vLLM 量化部署:AWQ、GPTQ 与 FP8 配置

梳理 AWQ、GPTQ 与 FP8 的部署选择,说明量化如何以模型精度换取更小显存占用,并按目标 GPU 核对兼容性、加载检查点及控制模型显存边界。

部署 AWQ、GPTQ 与 FP8,先按目标 GPU 核对量化兼容性,再决定加载现有检查点还是生成新的量化检查点;不要把 vLLM 各格式的配置互相套用。实际操作应先匹配格式与硬件,再使用对应入口,并把“模型能加载”与“输出可用”分开验证。下面按官方文档给出各格式的配置方法和容易误用的地方。

先确认量化格式和目标 GPU

官方的量化说明与兼容表把量化定义为以模型精度换取更小的显存占用,并说明了 GPU 代际与 SM 计算能力的对应关系;兼容范围可能随项目支持变化而调整。

Volta   = SM 7.0
Turing  = SM 7.5
Ampere  = SM 8.0/8.6
Ada     = SM 8.9
Hopper  = SM 9.0
  • AWQ 不支持 Volta 和 AMD GPU;支持 Turing、Ampere、Ada、Hopper、Intel GPU 和 x86 CPU。
  • llm-compressor FP8(W8A8)的支持列为 Ada、Hopper 和 AMD GPU。

开始前先确认显卡代际和计算能力。如果格式不在支持范围内,应先调整模型或硬件,而不是反复更换启动参数。

若模型仍然装不下,官方显存配置说明指出,降低 max_model_len 和 max_num_seqs 可以减少内存占用;CUDA graphs 默认启用并额外占用 GPU 内存,enforce_eager 可以完全关闭 graph capture。

max_model_len
max_num_seqs
enforce_eager

先按实际上下文长度和并发量调整前两个参数,仍有显存压力时再考虑 enforce_eager。

AWQ:使用现有检查点加载

官方AutoAWQ 说明称 AutoAWQ 库已经弃用,相关功能已由项目迁移到 llm-compressor。加载已有 AWQ 检查点时,文档仍给出以下运行时标识:

llm = LLM(model="TheBloke/Llama-2-7b-Chat-AWQ", quantization="auto_awq")

这里的模型标识来自官方示例,不代表需要重新安装已弃用的 AutoAWQ。目标 GPU 必须先通过前节的 AWQ 支持边界;上述调用用于检查模型加载路径,不能单独证明输出质量。

GPTQ:先确认模型产物和加载方式

官方GPTQModel 说明指出,GPTQModel 可生成 4-bit 或 8-bit GPTQ 模型供推理引擎运行;Ampere 和 Hopper 上的兼容模型可以使用 Marlin 与 Machete kernel。

现有说明没有为不同 GPTQ 检查点给出可统一套用的加载参数。不要把 AWQ 的 quantization="auto_awq" 复制给 GPTQ;具体产物和加载方式应回到当前 GPTQModel 文档及模型发布说明核对。

FP8:选择生成方式或加载时转换

官方FP8 W8A8 文档给出的硬件路径是:FP8 W8A8 可在 Nvidia H100、AMD MI300x 等 GPU 上使用硬件加速,NVIDIA FP8 计算要求 compute capability >= 8.9;Turing 和 Ampere 则通过 Marlin kernel 运行 weight-only W8A16。

生成 FP8 检查点

生成工具应与推理环境分开安装:

pip install llmcompressor

文档给出的 FP8_DYNAMIC 配方如下:

recipe = QuantizationModifier(targets="Linear", scheme="FP8_DYNAMIC", ignore=["lm_head"])

它以 FP8_DYNAMIC 处理 Linear 层,并忽略 lm_head。这一流程不需要 calibration data。

加载 FP8 模型

llm-compressor 保存的模型通过本地目录加载:

llm = LLM("./Meta-Llama-3-8B-Instruct-FP8-Dynamic")

如果从 BF16 或 FP16 模型开始,并希望在加载时转换,可向模型参数追加以下选项:

--quantization="fp8_per_tensor"

该代码块只是需要追加的选项,不是可独立执行的完整启动命令。若使用 lm_eval 检查精度,还应加入:

add_bos_token=True

用 vLLM 验证加载,并避开常见错误

先运行对应章节给出的 Python 加载表达式。构造函数完成且没有模型、配置或 kernel 错误,可以记为“加载检查通过”,但它不代表量化后的输出已经可用。随后应使用代表性数据做精度评估,并沿用上一节的 add_bos_token=True。

这些说明没有建立跨格式通用的 HTTP 验证端点,因此不要猜测服务路径。排查时重点检查:

  • 是否先核对了量化格式与 GPU 代际。
  • 是否继续按照旧教程安装 AutoAWQ。
  • 是否把 Turing、Ampere 的 W8A16 路径误当成原生 W8A8。
  • 是否把 --quantization="fp8_per_tensor" 当成完整启动命令。
  • 是否把 AWQ 的 auto_awq 参数用于 GPTQ。
  • 显存不足时是否遗漏了上下文、批量限制和 CUDA graphs 的显存占用。

文中步骤依据正文所链接的官方文档整理,没有执行这些步骤;使用前请对照当前版本复核。

资料来源