Prhub

#27668 Fix MiMo-V2.5-Pro DP-attention dp size in cookbook deployment snippet

原始 PR 作者 JoyFuture 合并时间 2026-06-10 22:08 文件变更 1 提交数 1 评论 2 代码增减 +23 / -12

执行摘要

修复 MiMo-V2.5-Pro DP-attention 部署命令生成错误

MiMo-V2.5-Pro 的 FP8 检查点使用 TP=8 交错融合的 qkv_proj(因为量化是按 attention-TP 分片进行的),因此模型加载器要求运行时每个 DP 组的 attention-TP 必须为 8,否则抛出错误 MiMoV2 fused qkv_proj checkpoint is TP=8-interleaved; got attention tp_size=<n>。原代码在计算 Pro 的 dp 大小时错误地使用了 tp(例如在 tp=16 的 Hopper 节点上生成 --dp 16,使 attn_tp=1),导致部署命令无法启动。该问题已在 #23808 的 day0 讨论中由模型作者确认,Pro 模型仅支持 TP8,dpsize 应设为 2

该 PR 是典型的文档级 bugfix,虽然改动量小且不涉及运行时代码,但其对 DP-attention 与 TP 交错检查点的约束关系的澄清具有学习价值。建议所有部署 MiMo 系列模型的用户关注此变更,确保生成的部署命令正确。代码架构上,使用 spec.dp 的统一约束模式(而非硬编码 !isPro 分支)值得推广到其他需要类似约束的模型。

讨论亮点

review 中 gemini-code-assist[bot] 提出了两条改进建议:

  • 第 147 行:建议将 if (spec.dp > 1) 改为 if (spec.dp && spec.dp > 1),以显式处理 spec.dp 未定义的情况(如 Pro Blackwell 配置无 dp 字段),避免依赖隐式类型转换。
  • 第 296 行:建议在 dpSize 计算中使用回退值 1(如 const dpSize = spec?.dp ?? 1),防止在状态转换期间(如用户切换硬件)spec.dpundefined 时生成 --dp undefined 的非法命令。
    两条建议均未被作者采纳,当前实现中 spec.dp > 1undefined 时会隐式转换为 false,逻辑上等价于 spec.dp && spec.dp > 1,因此风险较低;但在 dpSize 处未提供回退值,仍可能在极端时序下产生 undefined 值。

实现拆解

  1. 扩展 HW_VARIANT_SPEC 定义:为 Pro 的 Hopper 行(pro|h200pro|h100,tp=16)添加 dp: 2,使 dp = tp / 8 = 2;Blackwell 行(pro|b200pro|gb300,tp=8)不设置 dp 字段,表示单一 attention 组、DP-attention off。
  2. 统一 computeConstraints 中的 DP-attention 约束:将原本仅对 base 变体生效的 DP-attention 强制逻辑扩展到 Pro 变体。当 spec.dp > 1 时强制启用 DP-attention(并生成理由说明),否则强制禁用。同时增加非 JAX 条件检查,避免影响 TPU 路径。
  3. 修正 dpSize 计算:将原来的条件表达式 !isPro ? spec.dp : tp 改为统一读取 spec.dp(若未定义则默认为 1),确保 Pro 变体不再错误地使用 tp 作为 dp 大小。
  4. 更新注释:将原有仅描述 base 的 TP=4 约束的注释,更新为同时描述 Pro 的 TP=8 交错约束与 DP-attention 推导逻辑。
文件 模块 状态 重要度
docs_new/src/snippets/autoregressive/mimo-v25-deployment.jsx 部署脚本 modified 6.48

关键符号

computeConstraints MiMoV25Deployment

关键源码片段

docs_new/src/snippets/autoregressive/mimo-v25-deployment.jsx core-logic

唯一修改的文件,包含所有逻辑变更:HW_VARIANT_SPEC 扩展、computeConstraints 统一、dpSize 修正及注释更新。

