[moe_reduce_fused] feat: 实现并优化 C500 专家输出加权归约算子 #55
Loading…
Reference in New Issue
No description provided.
Delete Branch "ancient_rain/TileOPs-Metax:feat/moe_reduce_fused"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
[moe_reduce_fused] feat: 实现并优化 C500 专家输出加权归约算子
小组课题信息
课题名称:面向 MetaX C500 的 moe_reduce_fused 算子迁移与性能优化
课题完整简介:本组以 MetaX C500 为目标平台,将 TileKernels-Metax 中的 MoE 路由/融合算子迁移至 TileOPs,并建立「Manifest → Op/Kernel → Test → Benchmark」完整信任链。
moe_reduce_fused作为主算子,负责将专家输出按路由权重加权归约回 token 序;本 PR 完成其 TileLang Kernel 实现、4 个 Manifest 变体 Op(Base / WithXsf / Fp8 / Quantized)、29 个正确性测试与 Manifest-driven Benchmark,并在真实 C500(sGPU 切片)上完成精度验证、性能复现与 mcProfiler 瓶颈分析。PR 简要描述
算子名称:
moe_reduce_fused算子认领 Issue:#9
小组:9 组
成员:朱洪彪、古雨、陈占炜、李明洋
改动类型:
feat:新增算子或功能optimize:优化已有实现源文件参考(TileKernels-Metax
dev分支,源提交 SHA:0266ab740980de7dc03a828b8259cd73d100c2eb):tile_kernels/moe/reduce_fused_kernel.pytile_kernels/torch/reduce_fused.pytests/moe/test_reduce_fused.py被测提交 SHA:
8568aeb99d23347d2d1152a64b938d615c96ff6f(评测机/root/review-7770740ac4工作树,其tileops/kernels/moe/reduce_fused.py与该提交内容一致,文件 sha1d67d5bf7bdcb67ec06118dc5f146da5af0a31783;正确性截图、profile_run_final.log与 mcProfiler 结果均在该状态下采集)。当前分支 head 为
ff401ee,相对被测提交仅含三类非 kernel 变更:_infer_output_shapes适配 manifest--strict校验;官方矩阵比较对 FP8 输出先转 fp32;官方矩阵按 Review 意见折叠进workloads/moe.py(WorkloadBase/FixtureBase)并删除独立的workloads/moe_reduce_fused.py,bench_moe_reduce_fused.py的 PyTorch 向量化基线扩展至全部 4 个变体。reduce_fused.py内容未变,上述正确性/性能数据仍然成立。1. 本次 PR 优化方案
优化前的主要问题:
gather先生成[T, K, H]中间张量再加权求和,访存量被放大 K 倍,且需要 clamp/掩码处理 padding slot;T.Pipelined会降级为串行循环,直接流水化无法生效。采用的优化方案(对应分支
feat/moe_reduce_fused最新实现):(token, hidden-tile),按token_topk_to_pos索引x[pos, :]加权累加,消除[T, K, H]gather 中间张量;block_h按 workload 特调(256/512/1024/3584/7168),线程数min(128, block_h)向下取 2 的幂,提升 decode 小 T 场景的并行度与占用;T.Pipelined的串行降级,显式展开四 buffer look-ahead pipeline,把后续 slot 的 load 与当前 slot 的 FMA 重叠(K 累加顺序保持不变),gather 的访存延迟被隐藏;K<4 走 fragment 元数据路径;pos < 0的 slot 直接跳过(流水线路径对 padding stage 清空 buffer),无无效访存/计算;with_weights/with_sf/with_x_sf编译期开关内联进同一个 kernel 模板,4 个 Manifest 变体共享一份 kernel 逻辑;按(T, K, H, in/out dtype, 变体)特化,每个配置只 JIT 编译一次;out_frag+T.copy中转,该组合在 MACA/TileLang 构建上会崩溃);tileops/kernels/moe/reduce_fused_base.py(原 one-block-per-token 版本)供回归对照。关键代码或配置变更:
tileops/kernels/moe/reduce_fused.py(MoeReduceFusedKernel,supported_archs=[80, 86, 89, 90]);tileops/kernels/moe/reduce_fused_base.py(基线 kernel 对照版本);tileops/ops/moe/routed_expert/reduce_fused.py(MoeReduceFusedFwdOp/MoeReduceFusedWithXsfFwdOp/MoeReduceFusedFp8FwdOp/MoeReduceFusedQuantizedFwdOp);tileops/kernels/moe/__init__.py、tileops/ops/moe/__init__.py、tileops/ops/moe/routed_expert/__init__.py;tests/ops/test_moe_reduce_fused.py、benchmarks/ops/bench_moe_reduce_fused.py;官方矩阵按 Review 意见以MoeReduceFusedOfficialWorkload/MoeReduceFusedOfficialFixture/MoeReduceFusedOfficialBenchmarkFixture折叠进workloads/moe.py,对应测试/基准为tests/ops/test_moe_reduce_fused_official.py、benchmarks/ops/bench_moe_reduce_fused_official.py;tileops/manifest/moe.yaml:MoeReduceFusedFwdOp及 3 个变体由spec-only更新为implemented;HANDOFF.md(协作与复现指引)。2. 精度验证
对比基准实现:独立 PyTorch 参考实现
_ref_reduce_fused(与源仓库tile_kernels/torch/reduce_fused.py语义一致:fp32 累加、-1padding 跳过、可选x_sf/sf缩放、输出 cast);官方 TileKernels 矩阵测试见tests/ops/test_moe_reduce_fused_official.py(MoeReduceFusedOfficialWorkload数据生成 +MoeReduceFusedOfficialTest.ref_program参考 +_assert_equal按 dtype 容差比较,FP8 先转 fp32)。测试命令:
测试 shape/dtype(共 29 项 = 14 smoke + 15 full):
4×2×256(fp16 / bf16 / fp32)、16×2×512bf16、32×8×3072bf16(Qwen3-30B)、32×8×7168bf16、512×8×7168bf16(DeepSeek-V3 decode)、1×8×256bf16(单 token)、8×1×256bf16(K=1)、无权重路径;32×8×7168bf16、512×8×7168bf16(Qwen3-235B)、512×8×3072bf16(Qwen3-30B);-1padding 跳过。误差范围(atol/rtol):fp16/fp32
1e-3;bf161.6e-2;FP8 输出0.1(e4m3fn 表示精度限制)。验证结果:smoke 14 passed;全量 29 passed(MetaX C500 实测,约 137 s,正确性截图与
profile_run_final.log已归档,复现方式见 HANDOFF.md)。3. 性能数据【必填】
测试环境:
/opt/maca-3.7.1)determine_target('auto')→maca)8568aeb99d23347d2d1152a64b938d615c96ff6f(评测机/root/review-7770740ac4工作树,kernel 内容与上游一致)性能复现命令(评测机代码目录
/root/review-7770740ac4):测量协议:ManifestBenchmark(10 次 warmup + 50 repeats × 3 trials + CUDA event + L2 flush,报告取 trials 中位均值),报告文件
profile_run_final.log(2026-08-05 14:31:10,与评测机/root/review-7770740ac4/profile_run.log一致)。2026-08-06 01:27 补充一轮同会话三口径实测(18/18 passed):TileLang 基线(reduce_fused_base.py)、当前 kernel、PyTorch 向量化基线三者同一协议、同一会话测得,见下文「三口径对照表」与评测机three_way_bench.json。优化前(TileLang 基线:原始 one-block-per-token TileLang kernel,即
tileops/kernels/moe/reduce_fused_base.py,与源仓库 TileLang kernel 语义一致;基线提交a409c2d,同协议、同会话实测,独立 baseline full12):优化后(当前 H 维分块 kernel,同一协议、同一会话实测;测试提交
643f3bf/ 本分支8568aeb系列):加速比(TileLang 基线口径):FP8 H7168 1.64×、Quant H7168 1.59×、H3072 1.08×、base decode 1.03×(噪声级)、base prefill/tiny 无明确变化(已近带宽上限)。
说明:
三口径对照表(同会话 2026-08-06 01:27 实测,18/18 passed;
three_way_bench.json):Roofline(Manifest 公式,基础变体):FLOPs =
2*T*K*H;Bytes =(T*K*H + T*H)*elem_bytes + T*K*4 + T*K*4。理论读写字节量 512×8×7168 bf16 为 66.09 MB(58.72 MB 读 + 7.34 MB 写 + 32.8 KB 元数据),benchmark 记录带宽 ≈ 1.25 TB/s(prefill 1.46 TB/s)。瓶颈分析(mcProfiler 3.8.1.4 per-kernel 观测,
_reduce_fused_main_kernel):结论:
vls_pipeline_stall为主,计算单元几乎空闲;4. 提交自检清单
Step 1:
From your project repository, check out a new branch and test the changes.Step 2:
Merge the changes and update on Gitea.