fine-tuning

模型微调 (Fine-Tuning) 完全指南

从基础概念到最佳实践,涵盖 LLM、多模态、图像生成、语音等全领域微调方法论。

创建时间:2026-04-21 | 持续更新中


目录

  1. 什么是微调?
  2. 为什么需要微调?
  3. 微调的核心概念
  4. 微调方法全景图
  5. 数据工程
  6. 训练策略
  7. 评估与验证
  8. 部署与推理
  9. 各模型微调速查表
  10. 常见问题与排障
  11. 最佳实践清单

1. 什么是微调?

微调 (Fine-Tuning) 是指在预训练模型的基础上,使用特定领域的少量数据进一步训练,使模型适应该领域任务的过程。

预训练模型 (Pre-trained)  ──微调──▶  领域适配模型 (Fine-tuned)
      │                                    │
      ▼                                    ▼
  通用知识                            领域专长
  广泛但不深                            精准且实用

类比理解


2. 为什么需要微调?

2.1 微调 vs Prompt Engineering vs RAG

维度 Prompt Engineering RAG 微调
成本 低~中 中~高
效果上限 受限于基座模型 受限于检索质量 最高
延迟 中(检索开销)
可定制性
维护成本 高(需调试 prompt) 中(需维护知识库) 低(一次训练)
适用场景 快速验证 知识密集型 风格/格式/领域专精

2.2 何时选择微调?

适合微调的场景: - 需要特定输出格式(JSON、代码规范、医学报告) - 需要特定风格(品牌语气、写作风格) - 领域术语/知识密集(法律、医疗、金融) - Prompt 太长或效果不稳定 - 需要降低推理成本(用更小的微调模型替代大模型)

不适合微调的场景: - 知识频繁更新(→ 用 RAG) - 只需临时适配(→ 用 Prompt) - 数据量太少(< 100 条,→ 先做数据增强)


3. 微调的核心概念

3.1 预训练 (Pre-training)

在海量无标注数据上训练模型学习语言/视觉基础表示。

3.2 指令微调 (SFT - Supervised Fine-Tuning)

在标注的指令-回复对上训练,使模型学会遵循指令。

3.3 偏好对齐 (Alignment)

让模型输出更符合人类偏好的回复。

方法 原理 需要奖励模型? 计算成本
RLHF (PPO) 强化学习 + 奖励模型 ✅ 需要
DPO 直接从偏好对优化 ❌ 不需要
ORPO 在 SFT 中融入偏好 ❌ 不需要
KTO Kahneman-Tversky 优化 ❌ 不需要
GRPO 群体相对策略优化 ❌ 不需要
SimPO 简化偏好优化 ❌ 不需要

3.4 关键超参数

参数 含义 典型值 影响
Learning Rate 学习率 1e-5 ~ 5e-4 过大→震荡,过小→不收敛
Batch Size 每批样本数 4 ~ 32 越大越稳定,显存需求高
Epochs 训练轮数 1 ~ 5 过多→过拟合
Warmup Ratio 预热比例 0.03 ~ 0.1 避免初期不稳定
Weight Decay 权重衰减 0.01 ~ 0.1 防止过拟合
Max Seq Length 最大序列长度 2048 ~ 128K 影响显存和训练速度

4. 微调方法全景图

4.1 全量微调 (Full Fine-Tuning)

更新模型所有参数。

优点:效果最好,深度适配
缺点:显存需求极高,可能灾难性遗忘
适用:数据量大(> 10K)、有充足算力

显存估算:模型参数量 × 2(模型 + 优化器状态)× 2(梯度 + 激活) - 7B 模型 ≈ 56~72 GB - 70B 模型 ≈ 560~720 GB

4.2 LoRA (Low-Rank Adaptation)

最推荐的微调方法

只在注意力和 FFN 层添加低秩矩阵进行训练,冻结原始模型参数。

优点:显存极低、训练快、可叠加、不破坏原始权重
缺点:表达能力略低于全量微调
适用:绝大多数场景

原理 原矩阵 W (d×d) 替换为: W + ΔW = W + BA 其中 B (d×r), A (r×d), r << d

关键参数: | 参数 | 含义 | 建议 | |------|------|------| | r (rank) | 低秩维度 | 8~16:简单任务,32~64:复杂任务 | | alpha | 缩放系数 | 通常 = 2×r | | dropout | 随机失活 | 0.05~0.1 | | target_modules | 应用 LoRA 的层 | 至少包含所有 attention 和 FFN 层 |

4.3 QLoRA (Quantized LoRA)

性价比之王

先 4-bit 量化模型,再加 LoRA 训练。

优点:显存极低(7B 只需 ~6GB)、效果接近 LoRA
缺点:训练速度略慢(量化开销)
适用:消费级 GPU、大模型微调

