Skip to content

【训练营】MXFP8/NVFP4低精度模拟与反量化 - #73

Open
crashingby wants to merge 2 commits into
InfiniTensor:2026-summer-projectfrom
crashingby:2026-summer-project
Open

crashingby wants to merge 2 commits into
InfiniTensor:2026-summer-projectfrom
crashingby:2026-summer-project

Conversation

@crashingby

Copy link
Copy Markdown

项目概述

完成 MXFP8 / NVFP4 低精度浮点软件模拟与 CUDA 反量化项目。

程序支持从 QDTENSOR 文件读取 FP16 / FP32 行主序矩阵,完成 CUDA 量化、真实位宽打包、QDWGT 文件写入与校验、CUDA 反量化为 FP16 / BF16 / FP32,并输出误差、压缩率、kernel 时间和有效带宽报告。

完整技术总结见:

  • 02_quant_dequant/黄新颖/Conclusion.md
  • 02_quant_dequant/黄新颖/README.md

低精度格式与缩放策略

  • MXFP8

    • payload 为 E4M3(S EEEE MMM),最大有限值为 448
    • 支持严格 OCP 风格的 rowwise block_size = 32、每块一个 E8M0 scale。
    • 额外实现了 tensor-scale 扩展:整张张量共享一个 E8M0 scale。
    • 反量化公式:x_hat = decode_E4M3(payload) × scale
  • NVFP4

    • payload 为 E2M1 4-bit nibble(S EE M),两个元素打包到一个字节中。
    • 使用每 16 个 rowwise 元素一个 E4M3 local scale,以及整张张量一个 FP32 global scale。
    • 反量化公式:x_hat = decode_E2M1(payload) × decode_E4M3(local_scale) × global_scale
    • 不支持 tensor-only scale mode,以保持 NVFP4 的双层缩放语义。
  • 支持 RNE(round-to-nearest, ties-to-even)和可复现的 stochastic rounding;随机舍入使用基于全局线性下标和 seed 的无状态 SplitMix64 映射。

实现与优化

  • 将格式 codec、CPU reference、CUDA kernel、pipeline、二进制 I/O 和 metrics 分层实现。
  • MXFP8 block 模式使用 一个 warp 处理一个 32 元素 block,通过 warp shuffle 完成 amax 规约,并使用 persistent grid 降低小 CTA 调度开销。
  • MXFP8 tensor 模式采用 partial reduction -> finalize scale -> encode 三段 kernel,正确处理跨 CTA 的全局 amax
  • NVFP4 先计算全局 scale,再以 16-lane tile 计算 local scale;独立 packed-encode kernel 由偶数 lane 独占写一个物理 byte,避免奇数列情况下跨行 packed byte 的竞争。
  • NVFP4 反量化采用一个线程读取一个 packed byte、同时解码两个 nibble,覆盖尾 nibble 和跨行 byte。
  • QDWGT 采用固定 little-endian 字段布局,记录 format、scale mode、rounding、真实 payload 位宽、scale、offset 和随机种子等信息。

正确性验证

  • CPU reference 与 GPU 结果逐 payload、scale 和反量化结果对照。
  • 覆盖 E4M3 / E8M0 / E2M1 边界值、饱和、RNE、随机舍入、全零、NaN / Inf、尾 block、奇数元素数、跨行 packed byte、FP16 / FP32 输入和 FP16 / BF16 / FP32 输出。
  • 提供 CTest 测试、配置样例、端到端实验脚本与 benchmark 脚本。

代表性实验结果

实验环境:NVIDIA RTX 4060(SM89),rtx4060-release

1024 × 1025、FP32 输入/输出、RNE 下:

格式 normal 分布 MAE normal 分布 MSE 逻辑压缩率
MXFP8 block 0.017952 0.000703 3.8752×
MXFP8 tensor 0.017952 0.000703 4.0000×
NVFP4 block 0.071406 0.009053 7.0995×

4096 × 4097 FP32 normal 输入、10 次 warmup、30 次 repeat 的 CUDA Event benchmark 中:

配置 quant median dequant median quant 有效带宽 dequant 有效带宽
MXFP8 tensor + RNE 0.886 ms 0.489 ms 92.334 GB/s 167.540 GB/s
MXFP8 block + RNE 1.071 ms 0.577 ms 72.717 GB/s 121.425 GB/s
NVFP4 block + RNE 2.272 ms 0.606 ms 33.131 GB/s 125.574 GB/s

MXFP8 提供更低误差;NVFP4 以更高的量化计算开销换取约 7.1× 的 FP32 存储压缩率。随机舍入的额外开销主要出现在量化阶段。

软件模拟与依赖边界

  • E4M3、E8M0、E2M1 编解码、scale、舍入、4-bit 打包/解包均为普通 CUDA/FP32/位操作的软件模拟
  • 未使用原生 FP8/FP4 Tensor Core 指令,也不依赖 Hopper、Blackwell 等特定硬件。
  • CUDA kernel 使用 warp shuffle、shared memory、CUDA Event、Thrust 和 cooperative groups;当前构建目标为 RTX 4060 的 SM89。
  • 不依赖 TensorRT、Transformer Engine、cuDNN 或 cuBLAS。

可继续优化方向

  • 复用 device buffer 和 stream,减少公共 pipeline 的反复分配开销。
  • 为 NVFP4 探索更激进的 kernel fusion、异步拷贝和更高吞吐的 packed-store 映射。
  • 扩展不同 stochastic seed、异常值比例、block size 与分位数误差实验。
  • 后续可加入 Nsight Compute / Nsight Systems 的 kernel 性能剖析。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant