跳到主要内容

LoRA — 一张游戏显卡怎么装下 70 亿参数的训练

这一章讲三件事: 全参微调的显存账为什么算不下来;LoRA 用什么赌注把这个账翻过来; 以及 rank、alpha、目标模块这三个旋钮各自拧的是什么。 这是全书的第一个技术主角——第 01 章许诺的「那笔显存账」,在本章从头算给你看。

1. 这一章讲什么

第 02 章末尾留了一个入口:「全参不现实」是 7B 以上才有的问题。 这一章回答两问:这个账究竟怎么算不下来的(第 3.1 节); LoRA 怎么让它算得下来的(第 3.2–3.4 节)1

它在全书链条里的位置: 第 01、02 章讲了微调的机制与数据, 这一章给出「在消费级硬件上执行它」的第一块基石。 没有这一章,这本书的书名里「消费级硬件」四个字就不成立。

2. 顶层全景

全参微调: 权重 + 梯度 + 优化器状态(+激活) ← 全都要全尺寸显存
14GB 14GB 28GB ≈56GB,消费卡装不下

▼ LoRA:冻住权重,只训两个小矩阵
LoRA: 冻结权重 14GB + 两块小矩阵的梯度与优化器状态

▼ QLoRA(下一章):把冻结权重压到 4-bit
QLoRA: 底座约 4GB + 小矩阵全套 ← 8–12GB,一张 24GB 卡稳稳放下

图说:三个箭头是三笔账,每一步都省在「不动的东西不为它付显存」。

3. 核心原理

3.1 主走查:那笔 56 GB 的账

这一节把第 01 章欠的账算清。每一步旁边都有具体的数。

优化(拿着梯度反复微调权重的那一步)占的显存比想象中多——大头不在模型本体, 在「陪跑的账本」。训练时,显存里要同时放四样东西,先点名,再算账:

权重:模型本体的那 70 亿个数,7B、16-bit 下 14 GB。 梯度:每个权重「往哪挪」的指引,与权重同尺寸,又 14 GB。 拿着梯度、决定每步实际怎么走的那个部件叫优化器(AdamW 是最常用的一个); 它要为每个参数记两本账——「优化器状态」这 28 GB 就是为记账付的2激活:从输入算到输出的那趟计算留下的中间结果,回头算梯度时要用,随输入长度涨。

四样加总:14 + 14 + 28 = 56 GB,还没算激活。 书里的参照物:80 GB 的 A100(数据中心级显卡)勉强装下;24 GB 的 3090/4090 (游戏卡旗舰)装不下3

这里有一处要如实点破:第 01 章给过同一件事的粗略版——「14 GB 权重加 28 GB 优化器状态,超过 40 GB」4——那份账漏了梯度项。本章按第 02 章原文的完整四件套 口径算:56 GB。两处数字对不上,以完整口径为准。

LoRA 怎么改写这笔账: 它把「要训练的参数」从 70 亿砍到大约 2000 万–4000 万 ——全模型的 0.3%–0.5%。这几千万个新增参数装在几块小数表里,行话叫适配器 (装在冻结底座上、专门承载「这次适配」的部件)。梯度与优化器状态只服务适配器, 冻结的 70 亿个只留着本体占 14 GB5

账目全参LoRA(r=16)
权重14 GB14 GB(冻结)
梯度14 GB只给适配器,≈几十 MB
优化器状态28 GB只给适配器,≈百 MB 量级
合计(不含激活)56 GB≈14 GB 出头(书里口径 25%–35%)6

下一章把冻结权重也压到 4-bit,再砍到 8–12 GB——这是后话。

3.2 赌注:低秩假设

省显存的前提是「不训练全部参数也行」。凭什么?LoRA 押的是一个经验观察。

观察是这样的:拿一个全参微调过的模型,把「微调后的权重减去微调前的权重」 得到一个纯变化量。数学上,这张变化量是一张按行列排好的数表,叫矩阵 (行数列数几千几千,但每个数都各就各位)7

书里押的假设,核心词是低秩(一张数表里真正独立的行列很少, 大量行列其实是别的行列的组合;「独立的行列数」行话叫秩)—— 合起来就是行话说的低秩假设:微调的变化量,别看形状巨大,内在结构很简单7

这个假设解释了第 01 章埋的伏笔:为什么「微调的改动幅度远小于权重本身」。 变化不但幅度小,结构也简单——用书里的话说, 微调需要的适配信号大部分可以装进少数几个精心挑选的变化里8

