第八章:大模型微调方案¶
8.1 前置问题:错误是否适合用微调解决¶
微调不是第一反应,也不是必须最后才允许尝试的方案。应先建立基线,确认问题来自知识访问、任务行为、输出约束还是模型容量,再比较收益与成本。
8.1.1 先做错误归因¶
%%{init: {"flowchart": {"nodeSpacing": 16, "rankSpacing": 22, "padding": 8, "wrappingWidth": 160}}}%%
flowchart TB
NEED["模型表现不达标"] --> Q1["诊断主要错误"]
Q1 --> P["选择针对性改进"]
P --> E["在同一测试集上比较"]
诊断结果决定改进方法,并不要求依次完成所有训练阶段:
- 格式不合法: 尝试提示与示例、结构化输出或约束解码。
- 事实缺失或过时: 使用检索或数据库工具,检查召回和证据使用。
- 稳定任务上的行为不佳: 开展 SFT 候选实验。
- 候选质量存在可比较差异: 收集偏好数据,测试 DPO 等方法。
各方案应在同一测试集上比较质量、成本与延迟。
这些方案可组合。例如,RAG 负责提供最新合同,SFT 教模型基于证据回答并引用出处。若检索没有召回正确条款,继续调生成模型通常解决不了根因。
8.1.2 哪些场景值得微调¶
- 高频、稳定的领域任务,已有一致且可验证的示范数据。
- 需要可靠的工具调用、结构化表达或专门术语,而较轻量基线仍不达标。
- 在明确任务分布上用较小模型替代大模型,且累计服务成本能覆盖训练和维护。
微调可以学到事实知识,但不适合作为需要频繁更新、精确追溯的数据库。产品价格、库存、政策版本通常应通过检索或工具访问。
8.1.3 成本不能脱离配置报价¶
| 成本项 | 应记录什么 |
|---|---|
| 数据 | 授权、标注、清洗、质量复核、分布覆盖 |
| 训练 | 模型大小、精度、序列长度、有效 batch、更新 token 数、硬件小时 |
| 评估 | 业务测试集、人工复核、通用能力与安全回归 |
| 维护 | 基座与 tokenizer 版本、adapter 兼容性、部署、回滚 |
不存在“微调至少几张 A100”或“标注必然几十万元”的统一门槛。基座升级后,旧微调模型也不会自动失效:可以继续部署旧版本;若要迁移到新基座,则通常需要重训或适配并重新验证,不能盲目加载旧 adapter。
8.2 两个维度:更新哪些参数,使用什么信号¶
| 维度 | 例子 | 决定什么 |
|---|---|---|
| 参数化与精度 | 全量微调、LoRA、QLoRA | 哪些权重更新、以什么精度存储和计算 |
| 训练数据与目标 | SFT、DPO、奖励优化 | 从示范、偏好或奖励中学习什么 |
因此可以有 LoRA + SFT、全量微调 + DPO、QLoRA + DPO。概念上可组合,不等于任何框架、模型和量化后端都支持任意组合。
SFT 和 DPO 当然也可以称为训练方法;这里要避免的只是把它们与 LoRA 当成互斥选项。SFT 不仅学格式,偏好优化也不仅学文风。
8.3 参数方案与显存预算¶
8.3.1 全量微调¶
全量微调更新全部或几乎全部模型参数,表达自由度大,但不保证同样数据和预算下效果最好。小数据、分布偏移或不合适的学习率,都可能导致过拟合与通用能力退化。
以 7 × 10⁹ 参数、无分片无卸载为例,下面只计算持久模型状态,使用十进制 GB:
| 项目 | 假定精度 | 大小 |
|---|---|---|
| 计算用权重 | BF16 / FP16,2 字节 | 14 GB |
| 梯度 | 若为 2 字节 | 14 GB |
| FP32 主权重副本 | 若优化器保留,4 字节 | 28 GB |
| Adam 一阶矩与二阶矩 | 各 FP32,共 8 字节 | 56 GB |
| 此配置合计 | 每参数 16 字节 | 112 GB |
若梯度也是 FP32,此例增加到 126 GB;若实现不维护 FP32 主权重,预算又不同。还没有算激活、logits、临时 buffer、通信与分配器开销,所以不能把“权重 + 梯度 + 两个矩约 84 GB”当成完整训练显存。
ZeRO / FSDP 把状态分片,offload 把部分状态移到主机,梯度检查点通过重算节省激活;这些方法改变单卡峰值显存与速度,不是消除了全部成本。
8.3.2 LoRA¶
对列向量输入,冻结 W,仅训练低秩增量:
“更新可以用低秩形式有效近似”是有实证支持的建模假设,不代表所有任务真实更新的秩都只有 8 或 16。
对一个 4096 × 4096 矩阵、r = 16:
- 原矩阵:16,777,216 参数;
- LoRA 两个矩阵:131,072 参数;
- 可训练参数比:1/128。
整个模型的比例要对所有目标矩阵求和;还取决于是否更新 embedding、输出头、bias 等。不能从这个单层例子推出任何 7B 模型都只有 2000 万可训练参数。
LoRA 大幅减少可训练参数对应的梯度与优化器状态,但基座仍需前向传播,梯度仍需经冻结层传到 adapter。因此激活不会按参数比例一起缩小,速度也不会自动提高 128 倍。详见 第九章。
8.3.3 QLoRA¶
QLoRA 把冻结基座低比特存储,与可训练的 LoRA 结合。原论文包含:
- NF4:针对近似正态权重分布设计的 4-bit 表示。
- Double quantization:再量化部分量化常数,降低元数据开销。
- Paged optimizers:借助内存分页应对显存峰值;换页可能有传输开销。
前向时按需把量化权重恢复到计算精度,通常用 BF16 等完成计算;不是把全部训练算术、激活和梯度都变成 4-bit。梯度更新 adapter,不直接更新离散的基座量化值。
7B 参数的裸 4-bit 位存储约为 3.5 GB,但还要加入量化元数据、未量化模块、adapter、优化器和激活。原论文展示了其配置下在单张 48GB GPU 微调 65B 模型,不意味着任意 7B / 13B 长上下文训练都能在 10GB 内完成。
论文中的任务效果可接近 16-bit 微调;这不是对任何模型、量化设置和任务的无损保证。量化误差、目标模块覆盖和优化设置都需验证。
8.3.4 三种方案怎样比较¶
| 维度 | 全量微调 | LoRA | QLoRA |
|---|---|---|---|
| 更新参数 | 全部或大部分 | 选定矩阵的低秩参数 | 低比特冻结基座上的低秩参数 |
| 主要显存压力 | 权重、梯度、优化器、激活 | 基座权重与激活,另有 adapter 状态 | 量化基座、激活与 adapter 状态 |
| 表达约束 | 较少 | rank 与目标模块限制 | 同左,另有量化误差 |
| 合并部署 | 不需 adapter 合并 | 浮点合并后可无额外分支 | 合并与再量化需核对后端和误差 |
| 速度 | 取决于系统与 batch | 常减少权重梯度计算 | 反量化有成本,较大 batch 也可能受益 |
| 通用能力退化 | 需回归评测 | 同样需评测,可停用 adapter 回退 | 同样需评测 |
不要为三者预先排定“最高、次高、最低”的质量顺序。
8.4 训练目标:数据如何变成梯度¶
8.4.1 SFT:模仿示范¶
给定指令及上下文,在示范回答上计算自回归交叉熵。通常把 prompt 和 padding 对应 label 设为忽略值,只对 assistant 的目标 token 计损失。
实施时尤其检查:
- 模板一致:训练和推理使用相同角色分隔符与结束标记。
- 标签对齐:移位通常由模型或 trainer 内部处理,避免重复 shift。
- 截断位置:长 prompt 不能把整段目标回答裁掉;否则有效监督可能为空。
- Packing 边界:分清样本边界、attention mask 与 position id,避免无意混入前一条样本上下文。
少量高质量示范可能有效,但应通过学习曲线判断需求,不能把 LIMA 的实验结果变成“千条足够所有任务”。
8.4.2 DPO:学习相对偏好¶
标准 DPO 接收同一 prompt 的 chosen / rejected,使用策略与冻结参考策略对两份回答的 log probability 计算偏好损失。其简化来自特定奖励与偏好建模假设,而非“所有 RLHF 都与监督学习完全等价”。
数据检查至少包括:两份回答是否对应同一问题、偏好标签是否可靠、长度与格式是否成为捷径、是否只覆盖旧策略容易生成的答案。DPO 不要求一定采用 LoRA,也不存在已知的“工业界最常见组合”可无依据地背诵。
8.5 一个可执行的选型过程¶
| 已确认的约束 | 可以先试什么 | 什么情况下升级 |
|---|---|---|
| 基座浮点权重装不下,任务允许量化 | QLoRA + SFT 小实验 | 量化误差或吞吐不能接受时换配置 |
| 浮点基座装得下,需要高效适配 | LoRA + SFT | 扩大目标模块 / rank 仍受容量限制时比较全量 |
| 示范表现已可用,有可靠成对偏好 | DPO,可配 LoRA | 覆盖不足且有可靠在线奖励时比较在线优化 |
| 明显领域迁移,有大量数据和预算 | 继续预训练、SFT 或全量适配的对照 | 根据任务收益与通用能力退化决定 |
不是按“个人 / 大厂”选方案,而是按约束与实测差距选择。
8.5.1 评估与数据切分¶
先冻结一份目标测试集;按用户、文档、时间或问题来源分组切分,避免近重复示范跨到测试集。比较原基座、提示基线、微调模型,保持解码预算一致。
除目标分数外,还要测:
- 未见任务和通用能力是否下降;
- 幻觉、误拒绝和敏感信息复现是否增加;
- 输出长度变化是否制造了偏好评估假象;
- 每次成功请求成本是否真的降低。
8.5.2 什么需要随训练产物一起保存¶
基座精确 revision、tokenizer / chat template、adapter 配置、量化配置、数据版本、训练参数和评测结果。仅保存 adapter_model 文件,不足以可靠复现一个微调系统。
8.6 常见错误与排查¶
- “基座冻结,所以不会遗忘。” 激活后的模型使用
W + ΔW,行为仍会变;停用 adapter 可以恢复基座不等于启用时无退化。 - “微调是把知识永久写进模型。” 它只是改变分布,不能保证精确记忆、检索或更新。
- “QLoRA 一定更快、更差或无损。” 三种结论都取决于量化、内核、任务和 batch。
- “参数少就无需调参。” 学习率、训练步数、rank、alpha、目标层与数据质量仍需联合检查。
- “越重成本越指数增长。” 不应把复杂度形容词当成增长规律,按实际状态量、FLOPs 和实验次数核算。
8.7 本章总结¶
先用错误分析确定训练信号,再根据显存和表达需求选择参数方案。全量微调、LoRA、QLoRA 的区别不只是“几张卡”,更包括优化状态、激活、量化与部署约束。可靠的选型结论来自同口径评测与可回滚产物,而不是固定推荐组合。
参考资料¶
本章的参考资料、阅读建议与来源说明见集中参考资料章节。