大模型工程化 · 微调选型

大模型微调方法
到底怎么选?

LoRA、QLoRA、AdaLoRA、aLoRA、全量微调……选择变多了反而更纠结。 这篇不讲所有 PEFT 论文的细节,只讲怎么根据你的任务、数据、算力、部署方式 在 5 分钟内挑对路线——然后再在那个路线里追极致效果。

▶ 先看核心结论 ⚡ 直接选路线
配套阅读:同目录 《模型微调到底是什么 · 原理图解》讲"微调在干嘛",本文讲"微调该用哪种"。
第 1 章 · 一句话答案

没有唯一最优解,先选对路线,再追极致效果

微调方案按"参数更新量"从多到少大致分三档:全量微调(动全部参数)→ PEFT 大类(只动一小撮参数,其中 LoRA 最主流)→ 更激进的 PEFT(AdaLoRA 调秩、aLoRA 按需激活)。

高参数 中参数(主流) 更精细 全量微调 Full FT 动 100% 参数 效果上限最高 显存极贵 LoRA · 主流首选 动 0.1% ~ 5% 参数 QLoRA · 显存紧张时 LoRA + 4-bit 量化基座 AdaLoRA 动态分配不同秩 aLoRA 按需激活可切换分支 —— 同等参数预算下,训练精度与显存成反比,但 PEFT 阵营内差距并不悬殊 ——
图 1:微调方案的三档地图 —— 高参数 / 中参数主流 / 更精细

速记口诀: 新手当 LoRA卡紧用 QLoRA抠精度试 AdaLoRA多任务/Agent 切 aLoRA高预算再上全量

选型信号其实只有 4 个:任务形态、数据规模、显存上限、部署形态。 下面我们就按这 4 个信号,把 5 种主流方法挨个对比一遍。

第 2 章 · 选型四问

先想清楚这 4 件事,再去看方法

上来就比方法细节会陷入"参数调优"陷阱。先回答下面 4 个问题,答案本身就是选型方向。

① 任务是什么形态?

对话结构化抽取多任务Agent

单任务稳定输出 → LoRA;多任务互不打架 → aLoRA;需要切换不同领域/工具风格 → aLoRA。

② 数据规模 / 质量

百条千条万条十万+

千条高质量 → LoRA/QLoRA 完全够;万条以上且数据干净 → 可考虑全量;样本极小(百条以内)→ 加 Adapter 或冻结更多层。

③ 显存 / 算力上限

单卡 24G单卡 40G单卡 80G多卡

24G 单卡 → QLoRA 几乎唯一选项;80G / 多卡 → LoRA 任意玩;多卡 A100/H100 → 全量微调也未必夸张。

④ 部署形态

单 LoRA 服务多 LoRA 热切换合并回基座

只服务一个任务 → 合并回基座推理更快;要多个任务同基座并存 → 保留 LoRA 权重便于热加载。

📌 真实优先级:任务形态 > 显存上限 > 数据规模 > 部署形态。前两个几乎就定了大方向,后面只是确认"能不能这样用"。
第 3 章 · 原理图解

5 种主流方法到底"动"了什么

5 种方案的本质差异是动哪个矩阵 / 动多少 / 怎么分配。下面每张图都用同一个基座模型做对比基线,方便直观感受。

① 全量微调(Full Fine-tuning)

基座所有权重 W 全部参与更新。优点是效果上限最高,缺点是显存巨大、容易"灾难性遗忘"原有能力。

W:d × d 整块大矩阵 (基座模型每一层的权重) 全部参与 ΔW W + ΔW:整块被改写 训练后权重全部更新 显存开销 全参数 + 优化器 + 梯度 ≈ 16× 模型体积
图 2:全量微调 — 整块矩阵全部更新,显存随模型线性放大

② LoRA(Low-Rank Adaptation)

冻结 W,在旁边挂一个 低秩分解 的旁路 ΔW = B·A(秩 r ≪ d),只训练 A、B。推理时把 ΔW 合并回 W,零额外延迟。

