执行摘要
新增 --force-fp8-ue8m0-scale 开关,强制 UE8M0 量化
PR body 缺失,但根据实现意图,用户需要在不依赖训练 GPU 架构的情况下强制使用 UE8M0 量化格式,可能是为了跨 GPU 架构的权重一致性和部署兼容性。
值得精读。重点学习如何将运行时依赖与用户强制开关解耦,以及如何在参数层提供灵活性。建议补充文档并增加对 _quantize_param 分支的测试。
无 review 评论,无讨论。
PR body 缺失,但根据实现意图,用户需要在不依赖训练 GPU 架构的情况下强制使用 UE8M0 量化格式,可能是为了跨 GPU 架构的权重一致性和部署兼容性。
值得精读。重点学习如何将运行时依赖与用户强制开关解耦,以及如何在参数层提供灵活性。建议补充文档并增加对 _quantize_param 分支的测试。
无 review 评论,无讨论。
slime/utils/arguments.py 的 add_train_arguments 中添加 --force-fp8-ue8m0-scale,store_true 默认 False,帮助信息说明其独立于训练 GPU 架构。quantizer_fp8.py 的 quantize_params_fp8 中读取 force_fp8_ue8m0_scale,并传入 _quantize_param;_quantize_param 将原来的运行时判断重构成 runtime_requires_ue8m0,并使用 force_ue8m0_scale or runtime_requires_ue8m0 决定是否调用 quant_weight_ue8m0;变换 scale 的条件改为 runtime_requires_ue8m0 and transform_ue8m0,确保 Hopper 下不进行 Blackwell 特有打包。tests/test_megatron_argument_validation.py 新增 test_force_fp8_ue8m0_scale_argument,验证默认值和开关设置后 force_fp8_ue8m0_scale 的取值。| 文件 | 模块 | 状态 | 重要度 |
|---|---|---|---|
slime/backends/megatron_utils/megatron_to_hf/processors/quantizer_fp8.py |
量化器 | modified | 7.22 |
slime/utils/arguments.py |
参数解析 | modified | 5.57 |
tests/test_megatron_argument_validation.py |
参数测试 | modified | 5.29 |
slime/backends/megatron_utils/megatron_to_hf/processors/quantizer_fp8.py
core-logic
核心量化逻辑,新增强制 UE8M0 开关并重构运行时判断
# slime/backends/megatron_utils/megatron_to_hf/processors/quantizer_fp8.py
def _quantize_param(
name,
weight,
weight_block_size,
transform_ue8m0=True,
force_ue8m0_scale=False,
):
# 仅处理 weight 参数
assert name.endswith(".weight"), f"Expected weight parameter, got {name}"
FP8_MIN = torch.finfo(torch.float8_e4m3fn).min
FP8_MAX = torch.finfo(torch.float8_e4m3fn).max
if weight_block_size is not None:
# 运行时是否需要 UE8M0,取决于 DeepGEMM 要求(通常对应 Blackwell 架构)
runtime_requires_ue8m0 = bool(
should_deepgemm_weight_requant_ue8m0
and should_deepgemm_weight_requant_ue8m0(weight_block_size=weight_block_size)
)
# 用户显式强制或运行时需要时,都走 UE8M0 量化路径
if force_ue8m0_scale or runtime_requires_ue8m0:
qweight, scale = quant_weight_ue8m0(weight, weight_block_size=weight_block_size)
# 仅当运行时真正需要时才对 scale 做 Blackwell 特有转换;
# Hopper 等架构强制 UE8M0 时保持规范 FP32 block 布局,不做打包
if runtime_requires_ue8m0 and transform_ue8m0:
scale = transform_scale_ue8m0(scale, mn=qweight.shape[-2])
else:
# 默认使用通用 triton 分块 FP8 转换
qweight, scale = blockwise_cast_to_fp8_triton(weight, weight_block_size)
scale_name = name.replace(".weight", ".weight_scale_inv")
else:
# per-tensor 量化:计算全局 scale,clamp 到 FP8 范围
scale = weight.abs().max().clamp(min=1e-12).to(torch.float32) / FP8_MAX
qweight = (weight / scale).clamp(min=FP8_MIN, max=FP8_MAX).to(torch.float8_e4m3fn)
scale = scale.view(1)
scale_name = name.replace(".weight", ".weight_scale")
return [(name, qweight), (scale_name, scale)]
slime/utils/arguments.py
configuration
注册新 CLI 参数 --force-fp8-ue8m0-scale
# slime/utils/arguments.py
def add_train_arguments(parser):
# ... 其他已有训练参数 ...
parser.add_argument(
"--force-fp8-ue8m0-scale",
action="store_true",
default=False,
help=(
"Quantize block-FP8 rollout weights with power-of-two FP32 scales, "
"independent of the training GPU architecture. Blackwell-only scale "
"packing remains controlled by the rollout runtime requirements."
),
)
# ... 后续 delta 权重同步等参数 ...
tests/test_megatron_argument_validation.py
test-coverage
新增参数解析测试,验证默认值和开关生效
# tests/test_megatron_argument_validation.py
@pytest.mark.unit
def test_force_fp8_ue8m0_scale_argument(monkeypatch):
module = load_slime_arguments_module(monkeypatch)
parser = argparse.ArgumentParser()
module.get_slime_extra_args_provider()(parser)
# 默认不开启
defaults = parser.parse_args(["--rollout-batch-size", "1"])
assert defaults.force_fp8_ue8m0_scale is False
# 显式开关后置为 True
configured = parser.parse_args(["--rollout-batch-size", "1", "--force-fp8-ue8m0-scale"])
assert configured.force_fp8_ue8m0_scale is True
当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。
默认关闭,不影响现有行为。风险在于强制 UE8M0 可能对非 Blackwell 硬件不兼容,需确认 quant_weight_ue8m0 已处理跨架构;文档缺失可能让用户误用;测试仅覆盖参数解析,未验证量化逻辑分支,尤其 force_ue8m0_scale=True 且 runtime_requires_ue8m0=False 时 scale 不 pack 的路径。
影响 FP8 量化流程:新增参数让高级用户可强制 UE8M0。对默认用户无行为变化,风险低。开发者需知晓参数并配合硬件架构设置。
当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。
参与讨论