链载Ai

标题: 解读Qwen1.5 MoE:稀疏大模型的高效智能 [打印本页]

作者: 链载Ai    时间: 昨天 09:30
标题: 解读Qwen1.5 MoE:稀疏大模型的高效智能

引言

官方文档:Qwen1.5-MoE: 1/3的激活参数量达到7B模型的性能 | Qwen

3月28日,阿里首次宣布开源MoE技术大模型Qwen1.5-MoE-A2.7B,这个模型以现有的Qwen-1.8B模型为基础。Qwen1.5-MoE-A2.7B激活参数为2.7亿,但在一系列基准评估中可以达到7B模型的性能。此外,与7B模型相比,它在训练成本和推理速度上具有显著优势。据官方评测显示,Qwen1.5-MoE-A2.7B在与最佳的7B模型相比取得了非常接近的性能。本文将根据官方博客内容与开放代码,针对Qwen1.5-MoE-A2.7B进行解读。

文章结构如下:

参数量

Qwen1.5-MoE-A2.7B。它仅拥有27亿个激活参数,但其性能却能与当前最先进的70亿参数模型,如Mistral 7B和Qwen1.5-7B相媲美。相较于包含65亿个Non-Embedding参数的Qwen1.5-7B,Qwen1.5-MoE-A2.7B只有20亿个Non-Embedding参数,约为原模型大小的三分之一。此外,相比Qwen1.5-7B,Qwen1.5-MoE-A2.7B的训练成本降低了75%,推理速度则提升至1.74倍。

Qwen1.5-MoE-A2.7B在与最佳的7B模型相比取得了非常接近的性能

模型结构

Qwen1.5-MoE模型中采用了特别设计的MoE架构。通常情况下,如Mixtral等方法所示,每个transformer block中的MoE层会配备8个expert,并采用top-2门控策略进行routing。这种配置还存在很大的优化空间。Qwen1.5-MoE对这一架构进行了多项改进:

DeepSeek-MoE和DBRX已经证明了finegrained experts的有效性。从FFN层过渡到MoE层时,我们一般只是简单地复制多次FFN来实现多个expert。而finegrained experts的目标是在不增加参数数量的前提下生成更多expert。为了实现这一点,我们将单个FFN分割成几个部分,每个部分作为一个独立的expert。我们设计了具有总共64个expert的的MoE,对比其他配置,我们认为这个实现能达到效果和效率的最优。

模型初始化阶段至关重要。初步实验表明,从零开始训练MoE模型可能效率低下,且难以提升至预期的最优性能水平。因此,我们首先利用已有的Qwen-1.8B,将其改造为Qwen1.5-MoE-A2.7B。此外,在初始化阶段引入随机性可以显著加快收敛速度,并在整个预训练过程中带来更好的整体性能表现。

目前,一个明显的趋势是在MoE中实现共享expert与routing expert。从更宏观的角度看,这是一种广义的routing方法,因为在没有共享expert的情况下,实际上就退化为传统的MoE路由设置。对于Qwen1.5-MoE-A2.7B模型,我们在其中整合了4个总是被激活的共享expert和每次只激活其中4个的60个routing expert。这种方式非常灵活,同时在我们实验中效率最佳。

训练成本与推理效率

MoE模型的训练成本与dense模型存在显著差异。尽管MoE模型通常拥有更多的参数,但由于其稀疏性,训练开销可以显著降低。首先先对比各个模型的三个关键参数,分别是总参数数量、激活参数数量和Non-embedding参数:

代码解读

代码地址:https://github.com/huggingface/transformers/blob/main/src/transformers/models/qwen2_moe/modeling_qwen2_moe.py

config解读

config配置参数:

{
"architectures":[
"Qwen2MoeForCausalLM"
],
"attention_dropout":0.0,
"bos_token_id":151643,
"eos_token_id":151643,
"hidden_act":"silu",
"hidden_size":2048,
"initializer_range":0.02,
"intermediate_size":5632,
"max_position_embeddings":8192,
"max_window_layers":21,
"model_type":"qwen2_moe",
"num_attention_heads":16,
"num_hidden_layers":24,
"num_key_value_heads":16,
"rms_norm_eps":1e-06,
"rope_theta":1000000.0,
"sliding_window":32768,
"tie_word_embeddings":false,
"torch_dtype":"bfloat16",
"transformers_version":"4.39.0.dev0",
"use_cache":true,
"use_sliding_window":false,
"vocab_size":151936,
"decoder_sparse_step":1,
"moe_intermediate_size":1408,
"shared_expert_intermediate_size":5632,
"num_experts_per_tok":4,
"num_experts":60,
"norm_topk_prob":false,
"output_router_logits":false,
"router_aux_loss_coef":0.001
}

Config文件中可以窥见许多设计模型的细节

模型主结构介绍

Qwen2MoeForCausalLM模型是基于“混合专家(Mixture of Experts, MoE)”架构的变体,其中使用了一种稀疏激活策略,即每个输入序列只激活少数专家(expert)。下面我们会逐步理解整个Qwen2MoeForCausalLM模型的结构和关键组件。

  1. 模型构造 (__init__方法):

    模型的初始化方法首先调用了它的父类Qwen2MoePreTrainedModel的初始化,然后创建了以下关键结构:






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5