Qwen2.5-3B 模型微调指南
本项目使用LoRA方法对Qwen2.5-3B-Instruct模型进行微调。
环境要求
pip install torch transformers datasets peft accelerate bitsandbytes
具体版本:
- torch >= 2.0.0
- transformers >= 4.36.0
- datasets >= 2.14.0
- peft >= 0.7.0
- accelerate >= 0.24.0
使用步骤
1. 训练模型
python train_qwen.py
训练过程中会:
- 自动将数据集分为90%训练集和10%验证集
- 使用LoRA进行高效微调(节省显存)
- 每50步保存一个checkpoint
- 每50步评估一次验证集
- 最终保存最佳模型
训练参数说明:
- Batch size: 4
- Gradient accumulation: 4(等效batch size = 16)
- Learning rate: 2e-4
- Epochs: 3
- LoRA rank: 8
- 使用FP16混合精度训练
预计显存占用: 约10-15GB(使用单卡A100/V100/3090等)
2. 测试模型
python inference_qwen.py
这个脚本会:
- 加载微调后的模型
- 运行几个示例问题
- 进入交互模式,可以自由提问
3. 合并LoRA权重(可选)
如果需要部署,建议合并LoRA权重:
python merge_lora.py
合并后的模型可以直接用transformers加载,无需PEFT库。
文件结构
.
├── train_qwen. py # 训练脚本
├── inference_qwen.py # 推理测试脚本
├── merge_lora.py # 权重合并脚本
├── qwen_finetuned_model/ # 训练输出目录
│ ├── checkpoint-50/ # 中间checkpoint
│ ├── checkpoint-100/
│ └── final_model/ # 最终模型(LoRA权重)
└── qwen_merged_model/ # 合并后的完整模型(运行merge_lora.py后生成)
训练技巧
调整学习率
如果loss下降太慢,可以增加学习率到5e-4;如果不稳定,降低到1e-4。
调整LoRA参数
r: 增加到16可以提升性能,但会增加显存占用lora_alpha: 通常设置为r的2-4倍
显存不足
如果显存不足,可以:
- 减小batch size到2或1
- 增加gradient_accumulation_steps
- 减小MAX_LENGTH到256
- 使用int8量化:添加
load_in_8bit=True
过拟合问题
如果训练集loss很低但验证集loss不降:
- 减少训练epochs
- 增加weight_decay
- 增加lora_dropout
性能监控
训练过程中可以观察:
loss: 训练损失,应该持续下降eval_loss: 验证损失,用于判断是否过拟合learning_rate: 学习率变化(使用cosine调度)
常见问题
Q: 为什么使用LoRA而不是全参数微调? A: LoRA只训练少量参数(约1-2%),大大降低显存需求和训练时间,同时效果接近全参数微调。
Q: 训练需要多长时间? A: 390条数据,3个epoch,在A100上约需要10-20分钟。
Q: 如何评估模型效果? A: 运行inference_qwen.py测试模型回答,或者计算验证集上的perplexity。
Q: 可以继续训练吗? A: 可以,在TrainingArguments中设置resume_from_checkpoint参数。