用 LLaMA-Factory 微调 DeepSeek-R1 蒸馏模型在特定领域数据集上的实操心得
<think> 推理链,而不是让它在微调后变成一个只会直接给答案的普通 Llama。很多人的坑在于直接把领域知识喂进去,结果发现模型虽然懂了专业术语,但推理能力断崖式下跌。我的经验是:数据集必须包含“思维链-答案”的配对格式,且在训练时不能对 <think> 标签内的 Token 做 Mask。
环境与配置要点
我用的是 A100 80G,为了防止 OOM,必须开启 DeepSpeed ZeRO-3。在 dataset_info.json 里定义数据集时,确保格式是 alpaca 或 sharegpt,但内容得是这种结构:
[
{
"instruction": "分析这段电路图的潜在短路风险",
"input": "",
"output": "<think>\n1. 检查电源输入端电压...\n2. 观察 C1 电容极性...\n3. 发现 VCC 与 GND 之间缺少限流电阻。\n</think>\n该电路在 C1 位置存在短路风险,建议增加 10Ω 电阻。"
}
]关键参数调优
在 LLaMA-Factory 的 WebUI 或命令行参数中,重点调整这几个项:
学习率:设为 2e-5 或 5e-6。R1 蒸馏模型很敏感,学习率过高会瞬间刷掉原有的逻辑推理能力。
LoRA Rank:建议 r=16,lora_alpha=32。太高了容易过拟合到数据集的说话语气上,而不是逻辑上。
截断长度:cutoff_len 必须设大,至少 4096。因为推理链 <think> 极其占 Token,如果截断了,模型就学不到完整的思考过程。
避坑指南:防止“推理退化”
最严重的坑是模型在微调后不再输出 <think>。解决办法是在 Prompt 模板里强制指定。如果你用的是自定义模板,记得在 template 配置中把 <think> 设为特殊 Token,或者在 System Prompt 里硬性要求:
You are a professional engineer. Please think step by step inside <think> tags before providing the final answer.效率提升技巧
如果数据集很大,建议先用 flash-attn 减少显存占用。另外,监控 Loss 时不要只看数值,每隔 100 步抽样几个 Case 跑一下,看 <think> 部分是否在复读训练集,还是在真正地推理。如果出现严重的模式崩溃(模式重复),立刻调低 weight_decay。
最终部署命令示例
llamafactory-cli train \
--stage sft \
--do_train \
--model_name_or_path deepseek-ai/DeepSeek-R1-Distill-Llama-8B \
--dataset my_domain_data \
--template llama3 \
--finetuning_type lora \
--output_dir ./saves/deepseek_r1_tuned \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--learning_rate 2e-5 \
--num_train_epochs 3.0 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 100 \
--learning_rate 2e-5 \
--flash_attn fa2 \
--fp16 True全部回复 (0)
还没有回复,来发第一条吧!
