Prhub

#39106 [AMD] Use the triton DSA backend for GLM-5.2 MXFP4 on MI355X

原始 PR 作者 jiejingzhangamd 合并时间 2026-09-12 02:48 文件变更 2 提交数 1 评论 0 代码增减 +12 / -9

执行摘要

MI355X MXFP4 配方改用 triton DSA 后端

GLM-5.2 的 MXFP4 配方此前沿用 amd/GLM-5.1-MXFP4 的 tilelang DSA 后端,但 PR body 指出:At tp=4 with --kv-cache-dtype fp8_e4m3 the shape is 16 query heads per rank on an FP8 KV cache, which is what the gfx950 Triton sparse-MLA kernels target. 按 batch=4/64/128/256/512 的 CUDA-graph 实测,triton 相对 tilelang 在 decode 内核上有 1.68x / 1.53x / 1.93x / 2.15x / 2.72x 的加速,输出一致(SNR 37–82 dB,bf16 输出最大绝对差 5e-3),端到端 AgentX 与 1,319 题 GSM8K 证据在 #39059。同时 PR body 说明 These cells are verified: false and carry no benchmark numbers, so no published result changes.,因此可以在不改变任何对外发布数字的前提下更新推荐配方。

值得精读(尤其是负责 AMD/ROCm 部署与内核选型的工程师),但读的重点不是 diff 本身,而是它给出的选型判据。建议关注三件事:一,tp 变化如何改变每 rank 的 query head 数并进而决定 DSA 后端(16 heads/rank 走 gfx950 Triton 稀疏 MLA,8 heads/rank 只能留 tilelang);二,在 verified: false 单元上“先改配方、后补基准”的推进节奏,以及用 verified 字段隔离对外发布数字的做法;三,把选择依据直接写成配置旁注释、并在 cookbook 同步标注边界,避免后续被“统一成 tilelang”改回。后续建议:为本组配方补一个 DSA 后端数值一致性/性能回归用例(哪怕只是 small-batch decode 的 SNR 门限),并在 GLM-5.2.mdx 的 AMD 总述段落加一句“triton 为 ROCm 默认,tilelang 仅用于已发布数字对应的 TP8/gfx942 配方”以消除口径歧义。

