Prhub

#2396 docs: refresh MXFP8 and NVFP4 RL guide

原始 PR 作者 zianglih 合并时间 2026-08-12 07:54 文件变更 29 提交数 13 评论 0 代码增减 +360 / -229

执行摘要

刷新 MXFP8/NVFP4 低精度 RL 指南并重命名页面

旧文档 fp8-low-precision.md 把 NVFP4 标为 experimental(兼容矩阵里还是 'coming soon'),MXFP8 也只覆盖早期 Blackwell 路径,与代码现状严重脱节。Roadmap issue #615(Blackwell MXFP8 与 NVFP4 RL training)中列出的多条实现 PR(Miles 侧 #512/#963/#1340/#1935,NVFP4 侧 #907/#1054/#1261/#2043)均已合入,功能已经可用。PR body 明确了本期范围:刷新 MXFP8 与 NVFP4 章节、保留 BF16 与 block-wise FP8 配方、文档化共享的 checkpoint / training / rollout / live-update 精度契约、把 MXFP8 的 MoE 与 dense 线性 GEMM 后端选择拆开,并明确非目标为「不改任何运行时或配方代码」。

值得精读,尤其适合负责 Blackwell 低精度训练的用户、文档维护者与关注 RoI 的技术管理者。核心看点:① 四阶段精度契约与 rollout × 训练兼容矩阵如何把 MoE RL 精度漂移的排障成本前置;② MXFP8 的 MoE / dense GEMM 后端选择拆分,纠正了旧文档单点建议的误导;③ NVFP4 后向模式「基础 + 高级选项」的分级呈现与外部来源引用策略;④ 文档重命名时全站链接、重定向与跨 PR 冲突处理的最佳实践。建议结合 issue #615 及其实现 PR 对照阅读。

讨论亮点

该 PR 的 review 过程几乎没有文字交锋:comments_count 为 0、review_comments_count 为 0,仅有一条 Zhichenzzz 的 APPROVED 空评论。真正的讨论体现在 13 个 commit 的演进与合并 commit 里:

  • 页面重命名的范围决策(commit 211f773c):页面已覆盖 block-wise FP8、MXFP8 与 NVFP4,「fp8- 前缀不足以概括」,因此把 fp8-low-precision 重命名为 low-precision,同步更新 23 个引用页、导航项并加永久重定向;同时顺带修正图片相对路径与 NVTE 环境变量的过时指引。
  • NVFP4 章节与代码对齐(commit 575f3c06):指出「NVFP4 一节只列了环境变量,训练 flags 读起来与 MXFP8 完全相同」,对照代码补齐 NVFP4 自己的 flags;并把 10 处异名链接("FP8 & Low Precision"、"Unified FP8" 等)统一到页面标题「Low Precision RL」。
  • four-over-six 表述反复打磨(commit 3d66db57 / 226d00ed):先收紧描述、后又恢复 humans& 博客引用,最终以「单独引用的高级选项 + 外部来源」的方式定稿。
  • 合并冲突处理(commit 304f90f1):与 #2395 在 docs.json 的 redirects 数组同一位置冲突,保留全部四条;并专门核验 #2381 新增的三个配方页(Kimi-K3、Nemotron-3-Ultra、Gemma-4)没有引用低精度页,确认 24 处链接全部一致、docs.json 解析通过、83 条导航项可解析。

实现拆解

