ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

D37-全参微调 vs LoRA 选型:什么时候该上全参,什么时候 LoRA 就够了

D37-全参微调 vs LoRA 选型:什么时候该上全参,什么时候 LoRA 就够了

文章目录

  • 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

维度全参微调LoRAQLoRA
更新参数100%0.1-5%0.1-5%
显存(Qwen2.5-7B)~80 GB~20 GB~10 GB
硬件门槛A100 80G × N4090/3090 24G4060Ti 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.5B0.5B~8 GBRTX 4090 24G
Qwen2.5-1.5B1.5B~24 GBA100 40G × 1
Qwen2.5-7B7B~122 GBA100 80G × 2(DeepSpeed)
Qwen2.5-72B72B~1.2 TBH100 × 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 个变体

变体原理显存效果
LoRAB·A 加在 Q/K/V1×⭐⭐⭐⭐
QLoRA4bit 基座 + LoRA0.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)

方法单卡 A1004 卡 A100
全参12 小时3.5 小时
LoRA3 小时1 小时
QLoRA4 小时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-10K16G80%LoRA r=8
1K-10K24G90%LoRA+ r=16
10K-100K24G+90%LoRA+ r=32或DoRA
10K-100K80G+95%全参 + DeepSpeed
> 100K80G+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 跑通这个项目需要什么

资源最小推荐
GPUA100 80G × 1A100 80G × 4
训练时间~12 小时~3.5 小时
成本(按量付费)¥360¥420(4 卡更快)
磁盘50 GB100 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

  1. 80% 的场景 LoRA 就够了,别盲目追求全参
  2. 数据量决定方法:< 1K 用 QLoRA,> 100K 才考虑全参
  3. 硬件决定可行性:24G 以下基本只能 LoRA/QLoRA
  4. 全参的优势是"新增能力"和"上限",不是"小数据更准"
  5. 决策树比"经验"更可靠:用 5 个维度对照自己的场景

十、思考题

  1. 场景题:你的公司要做"法律咨询模型",有 5000 条真实律师对话数据,硬件是 4 张 A100 80G,你会选全参还是 LoRA?为什么?
  2. 成本题:用全参微调 Qwen2.5-7B + DeepSpeed ZeRO-3,4 张 A100 跑 3 epoch,估算总成本(按阿里云按量付费)。
  3. 架构题:你设计了一个"基座 + 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 训练数据准备与清洗

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进