05 微调框架实战
学习理念:前面手写了 SFT/DPO 的训练循环是为了理解原理,实际项目直接用框架。本章覆盖从 TRL(全参微调)→ PEFT LoRA(高效微调)→ QLoRA(4bit 微调)→ Unsloth(极致加速)→ Accelerate(分布式)→ LLaMAFactory(零代码)的完整工具链。越往下工具化程度越高,但理解前面的原理才能用好这些工具。
海外对标:HuggingFace TRL、Microsoft DeepSpeed、Unsloth.ai
本节 AI 替代率:~80% | 人工干预率:~20%
| 角色 | 能力范围 |
|---|---|
| 🤖 AI 擅长 | 生成 SFTTrainer/LoRA/QLoRA 训练脚本模板 |
| 👤 人类需理解 | LoRA 的 r/alpha/dropout 参数的直觉含义、各种方案的实际显存差异 |
📌 来源说明:以下内容提取自原始笔记第9-12章(TRL/PEFT/Unsloth/Accelerate/LLaMAFactory),代码来自
06-09系列文件。
📖 阅读优先级
| 等级 | 章节 | 说明 |
|---|---|---|
| 🔴 必须深入 | 二、LoRA | Agent 微调最常用方案,理解 r/alpha 含义 |
| 🟡 理解即可 | 一、TRL + 三、QLoRA | 知道怎么用 SFTTrainer 就行 |
| 🟢 直接跳过 | 四~六、Unsloth/Accelerate/LLaMAFactory | 需要时再查文档 |
一、TRL 库:全参微调
TRL 的 SFTTrainer 封装了整个训练流程,只需配置参数 + 加载数据:
python
from trl.trainer.sft_config import SFTConfig
from trl.trainer.sft_trainer import SFTTrainer
training_args = SFTConfig(
output_dir="./finetuned/Qwen3-0.6B-TRL-SFT",
per_device_train_batch_size=8,
num_train_epochs=1,
gradient_accumulation_steps=3,
learning_rate=5e-5,
logging_steps=100,
warmup_steps=0.1,
eval_strategy="steps",
eval_steps=100,
bf16=True,
save_total_limit=2,
)
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=dataset_dict["train"],
eval_dataset=dataset_dict["test"],
processing_class=tokenizer,
)
trainer.train()
trainer.save_model("./finetuned/Qwen3-0.6B-TRL-SFT-best")显存监控:修改 TensorBoard callback 加入 GPU 显存记录:
python
# 修改 transformers/integrations/integration_utils.py 中的 TensorBoardCallback.on_log
memory_allocated = torch.cuda.memory_allocated(device) / 1024**3
logs.update({'train/gpu_memory_allocated_gb': round(memory_allocated, 4)})二、PEFT LoRA:高效微调
2.1 LoRA 原理速览
原始权重 W(d×k,冻结) + LoRA 适配器 BA(r 维,可训练)
┌─────┐
W' = W + BA │ B k×r│ ← 训练时仅更新 A、B
│ A r×d│
└─────┘
r = 8(典型值),参数量 = d×r + r×k << d×k2.2 LoRA 配置

python
from peft import LoraConfig
peft_config = LoraConfig(
r=4, # LoRA 秩(越大越强,越大越贵)
lora_alpha=8, # 缩放系数(≥r 通常效果较好)
lora_dropout=0.05, # Dropout 防过拟合
bias="none",
target_modules="all-linear", # 作用于所有线性层
task_type="CAUSAL_LM",
)
# 在 SFTTrainer 中传入 peft_config
trainer = SFTTrainer(
model=model,
args=training_args,
peft_config=peft_config, # 一行开启 LoRA
...
)2.3 LoRA 参数直觉
| 参数 | 小值(r=2) | 大值(r=64) |
|---|---|---|
| 参数量 | 极小(~0.1%) | 适中(~1%) |
| 表达能力 | 弱 | 强 |
| 过拟合风险 | 低 | 高 |
| 适用数据量 | 几百条 | 上万条 |
三、QLoRA:4bit 量化 + LoRA
🟡 【P1 看注释就行】 用 4-bit 量化加载 base model(节省 75% 显存),然后对 LoRA 层做 16-bit 训练。
python
from transformers import BitsAndBytesConfig, AutoModelForCausalLM
from peft import LoraConfig, prepare_model_for_kbit_training
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
)
model = AutoModelForCausalLM.from_pretrained("model/Qwen3-8B",
quantization_config=bnb_config)
model = prepare_model_for_kbit_training(model)
peft_config = LoraConfig(r=8, lora_alpha=8, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], ...)
# 后续与 SFTTrainer 组合使用四、Unsloth:极致加速
🟢 【P2 后面可以查】 Unsloth 通过手写 CUDA 内核替换 PyTorch 原生的 LoRA 操作,训练速度提升 2x,显存降低 50%。
python
from unsloth import FastLanguageModel
from unsloth.chat_templates import get_chat_template
# 加载模型(4bit 自动优化)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="Qwen/Qwen3-8B",
max_seq_length=2048,
load_in_4bit=True,
)
# 加载 LoRA
model = FastLanguageModel.get_peft_model(
model=model, r=8,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
)
# 之后用标准 SFTTrainer 训练
trainer = SFTTrainer(model=model, args=training_args, ...)
trainer.train()
# 保存并合并权重
model.save_pretrained_merged("./Qwen3-8B-SFT", tokenizer, save_method="merged_16bit")五、Accelerate:分布式训练

一行命令启动分布式:
bash
accelerate config # 交互式配置(选择 GPU 数量、DeepSpeed 等)
accelerate launch --config_file xxx.yaml train.pytrain.py 本身无需修改——Accelerate 自动处理设备放置、梯度同步、混合精度。
配置项:num_processes / distributed_type / mixed_precision / zero_stage / offload_optimizer_device
六、LLaMAFactory:零代码微调


bash
# 安装
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory && pip install -e ".[torch,metrics]"
# 启动 WebUI
llamafactory-cli webui
# 浏览器打开 http://localhost:7860
# 选择模型 → 数据集 → 参数 → 开始训练
七、微调方案选型表
| 方案 | 显存需求(7B) | 速度 | 代码量 | 适用场景 |
|---|---|---|---|---|
| 全参 SFT | ~84GB | 慢 | 5 行 | 有 A100 且追求最佳效果 |
| TRL SFT | ~80GB | 慢 | 15 行 | 快速实验全参 |
| LoRA | ~18GB | 中 | 20 行 | 消费级显卡推荐 |
| QLoRA | ~8GB | 中 | 25 行 | 低显存环境(RTX 3060) |
| Unsloth | ~6GB | 快 | 20 行 | 极致加速 |
| LLaMAFactory | 灵活 | 灵活 | 0 行 | 小白/快速验证 |
八、本阶段文件索引
| 优先级 | 文件 | 路径 |
|---|---|---|
| 🟡 P1 | 06_peft_lora.ipynb | 3.代码/fine_tune_proj/06_peft_lora.ipynb |
| 🟡 P1 | 07_QLoRA_running_demo.py | 3.代码/fine_tune_proj/07_QLoRA_running_demo.py |
| 🟢 P2 | 08_unsloth_demo.py | 3.代码/fine_tune_proj/08_unsloth_demo.py |
| 🟢 P2 | 参数含义介绍/LoraConfig参数.md | 3.代码/fine_tune_proj/参数含义介绍/ |
| 🟢 P2 | 参数含义介绍/SFTConfig参数.md | 3.代码/fine_tune_proj/参数含义介绍/ |