Qwen3 MoE Fused 是一个面向 Qwen3 MoE 模型 的高性能推理优化项目,由开发者 woct0rdho 发起并实现。该项目通过重构 MoE(Mixture of Experts)中专家(Expert)的计算流程,将原本顺序执行的 Expert 计算过程进行批量融合处理,从而在不改变模型权重的前提下,使推理速度提升 4-8 倍。
该实现完全兼容 Hugging Face Transformers 生态系统,并支持 LoRA、bitsandbytes 4-bit 量化、Unsloth 等主流微调和加速技术。

技术背景与挑战
在传统的 MoE 架构中,如 Qwen3 所采用的设计,默认是按顺序对每个被选中的 Expert 进行逐个计算:
for expert_id in selected_experts:
output += expert(input)
这种方式虽然逻辑清晰,但由于频繁的 GPU 内存访问跳跃,导致缓存命中率低,严重影响了推理效率。
核心问题:
- 多次小矩阵运算,无法充分利用 GPU 并行能力;
- 不同 Expert 的输入数据分散,内存访问不连续;
- 缺乏批处理优化,难以发挥现代 GPU 的吞吐优势。
解决方案:Fused MoE 计算
本项目的核心思路是:
一次性提取所有被选中的 Expert 权重,堆叠成大张量,再根据专家 ID 对输入进行排序后批量分组计算。
具体步骤如下:
- 提取 Expert 权重:从原始 MoE 中提取所选的 16 个 Expert。
- 堆叠权重张量:将这些 Expert 的线性层权重沿专家维度堆叠为一个统一的大张量。
- 输入排序优化:根据 Expert ID 对输入进行排序,使得相同专家的输入连续存储。
- 批量分组计算:使用 Triton 分组 GEMM 技术,对多个 Expert 同时进行高效矩阵乘法。
这种设计不仅提升了内存访问效率,还大幅减少了内核启动次数,充分发挥了 GPU 的并行计算能力。
🔥 核心特性
| 特性 | 描述 |
|---|---|
| ✅ 显著提速 | 在单卡 24GB VRAM 的 GPU 上实现 4-8 倍推理加速 |
| ✅ 零权重修改 | 不改变原始模型权重,仅优化中间计算逻辑 |
| ✅ 兼容性强 | 支持 Hugging Face Transformers、LoRA、Unsloth 和 bitsandbytes |
| ✅ 支持 LoRA | 可训练融合格式的 LoRA,并转换为非融合格式用于 GGUF 等部署 |
| ✅ 内存友好 | 输入排序优化提高缓存命中率,降低显存占用 |
📦 融合线性层实现(moe_fused_linear)
核心函数定义如下:
output[b, o] = sum_i weight[selected_experts[b], o, i] * input[b, i]
即:对每个 batch 样本,根据其分配的 Expert ID,选择对应的权重矩阵进行矩阵乘法。
当前实现基于 Unsloth 的 MoE 内核,并做了以下增强:
- 使用 Triton 实现分组 GEMM;
- 添加步幅、掩码和自动调优配置以支持小型矩阵(如 LoRA);
- 代码可读性强,未使用 Triton 的高级实验功能(如 TMA、swizzle),确保稳定性和兼容性。
🧩 LoRA 支持详解
为了支持 LoRA 微调,本项目实现了融合格式的 LoRA 定义:
对于形状为 (num_experts, out_features, in_features) 的权重张量,LoRA 权重的形状为:
lora_A:(num_experts, lora_rank, in_features)lora_B:(num_experts, out_features, lora_rank)
这意味着可以为每个 Expert 单独训练 LoRA 参数,并在推理时将其堆叠为融合格式,与主权重一同参与计算。
工具支持
convert.py提供了在融合格式与非融合格式之间转换的功能;- 可将训练好的融合 LoRA 转换为非融合格式,进而导出为 GGUF 等其他格式。
📌 当前进展与待办事项
| 功能 | 状态 |
|---|---|
| 融合 MoE 内核实现 | ✅ 已完成 |
| LoRA 支持 | ✅ 已完成 |
| GGUF 导出支持 | ✅ 融合 → 非融合支持 |
| Unsloth 快速 LoRA 支持 | ⏳ 开发中 |
| 向上游提交 PR(Transformers / Unsloth) | ⏳ 规划中 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...