3.3 结构:两个小矩阵冒充一个大矩阵

假设成立,做法就顺理成章了:既然变化量 ΔW 低秩, 就别直接学 ΔW,把它拆成两个小矩阵的乘积—— A(高×矮)乘 B(矮×宽),近似还原出那张大数表9

原权重 W(冻结,不收梯度)

输入 ──┬──→ W 通路 ──────────┐
│ ├──→ 相加 → 输出
└──→ A ──→ B 通路 ────┘
(只有 A、B 收梯度)

图说:LoRA 不改原通路,在旁边并联一条「矮个子」支路;
训练只调支路。effective 权重 = W + A·B。

三个设计细节,每一个都有明确的理由10:

  • 缩放因子 alpha:支路的输出先乘 α/r 再加进主路。α 取 2×r 是惯例—— 这样「改秩」不会顺手改掉支路输出的量级,两个旋钮各自独立可调;
  • B 初始化为全零:训练开始那一瞬,A·B=0,机器的行为与出厂模型一模一样, 然后适配从零慢慢长出来。这是训练稳定性的关键设计;
  • A 用随机初始化:B 必须是零,A 不能也是零(两个零相乘永远是零,什么都学不到)。

书里的一处与实际代码的出入,如实记录: 书里说 A 的初始化是 「按秩的平方根缩放的高斯随机数」10。但 Hugging Face PEFT 库的默认实现里, A 用的是 kaiming 均匀初始化(高斯只是可选项),B 置零则两边一致—— 「起点等于原模型」这个关键性质不受影响 (补充(不在书里,依据我们的 frontier 书架):PEFT 源码默认走 kaiming_uniform_, B 全零。依据: shelf=ai-frontier-reference/peft@src:src/peft/tuners/lora/layer.py:338 事实=源码注释写明 initialize A the same way as the default for nn.Linear and B to zero, 高斯初始化是 gaussian 选项)。

3.4 两个旋钮:打哪些矩阵、秩取多大

LoRA 装上后有两个必答题。第一题:打哪些权重?

先认识主角。注意力(Transformer 骨架里负责「回头看前文哪里重要」的部件) 靠几块投影数表干活,原论文只打其中查询、值两块。

现在的默认打法是四块全打——它们都是线性(输出恰好是输入加权求和)的变换, 书里统称线性层。

第二题:秩取多大? 秩越大,支路能表达的适配越丰富,代价是参数与显存变多。 书里收敛的经验区间11:

适用
4–8风格微调这类轻偏移:底座已会,只需掰口味
16万金油默认:指令跟随、领域适配的起点
32–64大行为偏移;或数据量大到撑得起更强的适配

书里给了一档加餐:要更深的领域适配,再加上前馈(注意力算完之后、 逐位置加工信息的那几层)的上/下投影——指令跟随类任务上,书里说有可测的收益12

实操路径也给了:从 16 起步,不够就升 32/64,够了就试 8 能不能更省13。 别忘了第 02 章的提醒反过来也成立:秩不是越大越好——数据只有几百条时, 高秩的额外表现力学的是过拟合14

4. 作者的判断与证据

**书里当证据给的:**LoRA 微调在任务基准上「经常打平或非常接近全参微调」; 差距只在需要深分布偏移的任务上出现——对指令跟随、领域适配、风格控制、分类, 书里判定「实际上等价」15

书里当立场给的:「这不是小改进,是多卡机房(行话叫集群)和单张显卡的差别」5—— 书把 LoRA 的意义直接放在硬件民主化上,这是全书的立场,也是它区别于 纯论文综述的地方。

**书里坦白没给的:**低秩假设以「经验观察」引入,书里没有引用具体的实验数据 (比如 ΔW 秩谱的实测图);「0.3%–0.5% 的可训参数够了」也依赖下游基准, 书里没有给出自己跑的对照实验。