配置示例: ```python from transformers import BitsAndBytesConfig

bnb_config = BitsAndBytesConfig( load_in_4bit=True, # 4-bit 量化 bnb_4bit_quant_type="nf4", # Normal Float 4 bnb_4bit_compute_dtype="bfloat16", # 计算精度 bnb_4bit_use_double_quant=True, # 双重量化(省更多显存) ) ```

4.4 DoRA (Weight-Decomposed LoRA)

LoRA 的升级版,将权重分解为幅度 (magnitude) 和方向 (direction) 分别适配。

优点:比 LoRA 更高的表达能力,更接近全量微调
缺点:稍高的显存需求
适用:需要高质量但不想全量微调的场景

4.5 其他方法

方法 特点 适用场景
Adapter 在层间插入小模块 多任务学习
Prompt Tuning 只训练 prompt embedding 极低成本分类
Prefix Tuning 训练前缀向量 轻量任务
IA³ 缩放激活而非权重 极低参数更新

5. 数据工程

5.1 数据格式

指令微调 (SFT) 格式json { "messages": [ {"role": "system", "content": "系统提示"}, {"role": "user", "content": "用户输入"}, {"role": "assistant", "content": "助手回复"} ] }

偏好对齐 (DPO/ORPO) 格式json { "prompt": "用户输入", "chosen": "好的回复", "rejected": "不好的回复" }

5.2 数据量建议

任务类型 最低有效量 推荐量 高质量上限
格式适配 50 200 1K
领域术语 200 1K 5K
指令跟随 1K 5K 50K
偏好对齐 200 1K 10K
代码生成 2K 10K 100K
Agent 能力 5K 20K 200K

5.3 数据质量原则

质量 >>> 数量

1000 条高质量数据 > 10000 条低质量数据

质量检查清单: - [ ] 指令清晰无歧义 - [ ] 回复准确且完整 - [ ] 格式一致 - [ ] 无重复/近似重复 - [ ] 覆盖各种场景(边界情况、异常输入) - [ ] 语言/术语与目标场景一致 - [ ] 长度分布合理(不要太短或太长)

5.4 数据增强技巧

# 1. 重写 (用 LLM 改写指令)
def rephrase(instruction):
    prompt = f"用不同方式表达以下指令,保持含义不变:\n{instruction}"
    return llm_generate(prompt)

# 2. 多语言翻译 (回译)
def back_translate(text):
    return translate(text, "zh→en→zh")

# 3. 模板变体
templates = [
    "请{action}",
    "帮我{action}",
    "我需要你{action}",
    "{action},谢谢",
]

5.5 数据划分

训练集 (80%)  → 模型学习
验证集 (10%)  → 调参和早停
测试集 (10%)  → 最终评估(仅用一次)

6. 训练策略

6.1 推荐训练路线

路线 A:标准流程(大多数场景)

预训练模型 → SFT (LoRA/QLoRA) → DPO/ORPO (可选)
                    │
                    ▼
              领域适配模型

路线 B:推理增强(数学/代码/Agent)

预训练模型 → SFT (含推理链数据) → GRPO (推理强化)
                    │
                    ▼
              推理增强模型

路线 C:低成本快速验证

预训练模型 → QLoRA SFT (少量数据) → 评估
                    │
                    ▼
              验证 pipeline 后再决定是否投入更多资源

6.2 学习率策略

Warmup 阶段              Cosine Decay 阶段
    ↑                          ↓
    │    ╱╲                    │
    │   ╱  ╲                   │
    │  ╱    ╲                  │
    │ ╱      ╲                 │
    │╱        ╲                │
    └──────────╲───────────────→ Steps
                 ╲             ↓
                  ╲───────────→ 接近 0
微调方法 推荐学习率 说明
Full FT 1e-5 ~ 5e-5 小学习率,避免破坏预训练知识
LoRA 1e-4 ~ 5e-4 可较大,因为只更新少量参数
QLoRA 1e-4 ~ 3e-4 与 LoRA 类似
DPO 5e-7 ~ 5e-6 非常小,避免过度优化偏好
ORPO 5e-7 ~ 1e-5 小学习率
GRPO 5e-7 ~ 1e-6 极小学习率

6.3 显存优化技术

技术 效果 说明
4-bit 量化 节省 75% 显存 QLoRA 核心
梯度累积 等效增大 batch 分批计算梯度后更新
梯度检查点 节省 40~60% 以时间换空间
DeepSpeed ZeRO 多卡高效并行 分片优化器/梯度/参数
Flash Attention 加速 2~3x 高效注意力实现
Offloading CPU 分担 将部分数据移到 CPU

6.4 多卡训练

# DeepSpeed + LoRA (推荐)
accelerate launch --config_file deepspeed_config.yaml \
  train.py \
  --deepspeed ds_config.json

