模型上线前夜我在服务器前盯了一晚。量化后的模型在验证集上准确率跌了1.7个百分点推理速度却只快了不到两倍——这远远不够。那个深夜让我意识到模型压缩、量化与加速推理从来不是“调几个参数就能跑通”的插件的活儿而是一场需要全局视角和系统性排查的硬仗。这篇内容我就围绕“038、性能优化模型压缩、量化与加速推理”这个方向把我在多个落地项目里反复试错、踩坑之后沉淀下来的方法和经验完整梳理一遍。不管你是刚接手模型部署任务的算法工程师还是想把已有模型塞进资源受限设备的嵌入式开发者这套从“为什么”到“怎么做”再到“出了问题怎么办”的完整链路都能给你可直接照搬的方案也能帮你避开那些文档里根本不会写的暗坑。1. 项目整体思路拆解为什么单一优化手段永远不够1.1 从性能瓶颈说起先定位短板再谈优化做模型加速之前第一件事不是急着套量化、上剪枝而是先搞清楚模型到底慢在哪里。我见过太多团队一上来就直接上INT8量化结果精度掉得稀里哗啦推理速度却几乎没变最后还得回退版本白白浪费几天时间。推理性能的瓶颈通常集中在三个层面。第一是计算瓶颈也就是大量的矩阵乘法和卷积操作占据主导这时候计算单元利用率不够典型场景是模型宽度大、通道数多。第二是访存瓶颈模型内部有大量逐元素操作Element-wise比如激活函数、残差连接、张量拼接这类操作几乎不消耗算力但会频繁读写内存直接把访存带宽吃满。第三是调度瓶颈小算子过多导致GPU或NPU频繁切换kernelGPU利用率上不去整卡都在空转。判断方法很简单用profiler工具比如PyTorch自带的torch.profiler或者TensorRT自带的nvidia-smi和nsys统计各算子的耗时占比。如果矩阵乘法类算子占比超过70%这就是典型的计算密集型量化收益最明显如果逐元素操作占比高优先考虑算子融合把多个小算子合并成一个大的kernel如果是调度瓶颈则要减少图结构中的分支节点或者用小批量推理来增加单次kernel的处理量。这个定位过程看起来基础但恰恰是最容易被忽略的关键一步。没有这一步后面的量化、剪枝、蒸馏都是在盲目试错。1.2 压缩、量化、加速三者的协同关系行业里的常见误区是把这三件事割裂开来看先用剪枝把规模变小再用量化把精度降下去最后用TensorRT加速各做各的互不相关。但实际工程里这三者是一套环环相扣的组合拳。剪枝Pruning负责“减肥”把不重要的参数或结构移除减少计算量但要注意的是剪枝后的模型往往结构稀疏在通用硬件上反而跑不快需要专门的稀疏推理库或者重新密集化。量化Quantization负责“降耗”把FP32的权重和激活值映射到INT8或更低精度降低内存占用和带宽压力让计算单元可以更密集地工作。推理加速Acceleration负责“统筹”通过计算图优化、算子融合、内存复用、并行调度等手段把硬件的能力彻底榨干。我的实际经验是优先做推理加速层面的图优化再评估是否还需要量化和剪枝。因为很多时候算子融合和内存复用带来的加速比远超量化而且完全不影响精度。反过来如果图优化后仍然有计算瓶颈再叠加量化就能做到精度损失最小化。比如我曾经处理过一个图像分割模型原始ONNX有1200多个节点。直接上INT8量化精度掉了3个百分点速度只提升1.8倍。后来我先做了算子融合把同类激活函数、BN层揉进卷积里节点一下子降到400多个再在这个基础上量化精度损失控制在0.6个百分点以内速度提升接近2.9倍。这个案例让我彻底确立了“先优化图结构再量化”的技术路线。1.3 怎么设定合理的性能目标很多团队在项目立项时拍脑袋定目标“要把推理速度提升5倍”完全没有考虑模型本身和硬件平台的实际情况。这种目标定出来要么逼着团队把精度砍到不可接受的程度要么最后根本实现不了。正确的做法是先跑一遍基线。在同一套硬件上测出模型在FP32下的原始延迟和吞吐量然后用这套数据作为“地板”向下推导各优化手段的叠加效果。一张经验估算表大概是这样的优化手段预期加速比精度影响工程成本算子融合图优化1.2~1.8倍无损低FP16半精度推理1.3~2.0倍几乎无损低INT8量化PTQ2.0~3.5倍部分模型有损失中结构化剪枝1.2~2.0倍需要重训练恢复中高知识蒸馏1.5~3.0倍需要重新训练教师和学生高组合拳融合量化蒸馏3.0~6.0倍可控制在可接受范围高这张表不是拍脑袋编出来的而是我在CPU、GPU、NPU多种平台上反复实测后的统计区间。设定目标时建议把总目标拆解成每个优化手段的子目标比如“图优化1.3倍 量化2.0倍 剪枝1.2倍 3.1倍”这样不仅方向清晰调试时也能定位到是哪一环没达标。2. 模型压缩方法论剪枝与蒸馏的取舍2.1 结构化剪枝实战要点剪枝的核心逻辑是模型里很多权重其实趋近于0或相关性极弱把这些参数剔除后用重训练来恢复精度就能得到一个更小更快但精度相近的模型。但在实际工程里剪枝踩过的坑一点都不比量化少。剪枝分为非结构化剪枝和结构化剪枝。非结构化剪枝是逐个权重判断是否保留结果得到的是稀疏矩阵在通用硬件上比如普通GPU和CPU反而会因为稀疏存储和计算不规则而变慢。只有当硬件或推理库原生支持稀疏计算时比如某些NPU和专用AI芯片非结构化剪枝才能发挥真正的优势。结构化剪枝则是剪掉整个通道Channel或整个层Layer直接减少特征图尺寸和计算量通用硬件上的加速效果好但精度损失更大更需要精调。具体实施时我一般用L1范数或BN层的gamma值作为通道重要性的判定标准。L1范数小意味着该通道内的权重普遍趋近于0贡献度低BN层的gamma值如果接近0说明该通道经过BN缩放后被抑制得很厉害也可视为冗余通道。这两者结合使用比单看一种指标更可靠。剪枝比例的选择是另一个关键点。以我处理过的ResNet系列模型为例全局剪枝比例控制在20%到30%时重训练100个epoch基本能恢复到原始精度的95%以上超过40%之后恢复难度指数级上升往往要配合蒸馏或更复杂的训练策略。所以在剪枝这件事上建议走“小步快跑”的路线先剪10%评估再剪10%评估而不是一次剪到位。2.2 知识蒸馏以大模型带小模型知识蒸馏的思路也很有意思。它不是直接把大模型榨干而是让大模型当“老师”教一个小模型当“学生”——学生不仅要学习数据集的真实标签还要模仿老师的输出分布把教师模型的“软知识”比如说了一张猫图教师模型不仅输出“猫”还输出了“猫0.85、豹0.10、虎0.05”这种带有类间相似度信息的分布学过来。蒸馏的实现方案分两类。第一类是离线蒸馏先训练好一个强大的教师模型再在学生模型的训练过程中加入蒸馏损失项。损失函数往往是两部分加权一部分是学生与真实标签的交叉熵另一部分是学生与教师预测分布的KL散度。温度系数T用来调节软标签的平滑程度T越高分布越平滑类别间的关系保留得越细腻。T的取值在实践中一般在3到10之间我常用T4。第二类是在线蒸馏教师和学生同步训练适合教师模型过大难以提前训练的场景但实现复杂度更高。做蒸馏时有个容易忽略的细节教师模型必须足够强大。如果教师本身精度就一般学生学到的“软知识”不仅没有增益反而会把教师的错误模式也学过来。我见过用精确率91%的教师去蒸馏学生模型出厂精度反而比直接训练小模型还要低1个百分点的情况原因就是教师模型欠拟合输出分布本身就含混不清。正确的做法是先确保教师模型在验证集上精度比学生模型至少高3个百分点以上蒸馏才有正收益。2.3 什么时候剪、什么时候蒸、什么时候都别碰面对一个具体模型到底该上剪枝还是蒸馏我的选择逻辑是这样的如果模型是公司内部自研的、训练流程成熟、GPU资源充裕那么首选蒸馏。因为蒸馏不改模型结构推理阶段的部署代码不用动只是训练阶段多花一点时间。如果模型是开源的预训练模型比如各类Transformer想直接压缩后部署那么优先结构化剪枝。因为没有完整训练代码或者训练成本太高时做蒸馏的重训开销难以承受。如果模型体积和延迟都还能凑合但精度掉0.5个百分点都完全无法接受那剪枝和蒸馏都可以先不做把精力集中在图优化和推理引擎优化上。我曾经做过一个目标检测模型的压缩项目模型是基于开源检测框架的预训练权重体积约240MB部署在边缘盒子上的延迟要求是单帧50毫秒以内。一开始我直接做结构化剪枝剪掉了30%的通道结果mAP掉了4个点重训练了三个晚上也只恢复到2个点的损失。后来换了思路先用一个更大更准的模型虽然体积大但只是离线训练用蒸馏这套开源模型然后对蒸馏后的小模型做20%的轻量剪枝最终在精度损失1个点的前提下把延迟降到了要求范围内。这就是“蒸馏打底、剪枝收尾”的组合策略比单打独斗效果好得多。3. 量化实践全记录从PTQ到QAT3.1 量化原理补课为什么INT8能快这么多聊量化之前先花两分钟把原理捋清楚不然参数设置就是瞎蒙。深度模型的权重和激活值在训练时都是FP3232位浮点数每个数占4字节。做INT8量化时把连续浮点数值范围映射到256个整数离散值-128到127。这样一来每个参数只占1字节内存占用直接降到四分之一带宽压力大幅下降。更重要的是INT8矩阵乘法在专用硬件上指令吞吐量是FP32的2到4倍两者叠加就得到了量化常见的2到4倍加速。量化映射的核心是校准Calibration。简单说就是要找到一个合适的缩放因子让浮点数和整数的映射误差最小。实际操作用的是这样的映射关系real_value scale * (int_value - zero_point)其中scale是浮点缩放因子zero_point是整数偏移量用于处理浮点范围不对称的情况比如ReLU后的激活值都在0以上此时zero_point不为0。我在实践中最常用的量化方案是per-channel量化也就是给权重的每个输出通道单独算一个scale。相比per-tensor量化整个张量共用一个scaleper-channel在卷积权重上的精度损失要小得多是CNN模型量化的默认选择而不必犹豫。3.2 预处理利器PTQ训练后量化的正确打开方式PTQ是指模型训练完成后不需要重新训练只用少量校准数据来统计激活值的分布然后确定量化参数。它的优势是快、省事劣势是精度损失相比QAT量化感知训练要大尤其是对激活值分布特别不均匀的模型。PTQ的核心在“校准数据”的选取和数量上。我见过不少人在这一步偷懒随手拿几十张图就去校准结果量化后精度崩得莫名其妙。校准集必须满足两个条件代表性覆盖真实部署场景中的数据分布。如果线上跑的图片主要是夜间监控画面就别拿白天的风景图来校准。多样性类别要均衡光照、角度、背景要多样化有助于激活值分布被充分统计。校准数据量方面我实测下来300到500张是一个比较稳的区间。少于100张时激活值统计的方差太大量化边界经常定不准多于1000张时边际收益迅速递减徒增校准耗时。还有一个容易踩的坑校准时的数据增强要和训练时保持一致。比如训练时用了RandomResizedCrop校准边上也尽量模拟这个分布不能让校准数据是全新风格的。PTQ的具体步骤我一般是这样跑的加载训练好的FP32模型用验证集或其子集做一遍完整推理确保基线和预期一致。选取300至500张代表性图片作为校准集确保分布多样性。用推理框架如PyTorch的torch.ao.quantization、ONNX Runtime的Quantization工具、TensorRT的INT8 Calibrator把校准集过一遍模型统计各层激活值的min/max分布确定scale和zero_point。对权重直接进行per-channel量化权重分布相对稳定可以直接统计。把量化后的模型在完整测试集上评估精度和FP32基线做对比判断是否需要进一步优化。这里有一个从实践中总结出的好经验如果PTQ精度损失超过2个百分点别急着改校准集先把模型里的敏感层排查一遍具体排查方法在4.3节讲找出个别层对量化极其敏感单独把这些层保留为FP16或FP32推理往往两个小时内就能把精度捞回来。3.3 终极手段QAT量化感知训练当PTQ无论如何都压不住精度损失或者模型本身对数值变化极为敏感时就要上QAT了。QAT的核心理念是“模拟量化”——在训练过程中通过直通估计器STE直通估计器把量化操作的不可导问题绕过去让模型的前向传播使用模拟的量化参数反向传播仍然按浮点计算更新梯度。这样训练出来的模型会让权重主动适应量化噪声量化后的精度损失会显著小于PTQ。QAT训练有一些必须注意的细节初始权重要用PTQ量化后的模型参数而不是从头开始训练。这样可以加速收敛也尽量避免破坏已经学到的特征提取能力。学习率要调小一般是原训练学习率的十分之一到五分之一。量化模拟带来的梯度噪声大学习率太大会振荡。要设置量化参数scale、zero_point的更新节奏。通常前几个epoch冻结量化参数freeze让模型权重先适应后面再解锁量化参数联合优化。我是用前5个epoch冻结之后同步更新效果比较稳定。QAT的代价是训练时间明显变长而且需要完整的训练流水线。如果项目评估下来PTQ能控制在可接受范围内就先别碰QAT只有在精度指标实在救不回来时QAT才是那个兜底的终极手段。3.4 量化实操一次完整的推理性能实测为了直观展示“量化前后到底能差多少”我拿一个真实项目的数据来复盘。项目背景是把一个中型的OCR检测识别模型部署到一台工控机上CPU是某主流型号推理框架用ONNX Runtime。模型原始ONNX是FP32格式输入为3通道图片单次推理延迟大约58毫秒。内存占用约320MBCPU峰值占用接近满核。优化操作分两步走。第一步是做图优化加FP16转半精度。ONNX Runtime打开图优化Level 3EnableAll算子融合之后实测延迟降到46毫秒加速比约1.26倍精度完全无损。第二步是做INT8量化使用per-channel权重量化校准集选择了400张真实场景图片激活值用per-tensor对称量化策略。量化完成之后模型体积骤降到约85MB内存也跟着降了一大截推理延迟直接压到21毫秒相比FP32型号总体加速达到2.76倍。整个过程中精度表现值得一提模型的准确率从FP32基线的94.2%降到INT8后的93.1%损失了1.1个百分点在OCR文本识别场景下完全能接受。我当时判断这个损失主要出在两层对光照变化敏感的卷积层上于是把这两层单独排除在量化范围之外改回FP16执行精度恢复到93.8%延迟只增加了不到2毫秒。这一步“关键层豁免”策略可以说价值极大——它让精度和速度达到了最优平衡。后来这套“敏感层豁免”的方法论还被我用在了好几个其他模型上屡试不爽。4. 推理加速的工程化细节框架选型、算子融合与运行时优化4.1 推理框架的选型逻辑不能只看跑分到了加速推理环节最重要的一件事就是选对推理框架。不同框架之间性能差距巨大有时候同一个模型换一个runtime延迟直接砍半也不是什么新鲜事。我在日常项目里主要会在三个流派之间做选择ONNX Runtime生态兼容性最好的一个能直接吃ONNX导出模型CPU上的优化很成熟支持图优化Level 1至Level 3、线程数动态调整部署最省心适合通用场景。TensorRTNVIDIA GPU上的性能天花板融合策略激进支持FP16、INT8、INT4等多种精度混合推理自动调优autotuning层数极深。但它是闭源的针对特定GPU生成优化引擎跨设备迁移时需重新做引擎构建。OpenVINOIntel CPU、集成显卡、VPU上的主力对x86架构的指令集优化做得极致适合边缘端以Intel平台为主的设备。选型逻辑上我建议跟设备绑定推理跑在NVIDIA GPU上无脑选TensorRT前提是耐心处理它的engine兼容问题跑在普通服务器或Windows工控机CPU上重点考虑ONNX RuntimeIntel集成显卡或者低功耗Atom处理器则首选OpenVINO。顺便说一个选型时容易被忽略的坑TensorRT生成的engine文件是和特定GPU型号、驱动版本、TensorRT版本强绑定的。在开发机上生成的engine拷到另一台同型号GPU但驱动版本不同的机器上往往会加载失败或退回到FP32速度。所以生产上要么在目标设备上重新构建engine要么干脆用ONNX文件在运行时即时构建。4.2 算子融合和内存复用怎么具体操作算子融合是图优化里最见效的一步。它的逻辑很朴素把多个相邻的小算子合并成一个融合算子减少kernel启动次数、减少中间张量写入和读出的内存开销。举个最常见的例子ConvBNReLU。原始图里这三个算子分别执行Conv先算一遍输出中间特征图接着BN逐元素操作再输出一次中间特征图最后ReLU激活。三个kernel启动两次中间内存写入。融合之后一个kernel就能把卷积、缩放、偏移、激活全部算完中间特征图完全不用落地。在ResNet一类的模型里这类融合基本能贡献30%到40%的提速效果。ONNX Runtime里打开图优化很简单但注意Level的选择import onnxruntime as ort # Level 1: 基础图优化常数折叠等 # Level 2: 算子融合BNConv等 # Level 3: 激进图优化可能改变图结构如精度调整 sess_options ort.SessionOptions() sess_options.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL session ort.InferenceSession(model.onnx, sess_options)用Level 3的时候要注意有些融合会改变浮点计算顺序极少数精度敏感模型会出现微小漂移。跑完优化后果断去评估精度如果有异常就降回Level 2。内存复用是另一个容易被忽略的环节。推理引擎的静态内存池可以预先分配好所有中间张量所需内存在多个算子之间复用同一块缓冲区减少动态内存分配的开销。从实践来看这一步在TensorRT和ONNX Runtime里都是默认行为不需要我们手动干预。但如果自己做自研推理引擎就一定要设计内存池否则频繁malloc/free会直接拖垮实时性。4.3 敏感层排查量化失败后的第一个突破口模型量化后精度损失大我从来不建议直接放弃量化转回FP32。相反第一步永远是做逐层敏感性分析找出“坏层”。做法很简单把模型按层拆开对每一层分别做量化模拟其他层保持浮点。跑一遍完整验证集记录这一层单独量化时的精度变化。哪些层单独量化就让精度大幅下跌那些就是敏感层。我遇到过的敏感层主要有几类输入层附近的卷积层这些层直接作用于原始输入对像素分布最为敏感一点点量化噪声都会影响后续所有层。深度可分离卷积中的depthwise层这类层参数量小、计算稀疏量化时scale统计不准的概率大。注意力机制中的softmax层和LayerNorm层它们的数值范围随输入变化剧烈静态量化很难覆盖全部分布极易失真。最后的分类层和检测头输出层直接影响最终结果精度敏感性极高。处理敏感层的手段是“混合精度量化”让这些层保留FP16或FP32其余层用INT8。实际操作中TensorRT和ONNX Runtime都支持这类per-layer的精度配置。这类做法带来的额外收益是往往豁免三五个敏感层精度就能回到基线附近而推理速度只是损失不到5%。4.4 动态形状问题被低估的性能杀手模型部署到线上输入尺寸如果动态变化对推理引擎来说简直是噩梦。TensorRT这类引擎喜欢静态形状因为静态形状能提前把所有内存布局和kernel配置预编排好但实际业务场景中OCR的长图、检测模型的多尺度输入几乎都是动态形状。我的经验是把动态形状问题拆成两道题来做第一道是“定档”。如果业务允许把输入尺寸离散化为几个固定档位比如长边256、512、1024每个档位预构建一个engine。线上按输入尺寸分档路由效果上完全满足需求速度还稳。第二道是“真动态”。如果离散化挡不住业务那就走动态shape模式。TensorRT在构建engine时指定min、opt、max三个档位opt设置成最常见尺寸能让加速效果最好ONNX Runtime则通过动态轴配置实现但性能会比静态形状低一些要做好预期管理。我做过的一个OCR项目刚开始用动态形状直接推理单帧延迟40毫秒上下反复横跳。后来改成三个静态档位预构建长边512的档位延迟稳定在21毫秒整整快了将近一倍线上体验从“偶尔卡顿”直接变成了“丝滑跟手”。5. 常见问题与排查技巧实录5.1 量化后速度不升反降是怎么回事这个问题在我接手过的项目里出现过不止一次原因也各不相同。最常见的坑是量化后模型还在CPU上跑没有利用专用指令。INT8量化加速在x86 CPU上依赖AVX512等指令集在一些老CPU或者被虚拟机限制了指令集的服务器上INT8反而比FP32慢。确认的方法是在目标机上查一下CPU支持的指令集如果支持AVX512_VNNI请大胆加速如果只有SSE4.2那量化收益大概率有限需要调整预期。第二个坑是线程数配置不当。ONNX Runtime默认使用的线程数未必最适合目标模型尤其量化后单算子计算量变小而线程调度开销占比变大反而会拖慢速度。我在工控机上的经验是把OMP线程数设置成与物理核心数一致并且开启NUMA亲和性如果支持的话。第三个坑是中间张量拷贝过多。如果推理时频繁在CPU和GPU之间做张量拷贝比如输入预处理在CPU、推理在GPU来回搬运那么量化省下的计算时间完全会被数据拷贝吞掉。解决办法是把预处理也搬到GPU上或者用异步数据流来掩盖传输开销。5.2 校准集怎么选才能让量化更稳这个问题值得单独拎出来讲因为太多人在量化时精度受损根子其实在校准集上而不是量化算法本身。校准集的选择有三个硬性要求必须来自真实部署场景。训练集经过大量数据增强分布和线上数据往往有偏差直接拿训练集做校准反而会失真。数量不是越多越好一般300到500张即可。这个量级能让激活值min/max统计稳定又不至于在校准阶段消耗太久时间。如果模型是多任务的比如同时做检测和分类每个任务相关的数据都要覆盖不能只选单一类型样例不然某个分支的激活分布压根没被统计到。有一次我做视频分析模型的量化校准集只选了白天场景的截图叠加上线后夜间画质明显不行——光照变化大模型前几层对亮度处理的激活分布完全超出了校准范围量化后检测率狂跌。后来把白天和夜间样本按3:7混合重新校准问题就解决了。这里背后就是校准集代表性的问题。5.3 推理引擎加载时间过长怎么处理TensorRT的engine构建是个出了名的“体力活”动辄几分钟到十几分钟取决于模型复杂度和GPU型号。在边缘部署场景设备每次启动都要重新构建engine的话用户体验会非常差。我的解决方案是把构建好的engine序列化保存成文件TensorRT的trt文件或ONNX Runtime的optimized模型部署时直接反序列化加载启动时间可以从几分钟压缩到几秒钟。但这里有一个大坑要提示TensorRT engine文件是设备强绑定的。换GPU型号、换驱动版本、甚至换一个TensorRT版本原有engine文件就可能报废或性能退化。所以生产环境里构建engine的流程要设计成“首次启动时检测硬件信息比对缓存文件是否匹配不匹配则重新构建并缓存”而不是简单地拷贝文件到处跑。5.4 排查工具清单一个工龄十年的老兵的“战斗背包”排查性能问题最忌讳空手乱摸。以下是我每次接手性能优化项目必跑的排查工具和步骤获取系统级占用状态nvidia-smiGPU利用率、显存占用、pidstat或topCPU占用。kernel级耗时分析如果用TensorRT看Nsight Systems的timeline这里面能清晰看到每个kernel的耗时占比找出异常长时间算子。PyTorch自研模型优化前分析torch.profiler导出自带的trace也能按算子聚合耗时定位计算瓶颈。检查模型是否发生内存迁移在异构场景下增加显存拷贝检测比如CUDA的memcpy耗时确认是否因为数据搬运拖慢了整个pipeline。前后端耗时拆分算一次预处理耗时、模型推理耗时、后处理耗时看延迟到底花在哪一段而不是一味在模型本身上做文章。这一套流程跑下来基本能把性能问题的根因定位到具体的算子或数据层不会再出现“调了半天参但速度没变”的窘境。5.5 精度掉点排查优先级一个重要速查顺序如果量化后精度掉了系统化排查顺序建议如下先看是不是校准集的问题重新选校准集重跑PTQ合格标准精度恢复明显。再看是否某些层对量化极敏感对可疑层逐个做“单层量化模拟”找出坏层做豁免。确认权重量化是per-channel还是per-tensorper-channel是否对齐到了正确的维度。确认激活值量化范围设置合理与否尤其是对称量化和非对称量化的选择是否恰当ReLU类激活域改用非对称量化往往能改善结果。如果以上全都没问题再考虑是否升级到QAT用重训练强制模型适应量化噪声。这个顺序背后其实是成本递增的规律开始只用几小时做校准集调整慢慢再引入按层分析到了QAT就是彻底的重训练工程耗时按天计算。按这个顺序排查可以用最小成本解决最大比例的精度问题。写在最后的经验之谈模型压缩、量化与加速推理这件事做了六七个项目之后我个人最大的体会是这行没有银弹没有一劳永逸的万能脚本每一步都依赖于对具体模型结构和具体硬件平台的深刻理解。我自己踩过最大的坑就是一开始动手太快——模型还没完全定位清楚瓶颈就直接把量化、剪枝、蒸馏全套往模型上硬灌结果精度稀碎、性能拉胯回滚之后从头开始逐步分析反而两三天内就达成了目标。后来我给自己定了一条铁律凡事先做profiling用数据说话不让感觉左右决策。最后再分享一个小技巧每次做量化都记得把FP32基线模型的输出尤其是Softmax之前的logits保存成文件。后续无论是调校准集、做敏感层分析还是评估混合精度效果都可以快速对着logits做分布对比而不是每次都要重新跑一遍推理。这个习惯帮我节省了大量重复评估的时间成本。这套“先定位、再优化、后验证”的方法论配合文中的工具和参数大概率能让你的模型部署提速少走一半弯路。
阅读完成 · 觉得有帮助?