Transformer 中的专家混合(MoEs)
Hugging Face 已彻底改造了 transformers 库,以提供对专家混合(MoE)架构的一流支持。此重新设计解决了 MoE 模型在检查点存储方式与硬件执行方式之间的根本不匹配,实现了显著更快的权重加载、更高效的通过可插拔后端进行推理,以及通过专家并行实现可扩展的分布。
MoE 基础:容量 vs. 活动参数
专家混合模型用一组称为专家的可学习子网络取代密集前馈层。路由器为每个 token 选择少量专家进行处理,从而将模型的总体容量与推理成本解耦。
- 总参数: 决定模型的整体容量和质量。
- 活动参数: 决定每个 token 的推理速度和计算成本。
例如,gpt-oss-20b 模型拥有 21B 总参数,但每个 token 只激活约 3.6B 参数(使用 32 个专家中的 4 个)。这使得模型在保持 21B 参数系统质量的同时,以 3.6B 参数模型的速度运行,在 M3 Ultra Mac 上实现约每秒 115 个 token。
权重加载重构与 WeightConverter
transformers 中的传统权重加载假设检查点张量与运行时参数之间是一对一映射。MoE 检查点通常会独立序列化专家(例如,256 个独立张量),但优化后的运行时内核需要将专家打包成单个连续张量,以进行分组 GEMM 操作。
为了解决此问题,Hugging Face 通过 WeightConverter 抽象引入了一个 转换管线。这将加载过程从简单的逐键复制转变为动态转换:
MergeModulelist: 将多个专家张量堆叠为单个连续张量。SplitModulelist: 将打包的张量拆分回单个专家。- 惰性实例化: 加载器仅在依赖准备好时,通过线程池实例化张量,且只扫描一次键,降低内存峰值并避免重复扫描。
权重加载基准
使用单个 A100(80GB)上的 Qwen/Qwen1.5-110B-Chat 进行基准测试,展示了相较于 v4,v5 管线的显著加速:
| 版本 | 策略 | 加载模式 | 时间 |
| :--- | :--- | :--- |
| v4.57.6 | device_map="auto" | 线程池 | 66.24s |
| v5 | device_map="auto" | 异步(默认) | 20.71s |
| v5 | TP | 异步 | 10.1s |
可插拔专家后端
为将专家计算与模型实现解耦,Hugging Face 使用 @use_experts_implementation 装饰器引入了专家后端系统。这使得模型能够在运行时在三种执行策略之间切换:
eager: 对选定的专家进行循环;主要用于调试和正确性验证。batched_mm: 使用torch.bmm为每个 token 复制专家权重;针对小批量和 GPU 密集型工作负载进行优化。grouped_mm: 使用torch._grouped_mm按专家 ID 对 token 排序并执行单次分组 GEMM;针对大批量和内存受限环境进行优化。
专家并行(EP)
专家并行使得拥有数千亿参数的模型能够通过在多个 GPU 上分配专家来实现扩展。不同于标准张量并行,每个设备仅加载其分配的专家子集(num_experts / num_devices)。
这通过 DistributedConfig(enable_expert_parallel=True) 实现,并依赖两个核心组件:
GroupedGemmParallel: 处理沿专家维度(dim=0)的专家权重分片。RouterParallel: 将全局专家索引重新映射为本地索引,并使用 all-reduce 操作合并跨设备的部分输出。
使用 Unsloth 优化的 MoE 训练
通过与 Unsloth 的合作,Hugging Face 利用专家后端抽象和 PyTorch 的 torch._grouped_mm API,并结合自定义 Triton 分组 GEMM 与 LoRA 内核,实现了更快的 MoE 训练。这些优化提供了:
- MoE 训练速度提升最高可达 12 倍。
- VRAM 使用量降低超过 35%。
- 上下文窗口长度约提升 6 倍。
- 相较于 v4
transformers实现,总体加速达 12‑30 倍。
SUMMARY: Hugging Face 重新设计了 transformers 库,通过全新的权重加载重构、可插拔的专家后端以及原生的专家并行,使专家混合(MoEs)成为一等公民。
TITLE: Transformer 中的专家混合(MoEs)