Qwen3 MoE Fused:显著提升 Qwen3 推理速度的融合专家计算方案

新技术5个月前发布 小马良
316 0

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 对输入进行排序后批量分组计算。

具体步骤如下:

  1. 提取 Expert 权重:从原始 MoE 中提取所选的 16 个 Expert。
  2. 堆叠权重张量:将这些 Expert 的线性层权重沿专家维度堆叠为一个统一的大张量。
  3. 输入排序优化:根据 Expert ID 对输入进行排序,使得相同专家的输入连续存储。
  4. 批量分组计算:使用 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)⏳ 规划中
© 版权声明

相关文章

暂无评论

none
暂无评论...