风险声明

⚠️ 本文档基于训练知识(截止 2025-08)+ 2026-06-28 实地抓取 LLaMA-Factory / unsloth 官方 README 复核。 未在本机实测。具体版本号、命令、显存占用请拿到对应硬件后实测。


一、为什么需要微调?

路径 适用 代价
Prompt Engineering 任务定义清晰、基模够用 几乎零成本,效果天花板受基模限制
RAG(检索增强) 需要引用私有知识、需溯源 工程链路长,延迟+成本高
Fine-tuning(本报告主题) 需要改行为/风格/输出格式,或需要持续预训练吸收领域知识 需要标注数据 + 训练算力
Pretrain from scratch 全新架构 / 全新领域 算力天文数字,几乎只有大厂能做

典型选择

  • 改”说话方式” → SFT(监督微调)足够
  • 改”判断对错” → DPO / ORPO(偏好对齐)更直接
  • 注入”领域知识” → 继续预训练(Continue Pretrain)→ SFT → 可选 DPO
  • 强化”推理” → GRPO / RLHF

二、微调方法全景

2.1 按改动参数量分类

方法 改动参数量 显存(7B 模型,bs=1,seq=2k) 适用
Full Fine-Tuning 100%(≈7B 参数) ≥ 60GB 极致效果、数据充足、卡多
Freeze Tuning <1%(只解冻最后几层) ≤ 16GB 任务简单、改动小
LoRA 0.1% – 1%(rank 8-64) 16-24GB 最主流,性价比最高
QLoRA LoRA + 4bit 量化基模 8-12GB(可在 4090 上跑 7B) 单卡跑大模型
DoRA LoRA 改进(分解方向/幅度) 16-24GB 比 LoRA 略好,略贵
GaLore 全参数,梯度低秩投影 接近 Full FT,但显存 ≈ LoRA 24GB 卡也想做 Full FT 效果时
BAdam Adam 的内存高效变体 16-24GB GaLore 平替
APOLLO 类似 GaLore,更新更稀疏 16-24GB 新工作,2025 出
Adam-mini 优化器侧省显存 16-24GB 全参数但省优化器状态

推荐起步组合QLoRA(r=16)+ bf16 + FlashAttn-2——单卡 4090/24GB 即可训练 7B,接近 Full FT 90% 效果。

2.2 按训练目标分类

阶段 训练目标 典型算法 数据量级
继续预训练(CPT) Next Token Prediction 标准 LM loss 百万级token(领域语料)
监督微调(SFT) 给定 prompt 输出理想 answer 标准 LM loss,只算 response 部分 loss 千-万级高质量指令对
偏好对齐(DPO/ORPO/SimPO) 让”好回答”概率 > “坏回答” DPO loss / IPO / KTO 千-万级(偏好对)
RLHF / PPO 用奖励模型引导策略 PPO + Reward Model 万-十万级
RL 强化(GRPO/DAPO) 可验证奖励(数学/代码) GRPO loss(DeepSeek-R1 用法) 千级(带可验证答案)

2.3 SFT 的两个核心坑

  1. 只算 response 的 loss,不算 prompt 的 loss——这是 Alpaca 格式的标准做法,但很多新手框架默认全算,导致模型学会”复读 prompt”。
  2. 数据质量 >> 数量——1k 条干净数据 > 100k 条带噪数据(LIMA 论文、Microsoft Phi 系列反复验证)。

三、主流微调框架横评

框架 定位 模型覆盖 算法覆盖 易用性 性能 国产卡
HuggingFace TRL 官方 SFT/DPO/GRPO 库 全(HF Hub 上都能训) SFT/DPO/PPO/GRPO/CPO/KTO/ORPO ★★★ 标准 需自适配
HuggingFace PEFT LoRA/QLoRA/DoRA 实现 LoRA 全系 ★★★ 标准 需自适配
LLaMA-Factory(hiyouga) 一站式 WebUI + CLI 100+ LLMs/VLMs(Qwen3 / DeepSeek / Llama 4 / GLM-4.1V / Gemma 3 / InternLM3 / MiniCPM-o) (PT + SFT + DPO/KTO/ORPO + GaLore/BAdam/APOLLO/Adam-mini/Muon/DoRA/LongLoRA/LoRA+/LoftQ/PiSSA) ★★★★★(LlamaBoard GUI) ★★★★(集成 FlashAttn-2 / Unsloth / Liger Kernel / KTransformers) 原生 NPU 文档(ASCEND),ROCm 也有
unsloth 极快速度 + 省显存 500+(gpt-oss / Qwen3.6 / Gemma 4 / Llama 4 / Mistral / Phi-4) SFT + RL(GRPO/FP8 RL) ★★★★(Studio Web UI) ★★★★★(2x 加速,70% 显存节省,无精度损失) AMD 可用(NVIDIA 为主)
DeepSpeed + Megatron 分布式大规模训练 自定义 ZeRO-1/2/3 + TP/PP ★★ 最强但调参难 适配差
Torchtune PyTorch 官方实验性 主流 LoRA/QLoRA + 新方法实验 ★★ 标准 需自适配
Swift(ModelScope) 阿里出品,中文友好 100+ SFT/DPO/GRPO 全 ★★★★ ★★★★ 有 NPU 适配