# deepspeed_config.json 核心配置
{
  "zero_optimization": {
    "stage": 3,                    // ZeRO-3: 最优显存效率
    "offload_optimizer": {
      "device": "cpu"              // CPU offload 优化器
    },
    "offload_param": {
      "device": "cpu"              // CPU offload 参数
    }
  },
  "bf16": {"enabled": true},
  "gradient_accumulation_steps": 4
}

7. 评估与验证

7.1 训练监控指标

指标 含义 健康信号 警告信号
Train Loss 训练损失 持续下降 不下降→学习率过大
Eval Loss 验证损失 持续下降 上升→过拟合
Learning Rate 当前学习率 按 schedule 衰减 异常波动
Grad Norm 梯度范数 稳定在 0.1~10 >100→梯度爆炸
Perplexity 困惑度 持续下降 平台期→需调整

7.2 评估方法

自动评估: ```python

LLM 任务

自定义评估

def evaluate(model, test_data): correct = 0 for item in test_data: response = model.generate(item["prompt"]) if matches(response, item["expected"]): correct += 1 return correct / len(test_data) ```

人工评估: - 随机抽样 50-100 条测试输出 - 盲评:不知道是基座还是微调模型 - 多维度评分:准确性、格式、流畅度、有用性

7.3 过拟合检测

正常训练:              过拟合:
Train Loss:  ↓        Train Loss:  ↓↓↓
Eval Loss:   ↓        Eval Loss:   ↓ 然后 ↑
                    ─────┬─────
                         这里就该停止

应对过拟合: 1. 早停 (Early Stopping) 2. 增加 Dropout 3. 减小 LoRA rank 4. 增加训练数据 5. 降低学习率


8. 部署与推理

8.1 模型合并

# 将 LoRA 权重合并到基座模型
from transformers import AutoModelForCausalLM
from peft import PeftModel

# 方法 1:运行时加载(推荐,灵活)
base = AutoModelForCausalLM.from_pretrained("base-model")
model = PeftModel.from_pretrained(base, "lora-weights")

# 方法 2:合并后保存(推理更快)
model = model.merge_and_unload()
model.save_pretrained("merged-model")

8.2 量化部署

# GGUF (llama.cpp / Ollama)
# 转换命令:
python convert-hf-to-gguf.py model/ \
  --outfile model-Q4_K_M.gguf \
  --outtype q4_k_m

# 量化级别对比
| 格式 | 大小 (7B) | 质量损失 | 推荐场景 |
|------|-----------|----------|----------|
| FP16 | 14 GB |  | 服务器 |
| Q8 | 7.5 GB | 极小 | 高质量需求 |
| Q4_K_M | 4.2 GB |  | 平衡选择 |
| Q4 | 3.8 GB |  | 资源受限 |
| Q2 | 2.2 GB |  | 极限压缩 |

8.3 推理服务

# vLLM (推荐,吞吐最高)
vllm serve ./merged-model \
  --port 8000 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.9

# Ollama (最简单)
ollama create my-model -f Modelfile
ollama run my-model

# TGI (HuggingFace)
docker run --gpus all \
  -p 8080:80 \
  -v ./merged-model:/data/model \
  ghcr.io/huggingface/text-generation-inference \
  --model-id /data/model

9. 各模型微调速查表

LLM

模型 推荐方法 最低显存 关键参数
Qwen 2.5-7B QLoRA + SFT + DPO 8 GB r=64, lr=2e-4
Qwen 2.5-72B QLoRA + SFT 48 GB r=32, lr=1e-4
LLaMA 3.1-8B LoRA + SFT + ORPO 6 GB r=32, lr=2e-4
LLaMA 3.1-70B QLoRA + SFT 40 GB r=32, lr=1e-4
Gemma 4-31B QLoRA + SFT + DPO 20 GB r=32, lr=2e-4
Qwen3.6-35B-A3B QLoRA + SFT 24 GB r=32, lr=1e-4
DeepSeek-V3.2 QLoRA + SFT + GRPO 多卡 r=32, lr=1e-4
Mistral-7B QLoRA + SFT + DPO 6 GB r=32, lr=2e-4
GLM-4-9B LoRA + SFT + DPO 7 GB r=32, lr=2e-4

多模态

模型 推荐方法 最低显存 关键参数
Qwen2.5-VL-7B LoRA + SFT 16 GB r=32, lr=1e-4
InternVL2.5-8B LoRA + SFT 16 GB r=16, lr=2e-4
LLaVA-OV-7B LoRA + SFT 14 GB r=16, lr=2e-4
MiniCPM-V-2.6 LoRA + SFT 10 GB r=16, lr=2e-4

代码

模型 推荐方法 最低显存 关键参数
Qwen2.5-Coder-7B LoRA + SFT 14 GB r=32, lr=2e-4
DeepSeek-Coder-V2-Lite QLoRA + SFT 12 GB r=32, lr=1e-4
CodeLlama-7B QLoRA + SFT 6 GB r=16, lr=2e-4
StarCoder2-7B QLoRA + SFT 6 GB r=16, lr=2e-4