5. 边界与局限

  • 深分布偏移任务上 LoRA 会输给全参——书里明确承认这一点, 例如把一个英文底座深度改造到全新语言/全新领域,全参仍有位置15;
  • 秩与数据量要匹配:秩的收益依赖数据撑腰,小数据高秩反而伤(3.4 节);
  • 书里给的 A 初始化说法与 PEFT 库默认实现有出入(3.3 节已点破); 按库的实际行为调参时,以库文档为准 (补充(不在书里,依据我们的 frontier 书架):PEFT 的 LoRA 数学被我们的拆解 归纳为三行——ΔW=B·A、α/r 缩放、B 零初始化。 依据: shelf=ai-frontier-reference/peft#01-lora-math.md 事实=该拆解把 LoRA 数学归为三行,B 置零保证训练起点恰为原模型);
  • 「打哪些矩阵」的默认(注意力四块)是 2025 年前后的共识, 新架构的模块名不同,配置时要按模型自己的层名来 (补充(不在书里,来自通用知识))。

6. 可带走的

  1. 训练显存 = 权重 + 梯度 + 优化器状态(+激活):7B 全参是 56 GB, A100 勉强、游戏卡不行;
  2. 优化器状态是大头:AdamW 要为每个参数记两本账,体积是权重的两倍;
  3. LoRA 的赌注是低秩假设:微调的变化量不但幅度小,结构也简单;
  4. 结构 = 冻结主路 + 并联一条 A·B 矮支路;B 置零,起点恰好是原模型;
  5. α=2×r 是惯例:让「秩」和「输出量级」两个旋钮解耦;
  6. 默认打注意力四块线性层;秩从 16 起步,不够升、够了降;
  7. 数据几百条时别贪高秩——过拟合在等;
  8. 多数任务上 LoRA≈全参;深分布偏移是它明确让步的地方。

7. 原文地图

主题原书章原文位置
显存四件套与 56 GB 账Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:19(搜「four distinct components」) · :21(搜「56 gigabytes」)
A100 与 24 GB 卡的对照Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:21(搜「80 gigabytes」)
0.3%–0.5% 可训参数、8–12 GBParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:23(搜「0.3 to 0.5 percent」)
多卡集群 vs 单卡的定性Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:25(搜「not a modest improvement」)
低秩假设Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:37(搜「low intrinsic rank」)
少数变化装下大部分适配Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:9(搜「not uniformly distributed」)
ΔW=A·B、前向 W+ABParameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:39(搜「product of two small matrices」) · :41(搜「W plus AB」)
alpha 缩放与惯例Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:45(搜「alpha divided by r」)
B 置零、A 随机Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:47(搜「initialization of B is set to zero」)
目标矩阵:原论文与现行默认Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:53(搜「Wq and Wv」) · :55(搜「all linear layers」)
秩的区间与实操路径Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:61(搜「4 to 64」) · :63(搜「start with rank 16」)
小数据高秩过拟合Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:91(搜「overfitting risk」)
质量对比与差距位置Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:29(搜「deep distribution shift」)
显存占比 25%–35%Parameter-Efficient Fine-Tuning (PEFT)text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:129(搜「25 to 35 percent」)

Footnotes

  1. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 7、9 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:7,搜「more than 40 gigabytes」;:9,搜「Parameter-Efficient Fine-Tuning」)。PEFT(参数高效微调)是一类方法的总称,LoRA 是其中的现行主角。

  2. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 19 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:19,搜「four distinct components」)。

  3. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 21 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:21,搜「barely accommodate」)。

  4. 出处:「Fine-Tuning Fundamentals」第 95 段(text/04-ch01-chapter-1-fine-tuning-fundamentals-full-and-feat.txt:95,搜「40 gigabytes」)。该段只计了权重与优化器状态。

  5. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 23、25 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:23,搜「20 to 40 million trainable」;:25,搜「multi-GPU cluster and needing a single GPU card」)。 2

  6. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 129 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:129,搜「25 to 35 percent」)。表中的梯度/优化器 MB 数是按 2000 万–4000 万参数从 56 GB 账目等比推的演示数,非书中原数。

  7. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 37 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:37,搜「very low intrinsic rank」)。 2

  8. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 9 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:9,搜「captured in a small number of carefully chosen changes」)。

  9. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 39、41 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:39,搜「delta W equals the product」;:41,搜「W plus AB」)。

  10. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 45、47 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:45,搜「twice the rank」;:47,搜「random Gaussian draw scaled by the square root of r」)。 2

  11. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 61 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:61,搜「4 to 64」)。

  12. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 53–55 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:53,搜「query projection」;:55,搜「feed-forward」)。

  13. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 63 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:63,搜「start with rank 16」)。

  14. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 91 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:91,搜「overfitting risk」)。

  15. 出处:「Parameter-Efficient Fine-Tuning (PEFT)」第 29 段(text/05-ch02-chapter-2-parameter-efficient-fine-tuning-peft.txt:29,搜「deep distribution shift」)。 2