按以下步骤拆解(纯文档变更,无源码/测试/部署配套):

  1. 指南主体重写:新建 docs/advanced/low-precision.md(+326 行),删除 docs/advanced/fp8-low-precision.md(−200 行)。新指南以「MoE RL 中 rollout 与训练之间精度漂移是常见失败模式」开篇,给出精度选择表(BF16 baseline、FP8 block-wise 为 Generally available、MXFP8 与 NVFP4 为 Beta)和 rollout × 训练兼容矩阵(仅对角线与 FP8 横线可行),并把 checkpoint 转换、trainer 前向、SGLang rollout、live weight export 四阶段精度契约固定为统一配方的基础。

  2. MXFP8 章节细化:文档化 Qwen3-30B-A3B launcher 的成对命令(prepare / execute 搭配 --rollout-mxfp8 --train-mxfp8)和 Megatron 侧 --fp8-recipe mxfp8 训练 flags;将 SGLang 后端选择从旧文档的单点建议(cutlass / triton)拆为两张独立表——MoE 用 --sglang-moe-runner-backendflashinfer_trtllm_routed / flashinfer_trtllm / cutlass),dense 线性 GEMM 用 --sglang-fp8-gemm-backendflashinfer_trtllm / flashinfer_cutlass / triton),并说明两者按模型、并行布局与已安装 SGLang 栈独立配对。

  3. NVFP4 章节重构:基础配方保留 high-precision backward;dequantized backward 与 four-over-six 改为「单独引用的高级选项」呈现;补充 NVFP4 的 scaling 契约(E2M1 权重按 16 值块存储,每块一个 E4M3 scale 加外层 FP32 scale,gate 与 up projection 联合量化),并与 MXFP8 区分训练 flags。

  4. 图示与来源:新增三张示意图 docs/assets/images/low-precision/(mxfp8-e2e.png、nvfp4-high-precision-backward.png、nvfp4-dequantized-backward.png),在文中注明来自 LMSYS 博客;外部引用链到 public roadmap issue #615、LMSYS overview 与 humans& 的 NVFP4 / 4-over-6 分析。

  5. 导航与全站链接:docs/docs.json 把 Performance 分组的页面项由 advanced/fp8-low-precision 改为 advanced/low-precision,并新增 /advanced/fp8-low-precision → /advanced/low-precision 永久重定向;qwen3.md、deepseek-v3-2.md、nemotron-3-super.md、GLM 系列、gpt-oss、moonlight、advanced/index.md 等 23 个引用旧路径的页面统一改为新标题「Low Precision RL」,advanced/index.md 的卡片描述也同步更新。

  6. 对照代码的事实修正:block-wise FP8 一节把 NVTE_FP8_BLOCK_SCALING_FP32_SCALES 的说明改为「由 miles/ray/train/actor_factory.py 在 actor env 中按硬件默认设置:Hopper 为 1、Blackwell 为 0(TransformerEngine 用 MXFP8 模拟 block-wise,需要 2 的幂 scale)」,不再要求用户手工设 1;NVFP4 一节补上与 MXFP8 不同的训练 flags 说明;新增图片路径统一为全站一致的绝对路径,符合 docs/README.md 约定。

文件 模块 状态 重要度
docs/advanced/low-precision.md 低精度指南 added 5.2
docs/advanced/fp8-low-precision.md 低精度指南 removed 4.73
docs/docs.json 文档导航 modified 3.81
docs/assets/images/low-precision/mxfp8-e2e.png 配图资源 added 2.17
docs/assets/images/low-precision/nvfp4-high-precision-backward.png 配图资源 added 2.17
docs/assets/images/low-precision/nvfp4-dequantized-backward.png 配图资源 added 2.17
docs/models/qwen/qwen3.md 模型文档 modified 2.11
docs/models/deepseek/deepseek-v3-2.md 模型文档 modified 1.93
docs/advanced/index.md 栏目首页 modified 2.02

关键源码片段

docs/advanced/low-precision.md documentation

本次变更的核心产物:326 行的统一低精度 RL 指南,覆盖 block-wise FP8、MXFP8、NVFP4 的精度契约、兼容矩阵、可运行配方与后端选择。

---
title: Low Precision RL
description: Unified low-precision pipelines for RL — block-wise FP8, MXFP8, and NVFP4 across rollout and training.
---
​
<!-- 本页是低精度 RL 的统一入口,由旧版 fp8-low-precision.md 重写而来。
     新版把 MXFP8 / NVFP4 从 experimental 升为 Beta,并固定四阶段精度契约:
     checkpoint 转换、trainer 前向、SGLang rollout、live weight export 必须使用同一套量化逻辑,
     否则 MoE 的 rollout 与训练之间会出现逐层数值漂移,最终表现为 log-probability 发散。 -->
