Prhub

#37995 docs(cookbook): Qwen3.8-Flash-Next NVFP4 recipes for DGX Spark (1x, 2x) and RTX PRO 6000

原始 PR 作者 Jiminator 合并时间 2026-09-08 06:33 文件变更 3 提交数 37 评论 1 代码增减 +791 / -13

执行摘要

为 Qwen3.8-Flash-Next NVFP4 新增 DGX Spark 和 RTX PRO 6000 的完整部署与基准测试食谱。

Qwen3.8-Flash-Next cookbook 页面原先仅包含数据中心级 GPU(H200, B200, B300, GB300, AMD MI350X/MI355X)的 NVFP4 配方。为了支持新硬件部署,本 PR 增加了经过验证的 DGX Spark (GB10, sm_121) 和 RTX PRO 6000 (sm_120) 的配方。动机包括:

  1. 解决 126 GiB 的 NVFP4 检查点无法在单个 128 GB 统一内存节点运行的问题(通过 TP=2 或文件后端 PLE 表)。
  2. 支持新的 NVIDIA ModelOpt MIXED_PRECISION (NVDA) 检查点格式及其特定加载器。
  3. 修复并记录了 GB10 上 MTP 模式下的输出崩溃问题(通过 #36811 和 #38290)。

这是一个高质量、详尽的文档 PR,虽然类型为 docs,但其复杂性和验证深度使其值得精读。特别是其处理硬件差异的覆盖层配置逻辑、为解决统一内存限制而引入的文件后端 PLE 表方案、以及文档中对多轮验证和修正的透明记录,都体现了严谨的工程实践。对于负责维护部署文档或支持新硬件平台的工程师,此 PR 提供了极具价值的参考。

讨论亮点

审查者 zijiexia 提出了三个关键问题并请求修改:

  1. 吞吐量指标定义:要求核实 RTX PRO 6000 的 tokens_per_sec_per_gpu 是否严格遵守“(输入 + 输出) tok/s/GPU”的定义,避免混淆。
  2. 准确性数据完整性:指出最初提供的 GSM8K 结果基于部分题目集(如 n=100/200),建议移除或重新运行完整集(1,319 题)以提供可靠的准确性参考。
  3. 内存数值一致性:指出 RTX PRO 6000 的常驻权重大小在文档中被表述为三种不同的数值(78 GiB, ~80 GiB, ~81 GiB),要求统一,明确 78.3 GiB 是检查点本身(不含 PLE 表)的大小,而 ~80/81 GiB 是加载后的 nvidia-smi 读数(包含开销)。作者通过后续提交解决了所有问题,包括重新运行完整集测试和统一文档数值。

实现拆解

  1. 扩展硬件与量化配置:在 docs/src/snippets/configs/Qwen/qwen3.8-flash-next.jsx 中,将 supportedHardware 扩展为包含 dgx-spark 和 rtx6000。新增 nvfp4-nvda 量化选项,并为 RTX PRO 6000 添加本地 vendor 覆盖。引入 multi-2 节点选项以支持多节点部署。
  2. 实现复杂的覆盖层逻辑:重写了 overlayDims 中的 pleOffload 逻辑。对于 DGX Spark,禁用 Auto 和 On(统一内存无收益),并根据节点数动态强制 Off(多节点)或 On (NVMe file)(单节点)。对于 RTX PRO 6000,强制 On(96 GB 显存必须卸载表)。
  3. 添加验证单元与基准数据:在 docs/src/snippets/configs/Qwen/qwen3.8-flash-next-benchmarks.jsx 中,为 8 个 DGX Spark 单元(RDXA/NVDA, 低延迟/高吞吐, 多节点/单节点)和 4 个 RTX PRO 6000 单元添加了完整的基准测试数据(GSM8K 准确度、TTFT、TPOT、吞吐量)。
  4. 完善文档与注释:在 docs/cookbook/autoregressive/Qwen/Qwen3.8-Flash-Next.mdx 中,更新了安装说明和精度表。新增了“DGX Spark notes”和“RTX PRO 6000 notes”手风琴部分,详细说明了启动顺序、NCCL、内存限制、并发控制、PLE 文件后端注意事项和 NVIDIA 导出差异。
  5. 多轮修正与重新验证:提交历史显示了 37 次提交,包含多次重新验证(如 GSM8K 完整集运行、修复 MTP 崩溃后的重新测试)和对审查意见(如吞吐量单位、内存数值不一致)的修正。
文件 模块 状态 重要度
docs/src/snippets/configs/Qwen/qwen3.8-flash-next.jsx 部署配置 modified 7.76
docs/src/snippets/configs/Qwen/qwen3.8-flash-next-benchmarks.jsx 基准数据 modified 7.3
docs/cookbook/autoregressive/Qwen/Qwen3.8-Flash-Next.mdx 用户文档 modified 4.89

关键符号

config benchmarks

关键源码片段

docs/src/snippets/configs/Qwen/qwen3.8-flash-next.jsx core-logic

核心配置文件,包含了所有新增的硬件、量化、覆盖层逻辑和验证单元定义,是实现 PR 目标的关键。

// PLE Offload 覆盖层配置,展示了针对不同硬件的禁用逻辑和强制选项。
// 对于 DGX Spark:统一内存使 RAM 卸载无收益,因此根据节点数强制 Off 或 "On (NVMe file)"。
// 对于 RTX PRO 6000:96GB 显存必须卸载 47.7 GiB 的 N-gram 表,因此强制 On。
{
  id: "pleOffload",
  title: "PLE Offload",
  showWhen: (sel) => !["mi350x", "mi355x"].includes(sel.hw),
  default: "auto",
  options: [
    {
      id: "auto", label: "Auto",
      // 在 DGX Spark 和 RTX PRO 6000 上禁用 Auto
      disabled: (sel) => sel.hw === "dgx-spark" || sel.hw === "rtx6000",
      disableReason: (sel) => sel.hw === "rtx6000"
        ? "RTX PRO 6000 (96 GB) 只能通过将 47.7 GiB FP8 N-gram 表放入固定主机 RAM 来运行此检查点..."
        : "DGX Spark 是统一内存:RAM 卸载无收益...",
      hints: ["PLE Offload: auto-enabled for BF16 on CUDA, off otherwise"]
    },
    {
      id: "on", label: "On",
      // 在 DGX Spark 上禁用 On
      disabled: (sel) => sel.hw === "dgx-spark",
      disableReason: "DGX Spark 是统一内存:RAM 卸载无收益...",
      flags: ["--ple-offload-embedding"]
    },
    {
      id: "off", label: "Off",
      // 在 RTX PRO 6000 或单节点 DGX Spark 上禁用 Off
      disabled: (sel) => sel.hw === "rtx6000" || (sel.hw === "dgx-spark" && sel.nodes === "single"),
      disableReason: (sel) => sel.hw === "dgx-spark"
        ? "单个 DGX Spark 无法将 126 GiB 检查点放入其 128 GB 统一内存..."
        : "RTX PRO 6000 (96 GB) 无法同时容纳 47.7 GiB N-gram 表...",
      flags: ["--no-ple-offload-embedding"]
    },
    // 文件后端选项(仅对 DGX Spark 单节点可用)
    {
      id: "file", label: "On (NVMe file)",
      showWhen: (sel) => sel.hw === "dgx-spark",
      disabled: (sel) => sel.nodes !== "single",
      disableReason: "文件后端表仅对单 Spark 单元进行了验证...",
      flags: ["--ple-offload-embedding", "--ple-offload-backend file"],
      hints: [
        "PLE 表 -> $SGLANG_CACHE_DIR/ple/<model> 下的稀疏 47.7 GiB 文件...",
        "启动前删除旧的表文件,直到上游修复为止:重写已填充文件速度慢..."
      ]
    }
  ]
}

评论区精华

基准测试数据的完整性与可重复性 测试

审查者 `zijiexia` 指出,最初提供的 GSM8K 准确性结果基于部分题目集(如 n=100/200),建议移除或重新运行完整集(1,319 题),以确保结果的可靠性和可重复性。

结论:作者重新运行了所有单元的完整 1,319 题集测试,并将新结果更新到文档中。 · 已解决

吞吐量指标(tokens_per_sec_per_gpu)的定义澄清 正确性

审查者要求核实 RTX PRO 6000 的吞吐量数据是否严格遵守“( 输入 + 输出 ) tok/s/GPU”的定义,以避免与仅输出吞吐量混淆。

结论:作者确认并统一了定义,确保所有数据行(DGX Spark 和 RTX PRO 6000)使用相同的“( 输入 + 输出 )”定义。 · 已解决

文档中内存数值表述不一致的修正 正确性

审查者指出 RTX PRO 6000 的常驻权重大小在文档中被表述为三种不同的数值(78 GiB, ~80 GiB, ~81 GiB),并要求统一为检查点分解值(78.3 GiB)或明确说明 nvidia-smi 读数的开销。

结论:作者统一使用 78.3 GiB 作为检查点分解大小,并澄清了其他数值是包含开销的加载后读数。 · 已解决

风险与影响

  1. 配置复杂性:引入了复杂的硬件特定禁用逻辑和条件标志(如 DGX Spark 节点数决定 PLE Offload 选项),增加了配置维护的认知负荷。
  2. 文档准确性风险:虽然经过多轮修正,但详细的硬件特定说明(如启动顺序、内存限制、NCCL 版本)如果未来硬件或驱动更新而文档未同步,可能导致用户部署失败。
  3. 引用依赖:食谱依赖于特定的开发镜像(dev-qwen38-next-local)和未发布的分支(qwen4-main-squashed),增加了外部依赖的复杂性。

对用户:提供了在 DGX Spark 和 RTX PRO 6000 上部署大规模语言模型的详细、经过验证的指南,降低了这些新硬件上的部署门槛。对系统:无代码逻辑变更,仅为文档和配置。对团队:确立了为复杂硬件配置维护食谱的高标准(包括多轮验证、完整性测试和精确的数值记录),可能成为未来类似工作的范本。

复杂配置逻辑 外部依赖(未发布镜像 / 分支) 硬件特定文档同步风险

关联 Issue

#36811 [Kernel] Avoid zero-bias allocation in fused softmax routing
#37111 [Bug] Qwen3.8-Flash-Next QSA + NEXTN decode graph silently corrupts output on GB10 TP2
#38290 [Kernel] Wait for the PDL dependency before loading the router bias (Triton + radix)
#38308 [qwen4-main-squashed] Cherry-pick #36811: avoid zero-bias allocation in fused softmax routing (fixes GB10 NEXTN collapse)

完整报告

参与讨论