你已经有一个能用的微调流程,也知道量化怎么选,但真到「把大模型的能力压进小模型」这一步,常见卡点是不知道从哪下手:教师选谁、数据怎么造、什么指标算蒸馏成功。这篇只讲动作顺序和判断标准,不堆概念,每一步都告诉你要产出什么、什么情况下这条路不适用。
你已经有一个能用的微调流程,也知道量化怎么选,但真到「把大模型的能力压进小模型」这一步,常见卡点是不知道从哪下手:教师选谁、数据怎么造、什么指标算蒸馏成功。这篇只讲动作顺序和判断标准,不堆概念,每一步都告诉你要产出什么、什么情况下这条路不适用。
先说明白:蒸馏不是「必做项」,它是「在有硬约束时才做」的工程手段。如果你手里的任务用提示词加大模型就能交付,或者小模型本身的输出已经达到业务线,那省下的时间拿去做数据质量更值。下面按动手顺序走:能不能做、教师和数据、损失和训练、验收和上线。
先判断你该不该蒸馏,再动手
动手前先过三个前置条件:教师模型在你这条任务上已经稳定可复现、任务边界清晰到能写出固定的输入输出约定、你对延迟或单次推理成本有明确的硬约束。三条缺一条就先停,尤其第二条——任务边界说不清,后面造数据会反复返工。
- 任务需求还在频繁改,输入输出格式一周一变,先别开蒸馏,等形态稳定
- 教师自己输出就不稳定,同一输入多次调用结果跳来跳去,先解决教师侧
- 小模型加一段提示词或少量示例已经够用,蒸馏属于过度工程
- 教师侧的成本或延迟其实不构成瓶颈,那蒸馏的收益就很小
- 你没有可回退的微调基线,蒸馏出问题会没有参照物
不适用场景要提前讲清楚,免得做完才发现方向错了。典型:创意类、开放性问答这类没有稳定参考答案的任务,蒸馏会把学生压成教师风格的平均值,反而丢掉多样性;还有教师输出本身带大量不确定性的场景,学生学到的就是噪声。
动手前写一页纸的立项说明,落在文档里:教师是谁、学生多大、目标延迟和显存上限、验收用哪套任务集、以及和现有微调、RAG 方案的分界线。这份纸是后面所有取舍的依据,别口头说。
| 判断项 | 该蒸馏 | 不该蒸馏 |
|---|---|---|
| 任务边界 | 输入输出固定、可写成模板 | 需求还在变、格式未定 |
| 教师稳定性 | 多次调用结果一致 | 同题输出跳动大 |
| 替代方案 | 微调+RAG 仍不达标 | 小模型加提示词够用 |
| 约束 | 延迟或成本有硬指标 | 没有硬约束,只是想做 |
选教师、造数据:蒸馏的主要工作量在这
教师不必选最强的那个,选在同任务上输出稳定、格式好解析的。如果你打算多教师混合,提前固定各教师权重并写进配置,否则同一份数据换个人重跑就对不上,后面训练出问题没法定位。
- 确定教师与调用方式固定 temperature、max tokens 等解码参数,记录教师版本标识;先用少量样本跑二十条,人工看格式是否稳定易解析。
- 准备种子输入从真实业务输入里抽一批覆盖主场景的样本,再补一批人工写的小样本种子集,专门覆盖边界和拒答场景。
- 批量生成教师输出对每条输入生成输出,保存原始返回和解析后的结构;失败和超时的样本单独打标,不要静默丢弃。
- 清洗与版本化按去重、去异常长度、过滤低置信样本、统一模板的顺序处理,每一步产出一份可回滚的版本快照。
数据来源大致三条:真实业务输入、教师对无标注输入的输出、以及人工写的小样本种子集。前两者量大,第三者质量高、用来校准方向和覆盖边界。硬标签和软标签的取舍看任务:分类任务更适合用教师的概率分布做软标签,生成任务更多看输出序列以及与教师输出的一致性排序。
定损失、配算力:学生怎么学
常见组合是交叉熵打底,叠加一层与教师输出分布或中间表示的对齐项。权重从小往大调,第一轮先跑通流程再说调优。对齐项不是必加项:如果学生和教师的结构差异大,中间层对齐反而会拖后腿,这时只用输出层对齐更稳。
训练配置先从你已验证过的微调配方起步:批次、学习率、轮次都照搬,只改和蒸馏相关的部分。这样出问题时你能判断是蒸馏引入的,还是配置本身的问题。算力估算走站内既有口径,按学生规模估显存与时长,再决定租卡还是按量付费,具体数字到 价格追踪(/price-watch) 核对当时的行情。
# 训练前先做一次小规模冒烟:少量步数、单卡、只跑通链路
# python train_distill.py --max_steps 50 --save_every 25 --eval_every 25
# 每轮保存检查点,并记录教师与学生在验证集上的差距曲线每轮留检查点,重点看教师与学生在验证集上的差距曲线。差距不收敛时,第一反应是回头看数据,而不是加轮次或调大学习率——多数蒸馏失败源于数据里混了大量教师自己也拿不准的样本。
验收与上线:怎么算蒸馏成了
验收至少用三套:业务任务集、教师同题对照、以及边界与拒答样本。只看单一分数容易被带偏,例如学生学会了教师的格式却没学会判断该不该答。及格线按你业务可接受的损失来定,提前写进验收单,别看到结果再回头改标准。
- 业务任务集:覆盖主场景,人工或规则判分,看整体是否达标
- 教师同题对照:同一批输入分别给学生和教师,统计一致率和关键差异
- 边界与拒答:故意给越界、模糊、恶意输入,看学生是否乱答
- 延迟与并发实测:学生变小不等于变快,瓶颈常在部署侧
- 回退演练:确认能一键切回教师或原微调模型,并实测切换耗时
上线前做延迟与并发实测,如果学生参数变小但线上没变快,先查部署侧:批处理、显存占用、服务框架、并发队列都可能吃掉模型变小带来的收益。模型结构相关的基础数据可以到 模型资料库(/models) 核对。
回退路径必须保留:学生表现掉出阈值时,能一键切回教师或原微调模型,并把这个动作写进上线检查表。这不是不信任蒸馏,是给线上留一张底牌。
下一步把教师调用方式、数据清洗流程、验收三套集先记进你的工程文档,再去站内对照工具和价格页面把算力与部署口径核一遍。→常见问题
蒸馏一定要用比学生大很多的教师吗?
不一定,关键看教师在同任务上的输出是否稳定、是否比学生明显强。差距太小蒸馏收益有限,差距太大而学生容量不够时,学到的多是表面格式而不是判断能力。实践上先用中小规模教师跑通流程,确认数据管线和验收口径没问题,再换更强的教师重跑。
蒸馏和微调到底该先做哪个?
通常先微调再蒸馏。微调解决「模型会不会做这件事」,蒸馏解决「用更小的模型做这件事、还要更快更便宜」。如果微调阶段教师都还没调稳,蒸馏出来的学生会继承它的毛病,而且你很难分清是数据问题还是教师问题。站内微调相关页面先把那一步走完。
蒸馏完效果比教师差多少算正常?
没有通用数字,取决于任务难度和学生容量。判断方法是看差距是否集中在少数难样本上、是否影响你的业务指标,而不是看平均分的绝对落差。可接受阈值要在动手前写进验收单。若差距散落在大量简单样本上,通常是数据或损失配置的问题,不是模型太小。