模型蒸馏概述
模型蒸馏是一种机器学习技术,通过将知识从大型复杂模型(教师模型)转移到较小、更高效的模型(学生模型),在显著降低计算成本和内存占用的同时,保留教师模型的大部分性能。蒸馏的方法主要有以下几种:
- 数据蒸馏:教师模型生成合成数据或伪标签,用于训练学生模型,可应用于多种任务,包括开放式推理任务。
- Logits 蒸馏:学生模型训练匹配教师模型的 Logits,即应用 softmax 函数前的原始输出分数,能保留更多教师模型的置信水平和决策过程信息。
- 特征蒸馏:将教师模型中间层的知识传递给学生模型,通过对齐隐表征,让学生学习更丰富、抽象的特征。
蒸馏 DeepSeek - R1 的准备工作
- 安装库:
-
- 首先需要安装相关的 Python 库,包括torch、transformers、datasets、accelerate、bitsandbytes、flash - attn等。可以使用以下命令安装:pip install -q torch transformers datasets accelerate bitsandbytes flash - attn -- no - build - isolation。
- 生成和格式化数据集:
-
- 可以通过在环境中使用ollama或其他部署框架部署DeepSeek - R1来生成自定义的领域相关数据集。若使用Magpie - Reasoning - V2数据集,它包含由DeepSeek - R1生成的 25 万条链式思考(CoT)推理样本,涵盖数学推理、编码和一般问题解决等任务。加载数据集后进行格式化,并将其构建为目标模型(如 Phi - 3)的聊天模板格式,以确保模型学习到正确的会话模式。同时进行训练 - 测试集划分,例如按 90% - 10% 的比例划分。
- 加载模型和 Tokenizer:
-
- 加载预训练的学生模型和对应的分词器。例如,如果要蒸馏到微软的 Phi - 3 - Mini 模型,可以使用AutoTokenizer和AutoModelForCausalLM从transformers库中加载模型和分词器。添加自定义标记以适应模型的特定需求,并将填充标记设置为结束标记。使用flash attention加载模型以提高效率,并根据需要调整模型的词向量维度以适应自定义标记。
配置 LoRA 进行高效微调
LoRA 通过冻结基本模型和只训练小的适配器层来减少内存使用。在配置 LoRA 时,需要定义一些参数,如per_device_train_batch_size(每个设备的训练批次大小)、per_device_eval_batch_size(每个设备的评估批次大小)、gradient_accumulation_steps(梯度累积步数)、eval_strategy(评估策略)、save_strategy(保存策略)、logging_strategy(日志记录策略)、logging_steps(日志记录步数)、learning_rate(学习率)、fp16(是否使用半精度浮点数)、optim(优化器)、max_grad_norm(最大梯度范数)、warmup_ratio(热身比例)、lr_scheduler_type(学习率调度器类型)等。
训练模型
使用SFTTrainer来简化指令遵循模型的监督微调过程。定义一个DataCollatorForLanguageModeling作为数据整理器,用于对示例进行批处理。将配置好的模型、训练参数、训练数据集、评估数据集、数据整理器和peft_config(用于支持基于 LoRA 的训练)传递给SFTTrainer,然后调用train方法开始训练模型。训练完成后,保存模型和分词器。
合并并保存最终模型
训练后,将 LoRA 适配器与基础模型合并进行推理。这一步确保模型可以在没有PEFT(Parameter - Efficient Fine - Tuning)的情况下独立使用。将合并后的模型保存到指定的路径,同时也保存分词器。
推理
使用pipeline或直接加载微调后的模型进行推理。将模型加载到指定的设备上,并设置数据类型为torch.float16以提高推理速度。可以输入相应的文本进行推理,得到模型的输出。
蒸馏策略与优化
- 损失函数设计:采用高温参数(Temperature Scaling),在教师模型推理时使用高温T(如T = 5),软化输出分布,使学生模型更容易学习。也可以考虑渐进式蒸馏,分阶段蒸馏,例如先蒸馏底层,再逐步加入高层。
- 学习率与优化器:使用较低的学习率(如1e - 5到1e - 4)和AdamW优化器,配合warmup和线性衰减,有助于模型的稳定训练和收敛。
- 计算指标与加速:关注模型大小、FLOPs、推理速度(如tokens/sec)等计算指标。使用ONNX、TensorRT或专用推理框架(如FasterTransformer)来加速模型推理。还可以进行量化压缩,如采用FP16或INT8量化进一步减小模型体积。
模型选择与架构压缩
- 模型选择:确认使用完整版DeepSeek - R1作为教师模型,确保其在下游任务上表现优秀。对于学生模型,可以选择经过验证的轻量架构,如TinyBERT、DistilBERT等。
- 架构压缩:可以通过减少层数(如从 24 层减至 6 层)、隐藏层维度(如从 768 到 256)或注意力头数等方式对学生模型架构进行压缩。同时,可以从教师模型的部分层进行参数初始化(如前三层),以加速学生模型的收敛。
以上是蒸馏DeepSeek - R1的一般步骤和方法,在实际操作中,可能需要根据具体的任务、数据集和硬件资源等情况进行调整和优化。