Part 5 · Training / Fine-tuning 训练与微调

5.2 SFT & the PEFT Family LoRA / QLoRA 原理与配置

难度 ★★★ 阅读 ~15 min 面试出现频率 高 前置 1.4 量化 / 5.1
故事线 第 2 段 · 选 LoRA 配置

决定要训了。基座选定一个 8B 的开源模型——未微调时类别准确率只有 76%,需要靠训练把它拉到 94% 的基线之上。

接下来的问题很具体:全量微调还是 LoRA?如果用 LoRA,rank 取多少、alpha 取多少、训哪些层?团队只有一张 80GB 的卡,且希望将来能为其他相近任务复用同一个基座。

Core Concept 核心概念

为什么可以只训练极少的参数

SFT(supervised fine-tuning,有监督微调)就是拿「输入-期望输出」的样本对继续训练模型。最朴素的做法是全量微调:更新全部参数。它的问题不在效果,而在成本——一个 8B 模型全量微调时,除了 16GB 的权重,还要为优化器状态、梯度、激活值各留一份,显存需求是权重的数倍。

PEFT(parameter-efficient fine-tuning,参数高效微调)的出发点是一个观察:把一个预训练模型适配到某个下游任务,所需的改动其实「不那么复杂」。既然改动本身是低复杂度的,就不必用全部参数去表示它。

LoRA(Low-Rank Adaptation,低秩适配)把这个想法落成了一个极简的形式:冻结原权重,在旁边加一对小矩阵来表示「改动量」。

LoRA:ΔW = B × A,用两个瘦矩阵表示权重改动量 W(冻结) d × d 原权重,不更新 + B d×r × A  r×d 只训练这两个小矩阵(r 通常是 8–64,而 d 是几千) 参数量对比 d = 4096, r = 16 时: W: 4096×4096 ≈ 1678 万 B+A: 2×4096×16 ≈ 13 万 约为原参数量的 0.8% 推理时可把 BA 合并回 W, 因此不增加任何推理延迟
图 1 · 低秩分解。关键性质有两条:① 训练时只有 B、A 需要梯度与优化器状态,显存需求大幅下降;② 推理时 W + BA 可以预先合并成一个矩阵,推理开销与原模型完全相同——这一点让 LoRA 在生产中格外实用。

rank 和 alpha 到底怎么选

这是实践中最常被问、也最容易被神秘化的两个超参数。它们的含义其实很直接:

rank (r):改动量的「表达能力上限」。r 越大,B×A 能表示的改动越复杂,但可训练参数越多、越容易过拟合。经验判断:任务越接近模型已有能力(改风格、改格式、改输出偏好),r 可以很小(8–16);任务越需要模型学习新的映射关系(陌生领域的推理模式),r 需要更大(32–128)。

alpha (α):改动量的「缩放系数」。实际生效的改动是 (α/r) × BA。所以真正影响训练行为的是 α/r 这个比值,而不是 α 本身——这是最常见的误解来源。

实用做法

固定 α = 2r(即 α/r = 2),只调 r 这一个旋钮

r=8, α=16 → 轻量适配,改风格/格式
r=16, α=32 → 通用默认起点
r=32, α=64 → 任务较复杂或数据量大时
r=64+ → 先怀疑是不是该考虑全量微调了

调参顺序:先固定 α/r,扫 r;r 定了之后再调学习率。
同时乱调两个耦合的参数,得到的结论没有意义。

训哪些层?早期实践常只训注意力的 q/v 投影。当前更常见的做法是把 LoRA 加到注意力的全部投影(q/k/v/o)加上 MLP 层——覆盖面更广,效果通常更好,代价是参数量增加(但相对全量微调仍然微不足道)。如果不确定,先全都加上,这比精细挑选层的收益更稳定。

QLoRA:让单卡训得动更大的模型

QLoRA 把 1.4 的量化与 LoRA 组合起来:把冻结的基座权重量化到 4-bit,梯度穿过这个量化后的模型反向传播到 LoRA adapter 上。基座反正不更新,用低精度存放并不损失训练目标。

这一步把显存需求进一步压缩,让「单张卡微调一个大模型」从不可能变成常规操作。代价是训练速度略有下降(需要反量化)。对绝大多数应用层团队,QLoRA 是默认选择——不是因为它效果最好,而是因为它把硬件门槛降到了可及的范围。

LoRA 的能力边界:它擅长什么,不擅长什么

这是选型时真正需要判断的地方,也是面试高频考点:

LoRA全量微调
擅长激活和重组模型已有的能力——改输出风格、格式、任务偏好、在已掌握领域内的推理方式同左,且能注入大量新知识或改变模型的底层表示
不擅长学习模型完全不具备的新能力;吸收超大规模训练数据(低秩表达能力会成为瓶颈)—
显存低,QLoRA 下单卡可行高,通常需多卡
灾难性遗忘较轻——原权重冻结,通用能力保留得更好较重,需要用混合数据缓解(5.3)
部署一个基座 + 多个 adapter,可按请求切换,多任务场景优势巨大每个任务一份完整权重,存储与部署成本高