W:冻结 🔒 不更新 + A:d × r 瘦矩阵 ✏️ 只训 A、B B:r × d 瘦矩阵 = W + ΔW ΔW = B·A,低秩补丁 推理时可合并回 W 0 额外推理延迟 显存只需存 W(冻结) + 小矩阵 A、B + 优化器状态
图 3:LoRA — 冻结主权重,训练一对瘦矩阵,可合并回原矩阵
📌 主流做法:r 取 8 / 16 / 32,α 取 2r。target_modules 通常选注意力里的 Q、K、V、O 投影层。

③ QLoRA(Quantized LoRA)

在 LoRA 基础上,把基座 W4-bit 量化(NF4 格式)压成"小格子",加载时反量化、训练时 LoRA 仍跑 FP16/BF16。显存能再省一个量级,单卡 24G 就能微调 65B 量级模型。

W:NF4 量化 (4-bit) 🔒 冻结 · 反量化使用 + A:BF16 d × r ✏️ 仍训 A、B B:BF16 r × d = W(NF4) + ΔW(BF16) 基座压成 4-bit · LoRA 仍精 Page Optimizer:分页调度 避免 OOM 全量 FT LoRA QLoRA
图 4:QLoRA — 基座 4-bit 量化、LoRA 仍 BF16,显存节省 4 倍以上
📌 QLoRA 的三个关键组件:① NF4(4-bit 数据类型)② Double Quant(对量化常数再做一次量化)③ Paged Optimizer(分页优化器)。三者缺一不可。

④ AdaLoRA(Adaptive LoRA)

LoRA 给所有层同一个秩 r,但实际不同层对任务的重要程度不同。AdaLoRA 让模型自己 动态分配不同层不同秩:重要层给高秩、不重要层剪枝到接近 0。

Transformer 各层 Layer 0 Layer 1 Layer 2 Layer 3 Layer 4 Layer 5 A (d × rᵢ) B (rᵢ × d) 秩 rᵢ 自适应 r=24 r=24 高秩 r=16 r=16 中秩 r=16 r=16 中秩 r=4 r=4 低秩 ≈0 ≈0 剪枝 r=8 r=8 中秩 AdaLoRA = 让 rᵢ 自动学出来 同等预算下更精细
图 5:AdaLoRA — 不同层分配不同秩,重要层宽、不重要层窄甚至剪枝

⑤ aLoRA(Activated LoRA)

把 LoRA 切成多个"小专家模块"(aB 块),每个块单独训练。推理时按需激活对应的块——可以快速在不同任务/不同领域/不同风格间切换,无需重训。

W:冻结 所有任务共享 + aB 块(独立训练) 块 #1 客服 块 #2 代码 块 #3 写作 块 #4 推理 ↑ 训练时同时学 N 块,每块擅长不同领域 ↑ 推理时只激活需要的 1~2 块 按需激活 路由 / 关键词命中 → 选哪几块 → 切换无需重训
图 6:aLoRA — 多个独立可切换的 LoRA 块,推理时按需激活
📌 aLoRA 来自 IBM Research 2024,特点是把 LoRA 的 A、B 切分成多个"激活单元",结合 Mixture-of-Experts 思想做条件激活。适合"一个基座 + 多套人格/多套技能"场景。
第 4 章 · 头对头对比

一张表看穿 5 种方法

对照 11 项关键指标。下表中:

维度 全量微调 LoRA QLoRA AdaLoRA aLoRA 更新参数比例 100% 0.1~5% 0.1~5% 0.1~5% 0.1~5%(多块) 显存需求(7B) ~60G ~16G ~6G ~16G ~18G 训练速度 中(量化开销) 中(含奇异值分解) 中(多块训练) 效果上限 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐(单块) 灾难性遗忘风险 多任务/多风格切换 需多副本 可堆叠 可堆叠 单模型多秩 原生支持 可合并回基座推理 部分(需路由) 上手成本 低(生态成熟) 中(需 bitsandbytes) 中(需自实现) 高(自研路由) 最低数据量 万条+ 千条 千条 千条 千条 ×N 任务 典型实现库 Transformers Trainer PEFT / unsloth / LLaMA-Factory PEFT + bitsandbytes adapters 库 ALoRA 论文 / 自研 典型场景 高预算·深度改造 通用·中小数据 显存紧张·大模型 资源敏感·精细 多任务·Agent
图 7:5 种微调方案 11 维对比表 —— 把这些维度做成卡片,选型时一边对一边打钩
📌 显存数据按 7B 模型、batch=1、序列长 2048 估算。实际会随 batch、序列长度、量化方式浮动 ±20%。
第 5 章 · 方法演进

