FP8 训练#
DeepSeek-V3 模型采用 Blockwise FP8 训练:
更细粒度的缩放(激活采用 tile 级别,权重采用 block 级别)替代了逐张量量化,降低了量化噪声。
实时的 amax 统计减少了延迟更新所带来的分布偏移误差。
本节列出在 LoongForge 中启用该方案所需的特性开关/环境变量,给出经过验证的配置方案,并汇总故障排查建议。
0. 前置条件#
条目 |
要求 |
|---|---|
硬件 |
原生 FP8 支持 |
软件 |
框架中已启用 Transformer Engine |
注意事项 |
FP8 在数值上更严格 → 在调试配置期间请保持 NaN/Inf/溢出监控处于开启状态 |
1. 特性开关#
1.1 命令行参数#
参数 |
含义 |
|---|---|
|
对 FP8 张量使用 E4M3(4 位指数,3 位尾数)格式。必须与 |
|
启用 block 级 / tile 级量化和逐 block/tile 的 amax 追踪。需要 |
|
在分布式 gather/通信以及参数缓冲区中保持权重为 FP8。降低内存和通信开销,但需要完整的收敛性和权重回归测试。 |
1.2 环境变量#
变量 |
用途 |
|---|---|
|
前向激活 amax 的 epsilon 钳位(避免除零 → NaN)。默认 0,建议 1e-12 |
|
前向权重 amax 的 epsilon 钳位,作用同上。 |
|
反向梯度 amax 的 epsilon 钳位。如果反向传播中出现 NaN,首先检查此项。 |
|
设为 |
|
设为 |
|
设为 |
|
设为 |
2. 推荐配置方案#
阶段 1 — 基线(验证稳定性)#
--fp8-format e4m3 \
--fp8-recipe blockwise
训练直至 loss/指标与 BF16 参考一致。
阶段 2 — 优化(节省内存)#
--fp8-format e4m3 \
--fp8-recipe blockwise \
--fp8-param-gather
重新运行完整的收敛性测试 + 下游评估 + 权重往返验证。
通用 epsilon 防护(添加到启动脚本顶部)#
export FP8_QUANT_FWD_INP_AMAX_EPS=1e-12
export FP8_QUANT_FWD_WEIGHT_AMAX_EPS=1e-12
export FP8_QUANT_BWD_GRAD_AMAX_EPS=1e-12
3. 快速故障排查清单#
症状 |
可能的解决方法 |
|---|---|
loss 或梯度中出现 NaN/Inf |
逐步提高三个 |
与 BF16 相比发散 |
先禁用 |
权重重载失败 |
确保保存权重时使用了相同的 FP8 标志和 epsilon 值。 |
使用上述开关和 epsilon 防护,LoongForge 中的 Blockwise FP8 训练即可用于生产规模的运行。
4. 相关内容#
对于全量 FP8 可能出现性能回退的场景(小型 MoE 专家、高 TP、短序列),请参阅 自适应 FP8 训练,了解基于基准测试的逐模块精度选择机制。