端侧 AI 为什么需要模型压缩
云端大模型效果好,但跑在手机上不现实——几 GB 的模型文件、几十 GB 的显存需求,手机根本扛不住。端侧 AI 的需求越来越多:语音唤醒、拍照识别、离线翻译,这些场景要求模型又小又快,效果还不能太差。模型压缩就是解决这个矛盾的技术路线。
压缩有三条主线:蒸馏(用大模型教小模型)、剪枝(砍掉不重要的权重)、量化(降低权重精度)。本文重点讲蒸馏和剪枝——量化在之前的推理优化文章里已经讲过。蒸馏和剪枝通常组合使用,效果比单做一个好。
端侧 AI 的核心矛盾:效果要接近云端大模型,但体积要小到能塞进手机。蒸馏和剪枝就是在这个矛盾里找平衡点。
- 知识蒸馏用大模型当老师,训练一个小模型模仿它的输出。
- 结构化剪枝按整个注意力头或层砍掉冗余部分,压缩后结构规整。
- 端侧部署把压缩后的模型移植到手机,解决延迟和内存问题。
- 精度取舍压缩幅度越大,精度损失越大,要找到合适的甜点。
知识蒸馏:让小模型学大模型
知识蒸馏的思路很直觉:大模型效果好但太大,小模型小但效果差。那能不能让大模型当老师,教小模型学习它的输出?具体做法是:用大模型对一批数据生成软标签(每个类别的概率分布),然后训练小模型去拟合这个软标签。小模型不仅学「正确答案是什么」,还学「老师觉得其他答案有多不像」。
# 知识蒸馏的基本流程
# 1. 准备数据:一批无标签或弱标签数据
# 2. 用大模型(老师)对这些数据做推理,得到软标签
# soft_labels = teacher_model.predict(data)
# 3. 训练小模型(学生)拟合软标签
# loss = MSE(student_model.predict(data), soft_labels)
# 4. 小模型再用真实标签做微调,恢复精度
# 关键点:
# - 老师模型越大,蒸馏效果越好
# - 学生模型可以是老师的缩小版(更少层、更小隐藏维度)
# - 软标签里的暗知识比硬标签信息量更大
结构化剪枝:砍掉冗余权重
大模型里有很多权重是冗余的——接近零、对输出影响很小。把这些权重砍掉,模型就变小了。非结构化剪枝是砍单个权重,压缩后是稀疏矩阵,需要专门硬件才能加速。结构化剪枝是砍整个注意力头或整个层,压缩后模型结构还是规整的,普通推理框架直接就能跑。
- 非结构化剪枝砍单个权重,稀疏矩阵,需专用硬件加速。
- 结构化剪枝砍整个头或层,结构规整,普通框架直接跑。
- 敏感度评估先测每个头/层对输出的影响,砍影响最小的。
蒸馏加剪枝的组合拳
单独做蒸馏或剪枝,压缩幅度有限。组合起来效果更好:先剪枝砍掉冗余结构,再蒸馏让小模型学大模型的输出,最后再微调恢复精度。这个流程通常能把模型压缩到原来的十分之一,精度损失控制在可接受范围内。
| 步骤 | 做什么 | 效果 |
|---|---|---|
| 剪枝 | 砍掉冗余的注意力头和层 | 模型变小,结构变稀疏 |
| 蒸馏 | 用原大模型教剪后的小模型 | 小模型学到大模型的知识 |
| 微调 | 用真实标注数据再训一轮 | 恢复剪枝和蒸馏带来的精度损失 |
端侧部署的工程问题
压缩完模型只是第一步,端侧部署还有一堆工程问题:模型文件要打包进 App、推理要适配手机 NPU、内存占用要控制、首次加载时间不能太长。这些问题和服务器部署完全不同——手机资源有限,你不能假设它什么都有。
# 端侧部署的关键指标
# - 模型大小:通常要求 < 200MB,否则 App 体积爆炸
# - 推理延迟:交互式场景要求 < 500ms
# - 内存占用:不能超过系统分配给 App 的上限
# - 启动时间:模型加载要快,不能让用户等太久
性能与精度的取舍
压缩是个取舍游戏:压得越狠,模型越小越快,但精度掉得越多。关键是找到你的场景能接受的甜点——语音唤醒这种简单任务可以压得很狠,复杂的语义理解任务就要保留更多参数。不要追求极致压缩,够用就好。
从实验到量产
实验阶段跑通压缩流程不难,难的是量产——要在各种手机型号上都能跑、要在不同系统版本上稳定、要适配不同 NPU 芯片。端侧 AI 的最后一公里永远是兼容性。压缩模型在实验室里测好效果,到了真实用户的手机上可能因为芯片不兼容跑不起来。这部分工作量往往比压缩本身还大。
蒸馏和剪枝解决的是「模型能不能变小」的问题,端侧部署解决的是「变小之后能不能在手机上跑」的问题。两个都做好,端侧 AI 才算真正落地。