使用 Unsloth 对 DeepSeek-R1-Distill-Qwen 模型进行高效 LoRA 微调,专注于中文医学推理问答任务
本项目使用 Unsloth 库对 DeepSeek-R1-Distill-Qwen 系列模型进行 QLoRA 微调,训练数据集为 FreedomIntelligence/medical-o1-reasoning-SFT 中文医学推理数据集。
- 🚀 高效训练: 使用 Unsloth 实现 2x 加速
- 🩺 医学专注: 针对医学问答任务优化
- 💭 思维链推理: 支持 Chain-of-Thought 推理模式
- 📊 完整评估: 包含 ROUGE、困惑度等多维度评估
unsloth-model-lora/
├── README.md # 项目说明
├── LICENSE # 开源许可证
├── requirements.txt # 依赖包列表
│
├── notebooks/ # 📓 Jupyter Notebooks
│ ├── qwen_1.5B_lora.ipynb # 1.5B 模型微调
│ └── qwen_7B_lora.ipynb # 7B 模型微调
│
├── models/ # 🤖 训练好的 LoRA 模型
│ ├── qwen-1.5b_lora_model/ # 1.5B LoRA 适配器
│ │ ├── adapter_config.json
│ │ ├── adapter_model.safetensors
│ │ └── tokenizer.json
│ └── qwen-7b_lora_model/ # 7B LoRA 适配器
│ ├── adapter_config.json
│ ├── adapter_model.safetensors
│ └── tokenizer.json
│
└── docs/ # 📚 文档
└── qwen_1.5B_lora_optimization_summary.md
# 克隆项目
git clone https://github.com/qingni/unsloth-model-lora.git
cd unsloth-model-lora
# 安装依赖
pip install -r requirements.txt| 模型 | 最低显存 | 推荐显存 |
|---|---|---|
| 1.5B | 8GB | 12GB+ |
| 7B | 16GB | 24GB+ |
💡 本项目在 NVIDIA RTX 4090 (24GB) 上开发和测试
打开对应的 Jupyter Notebook 并按顺序执行所有 cells:
# 启动 Jupyter
jupyter notebook
# 选择 notebooks/qwen_1.5B_lora.ipynb 或 notebooks/qwen_7B_lora.ipynb| 指标 | 1.5B 模型 | 7B 模型 | 提升 |
|---|---|---|---|
| 训练 Loss | 1.9966 | 1.6605 | ↓ 16.8% |
| 困惑度 (PPL) | 9.38 | 7.51 | ↓ 19.9% |
| ROUGE-1 | 0.1929 | 0.2932 | ↑ 52.0% |
| ROUGE-2 | 0.0325 | 0.0771 | ↑ 137.2% |
| ROUGE-L | 0.1862 | 0.2932 | ↑ 57.5% |
| 参数 | 1.5B | 7B |
|---|---|---|
| LoRA Rank | 64 | 32 |
| Batch Size | 128 | 32 |
| Learning Rate | 2e-4 | 1e-4 |
| Epochs | 5 | 3 |
| 可训练参数 | 73.9M (3.99%) | 80.7M (1.05%) |
| 训练时间 | ~1.7 小时 | ~4.5 小时 |
from unsloth import FastLanguageModel
# 加载基础模型
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/DeepSeek-R1-Distill-Qwen-7B",
max_seq_length=4096,
load_in_4bit=True,
)
# 加载 LoRA 适配器
model.load_adapter("models/qwen-7b_lora_model")
# 切换到推理模式
FastLanguageModel.for_inference(model)prompt = """以下是一条描述任务的指令,并配有一个提供进一步上下文的输入。
请撰写一份恰当的回复,以完成该请求。
### Instruction:
你是一位医学专家,在临床推理、诊断学和治疗规划方面拥有深厚的专业知识。
请回答以下医学问题。
### Question:
男,28岁,程序员,最近一周每天工作到半夜,感觉头晕、脖子疼,有时候还恶心。
### Response:
<think>
"""
inputs = tokenizer([prompt], return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=1024)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)<think>
这位28岁的程序员出现头晕、脖子疼痛和恶心等症状,可能是由多种因素导致的。
首先,他的长期熬夜可能影响了他的血压和血糖水平,导致头晕和恶心。
其次,长时间使用电脑可能压迫颈椎,导致脖子疼痛...
</think>
建议他进行血压、血糖和甲状腺功能的检测,并改善睡眠质量,以缓解症状。
datasets==4.3.0
pandas==2.3.1
peft==0.18.1
timm==1.0.19
torch==2.8.0
torchvision==0.23.0
transformers==4.57.3
trl==0.24.0
unsloth==2026.1.3
unsloth_zoo==2026.1.3
本项目包含多种评估方法:
| 评估方法 | 说明 |
|---|---|
| ROUGE 评分 | 计算生成文本与参考答案的词级别重叠度 |
| 困惑度 (Perplexity) | 评估模型对数据的拟合程度 |
| 样例对比 | 直观查看模型生成与参考答案的差异 |
| Loss 曲线 | 可视化训练过程中的损失变化 |
model = FastLanguageModel.get_peft_model(
model,
r=64, # LoRA rank,越大参数越多
target_modules=[ # 应用 LoRA 的模块
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",
],
lora_alpha=64, # 缩放因子
lora_dropout=0, # Dropout 比率
use_gradient_checkpointing="unsloth", # 节省显存
)args = SFTConfig(
per_device_train_batch_size=2, # 单卡 batch size
gradient_accumulation_steps=16, # 梯度累积
num_train_epochs=3, # 训练轮数
learning_rate=1e-4, # 学习率
lr_scheduler_type="cosine", # 调度器类型
warmup_steps=150, # 预热步数
optim="adamw_8bit", # 优化器
)- ✅ 完成 1.5B 模型微调与评估
- ✅ 完成 7B 模型微调与评估
- ✅ 新增评估模块 (ROUGE、困惑度、样例对比)
- ✅ 新增优化总结报告
本项目基于 MIT License 开源。
- Unsloth - 提供高效的微调框架
- DeepSeek - 提供优秀的基础模型
- FreedomIntelligence - 提供医学推理数据集
⭐ 如果这个项目对你有帮助,请给个 Star!