执行摘要
本PR重构了vLLM中AWQMarlinLinearMethod,使其在ROCm平台上使用choose_mp_linear_kernel框架,解决了原先AWQ模型被迫绕过该框架导致的性能瓶颈。通过添加AWQ到标准格式的转换并调整平台检查,实现了在ROCm设备上使用AWQMarlinConfig,基准测试显示prefill提升57%、decode提升73%的显著性能改进。
功能与动机
在ROCm平台上,AWQ模型原先通过AWQConfig → AWQLinearMethod → ops.awq_gemm路径运行,完全绕过了choose_mp_linear_kernel框架,导致性能受限。如PR body所述:“On ROCm, AWQ models were forced through AWQConfig → AWQLinearMethod → ops.awq_gemm, bypassing the choose_mp_linear_kernel framework entirely。” 本PR旨在纠正此问题,采纳了量化SIG会议中@mgoin的建议,通过重构使AWQMarlinConfig在ROCm上可用,并利用现有框架提升效率。
实现拆解
实现包括四个关键改动:
- 兼容性检查:在
is_awq_marlin_compatible中使用is_cuda_alike()替代is_cuda(),以扩展支持到ROCm。
- AWQMarlinLinearMethod重构:重写该类以使用
choose_mp_linear_kernel,在process_weights_after_loading中添加AWQ到标准格式的转换步骤,修复非标准位序和打包维度问题。
- 转换函数_convert_awq_to_standard_format处理qweight和qzeros,从输出维打包转换为输入维打包。
- 平台检查跳过:在
query_marlin_supported_quant_types中,对于ROCm跳过NVIDIA的device_capability检查,因为ROCm设备能力语义不匹配。
- 对称量化修复:在
ConchLinearKernel中,通过register_parameter(name, None)清除零点属性,以处理无零点的对称量化情况。
评论区精华
review讨论聚焦于两个核心点:
- 平台检查设计:gshtras指出:“Did any other non-cuda platforms rely on this condition? If this is meant to enable ROCm, the better condition would be if not is_rocm than is_cuda”。经过讨论,mgehre-amd采纳建议,将条件改为
not is_rocm(),以避免混淆其他平台。
- 性能优化建议:gemini-code-assist[bot]建议向量化AWQ格式转换中的循环:“This for-loop for repacking qweight can be vectorized for better performance during model loading。” 但讨论中未明确是否采纳此优化。
风险与影响
风险:
- AWQ格式转换逻辑复杂,可能引入数值错误,影响模型推理准确性。
- 平台检查修改为
not is_rocm(),可能意外影响非CUDA、非ROCm平台(如CPU或其他GPU后端),需谨慎测试。
- 新代码路径增加了维护负担,性能优化建议未确认采纳,可能存在加载性能瓶颈。
影响:
- 用户:ROCm用户现在可以启用AWQMarlinConfig,获得高达73%的解码速度提升,改善大规模部署效率。
- 系统:代码更统一,减少了特殊路径,便于未来扩展和调试。
- 团队:需确保转换逻辑的稳定性,并监控ROCm环境下的回归测试。
关联脉络
本PR是vLLM中ROCm支持持续改进的一部分。关联PR包括:
- PR #36100 “[ROCm] Fix fused_moe_fake signature mismatch and other AITER bugs”:同样针对ROCm量化操作修复,显示了团队对AMD硬件优化的专注。
- PR #32929 “[FP8]add FP8 WoQ kernel abstraction.”:涉及内核抽象框架重构,与本PR使用choose_mp_linear_kernel的设计一脉相承,反映了vLLM向统一量化内核框架的演进趋势。
参与讨论