5 种方法其实是"同一个思路在反复优化"

它们不是并列候选,而是沿着"怎么把参数训得更省、更准、更灵活"这条主线逐步演进。看清这条主线,就知道为什么会出现新方法。

FT 全量微调 2020 前 问题:显存 LoRA 低秩分解 2021 问题:基座太大 QLoRA 4-bit 基座 2023 问题:所有层 r 一样 Ada 动态秩分配 2023 问题:单任务单一形态 aLoRA 按需激活 2024 每一代都在解决上一代的"具体痛点",而不是凭空发明
图 8:微调方法演进链 —— 后一代解决前一代的"具体痛点"

3 个核心优化方向

① 省显存
全量 → LoRA(冻结主权重)→ QLoRA(基座量化)。三者都从不同角度降低显存。
② 提精度
LoRA → AdaLoRA(不同层不同秩,让重要层多学)。在同参数预算下效果更好。
③ 扩灵活性
LoRA → aLoRA(多块按需激活)。一个基座服务多任务多风格,无需重训。
第 6 章 · 场景对号入座

5 种方法的"主战场"

每种方法都有自己的甜区。下面按"你现在的处境"反查该用哪种。

全量微调适合:
  • 预算充足(≥8 张 A100 / H100)
  • 数据量极大(百万条以上)
  • 需要根本性改变模型行为(如全新领域持续预训练 CPT)
  • 研究/发表场景,追求绝对性能
LoRA 适合:
  • 90% 的工业落地场景
  • 单任务、稳定风格/格式/语气
  • 中等数据量(千条 ~ 几万条)
  • 至少有一张 24G 以上显卡
  • 需要快速迭代多个版本(LoRA 训练快、便宜)
QLoRA 适合:
  • 只有消费级显卡(24G / 4090)
  • 想微调 65B/70B 这种大模型
  • 显存紧张但不想放弃 PEFT 效果
  • 能接受一点训练时间换显存的取舍
AdaLoRA 适合:
  • 参数预算严格(如总可训参数有上限)
  • 任务对单层质量敏感(如下游任务重在某层特征)
  • 已有 LoRA 训练经验,想再压一点效果
  • 愿意调奇异值分解相关超参
aLoRA 适合:
  • 一个基座服务多套任务/多套风格(如电商客服 + 代码助手 + 数据分析)
  • Agent 场景:根据工具/意图切换不同的"专家"
  • 长上下文/分段处理:不同段用不同块
  • 需要"按需加载",避免一次性加载所有 LoRA
  • 愿意接受路由策略带来的工程复杂度
⚠️ 常见误区:"QLoRA 训练出来的 LoRA" ≠ "QLoRA 直接拿来用"。QLoRA 训完拿到的是 FP16/BF16 的 LoRA 权重,推理时通常合并回基座用基座加载,不会再以 4-bit 形式提供在线服务——4-bit 是训练时的内存技巧,不是部署的精度。
第 7 章 · 决策树

5 分钟选型流程

按顺序回答 4 个 yes/no 问题,就能落到唯一方案。

准备微调 Q1:需要切换多任务/多风格? → aLoRA Q2:单卡显存 < 24G? → QLoRA Q3:参数预算很紧/任务重某层? → AdaLoRA Q4:数据 ≥ 10万 + 多卡 ≥ 8? → 全量 FT → LoRA (主流首选) 📌 决策树速记: 多任务 → aLoRA;显存 < 24G → QLoRA;预算紧 → AdaLoRA;高资源 + 大数据 → 全量;其他 → LoRA(默认) 实战中 90% 场景落到 LoRA / QLoRA 两档。新手无需死磕 AdaLoRA、aLoRA,先把 LoRA 跑通。
图 9:5 分钟选型决策树 —— 4 个 yes/no 问题,唯一落点
📌 实战建议:先按决策树选方案 → 用基座模型 + 默认 LoRA r=16 跑一轮 baseline → 评估达标 → 直接用;不达标 → 调 rank、扩数据、换 AdaLoRA/全量。
第 8 章 · 实操清单

