大数跨境

LoRA 微调与显存占用原理:从冻结权重到低秩更新

LoRA 微调与显存占用原理:从冻结权重到低秩更新 AI大模型智能体前沿
2026-07-29
1
导读:显存爆到 140G?为什么大模型微调全网都在用 LoRA?带你彻底拆解显存流向与低秩更新的核心原理!

导读

 

文章在 LLM 微调实践中,全量微调不仅开销昂贵,还易引发灾难性遗忘。LoRA 通过低秩分解,将庞大的优化器显存开销暴降 99%,实现消费级单卡训练。本文从数学表达、Zero-Init 机制、显存四大来源到 QLoRA/DoRA              演进,带你彻底厘清大模型微调与显存调优的底层机制。


在现代大语言模型(LLM)与多模态大模型(VLM/Transformer)的微调实践中,如何平衡模型表达能力硬件显存开销是核心议题。

常见微调策略包括:全量微调(Full Fine-Tuning)层级冻结(Partial Freezing)LoRA(Low-Rank Adaptation) 以及 QLoRA(Quantized LoRA)。本文将从数学表达、初始化机制、显存占用的精确构成、计算流图及现代衍生变体(如 DoRA、AdaLoRA)等维度,深入剖析 LoRA 的底层原理。


一、全量微调:直接更新高维原始权重

对于模型中的任意线性变换层(Linear Layer):

其中   为输入特征,  为预训练得到的原始权重矩阵。

在全量微调(Full Fine-Tuning)中,优化器直接计算梯度并更新   中的每一个参数:

特点与局限(为何工程实践中很少使用全量微调)

  1. 表达能力极强  没有任何秩(Rank)或结构的限制,自由度最高(可调节参数量为  )。
  2. 显存与硬件门槛极高:除了加载模型权重本身,优化器还需要为所有参数分配梯度空间和高精度的优化器状态(Optimizer States,如 AdamW 的一阶与二阶动量)。对于 7B/70B 级别的模型,全量微调往往需要昂贵的多卡 A100/H100 集群。
  3. 易引发灾难性遗忘(Catastrophic Forgetting):大模型的通用知识高维分布式交织在   中。全量微调允许所有参数自由改变,反向传播会强行重写(Overwrite)原本维护通用语言与逻辑推理的关键权重,导致对旧知识严重退化;而 LoRA 冻结了底座  ,将新知识学习限制在独立低秩旁路   中,天然保护了预训练记忆。
  4. 存储与多任务部署成本巨大:全量微调针对每个下游任务都需要保存一份完整的模型权重(如 7B 约 14GB),无法实现类似 LoRA 的轻量级适配器保存与 Multi-LoRA 动态挂载服务
  5. 偏离低内在维度(Low Intrinsic Dimension)规律:研究表明大模型在适应特定下游任务时,权重的有效更新具备很低内在维度,全量更新庞大的参数空间存在严重的参数冗余。

二、部分层冻结:限制“可修改区域”

另一种传统方法是冻结(Freeze)模型的大部分层,仅解冻少数特定模块。

常见的层级冻结方案包括:

  • 冻结前   层:在深度 Transformer 架构中,冻结底层通用特征提取层,仅训练靠近输出的高级语义层;
  • 冻结主干网络,仅解冻输出头:冻结 Backbone,仅训练最后一层 Task Head / Linear Classifier;
  • 多模态场景:冻结视觉/音频编码器(Encoder),仅微调跨模态投影层(Projector)或分类头。
[Input] ---> [Frozen Backbone / Encoder] ---> [Trainable Head / Top Layers] ---> [Output]

核心机制

  • 部分层冻结限制的是:哪些层允许发生改变
  • 被解冻的层内部,其权重更新   依然是全秩(Full-Rank)更新。
  • 适用场景:适用于下游任务目标与输出接口发生改变(例如分类类别改变),或者仅需建立特定模态映射的场景。

三、LoRA 原理:不改原权重,构建低秩增量

LoRA(Low-Rank Adaptation, Hu et al., 2021)提出了不同的思路:保持原始权重   冻结不变,将权重增量   分解为两个低秩矩阵的乘积

前向传播计算公式变为:

矩阵维度定义如下:

  • (冻结,高维全秩)
  • (可训练)
  • (可训练)
  • 秩  (例如 
  •  为缩放常数(Scaling Factor),用于稳定超参数调节

[!NOTE]维度表示说明:本文推导统一采用线性代数标准的列向量表记( );在 PyTorch 代码工程实现中(输入为行向量 ),其等价算式为 

                   ┌──────────────┐
                   │  x (Input)   │
                   └──────┬───────┘
                          │
            ┌─────────────┴─────────────┐
            │                           │
            ▼                           ▼
  ┌───────────────────┐       ┌───────────────────┐
  │  W₀ (d_out×d_in)  │       │   A (r×d_in)      │
  │     [Frozen]      │       │    [Trainable]    │
  └─────────┬─────────┘       └─────────┬─────────┘
            │                           │
            │                           ▼
            │                 ┌───────────────────┐
            │                 │   B (d_out×r)     │
            │                 │    [Trainable]    │
            │                 └─────────┬─────────┘
            │                           │
            │                           ▼ (× α/r)
            │                 ┌───────────────────┐
            │                 │     ΔW · x        │
            │                 └─────────┬─────────┘
            │                           │
            └─────────────┬─────────────┘
                          │ (+)
                          ▼
                   ┌──────────────┐
                   │  y (Output)  │
                   └──────────────┘

1. 参数量对比示例

假设一个 Transformer Attention 中的 Linear 层,

  • 全量更新参数量 (约 1678 万 参数)
  • LoRA( )参数量 (约 13.1 万 参数)
  • 参数压缩比:只占原矩阵参数量的 **0.78%**。

2. 初始化策略(Zero-Init)

为保证在训练初始时刻(Step 0)模型的输出与预训练模型完全一致(即  ):

  • 矩阵   采用 高斯正态分布随机初始化(如   或 Kaiming 初始化);
  • 矩阵   全零初始化 ** **。

这样在初始状态下  ,保证了微调过程平滑启动,不会破坏已有的预训练表征能力。

3. 缩放因子   的作用

前向传播中的乘因子   允许在调整秩   时保持学习率(Learning Rate)相对稳定。通常可以设置   或  。当尝试不同的  (如从 8 调到 64)时,无需重新大幅调整学习率超参数。


四、LoRA 适配器的部署与合并(Merge)

训练结束后,LoRA 适配器有两种使用形态:

1. 动态挂载(保留独立 Adapter)

推理时保留   与 

  • 优势:底座模型   只需在显存中加载一份,不同下游任务的 LoRA 权重只有几十 MB,可实现快速动态切换(Multi-LoRA Serving)。

2. 权重合并(Weight Merging)

在部署到单机或推理性能要求苛刻的场景时,可直接将低秩增量无损合并进原始矩阵:

  • 优势:合并后的   与普通矩阵完全一致,推理阶段无任何额外的矩阵乘法计算开销和延迟。

五、显存占用的精确拆解与量化算例

要彻底理解 LoRA 为何省显存,必须先明确大模型训练时的显存四大来源:

1. 训练显存开销拆解(以混合精度 AdamW 为例)

显存组成部分
数据精度
每参数占用字节
说明
基础模型权重
BF16 / FP16
2 Bytes
必须载入显存用于前向传播
可训练参数权重
BF16 / FP16
2 Bytes
需更新的参数(全量微调为全部,LoRA 为 
参数梯度
BF16 / FP16
2 Bytes
反向传播计算得到的梯度
AdamW 一阶动量 ( )
FP32
4 Bytes
优化器维护的状态
AdamW 二阶动量 ( )
FP32
4 Bytes
优化器维护的状态
FP32 主权重副本
FP32
4 Bytes
混合精度训练中保证数值稳定性的 Master Weight

关键结论:对于每个可训练参数,AdamW 混合精度训练通常需要   字节 的显存!
而对于冻结参数,只需保存 2 字节 的原始权重,梯度与优化器状态开销为 0

[!TIP]💡 显存速算黄金口诀(6倍规则):

  • 优化器状态(12 字节)是 BF16 模型权重(2 字节)的 6 倍
  • 直观示例:对于一个 1 GB 大小的 BF16 模型(约 5 亿参数),若进行全量微调:
    • 基础权重:1 GB (2 Bytes/param)
    • 梯度:1 GB (2 Bytes/param)
    • 优化器状态:6 GB (12 Bytes/param)
    • 静态显存合计(不含激活值)8 GB(刚好是模型大小的 8 倍)!

2. 7B 模型训练显存量化对比示例

假设 Batch Size = 1, Sequence Length = 2048,使用 BF16 混合精度 AdamW:

微调方式
模型权重显存
梯度+优化器显存
中间激活显存
估算显存峰值
常见硬件需求
全量微调 (Full FT)
~14 GB (2B/param)
~98 GB ( )
~10 - 20 GB
> 135 GB
2 × A100 80G 或多卡 ZeRO-3
Standard LoRA (未开启 FlashAttn/GC)
~14 GB
~0.56 GB
~12 - 20 GB
~ 26 - 35 GB
A100 40G / 80G(24G 显卡会 OOM
Standard LoRA (开启 FlashAttn2 + GC)
~14 GB
~0.56 GB
~4 - 6 GB
~ 18 - 20 GB 1 × RTX 3090 / 4090 (24G)
QLoRA (4-bit NF4)
~3.5 - 4 GB
~0.56 GB
~4 - 8 GB
~ 8 - 13 GB
1 × RTX 4080 (16G) / 3090 (24G)

[!NOTE] 从上表可以看出:

  1. LoRA 将占比最恐怖的 梯度 + 优化器状态显存从 98GB 降到了不到 1GB
  2. 中间激活显存(Activations) 随序列长度与 Batch Size 增长,使用梯度检查点(Gradient Checkpointing)重算激活值可以进一步将激活显存降低 60% - 80%。

六、LoRA 对计算量(FLOPs)与训练速度的影响

很多人误以为“可训练参数减少了 99%,训练速度就会提升 99 倍”,这是极其常见的误区。

前向与反向计算流图分析

  1. 前向传播(Forward Pass)
    • 必须完整运行冻结的基础模型计算  (FLOPs 不减);
    • 额外增加了   和   两次矩阵小乘法(FLOPs 略增)。
  2. 反向传播(Backward Pass)
    • 仅对   计算梯度,不需要计算对   的更新梯度(减少了部分矩阵相乘);
    • 但为了将链式法则梯度反向传递到早期的 LoRA 层,仍然需要通过   计算对激活值   的梯度。

总结对比

                全量微调                 LoRA 微调
        ┌───────────────────────┐   ┌───────────────────────┐
        │  基础模型权重 W₀      │   │  基础模型权重 W₀      │ (冻结)
        │  [需要保存梯度/优化器] │   │  [零梯度/零优化器状态]│
        └───────────────────────┘   └───────────────────────┘
                                    ┌───────────────────────┐
                                    │  LoRA 适配器 (A, B)   │ (训练)
                                    │  [保存梯度/优化器]    │
                                    └───────────────────────┘
维度
LoRA 的实际影响
可训练参数量
降低 99%+
优化器状态与梯度显存
降低 99%+
基础模型权重显存
基本不变(仍需 2 字节/参数)
前向计算量 (FLOPs)
基本不变(增加微小低秩乘法)
反向计算量 (FLOPs)
减少约 30% - 50%
实际端到端吞吐量 (Tokens/s)
通常提升 20% - 50%(受限于 Memory-bound 与 Kernels)

七、QLoRA 与现代 LoRA 衍生变体

为了解决 LoRA 依然需要把全精度/半精度基础模型权重载入显存的痛点,以及进一步提升低秩表达能力,学术界与工业界推出了系列改进方案:

1. QLoRA (Quantized LoRA)

QLoRA(Dettmers et al., 2023)通过三大核心创新,使单张消费级显卡训练百亿大模型成为可能:

  1. NF4 (NormalFloat 4) 数据类型:基于正态分布的最佳信息论 4-bit 量化数据类型,精度显著高于标准 INT4。
  2. **双重量化 (Double Quantization, DQ)**:对量化常数(Quantization Scales)再进行一次量化,每参数额外节省约 0.37 bit 显存。
  3. **分页优化器 (Paged Optimizers)**:利用 CUDA Unified Memory,在显存峰值溢出时自动将优化器状态在 GPU 显存与 CPU 内存间分页传输,防止 OOM 崩溃。

2. DoRA (Weight-Decomposed Low-Rank Adaptation)

DoRA(Liu et al., 2024, ICML)将权重矩阵分解为幅值(Magnitude  方向(Direction 

  • 仅用 LoRA 去逼近方向变化  ,而幅值   单独学习。
  • 使得低秩更新的学习轨迹更接近全量微调(Full FT),在低秩(如  )下性能显著超越传统 LoRA。

3. AdaLoRA (Adaptive Low-Rank Adaptation)

  • 传统 LoRA 所有的层配置相同的秩 
  • AdaLoRA 利用 SVD 分解( ),在训练过程中根据参数的重要性指标,动态地为重要层分配更高的秩,为不重要的层剪枝/降低秩,实现显存与表达能力的高效配比。

4. 算子融合与加速(Unsloth & Fused LoRA Kernels)

在传统 PyTorch 实现中,LoRA 引入的矩阵加法与切片会增加额外的 GPU Memory IO 访存开销。现代加速库(如 Unsloth、Triton Fused LoRA Kernels)通过将   融合进单次 GPU Kernel 调用,大幅降低了显存读写延迟,将训练速度提升 2 - 5 倍。


八、大模型微调实践中的策略选型指南

在大语言模型(LLM)或多模态大模型(VLM)微调任务中,应根据数据特性与硬件算力选择合适的微调策略:

1. 常见下游任务微调(指令遵循、QA、特定领域文本生成)

  • 策略推荐全层 LoRA(将 target_modules 设置为所有的 Linear 层:q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj)。
  • 原因:在 Attention 和 MLP 中全面引入低秩更新,能够最大程度保留模型的泛化能力并学习新领域知识。

2. 仅更改分类输出维度 / 单一下游分类任务

  • 策略推荐冻结 Backbone + 解冻 Classifier / Task Head
  • 原因:主干表征能力足够,仅需重新建立输入向量到新标签类别的线性映射,极省显存且易于收敛。

3. 资源极度受限(如单张 16G/24G 消费级显卡)

  • 策略推荐:**QLoRA (4-bit NF4) + 梯度检查点 (Gradient Checkpointing)**。
  • 原因:显存瓶颈主要来自 14GB+ 的模型基础权重,4-bit 量化将权重压缩至 3.5GB 左右,搭配梯度检查点可将激活显存压至最低。

4. 极端要求精度 / 数据量庞大且算力充沛

  • 策略推荐全量微调 (Full FT) 或 **高秩 DoRA ( )**。
  • 原因:消除低秩假设瓶颈,获得最高性能表现。

九、总结与显存调优决策树

核心结论三句话:

  1. 全量微调允许所有原始权重自由变化,开销最大,表达能力最强;
  2. 部分层冻结限制“哪些层能改”,被解冻层仍为全秩更新;
  3. LoRA保持原始权重完全冻结,通过低秩分解限制“每一层以什么形式改变”,省显存的关键在于消除原始权重的梯度与优化器状态

显存 OOM 故障排查与调优决策树


十、拓展剖析:GPU 硬件三维瓶颈与预训练/微调算力开销对比

1. 硬件三维瓶颈解析:容量、带宽与算力

针对大模型在不同运行阶段的特征,GPU 硬件瓶颈分为三个维度:

瓶颈类型
物理含义
决定了什么?
在不同场景中的表现
显存容量 (Capacity)
GPU 显存大小 (GB)
能不能跑(硬门槛/一票否决)
装不下模型权重、梯度或激活值会导致直接 OOM 崩溃。LoRA / QLoRA 解决的就是此瓶颈。
显存带宽 (Bandwidth)
显存与 SRAM 数据传输速率 (GB/s)
单人吐字快不快 (Memory-bound)
在单用户对话/小 Batch 推理时,每个 Token 生成需搬运全量权重,GPU 算力大量时间在等访存数据。
计算算力 (Compute)
GPU 矩阵计算能力 (TFLOPS)
预训练要跑几天 / 高并发吞吐上限 (Compute-bound)
在预训练或大 Batch 高并发服务端场景下,总计算量极大,算力高低直接决定吞吐速度。

2. 预训练 vs 微调(后训练)的瓶颈对比

(1) 预训练:绝对的“算力 + 显存”双重极限挑战

  • 显存双重极限:模型参数量巨大(70B~405B),且全量训练必须保存 FP32 优化器状态与全量梯度(每个参数需 16 字节)。单卡物理上无法装载,必须依靠万卡集群,配合张量并行(TP)、流水线并行(PP)和 ZeRO-3 将显存切分到成千上万张 GPU 上。
  • 算力双重极限:需吞吐 3T~15T+ Tokens,总计算量高达   FLOPs。即便使用上万张 H100 GPU 满载运转,也需烧电跑 1~3 个月。

(2) 微调(SFT / LoRA):显存是硬门槛,算力是软需求

  • 算力需求极小:微调通常仅需数万条指令数据(约 10M~100M Tokens),数据量比预训练低 4 ~ 6 个数量级
  • 显存是硬指标,算力可用“时间换空间”
    • 显存不足会直接导致 OOM 任务中断(从 0 到 1 的门槛);
    • 只要显存够用(如开启 Gradient Checkpointing 重算激活值),虽然额外消耗了 20%~30% 算力,但单张消费级显卡(如 RTX 3090/4090)在 几小时到一两天内 就能完成微调。在工程实践中“跑 3 小时”和“跑 5 小时”均可接受,因此算力绝非微调的硬瓶颈。
—THE END—

文章仅做学术分享,如有侵权请联系删除,非常感谢!



【声明】内容源于网络
0
0
AI大模型智能体前沿
分享AI大模型智能体前沿知识,探寻多元应用,洞察未来趋势,带你一路 “卷” 赢行业!🔥
内容 1111
粉丝 0
AI大模型智能体前沿 分享AI大模型智能体前沿知识,探寻多元应用,洞察未来趋势,带你一路 “卷” 赢行业!🔥
总阅读17.0k
粉丝0
内容1.1k