Prhub

#39987 [ROCm] Add env flags to disable dynamic MXFP4 quant and enable AITER tuned GEMMs for Attention Projection Layers

原始 PR 作者 heachary 合并时间 2026-04-30 07:07 文件变更 5 提交数 12 评论 18 代码增减 +28 / -103

执行摘要

禁用 DeepSeek 注意力投影的动态 MXFP4 量化并启用 AITER 调优 BF16 GEMM

PR body 指出动态 MXFP4 量化在注意力投影层可能带来性能损失,尤其是在小 batch 或短序列场景下。通过微基准对比,BF16 调优 GEMM 在多数形状下优于 MXFP4 + 动态量化组合,因此默认禁用量化并启用更优的 BF16 路径。

建议阅读 Review 中的讨论,特别是关于避免添加环境变量的决策过程和性能基准的论证。该 PR 展示了如何通过实测数据驱动默认值变更,并保持灵活性。ROCm 相关开发者可关注 is_tgemm_enabled 的实现,以便类似场景复用。

讨论亮点
  • 避免新增环境变量:Rohan138 和 tjtanaa 强调应减少部署特定的环境变量。最终采纳建议,将新增变量替换为已有的 VLLM_ROCM_USE_AITER_LINEAR
  • 性能收益的普适性:heachary 提供微基准数据,显示 BF16 tgemm 在所有测试形状下均优于 MXFP4 + 动态量化,验证了默认行为变更的合理性。
  • 代码内聚性:dllehr-amd 建议将 is_linear_enabled 检查放入 is_tgemm_enabled 中,使调用点只有单一条件,最终被采纳。
  • 默认值陷阱:gemini-code-assist 机器人指出初期提交中 VLLM_ROCM_USE_AITER_TUNED_UNQUANTISED_GEMM 默认值错误地设为 True,会导致缺少 AITER 的用户崩溃,该问题在后续提交中修正。

实现拆解

  1. 移除动态 MXFP4 量化:在 vllm/model_executor/layers/quantization/quark/quark.py 中,删除 maybe_update_config 方法和相关常数,将 dynamic_mxfp4_quant 硬编码为 False,并添加注释说明原因。
  2. 添加 AITER tgemm 路径:在 vllm/model_executor/layers/utils.pyrocm_unquantized_gemm_impl 函数中,在原有 skinny 分支之后、线性回退之前,增加 rocm_aiter_ops.is_tgemm_enabled() 分支,调用 aiter.tuned_gemm.tgemm.mm
  3. 封装 tgemm 启用检查:在 vllm/_aiter_ops.py 中新增 is_tgemm_enabled 方法,该方法组合检查 AITER_LINEAR 环境和目标是否为 gfx950,返回布尔值。
  4. 更新环境变量文档:在 vllm/envs.py 中为 VLLM_ROCM_USE_AITER_LINEAR 添加注释,说明其现在也控制 tgemm 的启用。
  5. 删除相关测试:移除 tests/quantization/test_quark_maybe_update_config.py,因为其测试的 maybe_update_config 方法已不复存在。
文件 模块 状态 重要度
vllm/model_executor/layers/quantization/quark/quark.py 量化器 modified 7.2
vllm/model_executor/layers/utils.py GEMM 路由 modified 6.61
vllm/_aiter_ops.py AITER 封装 modified 5.63
vllm/envs.py 环境变量 modified 3.78
tests/quantization/test_quark_maybe_update_config.py 测试 removed 6.64

关键符号

maybe_update_config is_tgemm_enabled rocm_unquantized_gemm_impl

关键源码片段

vllm/model_executor/layers/quantization/quark/quark.py core-logic

核心变更:移除了动态 MXFP4 量化的强制启用逻辑,将 `dynamic_mxfp4_quant` 硬编码为 `False`,删除了 `maybe_update_config` 方法及相关测试依赖。

# vllm/model_executor/layers/quantization/quark/quark.pyclass QuarkConfig(QuantizationConfig):
    def __init__(self, ...):
        # ... 其他初始化
        # 注意:此标志保持禁用状态,因为动态 MXFP4 量化的开销
        # 抵消了转为 MXFP4 带来的性能收益。保留此字段以备将来可能重新启用。
        self.dynamic_mxfp4_quant = False
