☰
模型压缩十年实操:剪枝、量化、蒸馏与低秩分解全指南
2026/10/18 13:39:07 网站建设 项目流程

做模型压缩这件事,我算了算,从2015年第一次把剪枝代码跑通,到现在正好十年。这十年里,模型压缩从一个不太被重视的“小方向”,变成了深度学习落地绕不开的基础设施。我这里说的模型压缩,指的是在不明显损害效果的前提下,把模型变小、变快、变省资源的一系列方法,包括剪枝、量化、知识蒸馏、低秩分解这些。这篇内容我想从一个实操者的角度,把十年的技术演进、踩过的坑、和今天还值得用的方法,从头到尾梳理一遍。不管你是刚接触部署的新人,还是已经做过几次压缩的老手,应该都能找到一些能直接拿去用的东西。

2015年的时候,模型压缩在很多人眼里还算不上正经方向。当时的主流思路是加深加宽网络,模型越大,效果越好似乎是天经地义的事。但凡是做过真实部署的人,都会立刻撞上另一堵墙:内存装不下、算力扛不住、时延压不下来。我参加过的一次技术评审到现在还记得很清楚——算法团队报了一个分类准确率很漂亮的模型,嵌入式团队负责人只问了一句“内存和帧率能不能达标”,整个会议就冷场了。从那一刻起我意识到,模型压缩不是锦上添花的优化题,而是产品能不能落地的生存题。

1. 需求倒逼:十年里“压什么”发生了三次大转移

1.1 2015–2017:目标是“装得下”

早期模型压缩的核心驱动力是“存储装不下”。那时的视觉模型动辄几百MB,而手机、摄像头、嵌入式板卡的存储空间非常有限。把模型从500MB压到100MB,甚至50MB,是能不能上设备的硬门槛。所以那几年的主流方向集中在权重剪枝和二值化上,优先解决“体积问题”。现在回看,这个阶段的技术虽然粗糙,但它把压缩从“没有需求”变成了“有明确指标”,存储大小是一个一锤定音的验收条件。

那个年代流行的一个思路是:把绝对值接近零的权重直接置零,然后用稀疏格式存储。听起来很优雅,实际操作时会发现一个尴尬问题——普通硬件的稀疏矩阵计算支持很差,虽然存储省了不少,推理时索引开销反而更大。我在某个图像分类模型上做过测试,稀疏度拉高到90%,理论体积确实大幅下降,但推理时间几乎没变,甚至更慢。这就是早期剪枝的真实处境:论文指标漂亮,工程收益打折扣。

1.2 2018–2021:目标是“跑得快”

2018年前后,终端AI应用大面积铺开,需求从“能装下”变成了“实时响应”。人脸识别、语音唤醒、在线翻译,这些场景对时延极其敏感。此时大家真正关心的是“每秒能处理多少帧”和“单次请求延迟多少毫秒”。于是结构化剪枝、INT8量化、算子融合这些能直接降低计算量的方法开始成为主流。压缩指标的关注点从“参数量减少了多少”转向“推理时间缩短了多少”。

这个阶段还有一个重要变化:硬件生态开始主动配合压缩。芯片厂商在算子库里实现INT8计算,编译器开始支持通道剪枝后的密集算子,模型压缩第一次和硬件产生“联合优化”的关系。我见过一个移动端检测模型,单纯做INT8量化加算子融合,推理速度翻了4倍,精度只掉了0.3%。这种收益在2015年根本无法想象。可以说,2018到2021年是模型压缩工程化的黄金窗口期。

1.3 2022–2025:目标是“付得起”

到了大模型时代,问题再一次变化。模型体积已经不是核心矛盾,显存占用和推理成本才是真正的生死线。一个几百亿参数的模型,就算能跑起来,每次调用消耗的算力成本、显卡显存、带宽开销都高得惊人。此时模型压缩的核心目标变成了“在可接受的精度损失范围内,把单位推理成本压到最低”。混合精度、分组量化、蒸馏+量化组合拳,这些方法都是冲着成本去的。

