模型蒸馏实战

模型与算力

给准备动手做模型蒸馏的工程师一套可落地的实操流程:从定教师、造数据、定损失,到验收与上线前排查。

你已经有一个能用的微调流程,也知道量化怎么选,但真到「把大模型的能力压进小模型」这一步,常见卡点是不知道从哪下手:教师选谁、数据怎么造、什么指标算蒸馏成功。这篇只讲动作顺序和判断标准,不堆概念,每一步都告诉你要产出什么、什么情况下这条路不适用。

你已经有一个能用的微调流程,也知道量化怎么选,但真到「把大模型的能力压进小模型」这一步,常见卡点是不知道从哪下手:教师选谁、数据怎么造、什么指标算蒸馏成功。这篇只讲动作顺序和判断标准,不堆概念,每一步都告诉你要产出什么、什么情况下这条路不适用。

先说明白:蒸馏不是「必做项」,它是「在有硬约束时才做」的工程手段。如果你手里的任务用提示词加大模型就能交付,或者小模型本身的输出已经达到业务线,那省下的时间拿去做数据质量更值。下面按动手顺序走:能不能做、教师和数据、损失和训练、验收和上线。

先判断你该不该蒸馏,再动手

动手前先过三个前置条件:教师模型在你这条任务上已经稳定可复现、任务边界清晰到能写出固定的输入输出约定、你对延迟或单次推理成本有明确的硬约束。三条缺一条就先停,尤其第二条——任务边界说不清,后面造数据会反复返工。

  • 任务需求还在频繁改,输入输出格式一周一变,先别开蒸馏,等形态稳定
  • 教师自己输出就不稳定,同一输入多次调用结果跳来跳去,先解决教师侧
  • 小模型加一段提示词或少量示例已经够用,蒸馏属于过度工程
  • 教师侧的成本或延迟其实不构成瓶颈,那蒸馏的收益就很小
  • 你没有可回退的微调基线,蒸馏出问题会没有参照物

不适用场景要提前讲清楚,免得做完才发现方向错了。典型:创意类、开放性问答这类没有稳定参考答案的任务,蒸馏会把学生压成教师风格的平均值,反而丢掉多样性;还有教师输出本身带大量不确定性的场景,学生学到的就是噪声。

动手前写一页纸的立项说明,落在文档里:教师是谁、学生多大、目标延迟和显存上限、验收用哪套任务集、以及和现有微调、RAG 方案的分界线。这份纸是后面所有取舍的依据,别口头说。

判断项该蒸馏不该蒸馏
任务边界输入输出固定、可写成模板需求还在变、格式未定
教师稳定性多次调用结果一致同题输出跳动大
替代方案微调+RAG 仍不达标小模型加提示词够用
约束延迟或成本有硬指标没有硬约束,只是想做

选教师、造数据:蒸馏的主要工作量在这

教师不必选最强的那个,选在同任务上输出稳定、格式好解析的。如果你打算多教师混合,提前固定各教师权重并写进配置,否则同一份数据换个人重跑就对不上,后面训练出问题没法定位。

  1. 确定教师与调用方式固定 temperature、max tokens 等解码参数,记录教师版本标识;先用少量样本跑二十条,人工看格式是否稳定易解析。
  2. 准备种子输入从真实业务输入里抽一批覆盖主场景的样本,再补一批人工写的小样本种子集,专门覆盖边界和拒答场景。
  3. 批量生成教师输出对每条输入生成输出,保存原始返回和解析后的结构;失败和超时的样本单独打标,不要静默丢弃。
  4. 清洗与版本化按去重、去异常长度、过滤低置信样本、统一模板的顺序处理,每一步产出一份可回滚的版本快照。

数据来源大致三条:真实业务输入、教师对无标注输入的输出、以及人工写的小样本种子集。前两者量大,第三者质量高、用来校准方向和覆盖边界。硬标签和软标签的取舍看任务:分类任务更适合用教师的概率分布做软标签,生成任务更多看输出序列以及与教师输出的一致性排序。

定损失、配算力:学生怎么学

常见组合是交叉熵打底,叠加一层与教师输出分布或中间表示的对齐项。权重从小往大调,第一轮先跑通流程再说调优。对齐项不是必加项:如果学生和教师的结构差异大,中间层对齐反而会拖后腿,这时只用输出层对齐更稳。

训练配置先从你已验证过的微调配方起步:批次、学习率、轮次都照搬,只改和蒸馏相关的部分。这样出问题时你能判断是蒸馏引入的,还是配置本身的问题。算力估算走站内既有口径,按学生规模估显存与时长,再决定租卡还是按量付费,具体数字到 价格追踪(/price-watch) 核对当时的行情。

# 训练前先做一次小规模冒烟:少量步数、单卡、只跑通链路
# python train_distill.py --max_steps 50 --save_every 25 --eval_every 25
# 每轮保存检查点,并记录教师与学生在验证集上的差距曲线

每轮留检查点,重点看教师与学生在验证集上的差距曲线。差距不收敛时,第一反应是回头看数据,而不是加轮次或调大学习率——多数蒸馏失败源于数据里混了大量教师自己也拿不准的样本。

验收与上线:怎么算蒸馏成了

验收至少用三套:业务任务集、教师同题对照、以及边界与拒答样本。只看单一分数容易被带偏,例如学生学会了教师的格式却没学会判断该不该答。及格线按你业务可接受的损失来定,提前写进验收单,别看到结果再回头改标准。

  • 业务任务集:覆盖主场景,人工或规则判分,看整体是否达标
  • 教师同题对照:同一批输入分别给学生和教师,统计一致率和关键差异
  • 边界与拒答:故意给越界、模糊、恶意输入,看学生是否乱答
  • 延迟与并发实测:学生变小不等于变快,瓶颈常在部署侧
  • 回退演练:确认能一键切回教师或原微调模型,并实测切换耗时

上线前做延迟与并发实测,如果学生参数变小但线上没变快,先查部署侧:批处理、显存占用、服务框架、并发队列都可能吃掉模型变小带来的收益。模型结构相关的基础数据可以到 模型资料库(/models) 核对。

回退路径必须保留:学生表现掉出阈值时,能一键切回教师或原微调模型,并把这个动作写进上线检查表。这不是不信任蒸馏,是给线上留一张底牌。

下一步把教师调用方式、数据清洗流程、验收三套集先记进你的工程文档,再去站内对照工具和价格页面把算力与部署口径核一遍。

常见问题

蒸馏一定要用比学生大很多的教师吗?

不一定,关键看教师在同任务上的输出是否稳定、是否比学生明显强。差距太小蒸馏收益有限,差距太大而学生容量不够时,学到的多是表面格式而不是判断能力。实践上先用中小规模教师跑通流程,确认数据管线和验收口径没问题,再换更强的教师重跑。

蒸馏和微调到底该先做哪个?

通常先微调再蒸馏。微调解决「模型会不会做这件事」,蒸馏解决「用更小的模型做这件事、还要更快更便宜」。如果微调阶段教师都还没调稳,蒸馏出来的学生会继承它的毛病,而且你很难分清是数据问题还是教师问题。站内微调相关页面先把那一步走完。

蒸馏完效果比教师差多少算正常?

没有通用数字,取决于任务难度和学生容量。判断方法是看差距是否集中在少数难样本上、是否影响你的业务指标,而不是看平均分的绝对落差。可接受阈值要在动手前写进验收单。若差距散落在大量简单样本上,通常是数据或损失配置的问题,不是模型太小。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。