图像生成

模型 推荐方法 显存 关键参数
FLUX.1-schnell LoRA (Kohya_ss) 24 GB r=16, lr=1e-4
SD 3.5 Large LoRA 24 GB r=32, lr=1e-4
Kolors LoRA 16 GB r=16, lr=1e-4
PixArt-Sigma LoRA 8 GB r=16, lr=1e-4

语音

模型 推荐方法 显存 关键参数
CosyVoice-300M SFT 4 GB -
F5-TTS SFT 8 GB -
Whisper-large-v3 LoRA + SFT 10 GB r=32, lr=1e-4

Embedding

模型 推荐方法 显存 关键参数
BGE-M3 对比学习 8 GB lr=1e-5
GTE-Qwen2-1.5B 对比学习 6 GB lr=1e-5
Nomic-embed-text 对比学习 2 GB lr=1e-5
E5-Mistral-7B LoRA + 对比学习 16 GB r=16, lr=1e-5

10. 常见问题与排障

10.1 OOM (显存溢出)

Error: CUDA out of memory

解决方案(按优先级):
1. 降低 batch_size (→ 1)
2. 增大 gradient_accumulation_steps
3. 使用 QLoRA (4-bit)
4. 降低 max_seq_length
5. 启用 gradient_checkpointing
6. 使用 DeepSpeed ZeRO-3
7. CPU offload (offload_optimizer/device=cpu)
8. 换更大显存的 GPU

10.2 Loss 不下降

可能原因:
1. 学习率过大 → 降低 10x
2. 学习率过小 → 增大 10x
3. 数据格式错误 → 检查 tokenization
4. 标签/目标错误 → 检查数据标注
5. 模型未正确加载 → 检查 from_pretrained

10.3 输出质量差

排查顺序:
1. 检查训练数据质量(最重要!)
2. 增加训练 epoch
3. 增大 LoRA rank
4. 检查是否过拟合
5. 尝试不同的基座模型
6. 添加 DPO 偏好对齐

10.4 训练后模型"变傻"

灾难性遗忘 - 原因:
- 微调数据太少或太单一
- 学习率过大
- 训练轮数过多

解决方案:
1. 混合通用数据(20% 微调数据 + 80% 通用)
2. 降低学习率
3. 减少 epoch
4. 降低 LoRA rank
5. 使用 DoRA 代替 LoRA

10.5 微调后和原模型相比,会出现哪些"差距"

这里的"差距"按两个方向拆:会变好的地方、可能变差的地方。因为最常见的是 LoRA/QLoRA on 特定任务数据,以它为基准讨论。

预期变好

预期会变差(要提前评估)

微调完之后,建议至少过这 5 类 prompt,把原模型和微调模型并排跑一次:

这样才能量化"它到底变好了多少、付出了什么代价"。

一句话总结:M4 Pro + 48 GB 这台机器,用 transformers 跑 Qwen3-14B 推理可以,但建议换成 mlx-lm 或 llama.cpp 的 4-bit 版更实用;本机做像样的微调不现实,最务实路线是 mlx-lm LoRA(轻量实验)或云上 GPU LoRA(认真训),然后把权重(或 adapter)拉回来在本地做推理和评测。

10.6 常见报错

报错 原因 解决
CUDA error: device-side assert 数据/标签越界 检查词表大小和数据格式
RuntimeError: mat1 and mat2 shapes LoRA target_modules 错误 检查模块名是否匹配
ValueError: Unknown label type 数据标签格式错误 检查 label 编码
OutOfMemoryError 显存不足 降低 batch size / 使用 QLoRA
NaN in gradient 学习率过大 降低学习率,检查数据

11. 最佳实践清单

开始前

训练阶段

评估阶段

部署阶段

持续优化


附录:工具链推荐

用途 推荐工具
训练框架 HuggingFace TRL, Axolotl, LLaMA-Factory
数据处理 datasets, pandas, polars
LoRA 训练 PEFT + TRL, Kohya_ss (图像)
多卡训练 DeepSpeed, Accelerate
推理服务 vLLM, SGLang, Ollama, TGI
量化 bitsandbytes, llama.cpp (GGUF), AWQ
评估 lm-eval, OpenCompass
可视化 WandB, TensorBoard
实验管理 MLflow, Weights & Biases

推荐阅读顺序

  1. 新手入门:本文档 → Qwen 2.5 (最全面的示例)
  2. 中文场景:GLM-4Qwen3.6-35B-A3B
  3. 代码任务:Qwen2.5-Coder
  4. 多模态:Qwen2.5-VL
  5. 图像生成:FLUX.1
  6. 语音任务:CosyVoice

Page Source