同时,压缩对象也变了。过去压缩的是卷积网络,结构规整、冗余明显;现在要压缩的是自注意力模型,层与层之间有复杂依赖,直接删层、剪头的影响很难预估。大模型的涌现能力也让业界变得更谨慎:有些能力可能集中在少数几个参数上,简单剪枝可能连带删掉不该删的东西。所以近两年的压缩路线更强调“感知”,先判断哪些部分真正冗余,再动手。

时间段核心痛点主要目标常用手段
2015–2017存储装不下减小体积权重剪枝、二值化
2018–2021实时响应难降低延迟结构化剪枝、INT8量化
2022–2025推理成本高降低成本混合精度、蒸馏+量化

2. 四大技术路线:十年间各自的演进与卡点

2.1 剪枝:从“删权重”到“删结构”再到“删层”

剪枝是模型压缩里最直观的方法,思路就是“去掉不重要的部分”。但“不重要的部分”定义一直在变。

早期的非结构化剪枝针对单个权重。训练完成后把数值接近零的权重置零,模型变成一个稀疏矩阵。这个方法理论压缩率很高,但硬件不买账——稀疏计算的加速依赖专门硬件和特殊存储格式,通用平台很难把收益兑现。我自己的经验是,这类方法适合学术研究,不适合生产部署。

2017年之后,“结构化剪枝”成为主流。做法是整块删除,比如把不重要的卷积核、通道、甚至整个Block去掉。删除之后网络仍然保持密集计算模式,算子库可以直接受益,推理速度提升非常直观。这个方向有一个核心问题:如何判断哪些结构不重要?早期用权重范数做标准,后来发现不太可靠;再后来有人用BN层的缩放因子作为通道重要性指标,这招在实践里很管用。还有一种更稳的路子是做敏感度分析——逐层在验证集上评估“删掉这一层后损失变化多少”,根据敏感度决定每层的剪枝比例。

剪枝在工程上还有一个重要技巧:迭代剪枝。不要一次剪到位,而是“训练→剪掉一小部分→重训练→再剪”,反复进行。这很像减肥,每周减一点身体能适应,想一口气减掉十几斤大概率会反弹。我做过一个视频理解模型,一开始图省事全局统一剪掉40%,精度掉了3.5个点;后来改成敏感度分层剪枝,敏感层剪10%、不敏感层剪50%,总量还是40%,精度只掉了0.8个点。

大模型时代,剪枝的思路又进化了。注意力头剪枝、层剪枝、宽度剪枝,本质上都是找“删掉之后影响最小的结构”。判断方式也从“权重大小”变成了“消除之后对输出的扰动大小”。甚至有人开始把稀疏约束加进训练过程,让模型从头就长出一些可删的结构。这条路还远没到终点,但它已经证明:剪枝的底层逻辑不是“哪些参数没用”,而是“哪些结构冗余且互不依赖”。

2.2 量化:性价比最高的压缩手段

如果说剪枝是把模型“瘦身”,量化就是把模型“换血”。原理很简单:原本用32位浮点表示的权重,换成8位整数或者4位整数,体积直接降为原来的四分之一或八分之一。量化是压缩方法里性价比最高的,没有之一。

2015年前后大家热衷做二值化、三值化,一个权重只占1到2个bit,理论压缩率惊人,但在主流图像识别任务上精度掉得没法看。那几年我试过不少二值方法,结论是“论文里看起来很美,实际效果很劝退”。直到2018年之后,INT8量化在工程上逐渐成熟:对称量化、非对称量化、逐通道缩放、量化感知训练,一系列配套手段把精度损失控制在可接受范围内。

