LMDeploy W8A8 量化部署实战:SmoothQuant INT8/FP8 权重量化、离线推理与在线服务全指南
发布时间:2026/9/27 21:16:06来源:尧图网络
人工智能大模型模型推理服务推理引擎本地部署模型量化【免费下载链接】lmdeployLMDeploy is a toolkit for compressing, deploying, and serving LLMs.项目地址https://gitcode.com/gh_mirrors/lm/lmdeploy点击查看免费下载本文是一份围绕 LMDeploy 开源仓库中 W8A8权重 8-bit 激活 8-bit量化能力编写的完整实战指南。文章以 docs/zh_cn/quantization/w8a8.md 为核心骨架系统讲解如何基于 SmoothQuant 算法对 LLM 进行 INT8 / FP8 量化并结合仓库源码lmdeploy/lite/apis/smooth_quant.py、lmdeploy/pytorch/models/q_modules.py、lmdeploy/pytorch/kernels/cuda/w8a8_triton_kernels.py深入剖析平滑smoothing、模块替换module replacement与动态量化推理的底层原理。读完本文你将掌握W8A8 量化的适用硬件与基本概念、lmdeploy lite smooth_quant命令行工具的完整参数与用法、量化模型的离线推理pipeline与在线服务api_server部署方法以及量化流程每一步在源码中的真实实现。W8A8 量化概述INT8 与 FP8W8A8 表示模型权重Weight以 8-bit 存储、激活值Activation以 8-bit 表示的量化方案。相比常见的 4-bit 权重量化如 AWQ、GPTQW8A8 保留了更高的精度同时通过 8-bit 整数INT8或 8-bit 浮点数FP8计算显著降低显存占用与访存带宽是压缩、部署、服务 LLMLMDeploy 项目定位的重要环节。LMDeploy 同时支持 INT8 与 FP8 两种 8-bit 量化数据类型。由于 FP8float8_e4m3fn依赖于新一代 GPU 的原生支持两种数据类型的可用硬件范围不同官方文档给出如下 NVIDIA GPU 支持矩阵量化类型支持的 GPU 架构代表型号INT8Voltasm70V100INT8Turingsm7520 系列、T4INT8Amperesm80、sm8630 系列、A10、A16、A30、A100INT8Ada Lovelacesm8940 系列INT8Hoppersm90H100FP8Ada Lovelacesm8940 系列FP8Hoppersm90H100从表中可以看出INT8 覆盖从 V100 到 H100 的绝大多数 NVIDIA 数据中心 GPU而 FP8 仅支持 40 系列Ada Lovelace与 H100Hopper及更新架构。在lmdeploy/pytorch/kernels/cuda/w8a8_triton_kernels.py的__main__测试代码中也可以看到is_fp8_supported device_map[0] 9的判断逻辑——FP8 测试仅在计算能力 9.x即 Hopper及以上的设备上执行与文档描述一致。安装 LMDeploy量化、推理与服务全流程依赖完整的 LMDeploy 工具链执行以下命令安装全部依赖pip install lmdeploy[all][all]扩展包含推理所需的 Triton 内核编译环境、服务端等组件。量化过程中会通过 Hugging Face Hub 下载模型权重与校准数据集因此请确保网络可访问或提前准备好本地模型目录。8-bit 权重量化三步流程LMDeploy 的 W8A8 量化基于SmoothQuant思想整体流程可以拆解为三步权重平滑Weight Smoothing对语言模型的权重进行平滑处理把激活值中的离群点outliers迁移到权重侧使激活分布更规整从而让后续 8-bit 量化更加稳定、精度损失更小。模块替换Module Replacement将原模型DecoderLayer中的RMSNorm模块替换为QRMSNorm将nn.Linear模块替换为QLinear。这两个量化模块定义在 lmdeploy/pytorch/models/q_modules.py 中负责在推理时完成归一化动态量化与8-bit 矩阵乘反量化。保存量化模型Save Quantized Model完成上述替换后将新模型、tokenizer 与量化配置保存到工作目录得到可直接被 LMDeploy 加载推理的量化 checkpoint。这三步在源码中被封装为一个整体。打开 lmdeploy/lite/apis/smooth_quant.py 可以看到smooth_quant函数入口的完整签名def smooth_quant(model: str, work_dir: str ./work_dir, calib_dataset: str wikitext2, calib_samples: int 128, calib_seqlen: int 2048, search_scale: bool False, batch_size: int 1, w_bits: int 8, dtype: Literal[float16, bfloat16, auto] auto, device: str cuda, quant_dtype: Literal[int8, fp8, float8_e4m3fn, float8_e5m2] int8, revision: str None, download_dir: str None, trust_remote_code: bool False):其中--quant-dtype参数用于控制量化结果是 8-bit 整数还是浮点数类型int8对应torch.int8fp8是float8_e4m3fn的简写。源码第 33-36 行明确实现了这一映射if quant_dtype fp8: quant_dtype float8_e4m3fn quant_dtype getattr(torch, quant_dtype, torch.int8)同时函数第 42 行通过assert q_dtype_info.bits w_bits校验量化数据类型的位宽必须与w_bits默认 8一致防止误用。命令行入口lmdeploy lite smooth_quant是上述三步的 CLI 封装命令解析逻辑定义在 lmdeploy/cli/lite.py其子命令smooth_quant最终调用 lmdeploy/lite/apis/smooth_quant.py 中的同名函数。更多参数细节可执行lmdeploy lite smooth_quant --help查看。以下示例分别演示了 int8 与 fp8 两种量化方式以 InternLM2.5-7B-Chat 为例INT8 量化lmdeploy lite smooth_quant internlm/internlm2_5-7b-chat --work-dir ./internlm2_5-7b-chat-int8 --quant-dtype int8FP8 量化lmdeploy lite smooth_quant internlm/internlm2_5-7b-chat --work-dir ./internlm2_5-7b-chat-fp8 --quant-dtype fp8--quant-dtype的合法取值在 lmdeploy/cli/utils.py 中定义为[int8, float8_e4m3fn, float8_e5m2, fp8]其中fp8等价于float8_e4m3fnfloat8_e5m2是另一种 FP8 格式精度范围不同通常用于对范围要求更高的场景。命令行参数速查表结合 lmdeploy/cli/lite.py 与smooth_quant函数签名smooth_quant子命令支持以下主要参数参数默认值说明model必填模型名Hugging Face Hub 上的仓库名或本地 HF 格式模型路径--work-dir./work_dir量化模型的输出目录--quant-dtypeint8量化数据类型int8/float8_e4m3fn/float8_e5m2/fp8--calib-datasetwikitext2校准数据集支持wikitext2、c4、pileval、gsm8k、neuralmagic_calibration、open-platypus、openwebtext--calib-samples128校准样本数量--calib-seqlen2048校准样本的序列长度--calib-batchsize1校准推理的 batch size显存紧张时调小追求速度时可调大--calib-search-scale关闭是否搜索平滑比例scale ratio开启后使用 AWQ 式比例搜索而非固定 0.5--dtypeauto加载权重与校准推理的精度float16/bfloat16/auto--devicecuda量化计算设备支持cuda或npu--revision无模型版本分支名、tag 或 commit id--download-dir无模型权重下载目录默认使用 Hugging Face 缓存目录--trust-remote-code关闭加载需要远端代码的模型时开启量化流程源码级解析下面结合源码逐环节说明lmdeploy lite smooth_quant内部做了什么第一步加载模型并校准。函数先调用 lmdeploy/lite/apis/calibrate.py 中的calibrate加载 HF 模型与 tokenizer在wikitext2等校准数据集上以少量样本默认 128 条、seqlen 2048前向推理统计各层激活值的分布并把统计结果导出为work_dir/inputs_stats.pth。校准时的关键设计是_prepare_for_calibratecalibrate.py——将目标DecoderLayer与lm_head留在 CPU 上其余模块搬到 GPU从而显著降低校准阶段的显存占用。需要说明的是校准与量化仅支持特定模型架构。LAYER_TYPE_MAP/NORM_TYPE_MAPcalibrate.py中注册了 InternLM2/3、Qwen2/3、Qwen3Moe、Qwen3_5、Llama、Phi3、ChatGLM、Mixtral、Qwen2VL、Qwen2_5_VL、Mistral 等架构若模型类型不在映射表中会直接抛出RuntimeError提示不支持。第二步权重平滑。从inputs_stats.pth读取激活统计act_scales inp_stats[absmax]smooth_quant.py。随后根据search_scale分支默认search_scaleFalse调用smooth_layerslmdeploy/lite/quantization/awq.py按NORM_FCS_MAP/FC_FCS_MAP描述的层间关系对每个RMSNorm及其下游线性层、每个线性层及其下游层执行平滑。开启search_scale调用awq_layersawq.py使用校准阶段搜索出的逐层平滑比例ratios替代固定比例。平滑的核心数学实现在smooth_ln_fcsawq.py默认平滑比例alpha0.5平滑系数由act_scales.pow(alpha) / w_scales.pow(1 - alpha)计算得到然后对 RMSNorm 权重执行ln.weight.div_(scales)、对下游线性层执行fc.weight.mul_(scales.view(1, -1))从而把激活离群点搬进权重。代码中还处理了多种边界情况ln.weight为零的位置跳过平滑、GQA如 LLaMA2 的 v_proj 与 o_proj维度不匹配时直接返回、Qwen/Phi3 融合型 QKV/GateUp 只缩放 V 与 Up 部分等并在每层结束后打印 GPU 峰值显存。第三步模块替换与保存。平滑完成后通过collect_target_modules收集所有nn.Linear与 RMSNorm 模块逐一执行smooth_quant.pyfor modules, q_cls in ((fcs, QLinear), (rmsnorms, QRMSNorm)): for name, module in modules.items(): ... q_module q_cls.from_float(module, quant_dtypequant_dtype) parent_name, _, child_name name.rpartition(.) parent model.get_submodule(parent_name) setattr(parent, child_name, q_module)其中from_float负责把浮点权重真正量化成 8-bit 并保存 scale见下文推理内核一节。名中包含lora或模型架构注册的跳过模式MODELS.get(arch).skipped_modules()的模块不会被量化而是记录进quantization_config[modules_to_not_convert]。最后量化配置以quant_methodsmooth_quant、quant_dtype字段写入model.config并通过model.save_pretrained(work_dir, safe_serializationTrue)与tokenizer.save_pretrained(work_dir)保存smooth_quant.py。对于视觉语言模型VL则走save_vl_model分支一并保存视觉塔与语言模型。量化模型的离线推理量化完成后得到的就是一个标准 HF 格式的 checkpoint外加quantization_config标记。LMDeploy 的 pipeline 接口可以直接加载它仅需几行代码即可完成离线推理from lmdeploy import pipeline, PytorchEngineConfig engine_config PytorchEngineConfig(tp1) pipe pipeline(internlm2_5-7b-chat-int8, backend_configengine_config) response pipe([Hi, pls intro yourself, Shanghai is]) print(response)要点说明backend_config指定 PyTorch 推理后端W8A8 量化模型走 PyTorch 引擎tp1表示单卡张量并行显存或性能需要时可按2^n增大tp。模型路径既可以是上文--work-dir输出的本地目录也可以是已经上传到 Hub 的量化模型仓库名。关于 pipeline 的完整用法batch 推理、流式输出、多模态输入等参见 pipeline 指南。推理服务部署api_server 一键服务化除离线推理外LMDeploy 的api_server支持把量化模型一键封装为服务对外提供兼容 OpenAI 规范的 RESTful API。启动命令如下lmdeploy serve api_server ./internlm2_5-7b-chat-int8 --backend pytorch服务默认端口为23333。--backend pytorch与离线推理保持一致指定 PyTorch 后端以加载 W8A8 量化模型。服务启动后可在终端通过内置的api_client与 server 对话lmdeploy serve api_client http://0.0.0.0:23333此外访问http://0.0.0.0:23333可以直接在浏览器中打开Swagger UI在线阅读并试用各接口各接口如/v1/chat/completions、/v1/completions的定义与使用方法可查阅 api_server 文档。推理内核原理QRMSNorm 与 QLinear 的动态量化W8A8 量化模型在推理时不再走原版RMSNormnn.Linear而是由量化模块在前向过程中动态量化激活值这是 SmoothQuant 方案与静态量化如 WeightOnly、静态 FP8的核心区别。量化模块定义在 lmdeploy/pytorch/models/q_modules.pyQTensorq_modules.py封装量化后的张量 scale zero_point的数据类并把不存在的属性转发给内部原始 tensor便于无缝接入后续算子。QRMSNormq_modules.pyforward中先完成传统 RMS 归一化再调用rms_norm_dynamic_quant对归一化输出做逐 token 动态量化返回QTensor。QLinearq_modules.py权重在from_float时经per_channel_quant量化为 8-bit 并保存逐通道 scalebufferfloat32forward中若输入是普通 tensor 则先做逐 token 量化per_token_quant_int8若输入已是QTensor来自上一层QRMSNorm则直接复用其量化结果然后调用matmul_kernel_dynamic_quant完成 8-bit 矩阵乘最后按rms_scale * linear_scale反量化回 float16 输出。这些算子的 Triton 实现集中在 lmdeploy/pytorch/kernels/cuda/w8a8_triton_kernels.pyrms_norm_dynamic_quant第 463-513 行RMS 归一化 逐 token 动态量化 kernel支持带残差融合add_rms_norm_quant_kernel。per_token_quant_int8第 258-290 行激活值按absmax / Q_MAX求 scale 并量化Q_MAX由torch.iinfo/torch.finfo依据量化类型动态确定INT8 会 round 到整数FP8 则直接按浮点截断。matmul_kernel_dynamic_quant第 157-216 行8-bit GEMM Triton kernel_linear/_linear_add通过triton.autotune在BLOCK_M×BLOCK_N×BLOCK_K多组配置间自动择优累加器根据输入是否为浮点类型选择fp32或int32最终c c * rms_scale * linear_scale完成反量化可选残差与 bias 融合。per_channel_quant为逐通道权重量化权重量化在from_float阶段一次性完成属于静态量化侧。值得一提的还有 lmdeploy/pytorch/kernels/default/w8a8_kernels.py 提供的默认非 Triton实现以及lmdeploy/pytorch/kernels/w8a8_triton_kernels.py中通过FunctionDispatcher按后端分发算子的机制——同一个接口在 CUDA、默认等不同后端下会自动路由到对应实现。lmdeploy/pytorch/kernels/cuda/w8a8_triton_kernels.py的__main__中还内置了test_rms_and_linear/test_per_token_quant数值一致性校验与bench_rms_and_linear基准测试可直接作为内核正确性与性能的参考验证工具。总结与注意事项围绕 W8A8 量化本文覆盖了从原理、量化、推理到服务的完整链路。实际使用时有几点值得注意硬件先行FP8 量化仅适用于 Ada Lovelace40 系列与 HopperH100及更新架构老卡请选择--quant-dtype int8。校准数据与样本量默认wikitext2与 128 个样本即可获得较好效果分布与目标场景差异大时可换用c4、gsm8k等数据集完整支持列表见 calibrate.py。精度选项--calib-search-scale会额外搜索每层最优平滑比例AWQ 式通常能进一步降低精度损失但校准耗时更长。显存控制校准阶段大模型请保持默认--calib-batchsize 1必要时结合_prepare_for_calibrate的 CPU/GPU 分层放置机制控制峰值显存。模型架构支持量化前请确认模型架构已注册在LAYER_TYPE_MAP/NORM_TYPE_MAPcalibrate.pyMixtral 等 MoE 模型会自动展开专家层映射update_moe_mappingcalibrate.py。推理/服务统一走 PyTorch 后端离线推理与服务部署均需显式指定PytorchEngineConfig或--backend pytorch。如需进一步了解 SmoothQuant 之外的其他量化路径如 AWQ 4-bit 权重量化、GPTQ、KV Cache 量化可继续阅读 W4A16 量化指南 与 KV Cache 量化指南。赞分享人工智能大模型模型推理服务推理引擎本地部署模型量化【免费下载链接】lmdeployLMDeploy is a toolkit for compressing, deploying, and serving LLMs.项目地址https://gitcode.com/gh_mirrors/lm/lmdeploy点击查看免费下载相关推荐LMDeploy W8A8 权重量化实战指南SmoothQuant 实现 INT8/FP8 模型量化与部署LMDeploy W8A8 权重量化实战指南SmoothQuant 实现 INT8/FP8 模型量化与部署 W8A8Weight 8 bit, Activa人工智能大模型模型推理服务推理引擎本地部署模型量化vLLM-Omni Int8 W8A8 量化指南Diffusion Transformer 在线量化与序列化权重加载实战vLLM Omni Int8 W8A8 量化指南Diffusion Transformer 在线量化与序列化权重加载实战 本篇技术指南聚焦 vLLM Omni人工智能大模型模型推理服务多模态语音音频媒体生成本地部署vLLM FP8 W8A8 量化实战用 llm-compressor 离量化与在线动态量化的完整指南vLLM FP8 W8A8 量化实战用 llm compressor 离量化与在线动态量化的完整指南 FP88 位浮点量化是让 LLM 推理同时获得显存缩人工智能大模型模型推理服务推理引擎本地部署上一篇MSYS2高级用法CI/CD集成、多环境管理和自动化构建技巧下一篇深度解析OpenCore Legacy Patcher为旧Mac设备解锁现代macOS的完整技术方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网