​
## Choose a precision
​
| Format | Block layout | Hardware | Models tested | Maturity |
|---|---|---|---|---|
| **BF16** | — | All NVIDIA + AMD MI300X / MI325 / MI350 / MI355X | All | Baseline |
| **FP8 block-wise** (DeepSeek-style) | 128×128, FP32 scales | Hopper (H100 / H200), Blackwell (B200+) | Qwen3-4B, Qwen3-30B-A3B | Generally available |
| **MXFP8** | 1×32, UE8M0 scales | Blackwell only (B200, B300, GB200, GB300) | Qwen3-30B-A3B, DeepSeek-V3.2 | Beta |
| **NVFP4** (E2M1) | 1×16, two-level (FP8 + FP32) scales | Blackwell only (B200, B300, GB200, GB300) | Qwen3-30B-A3B | Beta |
​
## Rollout × training compatibility
​
<!-- 兼容矩阵是本指南的决策核心:只有对角线(同一精度贯穿 rollout 与 train)以及
     FP8 的两条横线是支持组合,MXFP8 与 NVFP4 之间、以及跨格式混搭均被排除。
     参考脚本 scripts/run_qwen3_30b_a3b.py 一次只允许一个 rollout 精度加一个训练精度,
     因此端到端配方必须成对使用 --rollout-* 与 --train-* 两个 flag。 -->
​
| Rollout \\ Train | BF16 | FP8 block-wise | MXFP8 | NVFP4 |
|---|---|---|---|---|
| **BF16** | ✅ baseline | ✗ | ✗ | ✗ |
| **FP8 block-wise** | ✅ | ✅ Hopper + Blackwell | ✗ | ✗ |
| **MXFP8** | ✅ | ✗ | ✅ Blackwell | ✗ |
| **NVFP4** | ✗ | ✗ | ✗ | ✅ Blackwell |
​
### Unified MXFP8 (Blackwell)
​
MXFP8 用一维 microscaling 块:32 个连续 E4M3 值共享一个 UE8M0 scale。
端到端配方让 rollout、前向、weight-gradient 与 data-gradient GEMM 全部走 MXFP8,
而配置为高精度的张量保留在 BF16。
​
```bash
python scripts/run_qwen3_30b_a3b.py prepare --hardware B200 --rollout-mxfp8 --train-mxfp8
python scripts/run_qwen3_30b_a3b.py execute --hardware B200 --rollout-mxfp8 --train-mxfp8
```
​
<!-- SGLang 的 MoE 与 dense 线性 GEMM 后端是独立选择的。旧文档只给单点建议,
     新版把两组选择拆开,读者需按模型、并行布局与已安装的 SGLang 栈配对挑选。 -->
​
| Workload | Miles flag | Backends |
|---|---|---|
| MoE | `--sglang-moe-runner-backend` | `flashinfer_trtllm_routed`, `flashinfer_trtllm`, `cutlass` |
| Dense linear GEMM | `--sglang-fp8-gemm-backend` | `flashinfer_trtllm`, `flashinfer_cutlass`, `triton` |
​
### NVFP4 (Blackwell)
​
NVFP4 把 E2M1 权重按 16 值块存储,每块一个 E4M3 scale 外加外层 FP32 scale。
gate 与 up projection 一起量化,使融合 rollout GEMM 使用同一个外层 weight scale;
trainer、checkpoint 转换器与 rollout kernel 必须遵守同一套 scaling 契约。
​
<!-- 后向模式是 NVFP4 章节的核心权衡:基础配方保留 high-precision backward,
     dequantized backward 与 four-over-six 作为单独引用的高级选项列出,来源分别是
     LMSYS 博客与 humans& 的 NVFP4 / 4-over-6 分析;实现层面的分档策略并未合入本 PR。 -->