量化有两个关键操作:训练后量化(PTQ)和量化感知训练(QAT)。前者非常简单——模型训完后,拿一小部分数据跑一遍,统计激活值的分布,算出量化参数,然后直接转成整数模型。好处是快,几乎不占额外时间;坏处是如果统计分布不准,精度比较容易崩。后者是在训练过程中模拟量化误差,让模型“适应”低精度表示,效果通常更好,但训练时间和计算资源成本高。

我这些年做量化项目,踩过最大的一次坑是校准集选择。当时做一个OCR相关模型,PTQ到INT8之后识别率掉了5%,怎么排查都找不出原因。后来发现是校准集的问题——我用的是网上找的通用图片,里面几乎没有生僻字和低分辨率样本,模型在真实场景里的激活分布根本没有被校准到位。换成线上真实分布样本后,误差立刻缩到1%以内。这件事我记到现在。校准集不是越多越好,更不是随便凑的,它必须覆盖真实部署时可能遇到的主要分布。

还有个常见问题是异常值。大模型权重里偶尔会出现绝对值特别大的离群值,直接把量化范围拉高了,其他权重被压得很窄,精度受损。解决办法也比较成熟:要么做异常值分离,要么按通道分组量化,要么把特别敏感的部分保留高精度、其他部分用低精度。这种混合精度思路,是这几年大模型量化的核心套路。做量化的时候还有一个容易被忽略的点:整数位宽看起来越低越好,但INT4在有些硬件上不一定比INT8快,反量化开销可能更大。选择位宽之前,先看清楚目标平台的算子库支持情况。

提示:量化不是简单地把浮点转整数,关键看你拿什么数据做校准、按什么粒度确定缩放范围、以及敏感层要不要单独保留高精度。

2.3 知识蒸馏:让“小模型”站在“大模型”肩膀上

知识蒸馏是2015年正式进入主流视野的一套思路,核心概念很优雅:用一个规模大、效果好的“教师模型”去指导一个小“学生模型”。教师输出不只是最终的硬标签,而是每个类别的概率分布。这个分布里藏着“猫和狗有多像”这类信息,小模型从教师那里学到的不仅是答案,还有答案之间的相对关系。

蒸馏最初的做法是匹配输出logits,用“温度”把概率分布变得平滑一些。温度越高,分布越均匀,类别间细节保留越多;温度太低,软标签就退化成了硬标签。温度怎么选?我在某分类任务上试过调参,温度从3调到10,训练损失越来越低,但学生模型在真实数据上的准确率反而变差了。原因很典型:温度太高,类别间差异被过度抹平,学生学到的是“模糊共识”。后来的实践经验是,分类任务温度通常落在3到7这个区间,并且要和教师模型的置信度一起看。

蒸馏后来从“只对齐输出”进化到“中间层也对齐”。特征蒸馏的做法是让学生模型的中间特征图去匹配教师模型的中间特征图,常用L2约束或者对抗对齐。对于带有自注意力的模型,还可以逐层对齐注意力矩阵。这类方法效果好,但实现复杂——中间层怎么对应、特征空间维度不一致怎么处理、对齐损失权重怎么调,都是工程上绕不开的细节。

到了大模型时代,蒸馏的含义被大大拓宽了。过去是“学概率分布”,现在是“学行为模式”。具体做法通常是:让大模型生成大量高质量问答数据,再用这些数据训练一个小模型。这个过程中小模型学到的是一种“输出风格”和“推理路径”,比单纯匹配logits更丰富。蒸馏还经常和量化组合使用:模型量化后精度掉了一些,让原模型当教师、量化模型当学生,再做一轮蒸馏微调,精度基本能追回来。我实测过一个7B级别生成模型,4bit量化后校准精度掉1%以上,补了一轮蒸馏后基本打平。

2.4 低秩分解:被低估的“数学流”方法

低秩分解的思路完全是数学式的:一个大的权重矩阵,可能存在大量冗余信息,可以用两个小矩阵相乘近似。假设原矩阵维度是m×n,把它分解成两个矩阵的乘积,尺寸之和远小于m×n时,存储和计算都能省下一大截。

