Prhub

#36020 [docs] Split the Qwen3.8-27B NVFP4 cells by lm_head precision

原始 PR 作者 Jiminator 合并时间 2026-08-25 01:50 文件变更 4 提交数 2 评论 1 代码增减 +188 / -30

执行摘要

按 lm_head 精度拆分 Qwen3.8-27B 的 NVFP4 部署配置。

PR body 说明:NVFP4 导出不是新旧替换,而是同时发布两份检查点——RadixArk/Qwen3.8-27B-NVFP4 把 lm_head 打包为 FP4,RadixArk/Qwen3.8-27B-NVFP4-BF16-LMHead 把 lm_head 保留为密集 BF16。原页面只有一个 NVFP4 选项,无法表达这种差异,因此按 head 精度拆成两个选项。同时给出继承依据:两份导出包只在 lm_head 不同,BF16 head 在磁盘上大约多 1.7 GB、运行时大约多 3.2 GB,严格更难适配显存,所以 FP4-Head 单元格继承 BF16-Head 配方是“保守方向”(the conservative direction)。

值得精读(尤其是 PR body):它示范了文档参数维护的方法论——用“更严格适配的变体可覆盖更宽松变体”的单调性论证来批量继承实测值,再对继承会低估的场景(RTX 5090 fp32)单独补测,既省工作量又不牺牲准确性。维护此类部署面板的工程师可以借鉴该模式;合入前建议全站搜索残留的 nvfp4 硬编码。

讨论亮点

本 PR 没有实质 review 讨论:zijiexia 直接批准(评审意见为空),唯一评论是 mintlify bot 的预览部署通知。技术论证全部沉淀在 PR body 里:一是“批量继承 + 定点补测”方法论——两份导出包只在 lm_head 不同,BF16-Head 严格更难适配,因此 FP4-Head 单元格继承 BF16-Head 参数是保守方向,能省掉 8 个单元格里 7 个的重复测量;二是唯一例外被单独实测——RTX 5090 fp32 单元格若继承会低估(BF16-Head 下 fp32 实测不可用,FP4-Head 下可用),作者直接在这份导出包上逐格测量,给出 pool 25,911 / K=6 / 10.15 ms、ratio 6.12 / pool 29,490 / K=5 等完整数据,并说明复现了早前一轮独立结果。

实现拆解

  1. 变更入口docs/src/snippets/configs/Qwen/qwen3.8-27b.jsxmatchDims.quant 维度。nvfp4 选项被替换为 nvfp4-bf16-headnvfp4-fp4-head 两个 id,覆盖 RTX PRO 6000、RTX 5090、DGX Spark、GB300 四类硬件,共 8 个 NVFP4 单元格;H200(SM90 无 FP4 tensor core)两个变体都保持置灰。

  2. 可用性判断改前缀匹配:EAGLE、DSPARK、DFlash2 三个 overlay 在 RTX 5090 上的 disabled 条件从 sel.quant !== "nvfp4" 改为 !String(sel.quant).startsWith("nvfp4"),保证两个 NVFP4 变体共享同一套“32 GB 下草案模型只能叠加在 NVFP4 权重上”的约束。这是全 PR 最关键的一处机械改动——原等值判断会让新 id 全部失去匹配。

  3. RTX 5090 fp32 单独实测:BF16-Head 导出包下 fp32 被置灰(密集 head 需约 3.2 GB,fp32 状态池放不下);FP4-Head 导出包释放余量后,DSpark 两个单元格在 --mem-fraction-static 0.89、balanced ratio 6.63/6.12 下可服务,DFlash2 high-throughput 在 0.895 + --mamba-full-memory-ratio 10 下可服务,low-latency 仍置灰(0.8975/r14 下 KV 余量只有 7,752 / 9,216 tokens)。DSpark 的 mem-fraction 因此按 ssmDtype 分支:fp32 用 0.89、bf16 用 0.88。

  4. 配套同步qwen3.8-27b-benchmarks.jsx 把 GB300 两条 NVFP4 benchmark 行的 quant 匹配键改为 nvfp4-fp4-head_qwen38_mamba_ratio_calculator.jsx 把默认 quant 状态改为 nvfp4-bf16-head、KV dtype 回退判断改为前缀匹配;Qwen3.8-27B.mdx 检查点表格新增 BF16-Head 行并补充两变体差异说明。

  5. 测试与 CI:无直接测试文件(文档变更);依赖 Mintlify 预览与 check_cookbook_configs.mjsdim.options 的结构校验。

文件 模块 状态 重要度
docs/src/snippets/configs/Qwen/qwen3.8-27b.jsx 文档配置 modified 7.34
docs/src/snippets/configs/Qwen/qwen3.8-27b-benchmarks.jsx 基准数据 modified 4.67
docs/src/snippets/_qwen38_mamba_ratio_calculator.jsx 比率计算器 modified 4.5
docs/cookbook/autoregressive/Qwen/Qwen3.8-27B.mdx 文档正文 modified 3.37

关键符号

config benchmarks Qwen38MambaRatioCalculator derive

关键源码片段