​
    # 原 maybe_update_config 方法已被删除,不再根据模型类型自动启用量化。
​
    def get_linear_method(self) -> "QuarkLinearMethod":
        return QuarkLinearMethod(self)
    # ... 其余方法保持不变
vllm/model_executor/layers/utils.py core-logic

GEMM 路由逻辑变更:在 `rocm_unquantized_gemm_impl` 中添加了 AITER tgemm 回退路径,作为 skinny 分支后的最后一个优化选择。

# vllm/model_executor/layers/utils.pydef rocm_unquantized_gemm_impl(
    x: torch.Tensor,
    weight: torch.Tensor,
    bias: torch.Tensor | None = None,
) -> torch.Tensor:
    # ... 之前的形状推导和 skinny 分支
​
    # 原代码中:if not use_skinny: 直接 return linear
    # 现在改为:
    if use_skinny:
        # ... 原有 skinny 逻辑
        return out # 提前返回
​
    # 新增 tgemm 回退:仅当 AITER 线性模式启用且为 gfx950 时
    if rocm_aiter_ops.is_tgemm_enabled():
        from aiter.tuned_gemm import tgemm
        return tgemm.mm(x, weight, bias)
​
    # 最终回退 PyTorch native
    return torch.nn.functional.linear(x, weight, bias)
vllm/_aiter_ops.py core-logic

封装 tgemm 启用检查:新增 `is_tgemm_enabled` 方法,集中管理对 AITER_LINEAR 和硬件平台的条件组合。

# vllm/_aiter_ops.py@classmethod
@if_aiter_supported
def is_tgemm_enabled(cls) -> bool:
    from vllm.platforms.rocm import on_gfx950
    # is_linear_enabled 检查 VLLM_ROCM_USE_AITER_LINEAR 是否开启
    return cls.is_linear_enabled() and on_gfx950()

评论区精华

应避免新增环境变量,复用现有机制 设计

Rohan138 和 tjtanaa 均反对引入新的 ROCm 环境变量,认为应减少部署特定配置。heachary 最初提出了两个新变量,后来同意移除。

结论:最终代码删除了两个新变量,改为复用已有的 `VLLM_ROCM_USE_AITER_LINEAR`,并将动态量化硬编码关闭。 · 已解决

性能数据是否足够支持默认行为变更 性能

Rohan138 要求提供微基准和端到端数据,证明 BF16 tgemm 全面优于 MXFP4 + 动态量化。heachary 提供了详尽的表格,显示 BF16 在几乎所有形状下更快。

结论:基于数据,移除量化并默认启用 tgemm 被认为是合理的。 · 已解决

is_tgemm_enabled 应内聚检查 is_linear_enabled 正确性

dllehr-amd 建议将 `is_linear_enabled` 检查放入 `is_tgemm_enabled` 内部,使调用点保持单一条件。heachary 采纳并实现。

结论:在 `is_tgemm_enabled` 中调用 `cls.is_linear_enabled()`,避免了重复检查。 · 已解决

风险与影响

  1. 默认行为变更:动态 MXFP4 量化永久关闭,可能对某些利用该量化精度的模型产生非预期效果,但微基准表明 BF16 精度更高且性能更优。
  2. 平台限制:tgemm 仅在 gfx950 上启用,其他 ROCm 平台(如 gfx90a)可能无法获得同等待优化,但可通过 VLLM_ROCM_USE_AITER_LINEAR=False 回退。
  3. 测试覆盖减少:删除专用测试文件后,需依赖其他集成测试验证此路径,可能遗漏回归。
  4. 依赖 AITER 版本aiter.tuned_gemm.tgemm 为可选依赖,若用户启用 VLLM_ROCM_USE_AITER_LINEAR 但未安装 AITER 将崩溃。

对使用 DeepSeek 系列模型(尤其是 FP4 量化变体)的 ROCm 用户,默认性能提升 5-15%(取决于 batch 大小和序列长度);无需任何配置。管理员可通过 VLLM_ROCM_USE_AITER_LINEAR=False 禁用 tgemm,或维持原有行为。对其他平台(NVIDIA、CPU)无影响。团队在维护上简化了量化配置逻辑,但新增了一条 AITER GEMM 路径。

默认行为变更 仅 gfx950 支持 测试覆盖删除 可选依赖崩溃风险

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论