LLM 蒸馏
知识蒸馏(Knowledge distillation)是一种模型压缩技术,它训练一个较小的学生模型(student model)来复现较大教师模型(teacher model)的行为。其结果是得到一个在推理时更小、更快、更便宜运行的模型。更重要的是,它保留了教师模型的绝大部分能力。
一个简单的理解方式:
- 教师模型已经擅长解决该任务
- 学生模型通过复制教师模型的输出来学习
与量化(它降低现有权重的精度)不同,蒸馏会产生一个全新的模型。这两种技术是互补的。蒸馏后的模型也可以再进行量化,以进一步提升效率。
DeepSeek-R1(671B 参数)是蒸馏能带来什么的一个很好的例子。研究人员用它把推理能力迁移到更小的模型中,包括 1.5B、7B、8B、14B、32B 和 70B 等变体。它们以教师模型的风格进行推理,而推理成本只是其一小部分。
蒸馏的原理
标准训练使用硬标签(hard labels)来教导模型: 即给定输入的正确答案。
蒸馏则让学生在教师的软标签(soft labels)上训练,也就是对下一个可能的 token 的完整概率分布。
这些软标签比单个正确答案包含更丰富的信息。例如,如果教师给"car"分配了 40% 的概率、给"vehicle"分配了 30% 的概率,学生学到的就不仅仅是答案,还有哪些替代选项是合理的,以及教师的置信度如何。这有助于学生更好地泛化。
学生模型通常使用以下目标的组合进行训练:
- 蒸馏损失(Distillation loss): 衡量学生输出分布与教师输出分布的接近程度。
- 交叉熵损失(Cross-entropy loss): 在带标签数据上进行标准的下一个 token 预测。
这些目标被组合起来,以平衡知识迁移与任务性能。
蒸馏的类型
响应蒸馏(Response distillation)
训练学生匹配教师的输出 token 概率。这是最常见的形式,因为它只需要访问教师的输出。它扩展性好,并被广泛用于生产更小的通用模型。
特征蒸馏(Feature distillation)
训练学生模仿中间表示: 隐藏状态、注意力模式或层激活。这需要访问教师的内部结构,实现成本更高,但对于结构相似的模型可以产生更好的知识迁移。
思维链蒸馏(Chain-of-thought distillation)
教师生成完整的推理轨迹,即问题的逐步解决方案,然后学生在这些轨迹上进行微调。DeepSeek-R1 的蒸馏变体就是这样创建的。它显著提升了较小模型的推理能力,尤其是在数学、编程和逻辑问题求解等任务上。
何时使用蒸馏
以下情况下,蒸馏是一个不错的选择:
- 你需要一个更小、更快的模型,用于对延迟敏感或资源受限的部署。
- 大型模型的量化版本仍然超出你的显存或延迟预算。
- 你有可用的强大教师模型,并且能承担训练成本。
- 你想把特定能力(如推理或编程)迁移到更小的模型中。
以下情况下,蒸馏可能不是正确的选择:
- 学生与教师之间的能力差距过大,学生架构无法吸收。
- 你没有足够的算力在训练期间对教师模型进行推理。
- 现有模型的量化或微调版本已经满足你的需求。
- 你需要尽可能高的精度。
并非所有模型都能被蒸馏。有些许可证禁止使用模型输出来训练其他模型。
蒸馏如何影响推理
蒸馏发生在训练期间,但收益在推理时体现。
通过创建更小的模型,它直接提升了服务效率:
- 更低的延迟: 更快的 token 生成
- 更低的内存占用: 需要更少的 GPU 内存
- 更高的吞吐量: 相同硬件上可以并行运行更多请求
- 更低的成本: 每个请求所需的计算更少
换句话说,蒸馏在应用任何运行时优化之前,就先降低了推理的基准成本。
你可以这样理解:
你可以在你的推理系统中组合这些技术: 大型模型 → 蒸馏 → 更小的模型 → 量化(如果需要)→ 优化服务 → 部署
常见问题
蒸馏的主要挑战是什么?
蒸馏可能很有效,但它有以下权衡:
- 需要额外的训练计算
- 取决于教师模型的质量
- 在复杂任务上可能会损失性能
- 需要仔细的数据生成和过滤
因此,许多团队从量化开始,只在需要时才使用蒸馏。
蒸馏和量化有什么区别?
下面是一个并排对比:
| 蒸馏 | 量化 | |
|---|---|---|
| 改变什么 | 训练一个新的、更小的模型 | 降低现有模型的精度 |
| 输出 | 一个不同的模型(学生模型) | 同一个模型,权重精度更低 |
| 发生时间 | 训练期间 | 训练之后 |
| 所需计算 | 高,需要训练 | 低,可以快速应用 |
| 对体积的影响 | 减少参数数量 | 减少每个参数的内存占用 |
| 易用性 | 更复杂 | 更容易应用 |
| 典型用例 | 构建更小的生产模型 | 优化现有模型以便部署 |