docs/src/snippets/configs/Qwen/qwen3.8-27b.jsx core-logic

部署面板的核心配置:quant 维度拆分、全部 overlay 可用性判断与 RTX 5090 fp32 实测参数都集中在这个文件,是全 PR 的主改动(+162/-17)。

// 以下为 qwen3.8-27b.jsx 中拆分后量化维度与 RTX 5090 overlay 逻辑的整理片段,
// 省略了硬件与节点等无关维度。
// 量化维度把单一 NVFP4 选项拆成两个变体:两份导出包只在 lm_head 上不同,
// BF16-Head 保留密集 head(磁盘大约多 1.7 GB、运行时大约多 3.2 GB),
// FP4-Head 把 head 打包为 FP4。BF16-Head 严格更难适配显存,所以 FP4-Head
// 单元格直接复用 BF16-Head 配方,属保守继承方向。
{ id: "quant", title: "Quantization", options: [
  { id: "bf16", label: "BF16" },
  { id: "fp8", label: "FP8" },
  { id: "nvfp4-bf16-head", label: "NVFP4-BF16-Head" },
  { id: "nvfp4-fp4-head", label: "NVFP4-FP4-Head" },
] }// EAGLE / DSPARK / DFlash2 在 RTX 5090 的可用性判断从等值比较改为前缀匹配,
// 让两个 NVFP4 变体共享同一约束:32 GB 显存下草案模型只能叠加在 NVFP4
// 权重上。前缀匹配是这次拆分能成立的关键——旧写法会漏掉新 id。
disabled: (sel) =>
  sel.hw === "rtx5090" && !String(sel.quant).startsWith("nvfp4"),
disableReason:
  "On the 32GB RTX 5090 the DSpark draft model only fits on top of the NVFP4 weights",// RTX 5090 的 mem-fraction-static 是唯一没有直接继承的单元格:FP4-Head
// 导出包实测 fp32 在 0.89 时可服务(balanced ratio 下 pool 25,911 / K=6、
// 29,490 / K=5),BF16-Head 导出包下 fp32 则被 SSM dtype 行置灰。
// 因此按 ssmDtype 分支钉住 0.89 / 0.88 两个值。
...(sel.hw === "rtx5090"
  ? [sel.ssmDtype === "float32"
      ? "--mem-fraction-static 0.89"
      : "--mem-fraction-static 0.88"]
  : []),
docs/src/snippets/_qwen38_mamba_ratio_calculator.jsx core-logic

ratio 计算器的 KV dtype 回退判断必须跟着新 id 走;这里改成前缀匹配,否则选择 FP4-Head 时计算器会把 KV 池误判为 bf16,导致 ratio 建议错误。

// 以下为 _qwen38_mamba_ratio_calculator.jsx 中 KV dtype 推导的整理片段。
// 依据当前选中的量化选项推导默认 KV 精度:两个 NVFP4 检查点都在配置里声明
// kv_cache_quant_algo: FP8,所以默认 --kv-cache-dtype auto 会落到 fp8_e4m3;
// BF16 / FP8 检查点则保持 bf16 KV 池。显式传入的 --kv-cache-dtype 标志始终
// 优先于检查点声明,因此先检查标志,再回退到 quant 前缀判断。
const kvDtype =
  kvFlag === "fp8_e4m3"
    ? "fp8_e4m3"
    : kvFlag === "bfloat16" || kvFlag === "bf16"
      ? "bfloat16"
      : String(quant).startsWith("nvfp4")
        ? "fp8_e4m3"
        : "bfloat16";

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

主要风险集中在配置键迁移与数据溯源:(1) quant id 从 nvfp4 改为两个前缀 id,页面所有匹配逻辑、benchmark 行和 ratio 计算器必须同步;本 PR 已覆盖 4 个文件,但若有其它页面或脚本硬编码 "nvfp4",会静默失去匹配,建议合入前全站 grep。(2) GB300 两条 benchmark 行被重新键到 nvfp4-fp4-head,但原始备注只写 NVFP4 = RadixArk W4A4-0811 (private),未说明测量时用的是哪份导出包,归属存在不确定性。(3) RTX 5090 fp32 的 0.89 / ratio 6.63 / --mamba-full-memory-ratio 10 均为单次实测的紧边界值(DFlash2 low-latency 在 0.8975/r14 下 KV 余量 7,752 vs 9,216 tokens),SGLang 显存布局变化后可能失效。(4) 整体不涉及运行时代码,回归面限于文档站点。

影响范围为文档站点而非运行时:Qwen3.8-27B 部署面板从单一 NVFP4 选项扩展为按 lm_head 精度区分的双变体共 8 个 NVFP4 单元格,读者能拿到与检查点匹配的 --model-path、mem-fraction 与 mamba ratio 参数;RTX 5090 用户新增 3 个可用的 fp32 组合(DSpark low-latency / high-throughput、DFlash2 high-throughput)。对团队而言,后续每轮测量与验证都要在两个变体上同步维护,文档维护成本上升。

quant id 全站同步匹配风险 GB300 benchmark 数据溯源不确定 RTX 5090 fp32 紧边界实测值 无直接测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论