文章目录
- D37-全参微调 vs LoRA 选型:什么时候该上全参,什么时候 LoRA 就够了
- 一、为什么会有"全参 vs LoRA"的选择难题
- 1.1 30 秒速览:全参 vs LoRA vs QLoRA
- 二、全参微调深度解析
- 2.1 什么是全参微调
- 2.2 全参微调的硬件需求
- 2.3 全参微调的 3 大优势
- 2.4 全参微调的 3 大风险
- 三、LoRA / QLoRA 回顾与深化
- 3.1 核心原理(一句话版)
- 3.2 LoRA 的 5 个变体
- 3.3 LoRA 的 3 大局限
- 四、5 维度深度对比
- 4.1 维度 1:参数量
- 4.2 维度 2:显存占用(Qwen2.5-7B 实测)
- 4.3 维度 3:训练时间(Qwen2.5-7B, 1 万条数据, 3 epoch, A100)
- 4.4 维度 4:效果(同数据同评测集)
- 4.5 维度 5:风险
- 五、5 个选型决策树
- 决策树 1:你的数据量有多大?
- 决策树 2:你的硬件预算?
- 决策树 3:你的效果要求有多极致?
- 决策树 4:你要学的"是什么"?
- 决策树 5:你能承受的最大训练成本?
- 综合决策矩阵
- 六、实战:Qwen2.5-7B 全参微调
- 6.1 硬件要求
- 6.2 数据准备
- 6.3 全参微调主脚本
- 6.4 DeepSpeed 配置
- 6.5 跑通这个项目需要什么
- 七、常见决策踩坑
- 7.1 误区 1:"LoRA 效果一定比全参差"
- 7.2 误区 2:"全参一定比 LoRA 慢"
- 7.3 误区 3:"全参就更专业"
- 7.4 误区 4:"合并后的 LoRA = 全参"
- 八、从 Demo 到生产:选型决策清单
- 九、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 GB4.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+ 条):
# 实战数据格式(JSONL){"instruction":"...","output":"..."}6.3 全参微调主脚本
# full_finetune.pyimporttorchfromdatasetsimportload_datasetfromtransformersimport(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="你是专业客服助手,回复要亲切不卑微、专业不说教。"defformat_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)# Tokenizetokens=tokenizer(text,truncation=True,max_length=2048,padding=False)tokens["labels"]=tokens["input_ids"].copy()# 因果 LMreturntokens 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 全参必须小 batchgradient_accumulation_steps=8,# 等效 batch=16learning_rate=1e-5,# 全参学习率比 LoRA 小 20 倍warmup_ratio=0.05,logging_steps=10,save_strategy="epoch",bf16=True,# A100 支持 bf16fp16=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 配置
# 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 训练数据准备与清洗