端侧 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 的上限
# - 启动时间:模型加载要快,不能让用户等太久