讨论亮点
  • 唯一的 review 事件是 HaiShaw 的 APPROVED 且 review body 为空、无行内评论:对 docs/配方类改动,审查实际上完全建立在 PR 描述自带的自证数据之上(内核级 benchmark 表 + SNR/最大绝对差 + 指向 #39059 的端到端验证)。
  • PR 描述中承担“设计辩护”作用的两句关键表述:At tp=4 with --kv-cache-dtype fp8_e4m3 the shape is 16 query heads per rank on an FP8 KV cache, which is what the gfx950 Triton sparse-MLA kernels target. 以及 These cells are verified: false and carry no benchmark numbers, so no published result changes.
  • 未在 review 中展开、但客观存在的遗留疑虑:PR body 的 CI 状态里 “AMD ROCm 10” slot 显示 No AMD PR run found for this commit,Extra 测试为失败(Run #34629833525),也就是说这次后端切换没有任何仓库内自动化覆盖。

实现拆解

  1. 配置入口(docs/src/snippets/configs/zai-org/glm-5.2.jsx):改动集中在 mi355x + quant: "mxfp4" 的四个配方单元,逐个把两行后端 flag 由 tilelang 改为 triton,其余 flag(--tp 4、--kv-cache-dtype fp8_e4m3、--chunked-prefill-size、--mem-fraction-static、--cuda-graph-max-bs-decode、--max-running-requests、--watchdog-timeout)完全不动,保证是“单变量”切换,便于回退对比。
配方单元(match 关键维度) 本次改动 备注
mi355x / mxfp4 / low-latency --dsa-prefill-backend triton、--dsa-decode-backend triton --chunked-prefill-size 131072,--mem-fraction-static 0.80
mi355x / mxfp4 / balanced 同上 --chunked-prefill-size 32768,--cuda-graph-max-bs-decode 128
mi355x / mxfp4 / high-throughput 同上 --cuda-graph-max-bs-decode 256,--max-running-requests 256
mi355x / mxfp4 / mtp-314 同上 EAGLE 投机解码,steps=3,--watchdog-timeout 1800
  1. 选择依据内联到配置注释:同一个注释块新增三行,写明 triton 是 SGLang 在 ROCm 上的默认后端、TP4 的形状命中 gfx950 FP8 sparse-MLA 调优、以及“上面的 TP8 FP8/BF16 单元继续保留 tilelang,因为它们已发布的数字是用 tilelang 测的”。把判据写在配方旁边,避免后续维护者再次把四个单元改回 tilelang。

  2. 刻意不动的范围(回归边界):mi355x 的 bf16 / fp8(--tp 8)单元、mi325x 的 fp8 单元(gfx942)全部保持 tilelang。原因是 TP8 时 GLM-5.2 每 rank 只有 8 个 query head,不满足 gfx950 稀疏 MLA 的调优形状,且这些单元的已发布数字来自 tilelang,改动会造成“数字与配方不一致”。

  3. 文档口径同步(docs/cookbook/autoregressive/GLM/GLM-5.2.mdx):MI355X MXFP4 段落由原来的 “the same DSA tilelang backends” 改为 DSA triton 后端,并补上 “At tp=4 this shape — 16 query heads per rank on an FP8 KV cache — is the one the gfx950 sparse-MLA kernels are tuned for”,同时显式声明 tp=8 配方仍用 tilelang。

  4. 测试 / 部署配套:本 PR 未新增或修改任何测试、CI workflow 与容器镜像;四个单元维持 verified: false,因此 Deploy 面板仍不展示基准数字,改动只影响面板生成出来的启动命令。

文件 模块 状态 重要度
docs/src/snippets/configs/zai-org/glm-5.2.jsx 配置片段 modified 5.78
docs/cookbook/autoregressive/GLM/GLM-5.2.mdx 部署文档 modified 2.14

关键源码片段

docs/src/snippets/configs/zai-org/glm-5.2.jsx configuration

本次变更的唯一功能承载点:`mi355x` + `quant: "mxfp4"` 的四个配方单元把 DSA 前后端由 tilelang 改为 triton,并新增三行注释固化选择依据,直接决定 Cookbook / Deploy 面板生成的启动命令。

// ====================================================================
// AMD MI355X + MXFP4 — amd/GLM-5.2-MXFP4(Quark)。TP4:4-bit MoE 权重
// 正好放进 4 卡切片,沿用已验证的 amd/GLM-5.1-MXFP4 MI355X 配方(同一
// DSA 架构族)—— --trust-remote-code(Quark 自定义量化配置)与
// --kv-cache-dtype fp8_e4m3 都来自该先例。
// DSA 后端:triton,这也是 SGLang 在 ROCm 上的默认后端。TP4 下该 shape
// 正好命中 gfx950 FP8 sparse-MLA 的调优区间;上面的 TP8 FP8/BF16 单元
// 继续保留 tilelang,因为它们已发布的数字是用 tilelang 测出来的。
// ====================================================================
{
  match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "low-latency", nodes: "single" },
  verified: false, // 尚未在 GLM-5.2 上做基准验证,Deploy 面板不展示数字
  env: [],
  flags: [
    "--trust-remote-code",
    "--model-path {{MODEL_NAME}}",
    "--tp 4", // 每 rank 16 个 query head,正好命中 gfx950 稀疏 MLA 的调优形状
    "--kv-cache-dtype fp8_e4m3", // FP8 KV cache 是走 gfx950 稀疏 MLA 快路径的前提
    "--dsa-prefill-backend triton", // 本次变更:tilelang → triton
    "--dsa-decode-backend triton", // decode 内核在该 shape 下实测 1.53x–2.72x 加速
    "--chunked-prefill-size 131072",
    "--mem-fraction-static 0.80",
    "--watchdog-timeout 1200",
    "--host {{HOST_IP}}",
    "--port {{PORT}}",
  ],
},
{
  // MTP(mtp-314):已验证的 AgentX 配方;steps=3 仍在 gfx950 投机解码的
  // 构建范围内(≤3),--mem-fraction-static 0.80 为 MTP draft buffer 留余量
  match: { hw: "mi355x", variant: "default", quant: "mxfp4", strategy: "mtp-314", nodes: "single" },
  verified: false,
  env: [],
  flags: [
    "--trust-remote-code",
    "--model-path {{MODEL_NAME}}",
    "--tp 4",
    "--kv-cache-dtype fp8_e4m3",
    "--dsa-prefill-backend triton", // 四个 MXFP4 单元统一切到 triton
    "--dsa-decode-backend triton",
    "--speculative-algorithm EAGLE",
    "--speculative-num-steps 3",
    "--speculative-eagle-topk 1",
    "--speculative-num-draft-tokens 4",
    "--chunked-prefill-size 131072",
    "--mem-fraction-static 0.80",
    "--cuda-graph-max-bs-decode 160",
    "--max-running-requests 160",
    "--watchdog-timeout 1800",
    "--host {{HOST_IP}}",
    "--port {{PORT}}",
  ],
},

评论区精华

TP4 切 triton、TP8 与 gfx942 保留 tilelang 的边界依据 设计

PR body 给出的判据是每 rank 的 query head 数:TP4 配合 `--kv-cache-dtype fp8_e4m3` 时为 16 个 query head,命中 gfx950 Triton 稀疏 MLA 的调优形状;TP8 只剩 8 个,不满足该形状,且其已发布数字由 tilelang 测得,故不动。reviewer HaiShaw 以 APPROVED 接受,未留评论。

结论:边界被接受并合入:只有 `quant: "mxfp4"` 的 4 个 mi355x 单元切换后端,bf16/fp8 的 tp=8 单元与 mi325x(gfx942)单元保持 tilelang。 · 已解决

后端切换缺少仓库内自动化性能 / 精度回归 测试

PR 未新增测试,四个单元维持 `verified: false`;PR body 的 CI 状态显示 AMD ROCm 10 slot 为 `No AMD PR run found for this commit`,Extra 测试失败(Run #34629833525)。数值一致性证据来自 PR 描述的离线性测试与引用的 #39059(AgentX TP4/EP4 + 1,319 题 GSM8K)。

结论:未在 review 中展开,属于合并后遗留的观测性缺口:若 Triton 稀疏 MLA 内核在 gfx950 回归,只能靠人工复测发现。 · 待处理

风险与影响

  1. 缺少自动化性能/精度回归:DSA 后端切换的数值一致性只在 PR 描述的离线性测试中体现(SNR 37–82 dB、bf16 输出最大绝对差 5e-3),仓库内没有对应测试用例,四个单元又都是 verified: false。若上游 gfx950 Triton 稀疏 MLA 内核后续回归,cookbook 配方会静默劣化,只能靠人工复测或 #39059 那类端到端跑分发现。
  2. MTP 单元的外推风险:mtp-314 单元承载 EAGLE 投机解码(--speculative-num-steps 3、--speculative-num-draft-tokens 4、--cuda-graph-max-bs-decode 160),而 PR 给出的内核基准是纯 decode 场景,未给出 spec-decode 下的对比数据;同时该单元的 --cuda-graph-max-bs-decode 160、--max-running-requests 160 未随后端变化调整。
  3. 文档内部口径不一致的误读风险:GLM-5.2.mdx 的 AMD 总述段落仍写 “Use the DSA tilelang backend”,只有 MI355X MXFP4 那个 bullet 改成 triton。读者若只读总述,可能误以为全平台仍是 tilelang,或反过来把 triton 误推到 gfx942(MI300X/MI325X)与 TP8 场景。
  4. 可移植性风险可控:triton 本身是 SGLang 在 ROCm 上的默认 DSA 后端,未显式指定 flag 的行为不变;风险局限于“照抄这四段配方”的用户。
  5. 无源码回归面:改动不触碰 python/sglang 下任何实现,也不改镜像 tag / dockerImages,因此不存在引擎侧行为变更。
  • 用户:在 MI355X 上按 Cookbook / Deploy 面板启动 amd/GLM-5.2-MXFP4(TP4)的用户会拿到 triton DSA 后端的启动命令,在 PR 给出的形状下 decode 内核预期有 1.5x–2.7x 的改善;TP8 的 FP8/BF16 用户与 gfx942 用户完全不受影响;已发布 benchmark 数字无变化(四个单元本就 verified: false)。
  • 系统:影响面停留在文档渲染出的配置片段,不改变任何 kernel、调度或显存分配逻辑;回退成本极低(改回 4 处 flag)。
  • 团队:确立了一条可复用的选型范式——“按 tp 推导每 rank 的 query head 数,再对照内核调优 shape 决定后端”,同时也把“已在 GPU 上验证过的教程文件与配置片段必须成对更新”的维护习惯固化下来。
  • 下游复现:InferenceX / AgentX 等复现实验若基于旧配方,会与 Cookbook 出现后端差异,需对齐到 triton 才能复现 PR body 的加速比。
配方默认后端变更 缺少性能 / 精度回归测试 AMD CI 未覆盖 依赖外部验证 PR#39059 文档口径不一致

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论