目录
大语言模型微调 (LLM Fine-Tuning) 指南
本文主要来学习一下大语言模型微调的核心概念、主流方法、数据工程、硬件要求及评估体系。
1. 基础概念:为什么要微调?
1.1 预训练 (Pre-training) vs 微调 (Fine-tuning)
- 预训练 (Base Model):模型在海量文本(万亿级 Token)上进行无监督学习。
- 能力:具备了语言理解能力、世界知识、逻辑推理雏形。
- 缺点:不懂指令,只会“文字接龙”。你问“如何写代码?”,它可能接着写“如何做饭?”。
- 微调 (SFT/Chat Model):在预训练模型基础上,使用高质量的“指令-回复”对进行有监督学习。
- 能力:学会了遵循人类指令、特定格式输出、角色扮演。
- 比喻:预训练是读完了“百科全书”,微调是进行了“职业技能培训”。
1.2 微调的几个阶段
- SFT (Supervised Fine-Tuning):有监督微调。让模型学会“好好说话”。
- RM (Reward Modeling):奖励模型训练。训练一个打分模型,判断回答好坏。
- RLHF (Reinforcement Learning from Human Feedback):人类反馈强化学习。利用 RM 模型优化生成策略,使回答更符合人类价值观(安全、有用)。
- DPO (Direct Preference Optimization):直接偏好优化。跳过 RM 阶段,直接利用偏好数据对(A比B好)优化模型,是目前替代 RLHF 的主流方法。
2. 核心技术:如何微调?
2.1 全量微调 (Full Fine-Tuning)
- 定义:更新模型的所有参数(7B 模型就是更新 70 亿个参数)。
- 硬件要求:极高。通常需要 4-8 张 A100/H100 显卡。
- 灾难性遗忘:容易忘记预训练学到的通用知识。
2.2 PEFT (Parameter-Efficient Fine-Tuning)
参数高效微调,只更新极少量的参数(通常 < 1%),冻结大部分原始参数。适合消费级显卡(如 RTX 4090)。
A. LoRA (Low-Rank Adaptation) - 业界标准
- 原理:在原始权重矩阵旁增加两个低秩矩阵 A A A 和 B B B。 W ′ = W + Δ W = W + B A W' = W + \Delta W = W + B A W′=W+ΔW=W+BA。
- 优势:
- 训练参数量极小(仅几百 MB)。
- 推理无延迟(可以将 BA 合并回 W)。
- 可插拔(可以训练多个 LoRA 挂载同一个 Base Model 上)。
- 关键参数:
rank®:矩阵的秩。通常设为 8, 16, 32, 64。越大越接近全量微调,但也越慢。alpha:缩放系数。通常设为rank的 2 倍。
B. QLoRA (Quantized LoRA) - 显存救星
- 原理:将 Base Model 量化为 4-bit (NF4格式) 加载,然后在此基础上训练 LoRA 适配器。
- 效果:单张 RTX 4090 可以微调 30B 甚至 70B 的模型。精度损失极小,性价比最高。
C. 其他方法 (P-Tuning, Prefix Tuning, AdaLoRA)
- 目前使用率较低,LoRA/QLoRA 占据统治地位。
3. 数据工程:燃料决定引擎
微调效果好坏,数据质量 >> 算法选择。
3.1 常见数据格式
在 LLaMA-Factory 中,数据主要分为两种格式:
1. Alpaca 格式 (指令类)
适合单轮问答、任务执行。
[
{
"instruction": "请把这句话翻译成英文。",
"input": "今天天气真好。",
"output": "The weather is very good today."
}
]
2. ShareGPT 格式 (对话类)
适合多轮对话、角色扮演。
[
{
"conversations": [
{ "from": "human", "value": "你是谁?" },
{ "from": "gpt", "value": "我是 Cyun 的助手。" },
{ "from": "human", "value": "你会做什么?" }
]
}
]
3.2 数据清洗关键点
-
去重:重复数据会导致模型“复读机”。
-
格式统一:确保 Json 结构无误。
-
多样性:指令类型要丰富(不要全都是翻译,要有推理、写作、代码等)。
-
Prompt Template (模版):非常重要!训练时的模版必须和推理时的模版严格一致。
Qwen 模版: <|im_start|>user\n...<|im_end|><|im_start|>assistant\n... Llama3 模版: <|begin_of_text|><|start_header_id|>user...
4. 显存计算与优化 (VRAM & Optimization)
显存(VRAM)是大模型微调中最大的瓶颈。了解显存去哪了,以及如何通过降低精度来节省显存,是配置环境的第一步。
4.1 显存去哪了?(估算公式)
在训练过程中,显存主要被以下四部分瓜分:
Total VRAM ≈ Model Weights + Optimizer States + Gradients + Activations \text{Total VRAM} \approx \text{Model Weights} + \text{Optimizer States} + \text{Gradients} + \text{Activations} Total VRAM≈Model Weights+Optimizer States+Gradients+Activations
- Model Weights (模型权重):模型本身的参数大小。
- Optimizer States (优化器状态):AdamW 优化器需要为每个参数保存“动量”和“方差”,这是显存消耗大户(通常是权重的 2 倍)。
- Gradients (梯度):反向传播时计算出的梯度值。
- Activations (激活值):前向传播时产生的中间结果(显存消耗随 Batch Size 和 序列长度 线性增长)。
4.2 核心精度技术:以精度换空间
为了塞下更大的模型,我们通常降低数值的“精度”。这是显存优化的核心手段。
A. 混合精度训练 (Mixed Precision)
默认 FP32(单精度)太占地方,现代训练通常使用半精度。
| 精度类型 | 字节 | 说明 | 4090 建议 |
|---|---|---|---|
| FP32 | 4B | 传统的单精度,精度最高,显存占用最大。 | ❌ 不推荐 (除非调试) |
| FP16 | 2B | 传统的半精度。速度快,但数值范围小,训练易溢出 (NaN)。 | ⚠️ 仅旧显卡使用 |
| BF16 | 2B | BFloat16。Google/NVIDIA 推崇的格式。范围与 FP32 相同,极度稳定且快。 | ✅ 首选 (必须开) |
B. 量化 (Quantization) - QLoRA
通过将预训练模型的权重压缩到 8-bit 或 4-bit 来极致压缩显存。
| 量化等级 | 7B模型权重显存 | 精度损失 | 适用场景 |
|---|---|---|---|
| 无 (BF16) | ~14 GB | 无 | 显存充足,追求极致效果 |
| Int8 | ~7 GB | 极低 | 显存紧张 |
| Int4 (NF4) | ~3.5 GB | 低 (QLoRA) | 推荐。单卡跑大模型的神器。 |
4.3 三大显存优化技术
1. Flash Attention 2
- 原理:物理层面的加速。通过优化 GPU 读写显存的逻辑,大幅减少 Attention 层的计算开销。
- 效果:速度提升 2-3 倍,显存略微降低。
- 设置:RTX 30/40 系显卡必须开启。
2. Gradient Checkpointing (梯度检查点)
- 原理:“以时间换空间”。不保存前向传播的中间激活值(Activations),而是在反向传播需要时重新计算它们。
- 效果:节省 50%-70% 的 Activation 显存,但训练速度变慢 20% 左右。
- 设置:如果你的 Batch Size 上不去,或者显存 OOM(爆了),请开启此选项。
3. Unsloth (加速库)
- 原理:手写了底层的 Triton/CUDA 内核,涵盖了反向传播过程。
- 效果:比官方实现快 2 倍,且显存更省。
- 设置:LLaMA-Factory 中推荐开启。
推荐配置方案
针对你拥有的 24GB 显存 (例如RTX 4090),以下是两种推荐的微调配置:
方案 A:追求速度与效果 (LoRA + BF16)
- 适用:7B / 8B 模型。
- 配置:
- Precision:
bf16 - Quantization:
None - Flash Attention 2:
On - Unsloth:
On
- Precision:
- 特点:训练速度最快,精度无损。
方案 B:追求大模型/大Batch (QLoRA + Int4)
- 适用:14B / 32B / 72B 模型,或者需要极大 Batch Size 时。
- 配置:
- Precision:
bf16(计算时依然用 bf16) - Quantization:
4-bit (nf4)(加载权重用 int4) - Flash Attention 2:
On - Gradient Checkpointing:
On(如果还爆显存就开)
- Precision:
- 特点:单卡能跑 30B+ 模型,甚至勉强能跑 70B。
5. 训练超参数详解 (Hyperparameters)
微调就像“炼丹”,超参数的设置直接决定了丹药是成仙还是炸炉。
| 参数名 | 建议值 (LoRA) | 建议值 (全量) | 详细说明 |
|---|---|---|---|
| Learning Rate (LR) | 2e-4 ~ 5e-5 | 1e-5 ~ 5e-6 | 学习率。决定了模型参数更新的步幅。 • 太大:Loss 震荡不降,模型学不到东西(炸炉)。 • 太小:收敛极慢,或者陷入局部最优。 技巧:LoRA 训练通常可以使用比全量微调大 10 倍的学习率。 |
| Epochs | 3 ~ 5 | 2 ~ 3 | 训练轮数。完整遍历一遍数据集叫 1 个 Epoch。 • 数据量 < 1万条:建议跑 3-5 轮。 • 数据量 > 10万条:跑 1-2 轮通常足够。 过多的 Epoch 会导致过拟合(死记硬背)。 |
| Batch Size | 显存允许的最大值 | 同左 | 批大小。一次喂给模型多少条数据。 • 越大训练越稳,但也越吃显存。 • 4090 显卡通常设为 1 或 2(配合累积使用)。 |
| Gradient Accumulation | 4 / 8 / 16 | 同左 | 梯度累积。以时间换空间。 如果显卡只能跑 Batch Size=1,设置 Accumulation=16, 等效 Batch Size = 1 × 16 = 16 1 \times 16 = 16 1×16=16。 保持 Batch Size × \times × Accumulation ≈ \approx ≈ 16~64 是个不错的范围。 |
| LR Scheduler | cosine | cosine | 学习率调度器。控制学习率随时间的变化。 • Cosine (余弦退火):目前公认效果最好。先快后慢,最后趋近于 0。 • Constant:恒定不变(不推荐)。 |
| Warmup Ratio | 0.03 ~ 0.1 | 0.03 | 预热比例。在训练最开始的 3%~10% 的步数里,LR 从 0 慢慢爬升到设定的最大值。 防止模型刚开始就被巨大的梯度“吓坏”导致梯度爆炸。 |
| Weight Decay | 0.01 ~ 0.1 | 0.1 | 权重衰减。一种正则化手段,防止参数数值变得过大,抑制过拟合。 |
| Cutoff Length | 1024 / 2048 / 4096 | - | 截断长度。一条数据的最大 Token 数。 超过这个长度会被切断。显存不够时,减小这个值最有效。 |
6. 评估体系 (Evaluation)
模型训练完了,怎么知道它变聪明了还是变傻了?
6.1 训练过程指标 (Training Metrics)
- Loss (损失值):
- 正常曲线:刚开始快速下降,然后趋于平缓。
- 异常情况:
- Loss 不降:LR 太小,或数据质量太差。
- Loss 激增:LR 太大(梯度爆炸),或数据格式错误。
- Loss 降到 0:过拟合(Overfitting),模型把答案背下来了,遇到新题就不会做。
6.2 自动化文本指标 (Automated Metrics)
虽然不够完美,但适合快速验证。
- BLEU / ROUGE:
- 比较“生成文本”和“参考答案”的 n-gram 重合度。
- 局限性:只看字面。比如:
参考:“我很高兴。”
生成:“我很悲伤。”(重合度极高,BLEU 分高,但意思相反)
生成:“心情愉悦。”(重合度低,BLEU 分低,但意思正确)
- Perplexity (PPL, 困惑度):
- 衡量模型对生成文本的“确定性”。PPL 越低,说明模型觉得这句话越通顺。
6.3 权威基准榜单 (Benchmarks)
想知道模型的综合智商,需要做“试卷”。
- MMLU (Massive Multitask Language Understanding):涵盖 STEM、人文、社科等 57 个学科,是目前最权威的英文综合榜单。
- C-Eval / CMMLU:针对中文语境的综合能力评测(包含高考题、公务员考试题等)。
- GSM8K:小学数学应用题。测试模型的逻辑推理(Chain-of-Thought)能力。
- HumanEval / MBPP:写代码能力测试。
6.4 LLM-as-a-Judge (主观评估)
目前最接近人类评估的方法。
- 方法:让 GPT-4 当“裁判”。给它看你模型的回答和标准答案,让 GPT-4 打分(1-10分)并给出理由。
- 工具:
AlpacaEval,MT-Bench。
7. 常见陷阱与解决方案 (Troubleshooting)
7.1 复读机现象 (Repetition)
- 现象:模型输出 “你好你好你好…” 或者一直重复最后一句话。
- 原因:
<eos>(结束符) 没学好,模型不知道何时停止。- 温度 (Temperature) 设置过低。
- 解决:
- 检查训练数据末尾是否包含了 EOS token。
- 推理时调高
repetition_penalty(如 1.1)。
7.2 灾难性遗忘 (Catastrophic Forgetting)
- 现象:微调了一个医疗模型,结果它连基本的 “写一首诗” 都不会了,或者逻辑能力大幅下降。
- 原因:微调数据分布过于单一,改变了模型原有的权重分布。
- 解决:
- Replay (数据回放):在微调数据中,混入 10%~20% 的通用数据(如 Alpaca 数据集)。
- 减小学习率,减少 Epoch。
7.3 幻觉 (Hallucination)
- 现象:模型一本正经地胡说八道(例如:编造历史事实)。
- 原因:模型是在进行概率预测,而非事实检索。微调数据中可能包含了模型原本知识库里没有的事实,强行让它记忆。
- 解决:
- 引入 RAG (检索增强生成),让模型基于外挂知识库回答。
- 训练“拒答能力”:在数据中加入“我不知道”的样本。
8. 模型导出与部署 (Deployment)
微调完成后,如何把模型应用到生产环境?
8.1 模型合并 (Merge LoRA)
如果你想让模型脱离 LLaMA-Factory 独立运行,或者使用 Ollama 等工具,需要将 LoRA 权重合并回基座。
- 操作:LLaMA-Factory -> Export -> Merge LoRA Weights。
- 结果:生成一个完整的模型文件(如
model.safetensors),大小约等于原基座模型。
8.2 量化 (Quantization)
为了在更小的显存或 CPU 上运行。
- GGUF 格式:
- 专为 CPU/Mac 推理设计(使用
llama.cpp或Ollama)。 - 可以将模型压缩到 4-bit 甚至 2-bit。
- 专为 CPU/Mac 推理设计(使用
- AWQ / GPTQ:
- 专为 GPU 推理设计。比 FP16 快,且省显存。
8.3 推理引擎推荐
- vLLM:目前吞吐量最大的 GPU 推理引擎,支持 PagedAttention,适合服务器端高并发部署。
- Ollama:最简单的本地运行工具,适合个人开发者,直接运行 GGUF 格式。
- LMDeploy:书生·浦语团队开发,针对 NVIDIA 显卡优化极致,速度极快。
680

被折叠的 条评论
为什么被折叠?