这个方法在理论层面非常漂亮,做SVD分解也很简单,但工程落地时遇到不少现实问题。深层网络的强非线性会让矩阵的“有效秩”偏高,硬性低秩近似会导致精度掉得厉害;分解后的网络结构变了,算子不一定能在目标硬件上高效执行。我早年在一组视觉模型上试过低秩分解,精度和速度的平衡点很难找,最后放弃了,转投剪枝。但这个方法并没有过时,近几年在自注意力模型上有一波复兴——注意力矩阵维度很高,但有效信息往往集中在少数几个方向上,低秩近似能省不少计算。参数高效微调领域也间接验证了这一点:冻结大部分参数,只训练一小部分低秩矩阵,效果出奇地好。这让我重新思考:预训练模型的权重空间里,本来就存在大量低秩结构。

低秩分解工程上最大的坑是“理论秩不等于有效秩”。SVD按奇异值能量占比估算出一个k值,但实际部署时可能发现精度崩了。我的做法是:先按奇异值谱估算,再在那个k值附近扫三组数据,结合少量微调决定。不要迷信公式,以实测为准。

3. 工程化进程:从“手工作坊”到“标准化流水线”

3.1 早期的“手工作坊”模式

2015年前后做模型压缩,基本是纯手工活。算法工程师先离线剪枝或者量化,把模型参数文件抠出来,再手动改写推理代码。整个过程没有标准工具,每一步都要靠经验试探。更麻烦的是,每换一个目标硬件,压缩策略和底层实现几乎全部重来。那时一个压缩项目做一个月是常态,而且结果很难复现——换个人来做,换个参数初始化,结果可能完全不同。

3.2 框架与自动化工具的成熟

后来主流深度学习框架把量化感知训练、剪枝API做成标配,压缩终于从“科研课题”变成了“配置项”。普通工程师不需要理解复杂原理,也能在训练脚本里加上量化感知步骤。自动化压缩工具也开始出现,自动搜索每层剪枝率、量化位宽,把压缩流程从数周缩短到几小时。工具能帮你做很多事,但底层的逻辑仍然是敏感度分析加搜索优化,只是把过去人工试错的过程自动化了。

这也是我给新人团队的建议:不要一上来就迷信自动压缩工具。先用小模型手动跑一遍剪枝、量化的全流程,把敏感度分析、校准集设计、蒸馏温度这些基本概念吃透,再上自动化工具。工具是放大器,前提是你知道要放大什么。

3.3 推理引擎与硬件适配:压缩收益的“最后一公里”

压缩后的模型要真正变快,必须得到推理引擎和算子库的支持。算子融合、内存布局优化、低精度算子实现,这些才是把理论收益兑现成实际加速的关键。我见过不少团队在训练框架里压缩得很漂亮,一部署到目标硬件就发现速度毫无提升。原因往往是指定算子不支持INT8,自动回退成了FP32;或者剪枝后的不规则shape触发了算子分发的慢路径。这说明一个道理:模型压缩不能只在模型层面做,要在“模型+编译器+算子库”的共同约束下做。

3.4 评测标准的变化

早期压缩论文喜欢报“压缩率”“稀疏度”,听起来很震撼。但工程上真正关心的是四项:端到端延迟、峰值显存或内存、吞吐量、精度损失。近年又加了一项:功耗。尤其在终端和边缘场景,功耗直接决定设备续航和散热,甚至比精度还重要。评测标准的变化说明模型压缩在走向成熟——大家不再追求一个漂亮的理论数字,而是关注它在真实系统里到底带来了多少收益。

4. 实操心得:这些年我踩过的模型压缩的坑

4.1 剪枝之外,还要考虑层的“性格”