3.1 选型决策

场景 推荐框架 理由
个人/小团队,7B-70B 单卡 unsloth 速度最快、显存最省、Studio UI 友好
企业团队,需要 WebUI + 集中管理 + 国产卡 LLaMA-Factory 一站式、原生 NPU/ROCm 支持、内置 LlamaBoard
学术研究,要试新算法 TRL + PEFT 上游,新算法第一站
多机多卡大规模训练(>70B / MoE) DeepSpeed + Megatron / LLaMA-Factory + KTransformers LLaMA-Factory 已有 2×4090 + CPU 训 1T 模型的 blog
生产环境中文落地 SwiftLLaMA-Factory 中文文档 + 国内模型生态最全

3.2 unsloth vs LLaMA-Factory

  • 想要速度 + 显存极致 → unsloth
  • 想要算法齐全 + WebUI + 多后端 → LLaMA-Factory
  • 两个可以同时用:LLaMA-Factory 已内置 unsloth 后端,命令行加 --use_unsloth 即可

四、数据工程

4.1 数据格式

主流三种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1. Alpaca 格式(单轮,最常见)
{"instruction": "...", "input": "...", "output": "..."}

// 2. ShareGPT 格式(多轮对话)
{"conversations": [
{"from": "human", "value": "..."},
{"from": "gpt", "value": "..."}
]}

// 3. OpenAI Messages 格式(标准 ChatML)
{"messages": [
{"role": "system", "content": "..."},
{"role": "user", "content": "..."},
{"role": "assistant", "content": "..."}
]}

LLaMA-Factory 内置数据集全用前三格式,自动识别。unsloth 默认用 HuggingFace datasets 库的标准 schema。

4.2 数据集推荐(按场景)

场景 数据集 来源
通用对话 alpaca / alpaca_zh / sharegpt HF Hub
中文指令 COIG-CQIA / COIG-PC / Chinese-LLaMA-Vivifier HF Hub
代码 Magicoder-OSS-Instruct-75K / CodeAlpaca-20K / OpenCodeInterpreter HF Hub
数学/推理 MetaMathQA / OpenMathInstruct / OpenR1-Math HF Hub
多轮对话 UltraChat / LMSYS-Chat-1M HF Hub
偏好对齐(DPO) UltraFeedback / HH-RLHF / Argilla-DPO-Mix-7K HF Hub
行业语料(CPT) 自己爬/买,清洗后用 内部
Agent/Tool 调用 xLAM / ToolBench / Glaive-Function-Calling HF Hub

4.3 数据清洗 checklist

  1. 去重:精确去重 + MinHash 模糊去重
  2. 过滤低质:长度过滤(< 20 token / > 2048 token 警告)、语言检测、毒性过滤
  3. 去污染:用 n-gram 与评测集(bench)比对,防止评测泄露
  4. 格式统一:统一成 Alpaca/ShareGPT 之一
  5. 质量标注:用 GPT-4 / Claude / 强基模打分,过滤掉低分样本

五、训练流程(以 LLaMA-Factory 为例,unsloth 类似)

5.1 最小工作流(7B 模型 + LoRA)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 1. 装环境
pip install uv
uv pip install "llamafactory[torch,metrics]" -i https://pypi.org/simple

# 2. 准备数据(放 data/ 目录,写 dataset_info.json 注册)
mkdir -p data && cp my_data.json data/

# 3. 写配置 yaml(以下为最小可用例子)
cat > train_lora.yaml <<'EOF'
model_name_or_path: Qwen/Qwen3-7B
template: qwen
dataset: my_data
output_dir: saves/qwen3-7b/lora/sft
finetuning_type: lora
lora_rank: 16
lora_target: q_proj,v_proj
learning_rate: 2.0e-4
num_train_epochs: 3.0
per_device_train_batch_size: 2
gradient_accumulation_steps: 8
bf16: true
flash_attn: fa2
EOF

# 4. 开训(单卡)
llamafactory-cli train train_lora.yaml

# 4b. 或多卡
torchrun --nproc_per_node 4 -m llamafactory.cli train train_lora.yaml

# 5. 推理测试
llamafactory-cli chat saves/qwen3-7b/lora/sft

# 6. 合并 LoRA 到基模(可选)
llamafactory-cli export saves/qwen3-7b/lora/sft

