在第 8、9 章中,我们讨论了预训练的全流程与分布式工程。预训练完成后得到的只是一个“基座模型”(Base Model),它擅长续写文本,却不懂得如何遵循人类指令、回答特定领域问题。把基座模型改造成“听得懂话、做得对事”的专用模型,核心手段就是微调(Fine-tuning)。
全参数微调(Full Fine-tuning,又称 Full-parameter Fine-tuning)是微调范式中最彻底、最经典的一种。本节先把它讲透,后续 10.2 节再讨论如何在资源受限时“退而求其次”。
一、核心定义:解冻全部权重
全参数微调是指在预训练权重的基础上,加载整个模型,放开所有层的参数冻结,让每一份权重都在下游任务的反向传播中接受更新。
它与预训练的区别在于:
- 数据规模:预训练消耗万亿级 Token,微调通常只需数十万到数千万 Token(视领域而定);
- 学习强度:预训练学习率较高(如 3e-4),微调学习率低 1–2 个数量级;
- 目标:预训练是构建通用语言能力与知识压缩,微调是将通用能力迁移到特定分布。
如果把预训练比作在大学毕业前读遍天下书,全参数微调就是进入特定行业后的全日制脱产再教育——所有知识都被重新审视和定向。
二、适用场景:什么时候必须上全参数?
以下四种情况,全参数微调通常是首选或必需:
1. 领域分布偏移极大
通用模型在法律、医疗、金融、芯片设计等领域往往表现贫瘠。当你的领域语料与通用互联网文本在术语、逻辑、句式上差异巨大时,冻结大部分参数会严重限制迁移效果。
2. 拥有充足的高质量标注数据
通常需要 5 万条以上 高质量指令对(Instruction-Response Pair)。数据太少时,全参数微调极易过拟合,把模型“训傻”。
3. 需要修改模型的底层知识或扩展词表
如果领域中有大量预训练阶段未覆盖的专业术语,必须扩展 Tokenizer 词表,此时 Embedding 层和 LM Head 的维度会改变,LoRA 等低秩方法无法直接适配,必须全参数微调。
4. 作为性能基准与业务天花板验证
在正式决定使用 LoRA 等轻量方案前,先用小批量数据做一次全参数微调,得到该数据集的“理论上限”,才能判断轻量方案的性价比损失是否在可接受范围内。
不适合的场景:硬件预算有限、数据极少(几千条)、快速迭代试错、仅需风格微调的通用对话任务。
三、算力需求:真实的显存账单
全参数微调是显存吞噬者,因为它需要同时保存模型参数、梯度、优化器状态和激活值。以业界最主流的混合精度(BF16/FP16)+ AdamW 优化器为例,单张 GPU 上的显存占用可拆解为:
| 组成部分 | 显存占用(每参数) | 说明 |
|---------|-------------------|------|
| 模型参数(BF16/FP16) | 2 Bytes | 半精度权重 |
| 梯度(BF16/FP16) | 2 Bytes | 反向传播产出 |
| 优化器状态(FP32) | 12 Bytes | Adam 的 FP32 主权重 + 一阶动量 + 二阶动量 |
| 静态合计 | ~16 Bytes | 这是“死开销”,与序列长度无关 |
| 激活值(Activations) | 动态估算 | 与 batch size、序列长度、层数正相关 |
工程速算公式(不含激活值):
总静态显存 ≈ 16 × 参数量(Bytes)
- 7B 模型:约 112 GB 静态显存。加上激活值,单卡 A100 80GB 无法容纳,必须使用 DeepSpeed ZeRO-3 或 FSDP 将参数切片到多卡;若用 8×A100 40GB,配合 ZeRO-3 和 Gradient Checkpointing 可以跑起来。
- 13B 模型:静态约 208 GB,建议 8×A100 80GB 起步。
- 70B 模型:静态约 1.1 TB,至少需要 16×A100 80GB 或 8×H100 80GB(配合 TP+ZeRO-3),属于企业级训练集群范畴。
对比参考:
- 7B 模型的 LoRA 微调(见 10.2 节)可在单张 RTX 4090(24GB)完成;
- 同型号的全参数微调需要 4–8 张 A100 才舒适。成本差距在 10 倍以上。
四、实现方案:从加载到收敛的实战路径
1. 权重加载与初始化
- 从 Hugging Face、ModelScope 或内部 Megatron 格式加载预训练 Checkpoint;
- 关键检查:确认词表是否匹配。若扩展了词表,需执行
resize_token_embeddings,并确保新嵌入层参与梯度更新。
2. 数据格式与 Loss 计算
全参数微调通常采用指令跟随格式(Instruction Following)。以 Llama 2/3 的聊天模板为例:
[INST] 用户问题 [/INST] 模型回答 </s>
工程铁律:只让模型学习“回答部分”的 Loss,用 -100 掩码掉 Prompt 部分。否则模型会把大量算力浪费在“学习如何复述用户问题”上,导致指令遵循能力下降。
3. 超参数配置(经验值)
| 参数 | 推荐范围 | 备注 |
|------|---------|------|
| 学习率 | 1e-5 ~ 5e-5 | 预训练学习率的 1/10 ~ 1/100;70B 大模型倾向更小的 lr |
| Batch Size(全局) | 64 ~ 512 | 显存不够时用 Gradient Accumulation 凑 |
| Epoch | 1 ~ 3 | 指令微调忌多轮重复,极易过拟合 |
| Warmup Ratio | 0.03 ~ 0.1 | 线性预热,保护预训练权重不被早期大梯度冲毁 |
| Weight Decay | 0.01 | 防止过拟合 |
| Max Length | 2048 ~ 4096 | 长文本任务需开启 Flash Attention 与位置插值(见 8.6 节) |
| LR Decay | Cosine | 最终学习率降至峰值的 10% |
4. 分布式策略选择(承接第 9 章)
- ZeRO-3(DeepSpeed):最常用方案。将参数、梯度、优化器状态切片到所有 GPU,配合
overlap_comm减少通信等待。7B–70B 模型均适用。 - 张量并行(TP):对 70B 以上模型,在单节点内做 TP=2/4/8,利用 NVLink 高带宽降低单卡显存峰值;跨节点再叠 ZeRO-3。
- 流水线并行(PP):全参数微调通常数据量不大,PP 的气泡(Bubble)开销相对明显,优先级不如 TP+ZeRO-3。
- FSDP(PyTorch 原生):上手快,与 Hugging Face 生态无缝集成,适合已有 PyTorch 技术栈的团队。
5. 训练框架推荐
- 中小团队:Hugging Face
trl库中的SFTTrainer+ DeepSpeed ZeRO-3 配置。一行命令即可开启全参数微调,生态成熟。 - 大厂/自研基座:Megatron-LM / Megatron-Core,适合 100B+ 模型或需要与预训练同构的集群。
- 长上下文微调:务必开启 Flash Attention 2,可将长序列训练的显存开销从 O(n²) 降至近 O(n),速度提升 2–4 倍。
6. 关键工程技巧
- Gradient Checkpointing:以 20%–30% 的训练时间换取 30%–50% 的显存节省,长序列场景必开。
- 样本打包(Packing):将多条短样本拼接成一条长序列(到
max_length),用 Attention Mask 隔离不同样本。可显著提升 GPU 利用率,避免 Padding 带来的算力浪费。 - 断点续训与频繁保存:全参数微调成本高,每 0.1–0.2 个 epoch 保存一次 Checkpoint,配合 Hugging Face
save_strategy="steps"。
五、优势、风险与决策树
优势:
- 性能天花板最高,能深度重塑模型的知识结构与行为模式;
- 词表扩展、多阶段持续预训练(Continual Pre-training)后的场景唯一选择。
风险与代价:
- 灾难性遗忘(Catastrophic Forgetting):过度微调会让模型丢失通用能力,变成“只会回答领域问题的白痴”。缓解方法:混入 10%–30% 的通用指令数据(如 Alpaca、ShareGPT)作为正则化。
- 推理成本零降低:微调后的模型体积与原始基座相同,部署时不会比基座更快、更省显存。
- 硬件门槛高:70B 模型的全参数微调是“富人游戏”,需要专业 AI Infra 团队兜底。
决策树:该不该全参数微调?
数据量 > 5万条高质量指令?
├─ 否 → 先考虑 10.2 节的 PEFT 方案
└─ 是 → 领域偏移极大 or 需扩展词表?
├─ 是 → 全参数微调(8×A100 起步)
└─ 否 → 追求绝对天花板?
├─ 是 → 全参数微调
└─ 否 → 先上 LoRA/Q-LoRA 验证,再决定是否全参
六、小结
全参数微调是大模型落地的“重型武器”:它最彻底、最昂贵,也最能挖掘预训练模型的潜力。在算力充裕、数据充足、领域鸿沟大的场景下,它是不二之选;但在资源受限或快速试错阶段,你需要更轻便的替代方案。
接下来的 10.2 节,我们将系统拆解 PEFT(参数高效微调) 技术族——LoRA、QLoRA、IA³、Prefix Tuning——它们如何在只更新 0.1%–1% 参数的情况下,逼近全参数微调 90% 以上的效果,从而让大模型微调从“重工业”变成“轻工业”。