最实用的一条判断:如果你的目标是「让模型把它已经会的事情,按你要的方式稳定地做出来」,LoRA 几乎总是够用。只有当你需要模型掌握它此前完全不具备的能力时,才值得考虑全量微调——而对应用层团队来说,这种情况远比想象中少见。

Case Study 真实案例

LoRA 与 QLoRA 两篇论文

LoRA (ICLR 2022) · QLoRA (NeurIPS 2023)

LoRA 的做法是冻结预训练权重,向 Transformer 每一层注入可训练的秩分解矩阵。论文给出的对比很直接:

10,000×
可训练参数量的减少(vs GPT-3 175B 用 Adam 全量微调)
3×
GPU 显存需求的降低(同一对比条件)
持平或更好
在 RoBERTa / DeBERTa / GPT-2 / GPT-3 上的模型质量

务必连条件一起记:10,000× 和 3× 是在 GPT-3 175B 与 Adam 全量微调这一特定对比下测得的。倍数会随模型规模、优化器和 rank 设置变化——可迁移的是「可训练参数可以少几个数量级而质量不降」这个结论,不是具体倍数。

QLoRA 更进一步:把梯度通过一个冻结的 4-bit 量化模型反向传播到 LoRA adapter,从而把显存压到「在单张 48GB GPU 上微调 65B 模型」的程度,同时保持全 16-bit 微调的任务表现。

65B / 48GB
单卡可微调的规模
NF4
4-bit NormalFloat,针对正态分布权重的信息论最优数据类型
99.3%
Guanaco 在 Vicuna 基准上达到的 ChatGPT 性能水平
24 小时
单张 GPU 上的微调耗时

论文的三项技术贡献值得记住,因为它们各自对应一个具体的显存瓶颈:① NF4——针对权重的近正态分布设计的数据类型;② 双重量化——连量化常数本身也量化,进一步降低平均显存占用;③ 分页优化器——处理训练中的显存尖峰。

Guanaco 那个 99.3% 需要谨慎解读:它是在 Vicuna 基准上、以特定评判方式得到的结果,不代表在所有任务上都接近 ChatGPT。这类「达到某某模型 X% 水平」的说法,永远要追问「在哪个基准上、用什么评判方法」。这个案例真正的分量在于第一句——65B 模型在单张 48GB 卡上完成微调,这是把大模型微调从机构级能力变成个人可及能力的转折点。

来源:Hu, Shen, Wallis, Allen-Zhu, Li, Wang, Wang, Chen, "LoRA: Low-Rank Adaptation of Large Language Models", ICLR 2022;Dettmers, Pagnoni, Holtzman, Zettlemoyer, "QLoRA: Efficient Finetuning of Quantized LLMs", NeurIPS 2023. 数字均引自各论文摘要;示意图为本书重绘。

故事线:这个任务的配置怎么定

工单结构化任务 · 配置决策与理由

① LoRA 还是全量微调 → LoRA。三条理由:任务是让 8B 模型稳定地做一件它已经大致会做的事(未微调已有 76% 准确率,说明能力基本具备,缺的是稳定性和格式遵循),正落在 LoRA 的擅长区;只有单卡;且团队希望未来能用同一基座 + 不同 adapter 服务其他相近任务(如工单相似度、自动回复草稿)。

② QLoRA 还是标准 LoRA → QLoRA。单张 80GB 卡跑 8B 模型的标准 LoRA 其实并不紧张,但选 QLoRA 是为了留出余量做更大 batch 和更长序列,同时为将来可能换更大的基座(如 32B)预留路径。代价是训练速度略降,在这个数据规模下可以忽略。

r = 16
起点:任务窄、接近已有能力
α = 32
保持 α/r = 2
q/k/v/o + MLP
全投影加 adapter
4-bit NF4
基座量化,单卡余量充足

③ 调参的顺序。团队没有一上来就做大规模超参搜索,而是:先用 r=16 跑通全流程并建立基线 → 再扫 r ∈ {8, 16, 32} 各跑一次 → 选定 r 后只调学习率。关键纪律是一次只动一个变量——同时改 r 和学习率,得到的对比结论没有意义。

④ 一个反直觉的观察。r=32 相比 r=16 并没有带来提升,反而在长尾类别上略有下降。这符合预期——更大的 rank 意味着更强的表达能力,在数据量有限时更容易过拟合到高频类别上。这个现象反过来提示了真正的瓶颈:不在模型容量,在数据。这正是下一节的主题。

说明:本故事线为综合多个真实项目的匿名化叙事;配置选择与观察为工程实践总结,全部数字为示例假设,非某次具体实验的测量数据。
Tooling Sidebar 工具层
微调工具链速查(会过期,正文不依赖本区块) 截至 2026-10

Axolotl:以 YAML 配置驱动的微调框架,覆盖 SFT / LoRA / QLoRA / DPO,社区配置示例丰富。适合「照着一个已验证的配置改」的团队。

Unsloth:以速度与显存优化见长,对单卡场景优化明显,提供大量开箱即用的 notebook。适合快速做可行性验证。