5.2 SFT 超参推荐起步

超参 推荐起步值 备注
learning_rate(LoRA) 2e-4 Full FT 用 2e-5
learning_rate(QLoRA) 1e-4 量化后更敏感
num_train_epochs 3 数据 < 1k 用 5
batch_size × grad_accum 16(等效 batch) 单卡不够就堆 grad_accum
max_seq_length 2048(对话) / 4096(长文) 长上下文训练贵 4 倍显存
warmup_ratio 0.03 标准
lr_scheduler cosine 比 linear 收敛稳
weight_decay 0.01 LoRA 可降到 0
lora_rank 16 7B 用 16,70B 用 64
lora_alpha 32(2×rank) LoRA+ 用 4×rank
lora_dropout 0.05 数据少时调到 0.1
packing True 把短样本拼满 seq_len,提速 30%+

5.3 DPO 起步(直接做偏好对齐)

1
2
3
4
5
6
# DPO 配置(在 SFT 后接着做)
stage: dpo
pref_beta: 0.1
learning_rate: 5.0e-6
num_train_epochs: 2.0
dataset: ultrafeedback # 或自建偏好对

ORPO(更省一步):SFT + DPO 一步搞定,无需先训 reference model,显存省一半。


六、评估与部署

6.1 评估方法

类型 做法 何时用
人工盲评 A/B 对比,标注员打分 最权威,贵
LLM-as-Judge 用 GPT-4 / Claude / 强基模打分 通用,需防位置偏置
Bench 评测 MMLU / C-Eval / HumanEval / GSM8K / MT-Bench 学术对比用,不能反映业务
业务指标 任务成功率 / 转化率 / 客服满意度 生产环境
Reward Model 训个 RM 自动打分 RLHF / DPO 训练时

6.2 部署

1
2
3
4
5
6
7
8
9
# vLLM 部署合并后的模型
vllm serve ./saves/qwen3-7b/full \
--host 0.0.0.0 --port 8000 \
--gpu-memory-utilization 0.9 \
--max-model-len 8192

# 或 LoRA 热加载(无需合并)
vllm serve Qwen/Qwen3-7B \
--enable-lora --lora-modules my_lora=./saves/qwen3-7b/lora/sft

SGLangvLLM 在生产部署性能相近,SGLang 对复杂提示词模板/Agent 调用稍优,vLLM 对纯生成吞吐稍优。


七、国产卡路径:海光 DCU K100

紧接《MinerU 部署调研报告》DCU 章节(2026-06-29),驱动/DTK/PyTorch wheel 严格匹配的机制完全相同。

7.1 DCU 训练能否跑 LoRA?

答:能,且 LLaMA-Factory 已原生支持 ROCm 路径(官方文档 rocm.docs.amd.com/projects/ai-developer-hub/...llama_factory_llama3)。unsloth 也有 AMD 实验支持。

DCU 通过 DTK 的 ROCm/HIP 兼容层,PyTorch 把 DCU 伪装成 CUDAtorch.cuda.is_available() 返回 True。因此:

组件 DCU 上情况 备注
LoRA / QLoRA PEFT 全套算法兼容
FlashAttention-2 DTK 自带 ROCm 版
DeepSpeed ZeRO ⚠️ 部分支持 单机能跑,多机需测
FSDP ⚠️ 同上
unsloth 内核 AMD 实验分支
Megatron-LM TP/PP 不建议 DCU 玩

7.2 DCU + LLaMA-Factory 实操路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 假设已完成 MinerU 报告"第三节"的所有前置(驱动 + DTK 25.04 + 海光 PyTorch wheel)

# 1. 验证 CUDA 伪装(关键!不是真的 NVIDIA 卡)
python -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
# 应输出: True Hygon DCU ...

# 2. 装 LLaMA-Factory(无 NPU 适配时)
uv pip install llamafactory

# 3. 训练启动方式不变(但要确认 FlashAttn-2 加载 ROCm 版)
llamafactory-cli train train_lora.yaml

# 4. 多卡(DCU)
torchrun --nproc_per_node 2 -m llamafactory.cli train train_lora.yaml

7.3 DCU + unsloth 实操路径

unsloth 在 AMD 上需要装 ROCm 版:

1
2
# 用 AMD 官方 PyTorch wheel(不是 NVIDIA 那条)
uv pip install unsloth --torch-backend=rocm

7.4 已知 DCU 训练坑(经验)

