
CHAPTER 03 · DISTILLATION IN PRACTICE
教师部署 · 数据生成 · 黑盒/白盒/特征/同步/渐进式蒸馏全流程 · 调参与排查
蒸馏的实操比微调复杂,因为你要同时处理两个模型(教师和学生),而且需要选择蒸馏策略、生成蒸馏数据、调整蒸馏损失。本章将把这些环节逐一拆解,让你能从零跑通。
能力越强越好 教师的能力天花板就是学生的能力天花板
同系列优先 架构相似,白盒蒸馏时中间层对齐更容易
显存能装下 需同时运行教师(推理)和学生(训练),教师显存是硬约束
推荐组合
72B → 7B 压缩~10x | 显存~52GB(72B 4bit + 7B LoRA)| 2×A100 80GB
72B → 1.5B 压缩~48x | 显存~42GB | 1×A100 80GB
14B → 1.5B 压缩~9x | 显存~32GB | 1×A100 40GB
7B → 0.5B 压缩~14x | 显存~16GB | 1×RTX 4090
方式一:直接加载(白盒蒸馏用) 需要访问教师模型的Logits和Hidden States,必须直接加载模型权重。建议4bit量化节省显存。
方式二:API服务(黑盒蒸馏用) 用vLLM部署教师模型API,只需文本输出。适合闭源模型或显存不够的场景。
方式三:离线批量推理 ★推荐 先批量运行教师生成蒸馏数据保存到文件,再用数据训练学生。不需要同时加载两个模型。
离线生成建议temperature=0.7和top_p=0.9,既有质量保证又有多样性。temperature=0(贪心解码)所有输出都一样,学生学不到多样性。
白盒蒸馏的核心是提取教师模型的Logits(未归一化的概率分布)。这需要在训练过程中实时获取,不能离线完成。
关键参数
temperature: 2.0~5.0 温度越高软标签越"软",暗知识越丰富,推荐从2.0开始
alpha: 0.5~0.7 蒸馏损失权重。教师信号质量高时增大alpha,数据有标注时降低
kl_div reduction: batchmean 使损失值与batch_size无关
显存优化技巧
教师模型4bit量化 → 推理显存降低约70%
学生模型开启gradient_checkpointing
降低batch_size → 白盒蒸馏显存约为普通微调的1.5~2倍
教师模型卸载到CPU → 速度极慢(约10倍),但可在单GPU上跑通
黑盒蒸馏只需教师生成的文本,数据生成三步走:准备输入提示 → 用教师生成回答 → 数据质量过滤。
蒸馏提示的设计原则
覆盖面要广 提示应覆盖目标场景的各种任务类型
难度要有梯度 50%中等 + 30%简单 + 20%困难
长度要有变化 短指令(10字以内)和长指令(100字以上)都要有
避免重复 去重很重要,重复提示会让学生在相同模式上过拟合
蒸馏提示来源选择
UltraChat 1.5M条 | 多样性高 | 通用蒸馏数据量最大
Alpaca 52K条 | 质量高 | 通用蒸馏质量较好
Open-Orca 4.2M条 | 多样性高 | 大规模蒸馏
领域模板+Self-Instruct 自定义 | 领域蒸馏推荐组合
黑盒蒸馏数据量建议
通用能力蒸馏 50K~500K条
特定领域蒸馏 10K~100K条
推理能力蒸馏 5K~50K条(含思维链)
对话风格蒸馏 1K~10K条
DeepSeek-R1蒸馏Qwen-1.5B的成功案例使用了80万条推理链数据。这说明高质量的大规模蒸馏数据可以显著提升小模型能力。
Qwen2.5系列学生模型对比
0.5B FP16 ~1.2GB | 4bit ~0.4GB | ~200 tokens/s | 手机/嵌入式
1.5B FP16 ~3GB | 4bit ~1GB | ~120 tokens/s | 端侧/低成本部署
3B FP16 ~6GB | 4bit ~2GB | ~80 tokens/s | 消费级GPU
7B ★最常用 FP16 ~14GB | 4bit ~4GB | ~40 tokens/s | 服务器/云端
学生模型一定要用预训练权重初始化,不要从零开始。蒸馏是在已有能力基础上"增强",不是从零"建造"。
黑盒蒸馏的训练流程与普通微调完全一致——区别只在于训练数据来自教师模型而非人工标注。配置和第二章的SFT配置一样,只需把dataset换成教师生成的蒸馏数据。
# 黑盒蒸馏就是"用教师数据做SFT"
CUDA_VISIBLE_DEVICES=0 llamafactory-cli train qwen2.5_blackbox_distill.yaml
白盒蒸馏需要同时运行教师和学生模型,LLaMA-Factory目前不直接支持Logits级别训练,需自定义脚本。核心步骤:
1. 加载教师(4bit量化,eval模式,不计算梯度)和学生(LoRA微调)
2. 数据加载 + tokenize + label masking(prompt部分设为-100不计入损失)
3. 训练循环:教师前向(no_grad)→ 学生前向 → KD Loss + CE Loss → 梯度累积更新
4. 注意:Qwen系列已有pad_token,不要用eos_token覆盖;global_step按梯度更新计数
温度参数(Temperature)
τ=1 → 尖锐分布,暗知识不足,不推荐
τ=2 → 适度软化,★推荐起点,大多数场景效果好
τ=3~5 → 明显软化,教师远大于学生时适用(如72B→1.5B)
τ>5 → 过度软化,信号被稀释,不推荐
Alpha(蒸馏损失权重)
α=0.3 → 偏向硬标签,有高质量标注数据时
α=0.5 → ★推荐起点,蒸馏和硬标签各半
α=0.7 → 偏向蒸馏,标注数据少或质量低时
α=0.9 → 几乎全靠蒸馏,纯蒸馏无标注数据
Epoch选择
差距小(14B→7B)→ 1~2 epoch
差距中(72B→7B)→ 2~3 epoch
差距大(72B→0.5B)→ 3~5 epoch
完整调参实验记录(72B→7B,10K条数据)
基线(直接SFT)→ C-Eval 68
τ=2, α=0.5, lr=5e-5, 2ep → C-Eval 71
τ=3, α=0.5, lr=5e-5, 2ep → C-Eval 72(温度提升有效)
τ=4, α=0.5, lr=5e-5, 2ep → C-Eval 71(温度过高,信号稀释)
★最优 τ=3, α=0.5, lr=3e-5, 3ep → C-Eval 73(降低lr+增加epoch)
结论:温度2→3有提升,3→4反而下降;降低学习率+增加epoch比增大alpha更有效。
在响应蒸馏基础上,额外对齐教师和学生的中间层隐藏状态。核心改动三点:
1. 教师和学生模型均需开启 output_hidden_states=True
2. 创建可学习的对齐矩阵(nn.Linear: student_dim → teacher_dim),将学生特征映射到教师空间
3. 损失函数增加特征对齐项:L_total = α·L_KD + β·L_feature + (1-α-β)·L_CE
层映射配置(72B→7B为例)
教师80层,学生28层,均匀映射+每隔4层对齐一次
推荐权重:α=0.4(KD)+ β=0.3(Feature)+ 0.3(CE)
能力保留率 学生/教师在基准测试上的得分比,衡量"学到了多少"
蒸馏增益 (蒸馏后-蒸馏前)/(教师-蒸馏前),衡量"蒸馏带来的提升占理论最大提升的比例"
输出相似度 学生和教师输出文本的语义相似度(BLEU/ROUGE/BERTScore)
分布对齐度 学生和教师Logits分布的KL散度,越小说明学生越像教师
LLM生成任务推荐反向KL
正向KL(标准KD):学生尝试覆盖教师的所有模式 → 倾向模式覆盖 → 学生可能过度估计低概率区域,生成不连贯文本
反向KL(MiniLLM方案):学生聚焦于教师分布的主要模式 → 倾向模式寻求 → 生成质量更高,但可能遗漏教师的某些能力
微软MiniLLM(ICLR 2024)系统性地验证了这一点。反向KL需要特殊训练技巧(梯度方差大),建议先从正向KL开始,熟悉后再尝试反向KL。
蒸馏比微调更容易出问题——因为你要同时处理两个模型。以下是5个最常见的问题:
问题1:教师模型OOM
教师量化到4bit(显存降70%);或改用黑盒蒸馏(先离线生成数据再训练)
问题2:蒸馏loss不下降
检查温度参数(τ=2~4安全区间);检查学习率(LoRA蒸馏推荐3e-5~5e-5);检查数据格式和label masking
问题3:学生生成质量差
调整KD/CE损失比例(增大α让输出更像教师);检查数据覆盖面(不要只用单一类型);温度可能过高
问题4:训练速度极慢
检查教师是否在CPU上(速度慢10倍);增大batch_size;考虑黑盒蒸馏替代
问题5:蒸馏后不如直接SFT
先用少量数据做对比实验排查配置问题;可能是温度过高或α设置不当;确认教师模型确实比学生强
多模态蒸馏(如视觉-语言模型)在文本蒸馏基础上增加了视觉编码器的对齐。核心差异:
视觉编码器对齐 需要对齐教师和学生的视觉编码器中间层特征,通常用L2距离+余弦相似度联合损失
跨模态对齐 对齐视觉和文本的交叉注意力层,让学生学会教师的跨模态推理模式
显存挑战 多模态模型本身显存需求高,蒸馏时需同时加载两个多模态模型,建议教师4bit量化+教师CPU offload
多模态蒸馏目前仍是前沿研究方向,工程实践尚不成熟。建议先掌握纯文本蒸馏,再扩展到多模态场景。
本章小结
- 教师模型怎么选?→ 能力越强越好,同系列优先,显存能装下
- 黑盒蒸馏怎么做?→ 和SFT完全一样,只是数据来自教师
- 白盒蒸馏怎么做?→ 自定义训练循环,KD Loss + CE Loss联合优化
- 温度怎么选?→ 从τ=2开始,2~4之间有最优点
- 正向KL vs 反向KL?→ LLM生成任务推荐反向KL(MiniLLM)
- 特征蒸馏怎么加?→ 开启output_hidden_states,加对齐矩阵,增加β·L_feature项
- 蒸馏出问题?→ 5大问题排查:OOM/loss不降/质量差/速度慢/不如SFT
PAPER & INK · AI EDITION · CHAPTER 03
#得到大脑
#《日更者联盟》 14天打卡活动---Day03