LlamaFactory(原名 LLaMA-Factory):覆盖模型广、带 Web UI,中文社区活跃,适合快速试多个基座。

底层组件:HuggingFace peft(LoRA 等 PEFT 方法的参考实现)+ trl(SFT/DPO 训练器)+ bitsandbytes(4-bit 量化)。建议至少用底层组件手写一次训练脚本——搞清楚数据格式、loss mask、模板拼接这三件事,比会用任何框架都重要。

最容易出错、也最难发现的一处:chat template 与 loss mask。训练时的对话模板必须与推理时完全一致(差一个特殊 token 都会显著影响效果),且 loss 通常只应计算在助手回复部分,不应计算在用户输入上。这两处配错时,训练照常完成、loss 曲线看起来正常,只是效果莫名其妙地差——排查时优先检查它们。

部署:vLLM、SGLang 等支持直接加载 LoRA adapter,并支持多 adapter 动态切换(一个基座服务多个任务)。这是 LoRA 在生产中相对全量微调最实际的优势。

Quiz 自测

章末自测

概念题为什么 LoRA 在推理时不增加任何延迟?这和 adapter 类方法有什么区别?

因为 LoRA 的改动量可以被合并回原权重。训练完成后计算 W' = W + (α/r)·BA,得到一个与原权重形状完全相同的新矩阵。推理时直接用 W',模型结构、计算图、参数量都和原模型一模一样——没有任何额外的算子或层。

对比早期的 adapter 方法:它们在 Transformer 层之间插入额外的小网络。这些新增的层无法被合并进原有的矩阵乘法,推理时必须实际执行,因此会带来额外的延迟——在对延迟敏感的服务中这是实打实的代价。

这个「可合并性」是 LoRA 设计中最被低估的优点:它让「训练时高效」和「推理时零开销」这两件通常互相矛盾的事同时成立。

但要注意一个实践上的取舍:如果你希望一个基座服务多个任务、按请求动态切换 adapter,那就不能合并(合并后就固定成一个任务了)。此时推理框架需要在运行时单独计算 BA 分支,会有少量额外开销。合并 = 单任务零开销;不合并 = 多任务灵活性,按场景选择。

场景判断团队用 LoRA 微调后效果不理想,提议把 rank 从 16 提到 128。这个判断可能错在哪?应该先检查什么?

「效果不好就加大 rank」是一个常见但通常错误的反射。rank 决定的是改动量的表达能力上限,只有当这个上限确实成为瓶颈时,加大它才有用。而在应用层的微调项目里,瓶颈几乎从来不在这里。

应该按顺序先检查的五件事:

① 数据质量与数量。这是最可能的原因(5.3)。样本有噪声、标注不一致、类别极不均衡——这些问题加大 rank 只会让模型更好地拟合错误的数据,效果反而更差。

② chat template 与 loss mask 是否正确。模板与推理时不一致、或 loss 算到了用户输入上,都会导致「训练正常完成但效果莫名其妙差」。这类配置错误不会报错,极易被忽略。

③ 学习率。LoRA 通常需要比全量微调更大的学习率。学习率过小时,表现是「训了等于没训」——很容易被误判为模型容量不足。

④ 是否过拟合。如果训练 loss 持续下降但验证指标变差,问题是过拟合——此时加大 rank 会让情况更糟,正确方向是加数据、加正则或减小 rank。

⑤ 任务是否真的适合 LoRA。如果任务需要模型掌握它完全不具备的能力,那确实是 LoRA 的能力边界——但此时的正确方向是换更强的基座或考虑全量微调,而不是把 rank 调到 128(那已经接近全量微调的参数量,却仍受低秩结构限制,是两头不讨好的配置)。

故事线中的实例:r 从 16 提到 32 时长尾类别反而变差,正是过拟合的表现——这提示瓶颈在数据而非容量。

面试题改编「LoRA 为什么有效?它的低秩假设合理吗?」

核心论点:把预训练模型适配到某个下游任务,所需的权重改动具有较低的内在复杂度——预训练已经学到了通用的表示,微调做的是「重组和强调」而非「重新学习」。既然改动本身低秩,就可以用两个瘦矩阵 B×A 来表示,而不必更新全部参数。

实证支持:LoRA 论文报告,相比 GPT-3 175B 的 Adam 全量微调,可训练参数减少约 10,000 倍、GPU 显存需求降低约 3 倍,而在 RoBERTa、DeBERTa、GPT-2、GPT-3 上的模型质量持平或更好。参数少了四个数量级而质量不降,本身就是低秩假设成立的有力证据。

假设何时不成立(能主动说出这一层是加分项):当任务要求模型学习预训练中完全不具备的能力时,改动就不再低秩——此时 LoRA 会受表达能力限制。典型情形包括适配到与预训练分布差异极大的领域、或在超大规模数据上继续训练。换句话说,低秩假设的成立依赖于「基座已经大致会做这件事」这个前提。

补充两个工程属性:① 可合并性——推理时 BA 可并回 W,零额外延迟;② 灾难性遗忘更轻——原权重冻结,通用能力保留得更好。这两点让 LoRA 在生产中的实际价值超出「省显存」本身。