现象 绕法
DTK 25.04 ↔ torch wheel 必须严格匹配 装错 wheel torch.cuda.is_available() = False torch-2.4.1+das.opt2.dtk2504-... 严格对应
group=39 没加 Cannot open /dev/kfd usermod -aG 39 $USER 或容器 --group-add 39
FlashAttn-2 加载失败 import 阶段报 no kernel image 装 ROCm 版 FA-2 或改用 --flash_attn false(降速)
训练 loss 不下降 多半是 bf16 与 DCU 算子不完全兼容 切 fp16 试一下
QLoRA bitsandbytes DCU 上可能找不到 4bit 算子 用 HQQ/EETQ 替代(已集成到 LLaMA-Factory)

7.5 DCU 上微调 7B 模型显存参考(经验值)

配置 显存占用
LoRA r=16,seq=2048,bs=2 ~22GB
QLoRA 4bit,seq=2048,bs=2 ~12GB
Full FT 7B + ZeRO-3(多卡) ~30GB/卡

DCU K100 单卡 16GB / 32GB 显存,7B 训练推荐 QLoRA + 单卡LoRA + 单卡;Full FT 7B 需 ≥ 60GB 单卡或 ZeRO-3 多卡。


八、踩坑清单与决策建议

8.1 常见踩坑(顺序按发生频率)

  1. 只算全句 loss 而不是 response loss → 模型复读 prompt
  2. 学习率太大(LoRA 用 1e-3) → 训崩,loss 飞
  3. 数据未去重/未清洗 → 模型学坏
  4. 训练 epoch 过多 → 灾难性遗忘(忘了预训练知识)
  5. 评测集污染 → 分数虚高
  6. 合并 LoRA 时漏了 tokenizer 模板 → 部署后输出格式错
  7. DCU/NPU 上没改 DTK 适配版本 → 直接报 CUDA 不可用
  8. Packing 开了但忘了 attention mask → 跨样本注意力泄露

8.2 决策清单(给主人场景)

问题 建议
7B 模型 + 单卡 4090/A800 LLaMA-Factory + QLoRA + flash_attn=fa2
7B 模型 + 多卡 4090×4 LLaMA-Factory + LoRA + 多卡 DDP
70B 模型 + 8×A800 LLaMA-Factory + LoRA r=64 + DeepSpeed ZeRO-3(或 unsloth)
海光 DCU K100 + 7B LLaMA-Factory + QLoRA + ROCm FA-2,验证 torch.cuda.is_available() 再开训
想最快出 PoC unsloth Studio,Web UI 拖拽式
想做 Agent / Tool 调用 数据集用 xLAM,template 用 tool,LLaMA-Factory 直接支持
想做数学/代码推理 SFT 后接 GRPO,用 OpenR1-Math / OpenCodeInterpreter

8.3 三句话总结

  1. 数据 > 算法 > 框架:90% 的微调效果来自数据质量
  2. QLoRA + bf16 + FA-2 是单卡起步最优解
  3. 国产卡选 LLaMA-Factory(原生多后端支持),N 卡选 unsloth 或 LLaMA-Factory 都行

九、信息源

9.1 框架官方

9.2 算法论文

  • LoRA:arXiv 2106.09685(Hu et al.)
  • QLoRA:arXiv 2305.14314(Dettmers et al.)
  • DoRA:arXiv 2402.09353(Liu et al.)
  • DPO:arXiv 2305.18290(Rafailov et al.)
  • ORPO:arXiv 2403.07691(Hong et al.)
  • SimPO:arXiv 2405.14734
  • GRPO:DeepSeek-R1 技术报告
  • GaLore:arXiv 2403.03507(Zhao et al.)
  • BAdam:arXiv 2405.16070
  • APOLLO:arXiv 2412.05270
  • Adam-mini:arXiv 2406.16793
  • LIMA:arXiv 2305.11206(数据质量 > 数量)

9.3 部署

9.4 国产卡

9.5 姐妹文档

  • MinerU 部署调研报告(2026-06-29):source/_posts/MinerU部署调研报告.md

十、附录:微调最小命令清单(速查)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# ============ NVIDIA 4090/A800 上 7B LoRA ============
pip install uv
uv pip install llamafactory
llamafactory-cli train train_lora.yaml

# ============ NVIDIA 4090 上 7B QLoRA(显存吃紧时) ============
# yaml 里 finetuning_type: qlora, quant_bit: 4

# ============ 海光 DCU K100 上 7B QLoRA ============
# 1) 装好 DTK 25.04 + 海光 torch wheel(详见 MinerU 报告第三节)
# 2) 验证: python -c "import torch; print(torch.cuda.is_available())" # True
uv pip install llamafactory
llamafactory-cli train train_lora.yaml # 命令完全一致,会自动用 DCU

# ============ unsloth 极简版(N 卡) ============
uv pip install unsloth --torch-backend=auto
# 跑 https://unsloth.ai/docs/get-started/fine-tuning-llms-guide 的 notebook

# ============ 部署 ============
vllm serve ./merged_model --port 8000