不同层的冗余程度差异极大,敏感度分析是判断依据。我的标准流程是:先做一个全局剪枝率预实验,找出精度掉点严重的层;然后对每一层分别做“删除扰动”实验,记录删除该层对验证集Loss的影响;最后按敏感度分配每层剪枝率。这比统一比例让结果稳定得多。

4.2 量化不是“转格式”,而是“重新适配数据”

很多人第一次做量化,以为就是把权重做一次线性变换。实际上,量化之后一定要重新跑一遍模型,观察每层输出的分布变化。我的检查方法是对比量化前后每一层的输出余弦相似度,如果某一层低于0.99,就标记为敏感层,优先考虑该层保留高精度或者换量化方式。这一步能帮你提前发现问题,而不是等上线之后被业务方找上门。

4.3 蒸馏的软标签不是越“软”越好

温度越高,软标签携带的信息越丰富,但也越模糊。温度低,信息太硬,学生学不到相似性关系。实际操作中,我一般先固定温度3到5做一轮,观察学生模型在验证集上的表现,再在两三个温度值之间微调。同时注意蒸馏损失的权重,不要让它压过硬标签的监督信号,否则学生模型会过度拟合教师模型的“个人偏好”。

4.4 低秩分解的秩,先估再扫

低秩分解确定秩的时候,我习惯先看奇异值谱,估算前多少个奇异值占了90%的能量,把k设成这个数。但理论估计不一定适配真实部署,建议在k附近多试几组,配合少量微调看最终效果。这个方法在自注意力模型上尤其值得一试,因为注意力矩阵的冗余度往往比全连接层更高。

4.5 常见问题速查表

现象可能原因排查方向
剪枝后速度不增反降非结构化稀疏导致索引开销大改为结构化剪枝、检查算子库支持
量化后精度骤降校准集分布不匹配、存在异常值换校准集、异常值分离、敏感层混合精度
蒸馏后学生模型效果差温度过高、蒸馏损失权重过大降低温度、增加硬标签比例
低秩分解后训练不收敛秩太低、未做微调增大k值、补充微调
组合压缩收益不如预期压缩顺序不合理推荐顺序:蒸馏→剪枝→量化→微调

5. 十年演进的快照:一张表与三点建议

5.1 一张时间线表

年份核心问题主流方案
2015模型太大剪枝、蒸馏概念成熟
2016存储约束剪枝+量化+编码的组合
2017推理延迟结构化剪枝
2018自动化需求自动化压缩工具出现
2019部署精度量化感知训练大规模应用
2020自注意力模型瘦身低秩分解、特征蒸馏
2021大模型显存压力分组量化、混合精度
2022大模型能力传承蒸馏+指令微调
2023稀缺算力激活稀疏、结构化剪枝复兴
2024成本竞争压缩+蒸馏一体化流程
2025全栈优化从训练阶段开始引入稀疏与量化

5.2 今天入场,建议从哪里开始

如果你现在打算做模型压缩,我的建议是先把四件事吃透:敏感度分析、校准集设计、蒸馏温度调节、算子库约束。这四件事看着基础,但十年里所有主流方法几乎都是它们的不同组合。把这四件基础功练好,再看最近两年的大模型压缩论文,你会很容易抓住它们的共同逻辑:先判断冗余在哪里,决定用什么手段去掉,再用重训练或蒸馏把损失补回来。

5.3 我自己的一点体会

做模型压缩这十年,我最大的体会是:压缩的本质不是“删东西”,而是搞清楚什么东西可以删、删了之后如何补救。它是一个“算法+系统+数据”的系统工程问题,单独在任何一个层面发力都很难拿到极致收益。早年我以为压缩就是比谁的剪枝公式更漂亮,后来才发现,真正决定产品好坏的是模型与硬件、数据分布之间的匹配程度。这十年大模型把压缩推到了聚光灯下,但底层的道理还是2015年那一套:先找冗余,再决定手段,最后用微调和蒸馏把损失找回来。理解了这个逻辑,任何新压缩方法在你眼里都不会陌生。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询