方法与实践 可动手 10月24日 周六 #inference#llm

MoE 离线批推理先按领域排序,vLLM 上最多提速 17.3%

Hugging Face 社区文章指出,MoE 模型每个解码步要读取批内所有请求路由到的专家权重;同领域的提示词使用的专家高度重叠,所以离线批处理前先按领域排序,就能减少每步读取的专家数。作者在单张 AMD MI300X 上用原版 vLLM 0.27 实测,只改提示词顺序、不改模型和内核。

要点

  • Qwen3-30B-A3B 上 32 条随机请求约触达 128 个专家中的 94 个,单领域批次比混合批次少读 19–25% 的专家
  • Qwen3-30B-A3B 在批大小 32 时提速 17.3%;gpt-oss-120b 提速 6.9%–12.2%
  • 没有领域标签时,可用 Qwen3-Embedding-0.6B 嵌入后做 k-means 聚类,再按簇排序
  • 不适用于稠密模型、以预填充为主的任务、专家很少的粗粒度 MoE,以及对延迟敏感的在线服务
为什么值得关注

做大批量离线生成(数据合成、批量评测、标注)的团队,加一次排序就可能省下一成以上的 GPU 时间;注意重新排批会改变部分贪心解码的输出,需要逐位一致时得用批不变内核。

配套实验

已验证 检查 4/4 通过 GitHub Actions 实际运行 · Python 3.12.15 · 耗时 0.8s
给 MoE 批推理排个序:按领域分组能少读多少专家

受 Hugging Face 文章 Sort your prompts 启发,用模拟路由演示:MoE 每个解码步要读取批内所有请求用到的专家,把同领域提示词排在同一批,能减少每步触达的不同专家数;专家数越少的粗粒度 MoE,节省越小。

结论模拟中按领域排序让每步读取的专家从 101.1 个降到 74.0 个(少 26.8%),专家越少的 MoE 节省越小(15.0%)

设定:768 条提示词、6 个领域、批大小 32
METRIC: 随机批 每步触达专家数 (128 专家) = 101.1 个
METRIC: 按领域排序 每步触达专家数 (128 专家) = 74.0 个
METRIC: 少读专家比例 (128 专家) = 26.8 %
METRIC: 少读专家比例 (32 专家) = 15.0 %
METRIC: 单领域前 1/4 专家所占路由比例 = 78.4 %
[PASS] 按领域排序后,每步触达的不同专家数少于随机打乱
[PASS] 128 专家配置下少读专家比例超过 5%
[PASS] 粗粒度 MoE(32 专家)的节省比例小于细粒度(128 专家)
[PASS] 单领域内前 1/4 专家所占路由比例高于均匀路由的 25%
RESULT: 模拟中按领域排序让每步读取的专家从 101.1 个降到 74.0 个(少 26.8%),专家越少的 MoE 节省越小(15.0%)
python main.py 查看代码与内网复现步骤 →

来源

Esc
↑ ↓ 选择Enter 打开

分享图

1080 × 1350,适合发到群聊或朋友圈
分享图预览

键盘快捷键

j / k
下一条 / 上一条
o
展开或收起当前条目
Enter
打开当前条目详情
c
复制当前条目链接
s
收藏 / 取消收藏当前条目
/ 或 ⌘K
搜索
1 2 3
切换密度:标题 / 摘要 / 完整
t
切换主题
?
显示本帮助