​
<!-- 与代码对齐修正:NVTE_FP8_BLOCK_SCALING_FP32_SCALES 不再要求用户手工设置,
     已由 miles/ray/train/actor_factory.py 在 actor env 中按硬件默认:
     Hopper 上为 1,Blackwell 上为 0(TransformerEngine 用 MXFP8 模拟 block-wise 配方,
     需要 2 的幂 scale)。只有明确想覆盖默认时才需要手动设置。 -->

评论区精华

页面重命名 fp8-low-precision → low-precision 的范围与一致性 documentation

第 11 个 commit 解释命名原因:页面已覆盖 block-wise FP8、MXFP8 与 NVFP4,「fp8- 前缀不足以概括」;为完成重命名需同步更新 23 个引用页、导航项并新增永久重定向,同时顺带修复图片相对路径与 NVTE 环境变量的过时说明。

结论:以「Low Precision RL」为统一标题,全部 24 处链接一致;docs.json 新增永久重定向,外部旧链接不中断。 · 已解决

NVFP4 训练 flags 与 NVTE 环境变量说明对照代码修正 documentation

第 12 个 commit 记录四处对照代码的修正:NVFP4 一节此前只列环境变量、训练 flags 读起来与 MXFP8 完全相同;block-wise FP8 一节对 NVTE_FP8_BLOCK_SCALING_FP32_SCALES 的指引已过时(该变量现由 miles/ray/train/actor_factory.py 按硬件默认设置)。

结论:NVFP4 章节补齐独立的训练 flags;NVTE 环境变量改为「按硬件默认:Hopper 为 1、Blackwell 为 0,仅覆盖默认时才需手动设置」。 · 已解决

docs.json redirects 数组与 #2395 的合并冲突 other

合并 origin/main 时,#2395 为已删除的 Platforms 页面在同一位置添加了三条 redirect,与本分支的 fp8-low-precision 重定向冲突;合并 commit 同时核验了 #2381 新增的三个配方页没有引用低精度页。

结论:四条 redirect 全部保留;docs.json 解析通过,83 条导航项均解析成功,重命名清扫完整。 · 已解决

风险与影响

  • 零代码风险:纯文档变更,无运行时、测试、CI 影响;PR body 明确 Non-goal 为不改任何 runtime 或 recipe 代码。
  • 文档与代码偏差风险:主要风险是说明与实现脱节。本 PR 已对照代码修正两处(NVTE env var 的硬件默认逻辑、NVFP4 训练 flags),但 NVFP4 的 dequantized backward 与 four-over-six 高级模式仍在 roadmap 演进中(issue #615 里相关实现 PR 部分仍未合入),后续实现变化需要持续同步文档。
  • 站点构建验证缺口:Mintlify CLI 未在本地运行(Homebrew Node 无法加载 libllhttp.9.3.dylib),页面渲染效果未经本地验证;但 git diff --check、本地引用检查(3 个 PNG + 5 个仓库路径)、curl 200 检查与 pre-commit 全部通过。
  • 链接与重定向风险:依赖人工核验 24 处引用一致;合并 commit 已确认 83 条导航项可解析、#2381 新页面无遗漏引用,残留风险低。
  • 对读者:文档导航路径变化(/advanced/fp8-low-precision → /advanced/low-precision),旧 URL 由 301 永久重定向兜底;术语统一为「Low Precision RL」,消除此前同一页面被称作 FP8 & Low Precision / Unified FP8 等多达 10 种叫法的歧义。
  • 对系统:零代码、零运行时、零测试影响。
  • 对团队:文档与 issue #615 的 Blackwell MXFP8 / NVFP4 roadmap 形成闭环,为后续 NVFP4 成熟度从 Beta 升级预留结构;重命名时「改页面 + 改 23 处链接 + 加重定向 + 核验新增页面」的操作流程是文档-as-code 的范本,值得其他文档 PR 借鉴。
纯文档变更(零代码风险) Mintlify 构建未本地验证 全站 24 处链接一致性 NVFP4 高级模式仍在演进

关联 Issue

#615 [Roadmap] Blackwell MXFP8 and NVFP4 RL training

完整报告

参与讨论