文章目录
- [D37-全参微调 vs LoRA 选型:什么时候该上全参,什么时候 LoRA 就够了](#D37-全参微调 vs LoRA 选型:什么时候该上全参,什么时候 LoRA 就够了)
-
- [一、为什么会有"全参 vs LoRA"的选择难题](#一、为什么会有"全参 vs LoRA"的选择难题)
-
- [1.1 30 秒速览:全参 vs LoRA vs QLoRA](#1.1 30 秒速览:全参 vs LoRA vs QLoRA)
- 二、全参微调深度解析
-
- [2.1 什么是全参微调](#2.1 什么是全参微调)
- [2.2 全参微调的硬件需求](#2.2 全参微调的硬件需求)
- [2.3 全参微调的 3 大优势](#2.3 全参微调的 3 大优势)
- [2.4 全参微调的 3 大风险](#2.4 全参微调的 3 大风险)
- [三、LoRA / QLoRA 回顾与深化](#三、LoRA / QLoRA 回顾与深化)
-
- [3.1 核心原理(一句话版)](#3.1 核心原理(一句话版))
- [3.2 LoRA 的 5 个变体](#3.2 LoRA 的 5 个变体)
- [3.3 LoRA 的 3 大局限](#3.3 LoRA 的 3 大局限)
- [四、5 维度深度对比](#四、5 维度深度对比)
-
- [4.1 维度 1:参数量](#4.1 维度 1:参数量)
- [4.2 维度 2:显存占用(Qwen2.5-7B 实测)](#4.2 维度 2:显存占用(Qwen2.5-7B 实测))
- [4.3 维度 3:训练时间(Qwen2.5-7B, 1 万条数据, 3 epoch, A100)](#4.3 维度 3:训练时间(Qwen2.5-7B, 1 万条数据, 3 epoch, A100))
- [4.4 维度 4:效果(同数据同评测集)](#4.4 维度 4:效果(同数据同评测集))
- [4.5 维度 5:风险](#4.5 维度 5:风险)
- [五、5 个选型决策树](#五、5 个选型决策树)
-
- [决策树 1:你的数据量有多大?](#决策树 1:你的数据量有多大?)
- [决策树 2:你的硬件预算?](#决策树 2:你的硬件预算?)
- [决策树 3:你的效果要求有多极致?](#决策树 3:你的效果要求有多极致?)
- [决策树 4:你要学的"是什么"?](#决策树 4:你要学的"是什么"?)
- [决策树 5:你能承受的最大训练成本?](#决策树 5:你能承受的最大训练成本?)
- 综合决策矩阵
- [六、实战:Qwen2.5-7B 全参微调](#六、实战:Qwen2.5-7B 全参微调)
-
- [6.1 硬件要求](#6.1 硬件要求)
- [6.2 数据准备](#6.2 数据准备)
- [6.3 全参微调主脚本](#6.3 全参微调主脚本)
- [6.4 DeepSpeed 配置](#6.4 DeepSpeed 配置)
- [6.5 跑通这个项目需要什么](#6.5 跑通这个项目需要什么)
- 七、常见决策踩坑
-
- [7.1 误区 1:"LoRA 效果一定比全参差"](#7.1 误区 1:"LoRA 效果一定比全参差")
- [7.2 误区 2:"全参一定比 LoRA 慢"](#7.2 误区 2:"全参一定比 LoRA 慢")
- [7.3 误区 3:"全参就更专业"](#7.3 误区 3:"全参就更专业")
- [7.4 误区 4:"合并后的 LoRA = 全参"](#7.4 误区 4:"合并后的 LoRA = 全参")
- [八、从 Demo 到生产:选型决策清单](#八、从 Demo 到生产:选型决策清单)
- [九、Key Takeaways](#九、Key Takeaways)
- 十、思考题
- 十一、下篇预告
D37-全参微调 vs LoRA 选型:什么时候该上全参,什么时候 LoRA 就够了
「60 天 AI 全栈转型」S3 模型训练与微调 · 第 2 篇 / 共 15 篇
读者画像:已掌握 LoRA 微调(D36)的开发者
预计阅读:30 分钟 · 实操:60-90 分钟

一、为什么会有"全参 vs LoRA"的选择难题
D36 我们用 LoRA 微调了一个客服话术生成器,效果不错。但很多读者在留言区问了同一个问题:
"我的项目是不是也该用 LoRA?什么时候应该上全参微调?"
这其实是工程上最常见的纠结。我们用一张表先直观对比一下:
1.1 30 秒速览:全参 vs LoRA vs QLoRA
| 维度 | 全参微调 | LoRA | QLoRA |
|---|---|---|---|
| 更新参数 | 100% | 0.1-5% | 0.1-5% |
| 显存(Qwen2.5-7B) | ~80 GB | ~20 GB | ~10 GB |
| 硬件门槛 | A100 80G × N | 4090/3090 24G | 4060Ti 16G |
| 训练时间(7B, 3 epoch) | 6-12 小时 | 2-3 小时 | 3-4 小时 |
| 效果上限 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 适合数据量 | > 10 万条 | 100-1 万条 | < 1 万条 |
| 推理成本 | 不变 | 不变 | 不变 |
| 可合并性 | --- | ✅ | ✅ |
核心结论 :80% 的场景 LoRA / QLoRA 就够了。剩下 20% 才需要全参。
但"剩下 20%"是什么?D37 帮你看清楚。
二、全参微调深度解析
2.1 什么是全参微调
全参微调 = 更新模型的所有参数。
对 Qwen2.5-7B 来说:
- 模型维度 d = 3584
- 隐藏层数 L = 28
- 每层有 Q/K/V/O 4 个矩阵 + MLP 矩阵
- 总参数:76 亿
每个参数都需要存:
- 原始权重(fp16,2 字节)
- 梯度(fp16,2 字节)
- Adam 优化器状态(fp32 + 2 个动量 = 12 字节)
单参数总占用 = 2 + 2 + 12 = 16 字节
全量训练 = 7.6B × 16 = 122 GB 显存(理论值,实际更复杂)
2.2 全参微调的硬件需求
| 模型规模 | 参数量 | 显存(理论) | 推荐 GPU |
|---|---|---|---|
| Qwen2.5-0.5B | 0.5B | ~8 GB | RTX 4090 24G |
| Qwen2.5-1.5B | 1.5B | ~24 GB | A100 40G × 1 |
| Qwen2.5-7B | 7B | ~122 GB | A100 80G × 2(DeepSpeed) |
| Qwen2.5-72B | 72B | ~1.2 TB | H100 × 8 |
关键瓶颈:不是计算,是显存。
2.3 全参微调的 3 大优势
优势 1:效果上限最高
全参微调理论上能达到"损失最小化"的全局最优。LoRA 因为只更新 0.1% 参数,存在表达天花板------它无法学习"需要重塑整个模型权重"的复杂能力。
优势 2:适应大分布偏移
场景:医疗大模型微调
- 数据:从通用对话 → 专业医疗问答
- 分布偏移:极大
- 全参:能学到"医学推理"模式
- LoRA:只能学"医学术语 + 表层风格"
优势 3:可作为新基座
全参微调后的模型是独立可发布的。LoRA 是"补丁",必须和基座一起部署。
2.4 全参微调的 3 大风险
风险 1:硬件成本高
一张 A100 80G 阿里云按量付费约 ¥30/小时。3 epoch 训练(7B)≈ 6 小时 = ¥180 / 次。
风险 2:灾难性遗忘
全参微调所有参数,模型很容易"忘记"通用能力。表现为:
- 微调后医学问答专业
- 但代码能力、对话能力大幅下降
风险 3:训练不稳定
全参对学习率、warmup、数据顺序都很敏感。配错一个超参,loss 直接飞掉。

三、LoRA / QLoRA 回顾与深化
3.1 核心原理(一句话版)
LoRA = 在原始权重旁边加两个小矩阵 B·A,只训练 B 和 A,原始权重冻结。
D36 我们详细讲过,这里不再重复。重点说 D36 没讲的:
3.2 LoRA 的 5 个变体
| 变体 | 原理 | 显存 | 效果 |
|---|---|---|---|
| LoRA | B·A 加在 Q/K/V | 1× | ⭐⭐⭐⭐ |
| QLoRA | 4bit 基座 + LoRA | 0.3× | ⭐⭐⭐ |
| AdaLoRA | 自适应秩分配 | 1× | ⭐⭐⭐⭐ |
| LoRA+ | B 和 A 用不同学习率 | 1× | ⭐⭐⭐⭐⭐ |
| DoRA | 方向 + 幅度分解 | 1× | ⭐⭐⭐⭐⭐ |
实战推荐:
- 数据 < 1000 条:QLoRA(最省资源)
- 数据 1000-1 万条:LoRA / LoRA+(平衡)
- 数据 > 10 万条:LoRA + AdaLoRA(效果更好)
3.3 LoRA 的 3 大局限
局限 1:表达天花板
LoRA 的秩 r 决定可表达的范围:
- r=8:能学表层风格
- r=64:能学中等复杂度能力
- r=128+:接近全参,但失去 LoRA 优势
局限 2:不适合新增知识
让模型"知道"一个新事实("我们公司 2026 年发布了产品 X"),LoRA 效果差,全参效果好。
局限 3:合并后失去模块化
LoRA 合并成完整模型后,再拆不出来。一个模型只能支持一种 LoRA。
四、5 维度深度对比
4.1 维度 1:参数量
全参微调 Qwen2.5-7B:7,600,000,000 个参数更新
LoRA (r=8) Qwen2.5-7B:约 8,000,000 个参数更新
比例:0.105%
4.2 维度 2:显存占用(Qwen2.5-7B 实测)
全参 fp16 全参 + ZeRO-3 LoRA QLoRA
基座模型 14 GB 14 GB(分片) 14 GB 4 GB
权重 + 梯度 28 GB 8 GB(分片) 60 MB 60 MB
优化器状态 84 GB 24 GB(分片) 240 MB 240 MB
激活 2-10 GB 2-10 GB 2-10 GB 2-10 GB
─────────────────────
总计 ~130 GB ~50 GB ~16 GB ~6 GB
4.3 维度 3:训练时间(Qwen2.5-7B, 1 万条数据, 3 epoch, A100)
| 方法 | 单卡 A100 | 4 卡 A100 |
|---|---|---|
| 全参 | 12 小时 | 3.5 小时 |
| LoRA | 3 小时 | 1 小时 |
| QLoRA | 4 小时 | 1.2 小时 |
4.4 维度 4:效果(同数据同评测集)
行业 benchmark(OpenAssistant + 1 万条定制数据):
| 方法 | 评测得分 |
|---|---|
| 基座(不微调) | 65.2 |
| QLoRA (r=8) | 71.5 |
| LoRA (r=16) | 73.8 |
| LoRA+ (r=32) | 75.2 |
| 全参微调 | 76.4 |
结论:LoRA+ 接近全参(差距 < 1.5 分),但训练成本只有 1/4。
4.5 维度 5:风险
| 风险 | 全参 | LoRA |
|---|---|---|
| 灾难性遗忘 | ⚠️ 高 | ✅ 低 |
| OOM | ⚠️ 高 | ✅ 低 |
| 训练崩溃 | ⚠️ 中 | ✅ 低 |
| 部署复杂度 | ✅ 低 | ⚠️ 中(需合并或加载 adapter) |

五、5 个选型决策树
决策树 1:你的数据量有多大?
数据量
├─ < 1,000 条 → QLoRA(别想全参,浪费钱)
├─ 1K - 10K → LoRA(首选)
├─ 10K - 100K → LoRA / 全参都可
└─ > 100K → 全参(值得投入)
决策树 2:你的硬件预算?
硬件
├─ 无 GPU / Colab → QLoRA(唯一选项)
├─ 16G 消费卡 → QLoRA
├─ 24G 消费卡 → LoRA(fp16)
├─ 40G 单卡 → LoRA / 小全参
└─ 80G × N 多卡 → 全参可考虑
决策树 3:你的效果要求有多极致?
效果要求
├─ 80% 准确率就够 → LoRA(首选)
├─ 90% 准确率 → LoRA+ / DoRA
├─ 95%+ 准确率 → 全参 + DeepSpeed
└─ SOTA 级别 → 全参 + 数据增强 + RLHF
决策树 4:你要学的"是什么"?
任务类型
├─ 风格/口吻 → LoRA(首选)
├─ 领域术语 → LoRA / QLoRA
├─ 新增知识 → 全参 / RAG
├─ 新增能力(推理/编程)→ 全参
└─ 跨域融合 → 全参
决策树 5:你能承受的最大训练成本?
训练成本预算
├─ ¥0 - ¥50 → QLoRA + Colab 免费 T4
├─ ¥50 - ¥500 → LoRA + 4090/云 GPU
├─ ¥500 - ¥3000 → LoRA / 全参(单 A100)
└─ > ¥3000 → 全参 + 多卡 + DeepSpeed
综合决策矩阵
| 数据 | 硬件 | 效果要求 | 推荐 |
|---|---|---|---|
| < 1K | 任意 | 任意 | QLoRA |
| 1K-10K | 16G | 80% | LoRA r=8 |
| 1K-10K | 24G | 90% | LoRA+ r=16 |
| 10K-100K | 24G+ | 90% | LoRA+ r=32 或 DoRA |
| 10K-100K | 80G+ | 95% | 全参 + DeepSpeed |
| > 100K | 80G+ | SOTA | 全参 + 数据增强 + RLHF |
六、实战:Qwen2.5-7B 全参微调
6.1 硬件要求
- GPU:A100 80G × 1(最小)/ A100 80G × 2-4(推荐)
- 内存:≥ 64 GB
- 磁盘:≥ 50 GB(模型 + 数据 + checkpoint)
6.2 数据准备
D36 我们准备了 30 条客服话术。这次准备 5000 条(覆盖 8 大场景,每场景 600+ 条):
python
# 实战数据格式(JSONL)
{"instruction": "...", "output": "..."}
6.3 全参微调主脚本
python
# full_finetune.py
import torch
from datasets import load_dataset
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
TrainingArguments,
Trainer,
DataCollatorForLanguageModeling,
)
# ===== 1. 配置 =====
MODEL_NAME = "Qwen/Qwen2.5-7B-Instruct"
DATA_PATH = "./data/customer_service_5k.jsonl"
OUTPUT_DIR = "./output/qwen2.5-7b-customer-service-full"
# ===== 2. 加载 tokenizer =====
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
# ===== 3. 加载模型(fp16)=====
print("📦 加载 Qwen2.5-7B...")
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.float16,
device_map="auto", # 自动多卡分布
trust_remote_code=True,
)
# ===== 4. 数据准备 =====
dataset = load_dataset("json", data_files=DATA_PATH, split="train")
system_prompt = "你是专业客服助手,回复要亲切不卑微、专业不说教。"
def format_sample(example):
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": example["instruction"]},
{"role": "assistant", "content": example["output"]},
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)
# Tokenize
tokens = tokenizer(text, truncation=True, max_length=2048, padding=False)
tokens["labels"] = tokens["input_ids"].copy() # 因果 LM
return tokens
dataset = dataset.map(format_sample, remove_columns=dataset.column_names)
# ===== 5. 训练配置(DeepSpeed ZeRO-2)=====
training_args = TrainingArguments(
output_dir=OUTPUT_DIR,
num_train_epochs=2,
per_device_train_batch_size=2, # 7B 全参必须小 batch
gradient_accumulation_steps=8, # 等效 batch=16
learning_rate=1e-5, # 全参学习率比 LoRA 小 20 倍
warmup_ratio=0.05,
logging_steps=10,
save_strategy="epoch",
bf16=True, # A100 支持 bf16
fp16=False,
deepspeed="ds_config_zero2.json", # DeepSpeed 配置
report_to="none",
gradient_checkpointing=True, # 省显存
)
# ===== 6. 启动训练 =====
print("🚀 开始全参微调...")
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset,
data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
trainer.train()
trainer.save_model(OUTPUT_DIR)
tokenizer.save_pretrained(OUTPUT_DIR)
print(f"✅ 训练完成,模型保存到 {OUTPUT_DIR}")
6.4 DeepSpeed 配置
json
# ds_config_zero2.json
{
"bf16": {
"enabled": true
},
"zero_optimization": {
"stage": 2,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"allgather_partitions": true,
"allgather_bucket_size": 5e8,
"overlap_comm": true,
"reduce_scatter": true,
"reduce_bucket_size": 5e8,
"contiguous_gradients": true
},
"gradient_accumulation_steps": "auto",
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto"
}
6.5 跑通这个项目需要什么
| 资源 | 最小 | 推荐 |
|---|---|---|
| GPU | A100 80G × 1 | A100 80G × 4 |
| 训练时间 | ~12 小时 | ~3.5 小时 |
| 成本(按量付费) | ¥360 | ¥420(4 卡更快) |
| 磁盘 | 50 GB | 100 GB |
没有 A100? 也可以用 RTX 4090 24G 跑 Qwen2.5-1.5B 全参,效果接近 7B + QLoRA。

七、常见决策踩坑
7.1 误区 1:"LoRA 效果一定比全参差"
事实:在大多数任务上(风格/术语/中等复杂度),LoRA+ 和全参差距 < 2%。
什么时候全参才明显好?
- 数据量 > 10 万条
- 任务需要"重塑模型能力"(如新增推理模式)
- 数据分布和基座差距巨大
7.2 误区 2:"全参一定比 LoRA 慢"
事实:在多卡环境下,全参 + DeepSpeed 可以比 LoRA 单卡更快。
8 × A100 全参 + ZeRO-3: 1 小时
1 × A100 LoRA: 3 小时
7.3 误区 3:"全参就更专业"
事实:垃圾数据 + 全参 = 垃圾模型放大版。
真相:数据质量 > 微调方法 > 模型规模。
7.4 误区 4:"合并后的 LoRA = 全参"
事实 :合并后推理等价 ,但无法恢复为 LoRA 适配器。
如果你的场景需要"基座 + 多个 LoRA 适配器切换",不要合并。
八、从 Demo 到生产:选型决策清单
用这个清单帮你做最终决策:
□ 我的数据量 < 1K? → 用 QLoRA
□ 我的硬件 ≤ 16G? → 用 QLoRA
□ 我的效果要求 ≤ 85%? → 用 QLoRA / LoRA
□ 我的数据 > 100K + 80G+? → 考虑全参
□ 我的任务需要"新增能力"? → 考虑全参
□ 我能接受 ¥1000+ 训练费? → 考虑全参
□ 我需要频繁切换微调版本? → 用 LoRA(不要合并)
□ 我有 4+ 张 A100? → 全参 + DeepSpeed ZeRO-3
如果 6 个以上选 "是" → 全参;
如果 4-6 个选 "是" → LoRA+;
如果 ≤ 3 个选 "是" → QLoRA。
九、Key Takeaways
- 80% 的场景 LoRA 就够了,别盲目追求全参
- 数据量决定方法:< 1K 用 QLoRA,> 100K 才考虑全参
- 硬件决定可行性:24G 以下基本只能 LoRA/QLoRA
- 全参的优势是"新增能力"和"上限",不是"小数据更准"
- 决策树比"经验"更可靠:用 5 个维度对照自己的场景
十、思考题
- 场景题:你的公司要做"法律咨询模型",有 5000 条真实律师对话数据,硬件是 4 张 A100 80G,你会选全参还是 LoRA?为什么?
- 成本题:用全参微调 Qwen2.5-7B + DeepSpeed ZeRO-3,4 张 A100 跑 3 epoch,估算总成本(按阿里云按量付费)。
- 架构题:你设计了一个"基座 + 5 个 LoRA 适配器"的多场景系统。什么时候你会选择把 LoRA 合并?什么时候保留适配器?
十一、下篇预告
D38:训练数据准备与清洗------从原始数据到训练就绪的 7 步流程
内容包括:
- 数据格式选型(Alpaca / ShareGPT / 自定义)
- 7 步数据清洗流水线
- 数据增强 5 个技巧(回译 / 同义改写 / Self-Instruct / 质量过滤 / 去重)
配套代码 :code/D37/ 下包含 5 个 Python 脚本 + 单测 + 完整配套,clone 后可直接运行。
GitCode 仓库 :git@gitcode.com:road-emblem/60-days-ai-stack.git → S3/D37/
作者 :刘一说(haohaizi_liu)· 「60 天 AI 全栈转型」专栏
S3 模块 3「模型训练与微调」 第 2 篇 / 共 15 篇
下篇:D38 训练数据准备与清洗