Skip to content

[2026春季][T2-1-3] goog00#500

Open
goog00 wants to merge 1 commit into
InfiniTensor:mainfrom
goog00:2026-spring-goog00-T2-1-3
Open

[2026春季][T2-1-3] goog00#500
goog00 wants to merge 1 commit into
InfiniTensor:mainfrom
goog00:2026-spring-goog00-T2-1-3

Conversation

@goog00

@goog00 goog00 commented Jul 12, 2026

Copy link
Copy Markdown

T2-1-3 Qwen3-MoE 推理性能优化 — 赛题报告

小组:justdoit | 目标模型:Qwen/Qwen3-30B-A3B-Thinking-2507
平台:沐曦 MetaX C500(TP=2)+ NVIDIA RTX 4090D(TP=4)双平台正确性 PASS + 并发吞吐实测
代码:InfiniCore 2026-spring-goog00-T2-1-3 分支 · InfiniLM 2026-spring-goog00-T2-1-3 分支


实现的功能概述

在 InfiniLM/InfiniCore 框架上完成 Qwen3-30B-A3B-Thinking-2507(30B 总参 / 3B 激活,
128 专家、top-8、48 层全 MoE、BF16)的可运行 + 性能优化适配,并给出正确性与性能的实测证据。
image


使用的技术方案与参考资料

2.1 架构确认(对照 HF)

对照 config.json 与 transformers modeling_qwen3_moe 确认:model_type=qwen3_moe
无共享专家、无 aux-free 偏置、per-expert split 权重、48 层全 MoE,与 InfiniLM 现有
qwen3_moe 骨架完全兼容,无需新建模型目录、无需扩展路由算子。风险集中在性能优化。

2.2 核心方案:grouped_gemm 专家批化

问题:原朴素实现对 ntoken × top-8 个 (token, expert) 组合逐个调用单专家 MLP,
每次都是 1×hidden 的小 GEMM,完全失去 batch 性,kernel launch 爆炸。

方案(InfiniCore 新增 grouped_gemm 算子 + InfiniLM 重写 Qwen3MoeExperts::forward):

  1. CPU 端对路由 indices 分桶,得到每专家 token 数 counts 与置换 perm

  2. embeddingperm gather → 三次 grouped_gemm(gate/up/down,各一次覆盖全部专家)

    • swiglu
  3. 路由权重广播缩放 → index_add_ scatter 回原 token;

  4. TP allreduce

grouped_gemm 接收 group_sizes,一次调用内对各专家 slab 依次发 GEMM(行主序
C=A@Bᵀ,列主序转置实现),CPU/NVIDIA/MetaX 三后端 + CPU 参考实现 + Python 单测。

2.3 grouped_gemm 的 host-counts 直通接口

grouped_gemm 额外提供可选的 host 端 group_sizes 直通参数(默认 nullptr,向后兼容),
允许调用方在已知各专家 token 数时跳过算子内部的 device→host 同步拷贝。该接口为拷贝-同步
受限平台预留优化位,不影响默认路径行为。性能主线是 §2.2 的 grouped_gemm 批化(见 §3 实测)。

2.4 参考资料

  • HF 模型与配置:Qwen/Qwen3-30B-A3B-Thinking-2507(config.json / generation_config / tokenizer)

  • transformers modeling_qwen3_moe.py(权重命名、路由、chat template 参照)

  • InfiniLM/InfiniCore 框架现有 qwen3_moe 骨架、op::topksoftmaxmoe_mlp、TP 通信


测试脚本:运行方式与运行效果

硬件:NVIDIA RTX 4090D × 4(TP=4)沐曦 MetaX C500 × 2(TP=2) 两套环境,均为真机实测
本章按平台分列:先 §3.1 NVIDIA,后 §3.2 沐曦,§3.3 双平台一致性小结。

通用方法(两平台一致):

  • 正确性 = prefill 对齐 HF(两阶段):30B 放不下两份,故 HF 参照离线先跑存盘,再用 InfiniLM 对比。
    HF 仅作参照,不进入推理路径。
# 阶段1:HF 参照(两平台共用一份)
python3 test/models/qwen3_moe/dump_hf_reference.py \--model <path>/Qwen3-30B-A3B-Thinking-2507 --device cuda --out /tmp/qwen3_ref.json
# 阶段2:InfiniLM 对比(退出码 0=PASS;--device 换 nvidia/metax,--tp 换 4/2)
python3 test/models/qwen3_moe/check_prefill_logits.py \--model <path>/Qwen3-30B-A3B-Thinking-2507 --device <nvidia|metax> --tp <4|2> --ref /tmp/qwen3_ref.json
  • 判读:prompt_tok ok(chat template/分词一致)+ first_tok ==(prefill 首步 argmax 与 HF 一致)

    • prefix 16/16(前 16 个贪心 token 逐一命中)。
  • 本模型 run-to-run 非确定(TP all-reduce 规约顺序 + BF16 index_add_ 原子加),长序列必然分叉,
    故用首/前缀 token argmax 对齐(贪心解码真正依赖的量)而非整段 bit-exact。
  • 性能 = 并发服务吞吐bench/qwen3_moe/,server + 零依赖并发客户端。
    out_tok/s = 聚合输出吞吐,total_tok/s = 含 prefill 的聚合总吞吐(单流速率 = 聚合 / 并发数)。
MODEL=<path> DEVICE=<nvidia|metax> TP=<4|2> ATTN=paged-attn bash bench/qwen3_moe/serve.sh
python3 bench/qwen3_moe/load_client.py --tag this
python3 bench/qwen3_moe/summarize.py bench_results/this

