ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

vLLM INT4 W4A16 量化实战:llm-compressor 校准压缩到 vLLM 推理评估全流程

2026/9/5 16:23:22 拓冰建站 浏览量
vLLM INT4 W4A16 量化实战:llm-compressor 校准压缩到 vLLM 推理评估全流程 vLLM INT4 W4A16 量化实战llm-compressor 校准压缩到 vLLM 推理评估全流程【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllmvLLM 支持将模型权重压缩为 INT4 位宽W4A164-bit 权重 16-bit 激活以显著降低显存占用与模型体积尤其适合低 QPS 但对延迟敏感的服务场景。本文完整覆盖从环境准备、校准数据构造、llm-compressor 一键量化到 vLLM 加载验证与lm_eval精度评估的全流程并结合 vLLM 源码深入解析 W4A16 量化模型在 vLLM 运行时中是如何被识别、反量化并经 Marlin 内核加速的帮助你不仅会量化还能理解其底层机制与调优抓手。1. INT4 W4A16 量化概述W4A16 属于 weight-only 量化权重以 4-bit 整数存储相比 FP16 约节省 4 倍权重显存前向计算时权重先反量化到 16-bit 再参与矩阵乘。这类格式在低 QPS 工作负载中收益明显——推理瓶颈往往在权重搬运而非算力减小权重体积即可降低带宽压力并维持低延迟。硬件前提来自官方文档的明确约束INT4 计算支持 NVIDIA GPU 计算能力 8.0 的架构即 AmpereSM 8.0/8.6、Ada LovelaceSM 8.9、HopperSM 9.0、Blackwell在 vLLM 整体量化支持矩阵中见 量化总览Marlin 系列内核覆盖 GPTQ/AWQ 等 INT4 权重路径自 Turing 起可用但本文档针对 llm-compressor 产出的 W4A16 checkpoint以计算能力 8.0为准。vLLM 侧消费的是 llm-compressor基于 compressed-tensors 规范保存的量化 checkpointconfig.json中的量化元数据会被自动识别无需在LLM(...)中额外指定quantization参数。更多压缩格式可参考 llm-compressor 概览其支持 FP8、INT8、INT4 等多种方案以及同目录的 FP8 W8A8 指南。2. 环境准备量化与服务部署应使用相互独立的虚拟环境因为 llm-compressor 与 vLLM 的依赖组合不一定兼容# 量化环境 (venv-llm-compressor) pip install llmcompressor # vLLM 推理 评估环境 (venv-vllm) pip install vllm lm-eval[api]0.4.12要点llmcompressor负责模型加载、校准前向与 GPTQ 量化改写产出自包含的压缩 checkpointvllm加载并推理量化模型lm-evaluation-harness 0.4.12用于量化前后精度回归验证--model vllm后端会调用 vLLM 引擎批量打分。3. 量化流程四步走整体流程分为四步加载模型、准备校准数据、应用量化、在 vLLM 中评估精度。3.1 第一步加载模型使用标准transformers自动类加载权重与分词器from transformers import AutoTokenizer, AutoModelForCausalLM MODEL_ID meta-llama/Meta-Llama-3-8B-Instruct model AutoModelForCausalLM.from_pretrained( MODEL_ID, device_mapauto, dtypeauto, ) tokenizer AutoTokenizer.from_pretrained(MODEL_ID)device_mapauto让 accelerate 自动切分大模型到多卡dtypeauto尊重 checkpoint 的torch_dtype声明避免精度意外降级。3.2 第二步准备校准数据W4A16 需要样本数据来估计权重更新与校准 scaleGPTQ 通过观测激活的统计信息决定逐通道量化误差的补偿量。经验法则校准数据越贴近部署时的真实流量量化后精度损失越小。对通用指令微调模型官方示例采用ultrachat数据from datasets import load_dataset NUM_CALIBRATION_SAMPLES 512 MAX_SEQUENCE_LENGTH 2048 # Load and preprocess the dataset ds load_dataset(HuggingFaceH4/ultrachat_200k, splittrain_sft) ds ds.shuffle(seed42).select(range(NUM_CALIBRATION_SAMPLES)) def preprocess(example): return {text: tokenizer.apply_chat_template(example[messages], tokenizeFalse)} ds ds.map(preprocess) def tokenize(sample): return tokenizer(sample[text], paddingFalse, max_lengthMAX_SEQUENCE_LENGTH, truncationTrue, add_special_tokensFalse) ds ds.map(tokenize, remove_columnsds.column_names)关键细节先shuffle(seed42)再select保证校准样本在数据集内均匀分布避免头部样本偏置用apply_chat_template把多轮messages渲染成模型训练时见过的完整对话文本而不是裸拼接truncationTrue防止超长样本污染校准批次add_special_tokensFalse避免重复插入模板自带的特殊 token。3.3 第三步应用量化并保存from llmcompressor import oneshot from llmcompressor.modifiers.quantization import GPTQModifier from llmcompressor.modifiers.smoothquant import SmoothQuantModifier # Configure the quantization algorithms recipe GPTQModifier(targetsLinear, schemeW4A16, ignore[lm_head]) # Apply quantization oneshot( modelmodel, datasetds, reciperecipe, max_seq_lengthMAX_SEQUENCE_LENGTH, num_calibration_samplesNUM_CALIBRATION_SAMPLES, ) # Save the compressed model: Meta-Llama-3-8B-Instruct-W4A16-G128 SAVE_DIR MODEL_ID.split(/)[1] -W4A16-G128 model.save_pretrained(SAVE_DIR, save_compressedTrue) tokenizer.save_pretrained(SAVE_DIR)参数解读参数含义targetsLinear只量化nn.Linear类型的层注意 MoE 专家权重也是 Linear 子类默认会一并压缩schemeW4A164-bit 对称整数权重 16-bit 激活的快捷写法等价于 GROUP 策略、group_size128的完整配置ignore[lm_head]输出投影层不量化避免词表映射处误差被放大max_seq_length/num_calibration_samples校准前向时的截断长度与样本数须与数据预处理阶段一致save_compressedTrue保存时把 4-bit 打包权重packed weights连同 scale 等元数据一起写入 checkpointvLLM 直接按压缩格式加载无需二次转换保存目录名中的G128表示 group size 128每 128 个权重共享一组 scale是精度与压缩率之间的常用折中。3.4 第四步在 vLLM 中加载并评估精度量化完成后用 vLLM 直接加载本地压缩 checkpoint量化配置会从config.json自动识别from vllm import LLM llm LLM(./Meta-Llama-3-8B-Instruct-W4A16-G128)再用lm_eval做精度回归。以 GSM8K 为例lm_eval --model vllm \ --model_args pretrained./Meta-Llama-3-8B-Instruct-W4A16-G128,add_bos_tokentrue \ --tasks gsm8k \ --num_fewshot 5 \ --limit 250 \ --batch_size auto--batch_size auto让 harness 自适应选择吞吐最优的批大小--limit 250便于快速抽查正式验收时去掉该参数跑全量务必携带add_bos_tokentrue量化模型对bostoken 的有无往往敏感校准数据是否含特殊 token 会影响 scale 估计评估时与训练/校准侧的分词约定保持一致否则会出现难以归因的精度偏差。建议将基座模型的原始精度分数一并跑出量化后做逐任务对比确认损失在业务可接受范围内再上线。4. 最佳实践与超参调优官方文档给出的经验清单校准数据从512 条起步精度不达标时逐步增加校准集要有足够多样性避免过拟合到某一类用法序列长度从2048起步使用模型训练时的chat / instruction 模板渲染校准文本若模型经过微调优先取训练数据的子集做校准调优量化算法的核心超参dampening_frac控制 GPTQ 正则化的强度。取值更低通常精度更好但过小可能引入数值不稳定导致算法发散失败actorder决定权重通道被量化的顺序。按激活重要性排序如actorderweight可以在不增加运行时延迟的前提下改善精度。一个可按需扩展的完整 recipe 示例显式声明 GROUP 策略与分组量化细节from compressed_tensors.quantization import ( QuantizationArgs, QuantizationScheme, QuantizationStrategy, QuantizationType, ) recipe GPTQModifier( targetsLinear, config_groups{ config_group: QuantizationScheme( targets[Linear], weightsQuantizationArgs( num_bits4, typeQuantizationType.INT, strategyQuantizationStrategy.GROUP, group_size128, symmetricTrue, dynamicFalse, actorderweight, ), ), }, ignore[lm_head], update_sizeNUM_CALIBRATION_SAMPLES, dampening_frac0.01, )对照快捷写法可以读出schemeW4A16的默认展开num_bits4、typeINT、strategyGROUP、group_size128、symmetricTrue、dynamicFalse。当你需要非对称量化、更大 group size 或调整 GPTQ 行为时切换到这种config_groups显式写法即可。5. 源码透视vLLM 如何执行 W4A16 推理上面产出的是 compressed-tensors 规范 checkpoint。vLLM 侧的加载与执行链路如下均可在仓库中直接查证。5.1 配置识别与方案分发入口在 compressed_tensors.pyCompressedTensorsConfig解析config.json中的quantization_config逐组判断权重/激活的位宽与策略后分发到具体 scheme。对标准 INT4 权重-only 配置非 MXFP4/NVFP4 等特殊路径最终走CompressedTensorsWNA16分支该文件约第 801 行的分发点——源码注释也明确说明标准 4/8-bit 权重-only无输出激活 scale仍落入 WNA16。5.2 CompressedTensorsWNA16 方案实现实现位于 compressed_tensors_wNa16.py几个值得注意的实现细节位宽打包pack_factor Fraction(32, num_bits)4-bit 时一个 32-bit 整数打包 8 个权重对应 vLLM 的PackedvLLMParameter保证按32/4的粒度做张量并行切分支持的位宽从源码结构看WNA16_SUPPORTED_TYPES_MAP覆盖 2~8 bit 的多个非标准位宽uint2b2、uint3b4、uint4b8、uint5b16、uint6b32、uint7b64、uint8b128W4A16 对应scalar_types.uint4b8非对称零点是 4/8 bit 支持的额外能力actorder 落地self.has_g_idx actorder ActivationOrdering.GROUP即第 4 节 recipe 里的actorderweight在运行时体现为额外的通道排序索引g_idx由 Marlin 内核按序反量化约束校验pack 量化必须使用 group 或 channel 策略group_size -1且非 channel 会直接报错这与 llm-compressor 侧strategyGROUP的配置形成呼应。5.3 Marlin 内核执行该方案通过 kernels/linear 中的choose_mp_linear_kernel选择混精度线性内核W4A16 的典型执行路径是MarlinLinearKernel激活保持 16-bit4-bit 打包权重 group scale 直接在 Marlin GEMM 内核内解包参与运算。这也解释了文档中INT4 计算要求计算能力 8.0的来源——Marlin 依赖 Ampere 及以上架构的指令特性。5.4 MoE 模型如果量化对象是 MoE 架构压缩后的专家权重由 compressed_tensors_moe 下的方案处理按激活位宽分发到 WNA16/FP8 等内核如compressed_tensors_moe_wna16_rdna3.py、compressed_tensors_moe_w4a16_flydsl.py等平台实现。llm-compressor 的targetsLinear同样会覆盖专家投影评估 MoE 模型时同样建议对比量化前后基准分数。6. 故障排查精度异常偏低优先检查add_bos_token是否与校准/训练侧一致、lm_head是否已忽略、校准数据是否与目标负载分布相符其次考虑增大NUM_CALIBRATION_SAMPLES或降低dampening_frac量化过程数值不稳定/报错调大dampening_fracvLLM 加载失败确认save_compressedTrue保存、checkpoint 的config.json中quantization_config完整、GPU 计算能力 8.0遇到问题或提交功能需求可到 llm-compressor 项目的 issue 区反馈完整的 W4A16 示例脚本也在 llm-compressor 仓库的 examples 目录quantization_w4a16/llama3_example.py中可查阅。小结环节工具/组件仓库内可查证位置量化产出llm-compressoroneshotGPTQModifierW4A16本文第 3.3 节完整 recipe格式规范compressed-tensorsquantization_configcompressed_tensors.py运行时方案CompressedTensorsWNA162~8 bitGROUP/CHANNELactordercompressed_tensors_wNa16.py加速内核MarlinMarlinLinearKernelkernels/linear精度验收lm_eval --model vllm本文第 3.4 节命令掌握本文流程后你可以针对任意指令微调 LLM 完成一条可复现的压缩 → 服务 → 验证链路用贴近业务的校准数据跑 llm-compressor产出W4A16-G128checkpoint 后直接交给 vLLM 加载并用 lm-eval 量化前后对比把关精度。【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考