llama-moe
将 LLaMA 密集模型持续预训练为 MoE 架构,以更低计算成本实现更高推理效率的稀疏专家大模型工
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
将 LLaMA 密集模型持续预训练为 MoE 架构,以更低计算成本实现更高推理效率的稀疏专家大模型工
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
图1:pjlab-sys4nlp 组织头像
想象一下,你是一个图书馆管理员,面对一座藏书百万册的巨型图书馆。用户每天会问各种问题,而你不可能把每一本书都翻一遍再回答——于是你培养了 16 位专家,每人专精不同领域。用户提问时,门控网络先判断这题归谁管,再把任务分配给最合适的 2-4 位专家合作完成。这就是 Mixture-of-Experts(MoE)稀疏激活机制的核心思想。
上海人工智能实验室的 LLaMA-MoE 团队在 2024 年 EMNLP 发表的这篇论文,正是将这一思想付诸实践的里程碑工作。项目来自 pjlab-sys4nlp 组织(上海 AI Lab 旗下 NLP 团队),核心目标是:从已经训练好的 LLaMA dense 模型出发,通过持续预训练(Continual Pre-training)将其改造为 MoE 架构,而不是从零训练一个 MoE 模型。这个嫁接思路大幅降低了计算成本——不需要海量数据从头训练,只需要在专家划分后用精选的语料继续预训练。
LLaMA 的核心计算单元是 FFN(Feed-Forward Network,前馈网络)。LLaMA-MoE 的第一步,是将 LLaMA 每一层的 FFN 按一定策略划分为多个稀疏专家。专家划分方法非常灵活:
划分完成后,每个专家仍然是一个完整的 FFN,只是参数规模更小。在推理时,Top-K 门控机制(TopK Noisy Gate/Shazeer 2017,或 Switch Gating/Fedus 2021)决定每次激活哪些专家。对于 LLaMA-MoE-3.5B(2/8)模型,总参数量约 3.5B,但每次只激活 2 个专家,实际参与计算的有效参数量大幅减少,在保持推理质量的同时显著降低计算开销。
专家划分只是第一步。MoE 模型新增的门控层(Gate)需要重新训练,整个模型架构的变化也需要预训练来适应。LLaMA-MoE 采用 SlimPajama 数据集(清洗去重后的 627B token)与 Sheared LLaMA 动态采样策略,持续预训练初始化后的 MoE 模型。关键技术亮点包括:
smoe/modules/flash_attn.py),对 LlamaAttention 打猴子补丁(monkey patch),自动 fallback 到 xFormers(当 FlashAttention 不可用时),确保不同硬件环境下都能启用高效注意力smoe/trainer/llama_lr_scheduling.py(46KB)实现了 LLaMA 专用学习率调度| 模型变体 | 激活专家数 | 总专家数 | 激活参数量 | 基础模型 | SFT 模型 |
|---|---|---|---|---|---|
| LLaMA-MoE-3.0B | 2 | 16 | 3.0B | 🤗 base | 🤗 SFT |
| LLaMA-MoE-3.5B(4/16) | 4 | 16 | 3.5B | 🤗 base | 🤗 SFT |
| LLaMA-MoE-3.5B(2/8) | 2 | 8 | 3.5B | 🤗 base | 🤗 SFT |
项目提供了完整的 SFT(Supervised Fine-Tuning)脚本,位于 scripts/sft/ 目录。基于基础模型,用户可以用自己的对话数据集进一步微调,使模型更适应聊天或指令-following 场景。HuggingFace 上已上传了对应 SFT 版本,可直接下载使用。
项目包名 smoe(Sparse Mixture-of-Experts),采用清晰的模块化设计:
smoe/modules/moe/ 和 smoe/modules/moe_residual/:MoE 及残差 MoE 模块实现smoe/models/llama_moe/ 和 smoe/models/llama_moe_residual/:LLaMA-MoE 模型实现,包含 LlamaMoEModel、LlamaMoEForCausalLM、LlamaMoEDecoderLayer 等核心类smoe/models/mistral/ 和 smoe/models/mixtral/:对 Mistral/Mixtral 模型的支持(说明架构不限于 LLaMA)smoe/callbacks/:SaveModelCallback(检查点保存)和 TensorBoardCallback(训练可视化)smoe/trainer/:DeepSpeed 集成、LLM 专用学习率调度smoe/data/:scripts/tokenize/ 提供数据集分词脚本scripts/:完整工作流脚本,包含 expert_construction/(专家构建)、cpt/(持续预训练)、eval/(评测)、sft/(微调)、visualization/(可视化分析)| 类别 | 技术/依赖 | 版本 |
|---|---|---|
| 核心框架 | transformers | 4.31.0 |
| 参数高效微调 | peft | 0.4.0 |
| 分布式训练 | deepspeed | 0.10.0 |
| 高效注意力 | xformers | 0.0.20 |
| 加速库 | accelerate | 0.21.0 |
| 实验管理 | wandb | 0.15.6 |
| 日志可视化 | tensorboard | 2.13.0 |
| 数据集处理 | datasets | 2.14.1 |
| 预训练数据 | SlimPajama(627B tokens) | - |
| 语言模型 | LLaMA-7B/13B | Meta 发布 |
模型推理(最简单,示例代码 example.py):
from transformers import AutoTokenizer, AutoModelForCausalLM
model_dir = "llama-moe/LLaMA-MoE-v1-3_5B-2_8"
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_dir, torch_dtype=torch.bfloat16, trust_remote_code=True)
model.to("cuda:0")
input_text = "Suzhou is famous of"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda:0")
pred = model.generate(**inputs, max_length=50, temperature=0.0)
print(tokenizer.decode(pred.cpu()[0], skip_special_tokens=True))
模型权重可直接从 HuggingFace 下载(🤗 llama-moe 组织),无需本地编译。但自定义训练(持续预训练或 SFT)门槛较高:需要 CUDA 11.8 环境、安装 FlashAttention 编译依赖、配置 DeepSpeed 多卡环境,并按文档配置 GCC、conda 环境等。
LLaMA-MoE 代表了 2024 年 MoE 训练的一个重要方向——从 Dense 模型嫁接 MoE 而非从零训练。相比 GPT-4(传言的 MoE,激活参数量巨大)、Mixtral-8x7B(从零训练的 MoE),LLaMA-MoE 证明了在已有 LLaMA 基础上通过持续预训练转 MoE 的可行性,且在 SciQ、PIQA、WinoGrande 等基准上相比同量级 Dense 模型有显著提升。
这对资源有限的中小团队意义重大:不需要千卡集群,也能改造自己的 LLaMA 模型成 MoE 架构。同时 smoe 工具包对多种 MoE 变体(残差 MoE、Mistral-MoE、Mixtral)的支持,说明这套方法具备一定的通用性,为后续研究提供了可复用的基础设施。