Prhub

#50082 [Bugfix] Add Kimi K3 MoE support to benchmark_moe.py

原始 PR 作者 vanshbhatia-amd 合并时间 2026-08-20 03:42 文件变更 1 提交数 19 评论 10 代码增减 +13 / -0

执行摘要

为 benchmark_moe.py 新增 Kimi K3 MoE 参数解析分支

PR body 说明:benchmarks/kernels/benchmark_moe.py 无法对 Kimi K3 调优 fused MoE Triton kernel,因为 get_model_params() 不识别 KimiK3ForConditionalGeneration,回退到 Mixtral 默认分支后访问 num_local_experts 触发 AttributeError(Kimi 的 config 没有该字段)。Kimi K3 是多模态模型,MoE 参数嵌套在 KimiLinearConfig 的 text_config 中,且 top-k 字段名为 num_experts_per_token 而非常见的 num_experts_per_tok,因此需要专门分支。

值得快速阅读并纳入 benchmark 工具链。虽然改动很小,但展示了多模态模型 MoE config 解析的两个易踩坑点:参数嵌套在 text_config 中、top-k 字段命名差异(num_experts_per_token vs num_experts_per_tok)。建议后续为 get_model_params() 补充针对不同架构 config 的单元测试,固化字段名映射,防止未来架构新增时再次回退崩溃。

讨论亮点

Review 没有产生代码评论,核心讨论集中在 issue 评论区:作者主动 ping AMD ROCm 维护者(@tjtanaa、@dllehr-amd)请求 review 并确认改动只影响离线 benchmark_moe.py;mergify[bot] 两次提示 pre-commit 检查失败(要求运行 pre-commit run --all-files);维护者 hongxiayang 触发多轮 Buildkite CI(#83062、#84661、#84662)后批准合并。

实现拆解

  1. 定位问题get_model_params()benchmarks/kernels/benchmark_moe.py 中按 architecture 分流提取 MoE 参数;Kimi K3 未命中任何显式分支,落入默认 Mixtral 分支,尝试读取 config.num_local_experts 时崩溃。
  2. 新增分支:在 Qwen3OmniMoeForConditionalGenerationPixtralForConditionalGeneration 分支之间插入 elif architecture in ("KimiK3ForConditionalGeneration", "KimiLinearForCausalLM"),通过 config.get_text_config() 获取嵌套文本配置,再读取 num_expertsnum_experts_per_tokenmoe_intermediate_sizehidden_size。该分支同时覆盖纯文本版 KimiLinearForCausalLM(其 get_text_config() 返回自身)。
  3. 验证方式:作者用 get_config() 加载 released Kimi K3 配置并调用 get_model_params(),输出 (E=896, topk=16, moe_intermediate_size=3072, hidden_size=7168),与模型配置一致;配合 --tp-size 8 --enable-expert-parallel 得到 E_local=112、shard N=6144
  4. 配套改动:未新增自动化测试,只有 PR body 中的手动验证脚本;19 个提交中除首个核心提交外均为合并 main 的同步提交,无配置、部署或依赖变更。
文件 模块 状态 重要度
benchmarks/kernels/benchmark_moe.py 基准脚本 modified 5.59

关键符号

get_model_params

关键源码片段

benchmarks/kernels/benchmark_moe.py core-logic

唯一的变更文件,在 get_model_params() 中新增 Kimi K3 专用分支,修复离线 MoE kernel 调优脚本对 Kimi K3 的解析崩溃,并同时覆盖多模态与纯文本两种架构。

    elif architecture in (
        "Qwen3VLMoeForConditionalGeneration",
        "Qwen3_5MoeForConditionalGeneration",
        "Qwen3_5MoeTextConfig",
    ):
        # 多模态模型:MoE 参数嵌套在 text_config 中,先取出文本子配置
        text_config = config.get_text_config()
        E = text_config.num_experts
        topk = text_config.num_experts_per_tok
        intermediate_size = text_config.moe_intermediate_size
        hidden_size = text_config.hidden_size
    elif architecture in (
        "KimiK3ForConditionalGeneration",
        "KimiLinearForCausalLM",
    ):
        # Kimi K3 为多模态模型:MoE 参数位于嵌套的 KimiLinearConfig text_config 中。
        # 关键差异:top-k 字段名为 num_experts_per_token(而非其他模型的 num_experts_per_tok),
        # 且纯文本 KimiLinearForCausalLM 的 get_text_config() 会返回自身。
        text_config = config.get_text_config()
        E = text_config.num_experts
        topk = text_config.num_experts_per_token
        intermediate_size = text_config.moe_intermediate_size
        hidden_size = text_config.hidden_size
    elif architecture == "PixtralForConditionalGeneration":
        # Pixtral 可包含不同 LLM 架构,递归提取参数
        return get_model_params(config.get_text_config())
    else:
        # 默认分支(Llama 4 / Mixtral):回退到 Mixtral 字段名
        config = config.get_text_config()
        E = config.num_local_experts
        topk = config.num_experts_per_tok
        intermediate_size = config.intermediate_size
        hidden_size = config.hidden_size
​
    return E, topk, intermediate_size, hidden_size

评论区精华

Kimi K3 参数解析正确性验证 question

作者在 PR body 中给出验证步骤:用 get_config() 解析 released Kimi K3 配置,再调用 get_model_params(),输出 (E=896, topk=16, moe_intermediate_size=3072, hidden_size=7168),与模型 config 一致,证明新分支解析正确。

结论:验证通过,维护者 hongxiayang 批准合并,无额外修改要求。 · 已解决

pre-commit 检查失败处理 style

mergify[bot] 两次提示 pre-commit 检查失败,要求运行 `uv pip install pre-commit>=4.5.1 && pre-commit install && pre-commit run --all-files` 并提交修复,否则后续提交会自动被拦截。

结论:作者通过后续合并 main 分支同步修复格式问题,最终通过合并前检查。 · 已解决

CI 与审核流程 other

作者在 issue 评论区 ping AMD ROCm CODEOWNERS(@tjtanaa、@dllehr-amd)请求 review 并说明改动小而自包含;维护者 hongxiayang 触发 Buildkite CI(#83062、#84661、#84662),最终批准合并。

结论:维护者批准合并,PR 关闭;无需进一步代码修改。 · 已解决

风险与影响

影响面极小:改动仅限离线 benchmark 脚本 benchmarks/kernels/benchmark_moe.py,不进入 vLLM 运行时路径,默认架构(Mixtral、Llama 4 等)行为完全不变。主要风险有三:其一,无自动化测试,字段名映射(num_experts_per_tokenmoe_intermediate_size、嵌套 text_config)依赖 transformers 对 Kimi 配置的具体实现,上游若改名会再次回归;其二,KimiLinearForCausalLMget_text_config() 返回自身的行为依赖于 transformers 版本一致性;其三,pre-commit 曾失败,说明格式规范需要留意,但最终已通过。

对用户的影响是正向的:AMD/ROCm 团队及使用 benchmark_moe.py 进行 MoE kernel 调优的开发者现在可以对 Kimi K3 执行 fused MoE Triton kernel 调优(含 expert-parallel 场景),此前脚本会直接崩溃。对系统无运行时影响,对其他架构的调优流程保持兼容。团队层面,该改动建立了一个可复用的“多模态模型 MoE 参数从嵌套 text_config 提取”的分支模式,为后续支持同类架构提供参考。整体影响程度低,属工具链增强。

仅影响离线 benchmark 工具 缺少自动化测试覆盖 依赖 transformers 配置字段命名 pre-commit 曾失败后已通过

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论