3.1 NVIDIA RTX 4090D(TP=4)

3.1.1 正确性:prefill 对齐 HF —— 4/4 PASS

image image

图 3.1.1:RTX 4090D TP=4 check_prefill_logits.py —— 4 条 prompt 首 token + 前 16 token 全命中 HF,OVERALL PASS。

3.1.2 并发吞吐

4090D 单卡 24GB,30B 权重(TP=4 每卡 ~15GB)后 KV 空间有限,取代表性子集:

image image

图 3.1.2:RTX 4090D TP=4 load_client.py —— 单流 decode ≈ 34 tok/s;bs=8 聚合 ~178 tok/s;长输入 in=2048 总吞吐达 1605 tok/s

  • 单流 decode ≈ 34 tok/s(Ada 架构);输出吞吐随并发放大、长输入总吞吐极高。

3.1.3 端到端连贯输出

image

图 3.1.3:RTX 4090D TP=4 test_infer.py --backend cpp —— "How are you" → 正常 <think>…</think> 思考链 + 连贯英文回答,total_time ≈ 7.6 s。


3.2 沐曦 MetaX C500(TP=2)

3.2.1 正确性:prefill 对齐 HF —— 4/4 PASS

image image

图 3.2.1:沐曦 C500 TP=2 check_prefill_logits.py —— 4 条 prompt 首 token + 前 16 token 全命中 HF,OVERALL PASS。

  • 首 token 与 NVIDIA 逐一相同(106287 / 106287 / 32313 / 107520),验证两平台行为一致

3.2.2 性能:base vs this(grouped_gemm 的收益)

base=朴素逐 token MoE,this=grouped_gemm,同参数可比:
image

图 3.2.2:summarize.py base this —— bs=1 输出吞吐 base 10.98 → this 15.56(+41.7%),bs=8 +4.8%。

  • bs=1:grouped_gemm 输出吞吐 +42%——朴素版每 token 跑 8 个独立小专家 MLP(8× launch/token),
    grouped_gemm 批成 3 次 grouped GEMM,launch 大减。

  • 小规模(bs=1)不但不回退,还大幅提升(超额满足赛题「小规模不回退」要求)。

3.2.3 并发 × 长输入 × 长输出 完整矩阵

concurrency ∈ {1,8,32} × input ∈ {32,256,2048} × output ∈ {256,1024},共 18 组,全部实测通过
(C500 单卡 64GB,可跑完整矩阵):

image image image

图 3.2.3:沐曦 C500 TP=2 load_client.py 完整矩阵(18 组)—— 输出吞吐随并发放大(in=256/out=256 段 bs 1→8→32 = 24.5 → 86.5 → 143.2 tok/s,峰值 270 tok/s);长输入 in=2048、bs=32 总吞吐达 1236.7 tok/s

  • 输出吞吐随并发放大:同配置 bs 1→8→32 聚合 out_tok/s 逐级抬升(如 in=256/out=256 段
    24.5 → 86.5 → 143.2,≈3.5×/5.8×),峰值 270 tok/s,调度器组批有效、grouped_gemm 批量 decode 持续获益。

  • 总吞吐(含 prefill)在长输入下极高:in=2048、bs=32 达 1236.7 tok/s → prefill 大矩阵正是
    grouped_gemm 批处理的强项。

3.2.4 端到端连贯输出

image

图 3.2.4:沐曦 C500 TP=2 —— "你好,请介绍一下自己" → 正常 <think>…</think> 思考链 + 连贯中文自我介绍,total_time ≈ 12.2 s。


3.3 双平台一致性小结

image

同一套 InfiniLM T2-1-3 + InfiniCore grouped_gemm 代码在两平台正确性一致、性能趋势一致,
grouped_gemm** 的 CPU/NVIDIA/MetaX 三后端均验证有效。**



附录 A:关键代码位置

<style> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}</style>

仓库 路径 内容
InfiniCore src/infiniop/ops/grouped_gemm/(cpu/nvidia/metax) 算子三后端 + C/Graph API + Python 单测
InfiniCore src/infinicore/ops/grouped_gemm/ infinicore op 层封装(含 host counts 直通)
InfiniLM csrc/models/qwen3_moe/qwen3_moe_experts.cpp MoE experts 批化前向
InfiniLM test/models/qwen3_moe/{dump_hf_reference,check_prefill_logits}.py 正确性脚本
InfiniLM bench/qwen3_moe/ 并发吞吐基准(serve/load_client/summarize/README)

Honor Code.pdf

- MoE experts 前向:stacked weights + grouped_gemm + swiglu + TP allreduce
  (相对朴素 per-expert 循环,bs=1 输出吞吐 +42%)
- P0:可选 host group counts 跳过 grouped_gemm 内部 D2H 同步(graph guard)
- 正确性脚本:prefill 首步/前缀 token 对齐 HF 两阶段校验
  (MetaX TP=2 + NVIDIA TP=4 均 4/4 PASS)+ CORRECTNESS_README
- bench/qwen3_moe:无依赖并发吞吐基准(serve + load client + summarize)

Signed-off-by: sunteng <steng2009@163.com>
@goog00 goog00 requested a review from a team July 12, 2026 14:21
@goog00 goog00 changed the title feat(qwen3_moe): adapt & optimize Qwen3-30B-A3B-Thinking MoE [2026春季][T2-1-3] goog00 Jul 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant