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

文章目录

  • [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

  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 训练数据准备与清洗

相关推荐
尘世中一位迷途小书童1 小时前
想自研大模型,你得先过哪些技术关
人工智能
wei091301 小时前
2026 企业 AI 办公工具选型指南:搭建 AI 与现有办公流程融合体系
大数据·运维·人工智能
workflower1 小时前
AI+ 新型ICT 基础设施是企业数智化转型的基石
大数据·人工智能·机器学习·重构·云计算·汽车
sunneo1 小时前
每周GitCode开源精选项目
人工智能
一根会思考芦苇1 小时前
Agent 面对的是任务,Owner 面对的是人生
人工智能
Zelman1 小时前
第01章-AI Agent入门
人工智能
桃桃乌龙_1 小时前
RAG 深度解析:让大模型学会“开卷考试“的知识外挂
人工智能·面试
镜子AI1 小时前
镜子AI:教培机构RPA落地痛点拆解:拟人化触达与合规风控的工程化方案
大数据·人工智能·rpa
长弓三石1 小时前
用 JEV 决策模型接管 Agent 路由判断(二):工程实现与 4 个坑
人工智能