Skip to content

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 系列文件。

📖 阅读优先级

等级章节说明
🔴 必须深入二、LoRAAgent 微调最常用方案,理解 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×k

2.2 LoRA 配置

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:分布式训练

Accelerate配置

一行命令启动分布式:

bash
accelerate config              # 交互式配置(选择 GPU 数量、DeepSpeed 等)
accelerate launch --config_file xxx.yaml train.py

train.py 本身无需修改——Accelerate 自动处理设备放置、梯度同步、混合精度。

配置项:num_processes / distributed_type / mixed_precision / zero_stage / offload_optimizer_device


六、LLaMAFactory:零代码微调

AutoDL SSH隧道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
# 选择模型 → 数据集 → 参数 → 开始训练

LLaMAFactory数据集配置


七、微调方案选型表

方案显存需求(7B)速度代码量适用场景
全参 SFT~84GB5 行有 A100 且追求最佳效果
TRL SFT~80GB15 行快速实验全参
LoRA~18GB20 行消费级显卡推荐
QLoRA~8GB25 行低显存环境(RTX 3060)
Unsloth~6GB20 行极致加速
LLaMAFactory灵活灵活0 行小白/快速验证

八、本阶段文件索引

优先级文件路径
🟡 P106_peft_lora.ipynb3.代码/fine_tune_proj/06_peft_lora.ipynb
🟡 P107_QLoRA_running_demo.py3.代码/fine_tune_proj/07_QLoRA_running_demo.py
🟢 P208_unsloth_demo.py3.代码/fine_tune_proj/08_unsloth_demo.py
🟢 P2参数含义介绍/LoraConfig参数.md3.代码/fine_tune_proj/参数含义介绍/
🟢 P2参数含义介绍/SFTConfig参数.md3.代码/fine_tune_proj/参数含义介绍/

OPC 超级个体实战指南