资讯动态

模型量化实战指南:从PTQ、QAT选型到精度调优与部署避坑

发布时间:2026/10/21 5:16:31 来源:尧图企业网站定制
模型量化这个事儿我以前总觉得是“训练完顺手加个参数”的小事直到自己亲手把一个开源大模型塞进生产环境被显存、延迟和精度同时按在地上摩擦之后才意识到这压根是一整套系统工程。从理论到实践中间隔着校准集、缩放因子、混合精度、算子融合还有一堆文档里没写、只能靠踩坑才能总结出来的细节。如果你正在做AI原生应用比如把大模型部署成线上推理服务或者在手机、边缘设备上跑本地模型这篇文章就是写给你看的。我会完整拆解量化的核心原理、方案选型PTQ、QAT、动态量化、实操校准流程、精度调优方法和部署阶段的坑点尽量做到看完就能照着动手。1. 为什么AI原生应用绕不开模型量化1.1 显存和带宽才是真正的瓶颈很多人一提到模型推理第一反应是“算力不够”也就是FLOPs太高。但在实际部署AI原生应用的时候尤其是跑大模型这种动辄几十上百亿参数的模型最先卡住的往往是显存容量和显存带宽。我举个例子算笔账一个70亿参数的全精度模型FP32参数体积大概是28GB哪怕换成BF16也需要14GB。如果模型是自回归结构推理时要频繁读取全部权重显存带宽的占用会非常恐怖。你可能会说“我有A100/H100显存管够”但你要知道AI原生应用不只是跑一个离线脚本它往往要同时服务多个用户、多路并发请求。显存越大能塞进去的并发实例才越多单位成本才会降下来。量化的核心思路很简单用更少的bit去表示权重和激活值。把FP32转成INT8理论上模型体积直接变成原来的四分之一FP16转INT8体积减半。加减速和降低延迟。更关键的是显存占用降下来之后单卡能承载的请求数量上涨这在成本维度上带来的收益是实打实的。1.2 什么场景必须量化什么场景可以先缓缓不是所有项目都需要一上来就跑量化。我自己的判断标准是分场景的如果模型只在离线批量跑比如数据处理管道、离线生成报告一次跑几分钟也没关系那量化可以往后放。如果是线上实时推理服务需要低延迟、高并发那量化基本是必选项。如果是边缘设备、手机端、嵌入式设备内存和算力都有限量化几乎是唯一的选择。如果目标硬件支持FP8或者BF16推理而且显存充裕可以先不量化为INT8优先做其他优化。另外提醒一句量化不是免费的午餐。它会在一定程度上改变模型的数值分布带来精度损失。不同模型对量化的敏感度差异巨大有的模型量完几乎无损有的一量就崩。所以科学的做法是“先评估后量化”不要盲目跟风。1.3 量化是一道数学题更是一道系统题很多人以为量化就是用工具跑一下得到一个量化模型就完事了。实际上量化模型落地要面对的问题包括数值分布怎么统计才准校准方法的选择每个张量用同一个缩放因子还是每通道一个per-tensor还是per-channel量化后的算子是否能真正调用到硬件的低精度计算单元比如GPU上的INT8 Tensor Core或CPU上的VNNI指令混合精度怎么处理哪些层必须保留高精度哪些层可以激进量化量化感知训练要不要做需要多少数据和算力。所以量化绝不只是“int8 fp32 / 255”这么简单。它涉及数值分析、系统架构、硬件的协同设计。这篇文章会尽量把这些层面都串起来讲清楚。2. 量化方案选型PTQ、QAT和动态量化怎么选2.1 三种主流方案的原理对比业界主流量化方案无非三类训练后量化PTQ, Post-Training Quantization、量化感知训练QAT, Quantization-Aware Training、动态量化Dynamic Quantization。三者的根本区别在于“什么阶段引入量化误差”以及“如何获取量化参数”。先看PTQ。它的流程最粗暴拿一个训练好的模型喂一小部分校准数据统计激活值和权重的分布然后计算出量化参数缩放因子和零点直接把权重从浮点转成整数完成。整个过程不需要重新训练模型成本低、速度快是大多数AI原生应用的首选方案。我自己的经验是现在很多开源模型在发布时已经做得比较“皮实”直接PTQ到INT8往往就能保住90%以上的精度。再看QAT。它的流程是在训练过程中在前向传播里插入“伪量化节点”也就是模拟量化误差让模型在训练中逐步适应低精度带来的扰动。反向传播仍然使用浮点梯度来做更新。QAT的精度通常比PTQ更高但代价是需要额外的训练资源、调整超参数训练时间也拉长。不是每个团队都负担得起。动态量化是另一种思路权重提前量化成INT8但激活值在运行时才按实际分布动态计算量化参数。好处是对激活值分布剧烈变化的情况更鲁棒坏处是动态计算有额外开销适合部分算子而不是全模型。我做了一个简单对比表方便你做选型判断特性PTQQAT动态量化需要重新训练否是否数据需求少量校准集完整训练数据少量校准集实现成本低高中精度表现良好敏感模型可能掉点最优稳定但有运行时开销适用场景快速上线、算力有限精度要求高且资源充足CPU部署、分布动态变化大2.2 量化粒度Per-tensor还是Per-channel选定PTQ还是QAT之后紧接着要决定量化粒度。简单来说per-tensor是整层所有数值共享一个缩放因子per-channel是每个输出通道各算各的。per-tensor实现简单但问题在于如果某些通道存在明显离群值outlier整体分布会被拉宽导致其他通道的精度白白下降。per-channel能把每个通道的分布单独校准精度更好但硬件实现上更复杂不是所有推理框架都原生支持卷积层外加per-channel量化。有个通用经验权重矩阵的量化推荐per-channel激活值的量化如果框架支持尝试per-tensor和per-channel都跑一遍看哪个精度表现更好。大模型里的矩阵乘操作中量化粒度对精度影响非常明显有时候只是把weight的per-tensor改成per-channel困惑度就能回升一大截。2.3 后端硬件量化也得看“厨具”选型时最容易被忽略的就是目标硬件的指令集和数值格式支持。你费尽心思量化出的模型如果推理引擎不调用硬件低精度指令那前期收益都得打折扣。在GPU上通常要关注是否支持INT8的Tensor Core运算这能大幅加速矩阵乘法。TensorRT、vLLM这些框架对INT8的支持已经相当成熟。在CPU上x86平台需要看是否支持VNNI或AMX指令ARM平台要关注是否支持相应的INT8点积指令。在NPU上各家情况更分裂需要仔细查工具链支持的量化格式比如是否支持对称量化、非对称量化、混合精度等。我的建议是先选硬件再选推理框架最后选量化方案。如果推理框架自带最好的量化工具链就别重复造轮子。框架帮你解决算子融合、指令调度这类底层麻烦比你自己蛮力优化靠谱得多。3. 实操记录把大模型量化并部署上线的完整流程3.1 准备校准集质量比数量重要PTQ最关键的一步就是校准。校准数据的来源最好是真实业务里会出现的输入。比如你做的是聊天机器人就准备一批用户问题你做的是代码生成就准备一批代码任务描述。随机从网上拉一批文本往往效果不如几百条高质量业务样本。校准集的数量不需要很多通常256到1024条就够。但有一点要特别注意校准集不能太“干净”。如果全部是短文本那长文本输入下激活值分布没被覆盖量化后一遇到长文本就可能表现异常。尽量让采样覆盖不同的长度、主题和表达方式。在实际项目中我自己会额外保留一份评估集评估集和校准集严格不重叠这样量化后的精度数据才有说服力。校准集准备好之后通常需要在模型的前向推理中统计每一层的激活值分布。很多框架提供了自动hook机制不需要你手写前向逻辑。但如果你用的是一个比较底层的库就需要自己注册hook或改写forward把每层的输出分布记录下来。这一歩比较琐碎但也是后面调优的基础。3.2 计算缩放因子的两种常用方法得到分布之后就要计算每个张量的缩放因子。业界常用的两种方法是最大绝对值法MaxAbs直接取统计区间内所有绝对值的最大值然后用公式scale max_abs / 127去算INT8非对称量化还需另算零点。实现简单但对离群值非常敏感分布有长尾时不好用。KL散度法Entropy/Percentile这种做法是先尝试一堆候选的阈值把被截断掉的部分和重新量化之后的分布做对比找一个让信息损失最小的阈值。相比MaxAbs它对偏态分布更友好也是很多框架里默认的校准方式之一。要注意的是MaxAbs实现起来简单但并不是说它总是差劲。如果模型已经做过类似归一化的处理数值范围比较稳定MaxAbs的差异其实不大。但大规模语言模型经常有Hidden State的极端值这时KL散度或者百分位法通常更稳。校准之后得到的是一个缩放因子表一般以张量为单位保存。如果之后发现精度不够可以考虑按层调试而不是直接推倒重来。3.3 量化后精度验证与误差定位量化完不等于结束必须做精度验证。大模型场景里最常用的两个指标是困惑度Perplexity和下游任务准确率。困惑度适合衡量语言模型的整体输出质量下游任务如问答、文本分类可以反映实际业务效果。两个都测不要只测一个。一旦发现精度掉点排查的顺序我建议是先看是权重的问题还是激活值的问题。可以把权重保持FP16只量化激活值然后反过来再试一次。再看是哪些层掉点最严重。某些层比如最后的输出层、Embedding层、Norm层对精度极度敏感直接排除在量化范围之外往往就能解决问题。最后调整校准方法或校准集。把MaxAbs改成KL散度或者增加校准数据重新跑一遍。有时只换校准样本就能显著改善。还有一种情况量化本身没问题但推理框架里某些算子不支持INT8导致部分子图反复做反量化dequantize既慢又引入额外误差。所以精度验证时也要看算子是否都落到了低精度执行路径上。4. 常见坑点与排查技巧实录4.1 精度掉点严重优先级怎么排如果是刚接触量化我见过太多人一上来就怀疑自己“做法不对”然后反复重新校准折腾半天没效果。实际上精度掉点严重时优先级应该是这样的第一优先检查异常值层。找出分布特别奇怪、离群严重的层通过排除法确定这些层是不是拉低了全局精度。尝试对敏感层做混合精度也就是保留FP16。第二优先改校准方法。当前方法不好用就换一个KL散度、百分位、MSE方法都可以试。也别只试一种校准集多个校准集的结果对比一下。第三优先换量化粒度或对称/非对称。把权重换成per-channel把激活值换成per-tensor看看效果。最后再考虑QAT。如果前面所有方案都救不回来那就得付出训练成本了。我遇到过最典型的案例是某个模型的隐藏层里存在大量绝对值超过几十的离群点直接导致INT8量化的缩放因子被拉得巨大普通数值被压成接近0。后来减少离群层的量化范围或者把离群通道单独处理精度立刻回升。处理离群值的优先级真的很高。4.2 量化后运行比理论慢怎么找原因还有一种常见情况是量化之后模型体积变小了但推理延迟没有任何改善甚至更慢。这通常不是量化本身的问题而是没吃到低精度计算的红利。原因一般有这几种算子融合没启用。调用框架时没有开启图优化导致量化、反量化频繁发生额外开销比省下的计算还大。模型里存在大量的非量化算子。比如某些激活函数、归一化层它们在高精度下运行需要不停地把数据从INT8转回FP32。数据排布问题。INT8在很多硬件上需要特定内存排布才能高效计算如果排布不对访问效率会大幅降低。小算子过多。对单次计算量很小的算子低精度带来的收益远小于kernel启动和内存拷贝的开销。排查方法也不复杂先做一个逐算子的性能剖析。把耗时前20的算子列出来看哪些还是Float32执行。然后针对性地开算子融合或者手动改写子图。大模型推理场景里把GELU、LayerNorm这些融合进前一个算子收益往往立竿见影。4.3 混合精度与敏感层处理既然叫混合精度那就意味着不需要从头到尾完全一致。整套模型里有大量层冗余度高可以直接INT8而少量关键层需要保留更高精度。以典型Transformer结构为例经验法则是Embedding层通常不需要量化因为它的参数直接和词表映射有关量化后可能导致Vibration注意力模块里的QKV投影通常可以量化但有些模型对这部分敏感需要测了才知道输出层的LM Head非常敏感建议保持FP16/BF16尤其是每一步生成都要计算词表概率的场景LayerNorm和激活值统计里的方差、均值最好保持浮点因为它们动态性很强。选择混合精度最简单的办法就是先把全部层量化到INT8然后逐个把敏感层恢复到FP16比一次一个地观察指标变化。虽然有点费时间但能得到“最小代价、最大收益”的组合。5. 部署侧的经验量化只是第一步5.1 图优化与算子融合的配合我见过不少团队把精力全花在校准和量化上结果部署时因为算子融合没做好性能远低于预期。预处理阶段第一步往往是图优化常量折叠把不需要动态计算的常量提前算好存成固定的数据。算子融合把多个连续操作合并成一个。比如卷积或矩阵乘后面跟的偏置加法和激活函数融合成一个算子减少多次读写。去除冗余节点把没有任何实际作用的identity节点清理掉。在量化模型里算子融合还有一个额外价值就是减少量化和反量化来回切换的次数。数据从FP32变成INT8传给算子结果又要转回FP32给下一个算子用来回转换非常伤性能。融合后这些边界消失带宽消耗也下来了。5.2 评估量化模型的几个核心指标部署前建议建立一套多维度的评估标准不只盯一个指标。模型精度指标困惑度、下游任务准确率这决定量化后模型质量是否可接受。显存占用加载量化模型后实际占用的显存/内存决定并发容量。首Token延迟TTFT用户输入到看到第一个输出token的时间这直接影响交互体验尤其是流式输出场景。每个Token生成延迟生成后续token的速率在长文本生成里尤其重要。吞吐量 tokens/s单卡总吞吐直接影响成本和机器规模。我自己习惯的做法是每次量化实验都记录这四个维度的数据并确保在同一条数据集、同一个输入长度分布下测试否则数据没有对比价值。Quantization后能跑多快绝不能靠“感觉”判断要拿数据说话。5.3 实操小技巧与一些体会最后分享几个我在实践里总结的技巧始终保留一份原始FP16模型。量化模型有问题时能够快速回到高精度版本对比定位。校准集要做成长期可用的标准资产。每次模型迭代后都用同一套校准集做评估方便对比。调试量化时记录每一层的统计信息。我一般会把各层激活值的min/max/均值/方差输出成一份报告精度出问题时直接翻报告定位。如果使用某个推理框架先确认其量化格式兼容性。不同框架对量化模型的格式要求不一有的要ONNX有的要自定义格式提前对接好能少走很多弯路。千万别忽略批处理效应。真实部署时并发请求往往做了动态批处理这和单请求评测的延迟数据差别很大建议测试时直接模拟线上请求模式。从理论到实践模型量化本质上是一个“误差换性能”的博弈。它没有绝对的最佳方案只有最适合你业务场景的方案。做量化的核心流程其实是有章可循的先选硬件和推理框架再决定PTQ、QAT还是混合精度然后用有代表性的校准集去量化用多维度的指标去验证最后在部署侧做好算子和图优化。每一步都有细节也都可能踩坑。希望这篇内容能帮你在启动量化项目时少走一点弯路尤其是遇到精度掉点或者性能没提升的时候不要慌对照上面的排查顺序一个一个去测、去调。量化不是一个可以“一把梭”的自动流程但顺着这条链路走下来你会发现它其实是可控、可复现、可优化的事情。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