模型剪枝与量化:端侧部署的压缩优化实战指南
发布时间:2026/9/16 16:12:15 锦皓数字建站

搞模型部署的朋友应该都有过这种体验模型在GPU上跑得好好的精度刷得漂漂亮亮一上手机、边缘盒子、车载芯片要么内存直接爆掉要么推理延迟高到没法用。这时候就得认真考虑模型优化了。说到模型优化最常被拿出来讨论的两板斧就是模型剪枝和模型量化。这篇文章我想把这两个东西掰开揉碎讲清楚不绕弯子直接把原理、流程、实操步骤和踩坑经验都摆出来给正在做模型压缩和端侧部署的同学当一份参考笔记。无论你是刚接触部署的新手还是已经在做推理优化的工程师这篇文章应该都能帮你把剪枝和量化的全局图景补齐。1. 从“能跑”到“跑得动”为什么必须聊剪枝和量化说实话很多算法工程师对模型优化的理解停留在“调低精度、删减参数”的模糊概念上但真到落地时才发现剪枝和量化不是简单的一两个API调用背后牵涉到对模型结构、数值精度和硬件特性的整体理解。所以第一步我们把问题域先框清楚。1.1 模型部署的现实困境——三层资源瓶颈模型从训练环境搬到生产环境会同时撞上三个资源瓶颈存储、内存带宽和计算能力。拿一个BERT base模型举例它有大约1.1亿个参数如果用FP32存储权重文件就有440MB左右。这个体积放在服务器上不算什么放到手机App里用户一加载就被劝退再说推理过程中间激活值也要占内存计算量还跟序列长度成平方关系。哪怕是一个轻量级的YOLOv5sFP32权重也要14MB左右在低端嵌入式设备上跑一帧的延迟可能直飙几百毫秒。很多团队一开始的思路是直接换更小的模型比如把BERT换成DistilBERT把YOLOv5s换成YOLOv5n。这当然是一条路但模型的精度上限也同步变低了而且架构改动往往会带来一系列连锁的适配问题。相比之下剪枝和量化是在保持原模型结构基本不变的前提下做“减重”和“压缩”能在精度损失可控的范围内换来非常可观的推理加速和体积缩减。我个人的经验是先优化、后换模型通常比一上来就换小模型性价比高得多。这三层瓶颈——模型体积、内存带宽、计算量——对应到优化手段上分别是剪枝减少参数量和FLOPs、量化降低每个数的比特数和蒸馏用大模型教小模型。三者不是互斥关系真正工程上它们是叠加使用的。而这篇文章聚焦在剪枝和量化也是因为它们对现有模型结构的改动最小落地路径最成熟。1.2 三条主流优化路线怎么选剪枝、量化和蒸馏很多刚接触模型优化的同学会纠结我该先学剪枝还是先学量化其实两者解决的是不同层面的问题。我整理了一张对比表方便大家快速建立全局观优化路线核心手段主要收益主要代价典型落地场景模型剪枝移除不重要的权重或通道减少计算量、降低延迟需要重训练/微调精度恢复成本高CPU/GPU/NPU端延迟敏感场景模型量化降低权重和激活的比特数缩小体积、提升带宽效率可能引入量化误差需校准移动端、边缘设备、NPU专用加速知识蒸馏用小模型模仿大模型输出获得高精度小模型训练成本高需要教师模型从零训练轻量模型、平台化模型剪枝和量化还有个关键区别值得注意剪枝改变的是模型结构本身权重变稀疏或通道变少量化改变的是数值的表示方式FP32变成INT8、INT4结构不动。因此量化往往可以和剪枝无缝叠加剪完再量化收益是乘起来的。比如一个通道剪掉30%的模型再INT8量化理论体积能缩到原来的70% × 25% ≈ 17.5%这是什么概念440MB的模型变成77MB手机端完全可接受。还有一个容易被忽略的点就是精度-成本曲线不是线性的。剪枝刚开始的10%~20%可能精度完全不掉甚至因为正则化效应精度还涨一点到了40%以上精度会突然断崖式下跌。量化也是类似INT8通常能控制在1%以内精度损失INT4就要看模型鲁棒性了。所以做模型优化一定先摸清楚自己这个模型在哪一段上“吃得起”压缩。1.3 模型优化的评估指标别只盯着精度我之前见过不少项目组汇报优化成果时只说“模型体积减少60%准确率下降0.3%”听起来很漂亮但实际上线后发现延迟根本没降多少。问题就出在评估指标太单一。模型优化至少要看五个维度精度、模型体积、推理延迟、吞吐量每秒处理多少请求或帧、功耗尤其是电池供电的设备。内存带宽这个指标特别值得单独拿出来说。很多现代SoC的NPU对权重的读取带宽是有限制的INT8量化最大的价值不只是体积缩小而是内存带宽需求降为FP32的1/4这意味着同样的带宽能喂给计算单元更多的数据计算单元才不会饿肚子。我实测过在RK3588上跑INT8量化的YOLOv5s相比FP16推理延迟能从约30ms降到约12ms这个加速主要就是带宽和NPU指令集适配带来的。所以在开始做剪枝量化之前先立好项目的验收标准目标平台是什么可接受的精度损失是多少延迟/体积的硬指标是多少这些数字定了后面每一步的取舍就有依据了。2. 模型剪枝把网络里“不重要”的权重找出来丢掉模型的参数量很大但并不是所有参数都对最终预测结果同等重要。剪枝的核心思想就是找到那些“不重要”的参数并移除让网络变得更稀疏、更紧凑同时尽量不影响性能。2.1 剪枝的本质给权重的重要度打分为什么有的权重可以丢掉因为神经网络的表示存在大量冗余。打个比方你让100个人回答一个问题90个人的答案高度雷同剩下10个人提供了关键信息那你只需要留10个人的答案就行甚至还能从这10个人里再挑5个。神经网络也是一样很多权重的数值很小、对激活值的影响微弱去掉它对输出分布几乎没有扰动。那怎么判断一个权重重不重要最经典的方法是幅度剪枝Magnitude Pruning看权重绝对值的大小。绝对值大说明它对前一层的输入响应强烈对后一层的贡献显著绝对值接近0去掉它对输出影响很小。实现时直接给权重排个序设定一个阈值或剪枝比例低于阈值/排在后30%的权重就置为0。这个方法简单、计算量小而且实验效果在绝大多数模型上都稳定可用。除了绝对值还有梯度幅值、Hessian矩阵等更复杂的重要度指标。但我个人的建议是除非你用的是结构化剪枝配合特定硬件否则先从幅度剪枝开始性价比最高。有很多论文花里胡哨地提出各种新指标最后对比基线也就是幅度剪枝说明这个baseline本身已经很强了。2.2 非结构化剪枝与结构化剪枝别小看“稀疏”的代价剪枝按力度和粒度的不同可以分成两大流派非结构化剪枝对权重矩阵里的单个元素做置零得到的是不规则稀疏矩阵。好处是剪枝粒度细同样剪枝率下精度损失更小坏处是稀疏矩阵乘法的实现很麻烦通用CPU/GPU没有一个统一的加速指令集来高效处理这种不规则稀疏性通常需要专门的稀疏推理库或硬件比如某些配置了稀疏加速单元的NPU才能发挥加速效果。结构化剪枝以整个通道、整个卷积核、甚至整个层为单位进行裁剪。比如把某个卷积层输出通道数从256剪到128连带着下一层输入通道也跟着变少。好处是剪完后的模型是“稠密”的任何常规推理框架都能直接用延迟下降明显坏处是粒度粗糙同样的精度损失下能剪的比例不如非结构化剪枝高。我实测下来在ARM CPU和通用NPU上部署结构化剪枝的收益远大于非结构化剪枝。因为大多数推理框架对稀疏矩阵的优化做得并不好你辛辛苦苦把权重稀疏率做到90%最终跑起来跟稠密运算差不多快还得额外维护稀疏格式。做工程不是发论文落不了地的优化等于没优化。所以没有专用稀疏硬件加持的前提下优先选结构化剪枝。2.3 剪枝的完整流程训练-剪枝-微调结构化剪枝最经典的落地框架就是“训练-剪枝-微调”三步走。以通道剪枝为例分为以下阶段预训练模型准备先在完整数据集上把精调模型训练好得到一个精度达标的baseline。通道重要性评估常见方法是对BN层BatchNorm的缩放因子γ做L1正则化。BN层的公式是$y \gamma \hat{x} \beta$γ的值直接反映了这个通道在归一化后对输出的缩放强度。γ趋向0的通道输出接近常数β基本不携带信息。通过给γ加L1惩罚项训练时让不重要的通道γ自动收缩到接近0剪的时候直接对γ排序把靠后的通道砍掉。执行剪枝重建网络结构删掉对应的卷积核和BN层参数同时更新下一层输入通道数。这一步要格外小心残差结构ResNet的shortcut分支和拼接结构Concat通道对齐搞错了训练直接崩。微调恢复精度剪完的模型已经结构变化了必须用小学习率在数据集上重新训练若干epoch。经验上剪枝比例在10%~30%时微调5~10个epoch就能恢复剪枝比例超过50%之后可能要微调更久且精度很难完全回到baseline。再说说一次性剪枝 vs 迭代剪枝。一次性剪枝是直接剪到位再微调步骤少但风险高迭代剪枝是“剪一小步→微调→再剪一小步→再微调”精度恢复情况更稳健代价是训练时间长。我的经验是剪枝率低于40%时一次性剪枝就够了迭代剪枝收益不明显但如果你要挑战50%以上的压缩率迭代剪枝是必须的不然后期精度崩了找不到是哪一步剪坏的。2.4 一个容易踩的坑哪些层不能乱剪通道剪枝确实香但也不是所有层都适合一刀切。我见过不少同学在ResNet上按γ值剪完结果精度掉了5个点满头雾水。排查到最后发现是剪了stage边界的关键层。这里我总结了几类剪枝敏感层输入层附近的低层靠近输入的高分辨率层往往包含边缘、纹理等基础特征冗余度反而较低剪多了会让上层特征质量整体下降。残差连接的shortcut分支ResNet中shortcut传递的是恒等映射它对梯度流动很重要。如果shortcut被剪掉训练时梯度不稳定推理输出也会出现奇怪的偏移。很多实现会默认shortcut不剪只剪主分支。Detect/Head层目标检测和分类头是模型直接输出结果的地方对精度影响权重很高如果非剪不可剪枝比例一定要放低。已经比较窄的层如果某层只有32或64个通道再剪很可能就直接“结构性残废”了。实操前建议先做一个逐层敏感性分析固定剪枝率比如20%每次只剪一个层观察精度掉多少把所有层的敏感度画出来。这样你能知道哪些层可以重剪、哪些层要轻剪或者不剪。这个步骤我建议每个人都做一遍虽然耗时但远比盲剪然后盲调要靠谱。3. 模型量化用更少的比特数表达同样的数值如果说剪枝是给模型“减负”那量化就是给模型“换血”。量化把神经网络里的浮点数运算FP32、FP16换成低比特整数运算INT8、INT4让模型在硬件友好的同时跑得更快、占得更少。3.1 量化的数学原理浮点转定点到底发生了什么量化的数学本质很简单用一个线性映射把连续的浮点范围 $\left[ r_{min}, r_{max} \right]$ 映射到离散的整数范围然后把运算都改成整数运算最后再映射回来。最常见的是非对称量化公式长这样缩放因子$S \frac{r_{max} - r_{min}}{q_{max} - q_{min}}$零点$Z q_{min} - \frac{r_{min}}{S}$量化$q round\left(\frac{r}{S} Z\right)$反量化$r \approx S \times (q - Z)$对应对称量化就是假设浮点范围关于0对称$q_{min} -q_{max}$这样零点恒为0公式变成 $r \approx S \times q$实现更简单INT8卷积这种对计算速度敏感的算子大多用对称量化。很多人第一次接触时会被零点搞晕其实你可以这么理解浮点到整数的映射就是“等比例缩放平移”。S是缩放比例步长Z是平移量。量化误差主要来自两部分一是范围截断超出 $[r_{min}, r_{max}]$ 的值被强行夹取到边界二是舍入误差实数值映射到整数后的取整损失。截断误差和舍入误差是此消彼长的范围设太大极端值保住了但中间值的分辨率变低范围设太小极端值被截断了但大多数中间值分辨率高。这个平衡在后续校准环节要反复调。3.2 量化粒度per-tensor、per-channel 与 per-group量化不是对整个模型用一个S和Z而是可以按不同粒度分别设置参数。粒度越细精度保得越好但额外的元数据存储和计算开销也越大。per-tensor整个张量共用一个S和Z。最简单、开销最小但不同通道数值范围差异较大时会放大误差。per-channel每个通道独立一套S和Z比如卷积层每个输出通道各一套。实践中最常用的一档精度跟per-tensor比能提升不少在GPU/NPU上支持度也很好。per-group把通道分成若干组每组各配一套参数。主要用于低比特量化如INT4和权重范围特别不均匀的场景灵活性最强但实现复杂目前主要在部分特定硬件上支持良好。我的一般原则是权重用per-channel激活值用per-tensor。激活值在推理时动态变化逐通道处理会有额外计算大部分推理框架对激活的per-channel支持也不够好。权重是静态的per-channel多出来的计算成本可以接受收益非常明显。3.3 三种实用量化方案PTQ、QAT 和动态量化量化方案的选型直接影响你的工程量和精度效果。按实施阶段和是否需要重训练可以分为1. 训练后量化PTQPost-Training Quantization最常用、部署最快的方案。你用一些代表性数据喂给训练好的模型记录每一层激活值的分布范围然后据此计算量化参数权重量化则直接根据权重分布计算。整个过程不需要反向传播一个下午就能搞完。缺点是精度损失不可控尤其是激活分布特别“胖尾”少量异常大值撑开范围的模型。2. 量化感知训练QATQuantization-Aware Training在训练过程中就模拟量化误差。实现时在forward里做“伪量化”——先量化再反量化让模型提前适应低比特误差反向传播依然通过直通估计器STE近似梯度。QAT的效果通常比PTQ好很多特别是模型要量到INT8以下或者模型本身很敏感时。代价是要重新训练时间和算力成本高。3. 动态量化权重预先量化成INT8激活值在每次推理时动态量化。主要用于以Transformer为主的自回归模型因为激活值范围变化大静态校准不容易搞准。PyTorch里一行代码就能加载动态量化模型CPU上推理BERT能获得2~4倍加速非常适合做文本类模型的原型验证。三种方案怎么选我一般这么判断先跑PTQ如果精度损失小于0.5%直接上如果损失在1%~3%优化校准集和量化层配置再试一轮还不行就上QAT不要恋战。3.4 校准数据集被忽视却最关键的细节PTQ里有一个步骤叫校准Calibration就是拿一批数据跑一遍模型统计每层激活值的范围。校准数据集的选择直接决定量化参数的好坏我见过太多案例模型量化后精度掉点调了一堆参数没效果最后发现是校准集没选好。校准集要满足几个要求代表性数据分布要和真实业务数据一致。比如你模型是检测夜间监控画面的校准集却全是白天图片量化参数就会偏。多样性要覆盖各类典型场景。样本太少、太集中统计出来的范围就会失真。数量适中通常几百张到一千张就足够了。太少统计方差大太多浪费计算时间边际收益递减。避免极端值污染如果校准集里混入一两张异常样本比如过曝、纯色图会把激活值的范围撑大好几倍压缩其他正常值的精度。校准前最好做一轮离群值筛查。校准算法也有讲究。常见的校准方法包括MinMax直接取最小最大值、Percentile取分位数、MSE最小化量化前后分布的均方误差等。我的实践经验是MinMax虽然简单但在大部分图像模型上表现并不差如果激活值分布尾部特别长优先试Percentile如果精度差一点点就上MSE。4. 实操把剪枝和量化按顺序落进一个部署流程光讲概念不过瘾这一节直接带大家走一遍从PyTorch模型到INT8量化部署的完整实操流程。我以YOLOv5s和ONNX Runtime为例因为这个链路最常用、资料也最多踩坑信息量大。4.1 一个典型的端侧部署流水线先剪枝再量化模型优化的顺序不要搞反。正确的流水线是训练基线模型 → 结构化剪枝 微调恢复精度 → 导出ONNX → PTQ量化/校准 → INT8推理验证 → 精度回归。为什么必须先剪枝再量化而不是反过来因为量化公式里的S和Z是基于权重分布算的如果先量化再剪枝剪枝会把一些量化后的权重置零但已有的缩放因子还是按原来的范围定的导致量化参数失真。反过来就顺理成章剪枝改变了权重分布之后再量化校准统计是紧跟当前模型状态的。拿到一个需要优化的模型先别急着动手剪第一步永远是导出模型跑一遍原始精度记录baseline。后面每一步操作后都回头测一次精度这样可以精确定位哪个环节引入的误差。4.2 实操步骤PyTorch模型导出ONNX再转INT8量化Step 1导出ONNX模型import torch model torch.load(yolov5s.pt, map_locationcpu)[model].float() model.eval() dummy_input torch.randn(1, 3, 640, 640) torch.onnx.export( model, dummy_input, yolov5s.onnx, opset_version12, input_names[images], output_names[output], dynamic_axes{images: {0: batch}, output: {0: batch}} )这里有一个细节onnx导出时建议固定输入尺寸除非你真的需要动态尺寸。动态尺寸在量化时会让校准变得复杂很多推理框架对动态shape的op支持不全。Step 2用ONNX Runtime做PTQ的INT8量化ONNX Runtime提供了一个量化工具quantize_static它会跑一段校准数据来统计激活值范围from onnxruntime.quantization import quantize_static, CalibrationDataReader, QuantType import numpy as np class YOLODataReader(CalibrationDataReader): def __init__(self, images, batch_size8): self.data [] for i in range(0, len(images), batch_size): batch images[i : i batch_size] self.data.append({images: np.stack(batch).astype(np.float32)}) if len(self.data) 100: break self.iter iter(self.data) def get_next(self): return next(self.iter, None) # images 是你准备好的校准图片列表形状 [N,3,640,640] reader YOLODataReader(images) quantize_static( model_inputyolov5s.onnx, model_outputyolov5s_int8.onnx, calibration_data_readerreader, quant_formatQuantType.QOperator, per_channelTrue, weight_typeQuantType.QInt8, activation_typeQuantType.QInt8, )几个值得注意的点per_channelTrue对于卷积权重几乎是必选的精度差距明显。quant_format有两种QOperator使用量化的算子节点和 QDQQuantizeLinear/DequantizeLinear 节点对。在CPU上QOperator更稳在NPU上通常要QDQ需要根据部署目标定。校准数据不要只放一堆纯背景图最好是真实业务数据且自信联合覆盖各种目标。Step 3转成RKNN等其他平台格式如果你要在瑞芯微RKNN、地平线、昇腾等NPU平台上跑步骤类似先把模型转成ONNX再用厂商工具链转成私有格式。以RKNN为例rknn.config(mean_values[[0,0,0]], std_values[[255,255,255]], quantized_dtypew8a8)这一步很关键quantized_dtype定义了权重和激活的比特位根据你的精度需求选w8a8还是w16a16。转出来以后先用官方的模拟器或板子做校验再评估实测延迟不要信“理论上能到多少”这种话。4.3 INT8量化精度掉点怎么排查数值对比三板斧如果量化后精度掉得厉害比如超过2%不要急着换QAT先用数值分析定位问题层。我常用的排查方法有三个第一板斧看权重分布和激活分布。把模型每层的浮点值分布和整数映射范围画出来。如果发现某层激活值范围极宽比如0到1000但90%的数值集中在0到10那这层量化后信息大部分被浪费掉了。这时候要么改用更大的校准集重新统计要么对这一层单独设置更大的量化范围或者把该层保留为浮点运算混合精度。第二板斧逐层比较浮点模型和量化模型的输出余弦相似度。用同一张图输入两个模型取出某一层比如卷积输出的feature map计算两者的余弦相似度。正常应该在0.99以上如果某一层骤降到0.9以下瓶颈就在这层。锁定后优先针对它做调整。第三板斧检查是否有“脏”算子。ONNX里不是所有算子在INT8下都有高效实现。遇到不支持的算子时有些工具链会退回FP32计算有些则会用糟糕的降级方案。这时候把模型图导出来逐个op检查看到黄色的“fallback”节点直接改配置或重写该模块往往能迎来一次精度反跳。5. 常见问题与排查技巧实录避坑笔记这部分是我自己反复踩坑总结的速查笔记分享出来给大家。所有问题都来自真实项目每个都让我花过不少时间。注意这里面的问题都很典型建议收藏下次遇到直接按目录查。5.1 典型问题速查表现象可能原因排查与解决INT8量化后精度下降严重校准集分布和真实数据不一致换更贴近业务的数据重新校准量化后速度没有提升甚至变慢模型里有大量算子回退到FP32检查算子支持列表改QDQ格式或改写算子结构化剪枝后精度崩盘剪掉了敏感层或微调轮数不够做逐层敏感性分析重新设计剪枝方案增加微调时长权重剪枝后FLOPs降了延迟却没降非结构化剪枝没有稀疏加速支持改用结构化剪枝或确认部署硬件支持稀疏乘量化后网络输出数值和浮点完全一样推理框架没真正加载量化模型检查模型加载路径确认实际跑的是INT8算子RKNN量化后回归模型的数值不动量化配置或预处理有问题检查mean/std设置确认数据输入是0~255还是0~1剪枝微调后模型不收敛学习率太高或BN层参数没重初始化降低学习率重新统计BN均值和方差5.2 独家避坑我以为量化好了结果跑的是浮点这是最容易搞趴的一个隐蔽坑。有一次我在RKNN上跑一个模型输出结果跟FP32完全一致分毫不差。一开始还挺高兴——“哇量化后精度一点没掉”后来同事点醒我输出一模一样本身就说明模型根本没有被量化工具链默默回退到了浮点推理。果然一翻日志发现某些算子在INT8下不支持框架自动走了FP32路径而我用的板子刚好FP32也能跑静默降级了。从那以后我养成一个习惯模型转换完先检查算子的实际执行类型再谈精度和速度。有专门的profiling工具可以打印每个op的执行精度一旦发现有fallback就立刻处理别让这种“隐性浮点”蒙混过关。5.3 独家避坑校准数据不是越多越好质量远比数量重要我最初做PTQ的时候总觉得校准数据越多越准直接塞了两万张图做校准。结果是量化参数被冲淡了一些关键分布没被凸显精度反而不如一千张精选数据的模型。后来我总结出校准集的“最优规模”规律几百张到一千张、覆盖全部关键场景、剔除了离群噪声就够。更重要的其实是“多样性覆盖”。做图像分类要覆盖各个类别和典型光照做目标检测要覆盖不同尺寸目标、多类别目标、不同复杂背景。你还可以用聚类算法对大量业务数据做一次“去重挑代表样本”校准效果会明显变好。5.4 独家避坑剪枝后的“假阳性”收益结构化剪枝完成后模型体积确实小了但我遇到过延迟几乎没变的情况。最后发现原因在于剪枝改变了卷积核的通道数但如果推理框架对通道数的对齐优化不到位底层矩阵乘法仍然按原来的通道维度做padding或者在内存排布上没办法利用更小的通道数来减少访存。简单说你剪了通道但框架没吃到这个剪枝红利。解决方案有两个一是换用对通道数变化更敏感的推理框架比如专为端侧优化过的框架通常会做通道重排和内存规划二是用剪枝工具直接导出“物理剪枝后”的干净结构不要保留稀疏mask去推理框架里做动态掩蔽。剪枝结果必须是结构上的真实变化而不是逻辑上的mask否则TensorRT、ONNX Runtime这类框架根本不会买账。6. 模型优化的下一步混合精度、自动压缩与更激进的低比特边界探索到这里剪枝和量化的“基建”已经搭建完整但模型优化这个领域还在快速演进。最新涌现出的不少新工具和新方法值得关注。自动压缩工具链像NVIDIA TensorRT有自动模式选择华为的MindSpore Lite、阿里的MNN等都在做“自动搜索最佳压缩配置”的机制把剪枝率和量化参数变成可搜索的超参数用NAS的思路自动找最优组合。这种“一键压缩”虽然还做不到完全取代人工经验但趋势已经很明显——工程化、平台化是模型优化走向普及的必经之路。混合精度量化不是所有层都适合INT8有些层对精度极其敏感。混合精度量化允许你保留少数关键层为FP16或FP32其他层用INT8用很小的精度代价换来接近全INT8的加速比。当前很多工具链都支持按层指定量化精度我强烈建议在精度和速度之间做权衡时优先尝试这个方案。更激进的低比特INT4甚至INT2已经不是实验室概念了像Minimax、BitNet这类工作在探索“1-bit大模型”把权重全部二进制化或三值化。虽然目前主要适用于特定结构和从零训练的场景但再过几年移动端跑大模型可能就靠这些技术。如果你关注大模型端侧部署低比特量化是绕不开的前沿方向。量化感知训练与结构化剪枝的联合作战之前提过剪枝和量化应该串联使用最近一些工具开始支持在训练中联合优化“稀疏结构量化参数”让模型一开始就朝着稀疏且低比特的方向学习。效果比分开两步做更好但训练工程复杂度也上去一个级别。这些方向我不打算展开写因为每一块都够单独开一篇文章了。不过可以给大家一个建议把剪枝和量化的基本功打牢后面学这些新东西会很快。因为它们解决的问题一模一样只是换个更聪明的方式。我自己做模型优化这几年最大的一个体会是不要迷信任何一个“神奇方案”不要指望某一个工具、某一个论文技巧能一下子解决所有部署问题。真正可靠的方法是你对模型的敏感度建模能力——知道哪里冗余、哪里敏感、哪里能压缩、哪里不能动。剪枝和量化说白了都是让你更懂你自己的模型。把这个基本功练扎实不管以后出什么新工具、新框架底层逻辑你都拿得住。最后再分享一个小技巧。每次做完一轮剪枝或量化不只是记录精度和体积把每层剪枝率、每层量化误差、推理延迟、带宽占用这些信息都记下来。几轮优化下来你会积累一份非常宝贵的“模型优化地图”下次再遇到同类型模型时基本不用从头开始摸索。这份地图才是比任何工具都值钱的资产。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。