// 硬件变体规格定义:每个条目包含模型 slug、tp、多节点标志等
// Pro 版检查点为 TP=8 交错融合,base 版为 TP=4 交错融合
// dp 字段表示 DP-attention 所需的 DP 度数 (tp / factor)
const HW_VARIANT_SPEC = {
  "pro|h200": { slug: "XiaomiMiMo/MiMo-V2.5-Pro", tp: 16, multinode: true, nnodes: 2, blackwell: false, jax: false, dp: 2 }, // tp/factor = 16/8 = 2
  "pro|h100": { slug: "XiaomiMiMo/MiMo-V2.5-Pro", tp: 16, multinode: true, nnodes: 2, blackwell: false, jax: false, dp: 2 },
  "pro|b200": { slug: "XiaomiMiMo/MiMo-V2.5-Pro", tp: 8, multinode: false, blackwell: true, jax: false }, // tp=8 == factor, 无需 dp
  "pro|gb300": { slug: "XiaomiMiMo/MiMo-V2.5-Pro", tp: 8, multinode: true, nnodes: 2, blackwell: true, jax: false },
  // ... 其他配置行
};// 计算配置约束:根据当前变体和硬件强制某些选项的状态
const computeConstraints = (variant, hardware) => {
  const isPro = variant === "pro";
  const spec = HW_VARIANT_SPEC[`${variant}|${hardware}`];
  const blackwell = spec ? spec.blackwell : false;
  const jax = spec ? spec.jax : false;
  const c = {};
  // 对非 JAX 路径统一处理:两种检查点都是 TP 交错融合的
  if (spec && !jax) {
    const factor = isPro ? 8 : 4; // Pro 因子 8, base 因子 4
    if (spec.dp > 1) {
      // dp>1 时强制启用 DP-attention
      c.dpAttention = { force: "enabled", reason: `Checkpoint is TP=${factor}-interleaved; DP-attention is required (--dp = tp/${factor} = ${spec.dp}).` };
    } else {
      // 否则强制禁用(单一 attention 组)
      c.dpAttention = { force: "disabled", reason: `Single attention group on this hardware (tp=${factor}, no dp-attention).` };
    }
  }
  // ... DeepEP / JAX 等其他约束
  return c;
};// 在生成命令时:dpSize 直接从 spec 获取,替代原来的条件分支
const dpSize = spec?.dp ?? 1; // 使用回退值 1 防止 undefined 生成非法命令

评论区精华

隐式类型转换风险:spec.dp > 1 在 undefined 时的行为 正确性

gemini-code-assist 指出,当 spec.dp 未定义时(如 Pro Blackwell 配置),`spec.dp > 1` 依赖隐式转换。建议改为显式检查 `spec.dp && spec.dp > 1`。

结论:作者未采纳。当前实现中 `undefined > 1` 结果为 `false`,逻辑上等价于 `spec.dp && spec.dp > 1`,因此风险较低,但不够直观。 · unresolved

状态过渡期间 dpSize 可能为 undefined 正确性

gemini-code-assist 指出,在切换硬件配置的过渡渲染期间,`values.dpAttention` 可能暂为 `"enabled"`,而 `spec.dp` 未定义,导致 `dpSize` 为 `undefined`,生成 `--dp undefined`。建议使用回退值 1。

结论:作者未采纳。实际命令在 `useEffect` 修正前可能短暂出错,但最终值会正确。风险较低,但推荐添加回退以增强健壮性。 · unresolved

风险与影响

该 PR 仅修改部署代码片段生成文件(.jsx),不涉及任何运行时模型代码或启动逻辑,因此对实际推理无回归风险。主要风险在于:

  • 若未来新增硬件配置行时忘记添加 dp 字段,而 computeConstraints 已移除 !isPro 保护,Pro 变体的 dpAttention 约束将退化为根据 spec.dp 是否定义来决定,若 dp 未定义则 spec.dpundefinedspec.dp > 1false,DP-attention 会被强制禁用。对于 tp=16 的 Hopper 配置,这将生成不带 --enable-dp-attention 的命令,导致 loader 拒绝启动。当前 Pro Blackwell 行无 dp 字段,但 tp=8 时 attn_tp=8,符合要求,故无问题。
  • dpSizespecspec.dpundefined 时可能生成 --dp undefined,但用户切换硬件时 useEffect 会立即修正,实际命令在最终渲染前会正确更新。

影响范围:仅限 MiMo-V2.5 模型的文档部署代码片段生成器(.jsx 文件),不涉及任何运行时逻辑。
影响程度:中低。对使用 DP-attention 部署 MiMo-V2.5-Pro 的用户是必需的 bugfix,否则无法生成有效命令;对 base 变体和其他硬件配置无影响。
用户影响:修复后,Hopper 双节点场景下生成的启动命令从 --tp 16 --dp 16 --enable-dp-attention(无效)变为 --tp 16 --dp 2 --enable-dp-attention(有效),与模型作者确认的 day0 配方一致。
团队影响:减少了因文档错误导致的用户问题反馈。

隐式类型转换 时序竞争条件

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论