5 步落地 Checklist

决策树给出方法后,按这个清单一步步落地。

Step 1 · 数据

  • 数据格式:JSONL {"instruction":"…","input":"…","output":"…"}
  • 数量:千条起步,质量优先于数量
  • 标注一致性:至少 2 人交叉验证一份

Step 2 · 选方法 + 关键超参

  • LoRA:r=16, α=32, dropout=0.05,target_modules 选 q_proj, k_proj, v_proj, o_proj
  • QLoRA:加 load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=bf16
  • AdaLoRA:额外设 init_r=12, target_r=8, delta_r=16 等动态秩参数
  • aLoRA:需自实现路由与激活策略

Step 3 · 训练

  • 学习率:LoRA 1e-4 ~ 5e-4,全量 1e-5 ~ 2e-5(更小)
  • 训练轮数:3 ~ 5 epoch 起步,看验证集收敛
  • 批量:受显存限制就开 gradient accumulation
  • 日志:每 50 步打印 loss,每 epoch 评估一次

Step 4 · 评估 + 合并

  • 留出验证集:不能只看训练 loss
  • 关注"任务指标"(如 JSON 抽取准确率)+ "通用能力"(如 MMLU 子集)
  • LoRA 合并:model.merge_and_unload(),把 LoRA 写回基座
  • 若服务多任务:保留 LoRA 权重不合并,按需加载

Step 5 · 部署 + 监控

  • 单 LoRA:合并部署到 vLLM / TGI / Triton
  • 多 LoRA:PeftModel + 路由层 / LoRA 热加载服务(如 S-LoRA)
  • 监控:线上响应延迟、效果回归、显存占用
第 9 章 · 避坑

8 个常见选型误区

看过太多项目栽在"方法选错"这一步,下面 8 个坑几乎一半项目都会踩。

❌ 误区 1:数据少还选全量

千条数据训 7B 全量 = 灾难性遗忘 + 过拟合。先攒数据或改 LoRA。

❌ 误区 2:只看显存选 QLoRA

QLoRA 比 LoRA 慢约 30%~50%。如果有 80G 卡选 QLoRA 就亏了时间。

❌ 误区 3:无脑用 LoRA r=64

r 越大越接近全量,但显存也涨。一般 r=8~32 已经够用,r=128 收益边际递减。

❌ 误区 4:用 AdaLoRA 解决一切

AdaLoRA 比 LoRA 实现复杂、对超参敏感。新手先 LoRA 跑通再考虑 Ada。

❌ 误区 5:aLoRA 解决多任务

多任务大多数情况直接"多个独立 LoRA" 即可,不必上 aLoRA。aLoRA 是"基座必须共享 + 频繁切换"的场景才显优势。

❌ 误区 6:微调能塞知识

微调擅长改行为/格式/风格,不擅长注入新事实。需要新知识先 RAG。

❌ 误区 7:训练损失低 = 任务好

可能"背答案"。必须用任务指标 + 通用能力集双重评估。

❌ 误区 8:合并后忘记基座依赖

合并后的模型文件只依赖基座版本,丢失 LoRA 灵活性。一旦想更新就得重训。

收尾 · 一句话

所以,微调方法到底怎么选

选微调方案的第一性顺序:先看 任务形态(多任务选 aLoRA,单任务往下走), 再看 显存上限(<24G 选 QLoRA,否则往下走), 再看 资源/精度要求(极精算 AdaLoRA,否则往下走), 再看 数据规模 + 多卡(万条+多卡可选全量), 最后默认落到 LoRA

工业界 90% 的项目其实就在 LoRA / QLoRA 这两档之间选。剩下 10% 才需要折腾 AdaLoRA、aLoRA 甚至全量。

记住:没有"永远最好"的微调方法,只有"此刻对你最合适"的方法。先跑通 baseline,再追极致。