Qwen32B 全量微调和LoRA显存占用对比
Qwen32B在全量微调(Full Fine-tuning)和LoRA(Low-Rank Adaptation,低秩适应)两种方式下的显存占用。
核心结论: LoRA 的显存占用通常只有全量微调的 30% 左右,且主要省下了优化器状态(Optimizer States)和梯度(Gradients)的显存。
下面以 Qwen2.5-32B 为例,假设采用 AdamW 优化器、bf16 混合精度训练,对这两种方案进行具体的估算和对比。
1. 全量微调(Full Fine-tuning)
在全量微调中,模型的所有参数(Weights, Gradients, Optimizer States)都需要加载到显存中。
主要显存占用模块:
-
模型参数:32B 个参数,以 bf16 加载(2 字节)。
-
计算: 32×10^9×2 bytes = 约 64 GB
-
-
梯度:与参数大小相同,也需要存储。
-
计算: 32×10^9×2 bytes = 约 64 GB
-
-
优化器状态(AdamW):这是最大的开销。Adam 需要存储动量(Momentum)和方差(Variance),通常以 fp32(4 字节)保存以保证数值稳定性。
-
计算: 32×10^9×4 bytes×2= 约 256 GB
-
-
激活值(Activation):这部分取决于批次大小(Batch Size)和序列长度。32B 模型在微调时,激活值占用通常很大,一般在 30GB ~ 60GB 左右(假设批次大小为 1,序列长度 2048-4096)。
全量微调估算总量:
模型参数(64GB) + 梯度(64GB) + 优化器状态(256GB) + 激活值(~40GB) ≈ 424GB
结论:全量微调 32B 模型,需要 至少 8 张 A100-80GB(400GB+ 显存) 才能勉强跑起来,通常推荐 2 台 8 卡 A100(640GB+ 显存) 进行分布式训练,或者使用 H100。
2. LoRA 微调
LoRA 的核心是冻结原始模型参数,只插入并训练一小部分低秩矩阵。
主要显存占用模块:
-
基础模型参数:32B 个参数,以 bf16 加载。
-
计算: 32×10^9×2 bytes = 64 GB
-
注意: 这部分参数被冻结,不参与梯度计算,也不在优化器中更新。只需要驻留在显存中用于前向传播即可。
-
-
可训练的 LoRA 参数(Adapter Weights):这是关键优势所在。
-
假设只在 Q(Query)和 V(Value)矩阵上加 LoRA。
-
假设 LoRA 的秩(rank)r=16。
-
32B 模型的隐藏层维度(d)通常在 2560-5120 之间(具体取决于架构,这里估算取较大值)。
-
每层参数增量:d×r+r×d=2×d×r。
-
总层数:约 60-80 层。
-
估算下来,LoRA 可训练参数量大约在 1亿 到 2亿 之间(0.1B - 0.2B),即原始参数的 0.5% 左右。
-
计算: 0.2×10^9×2 bytes = 约 0.4 GB
-
-
梯度:只针对那 0.4GB 的 LoRA 参数计算梯度。
-
计算: 0.4 GB(bf16)
-
-
优化器状态:只针对那 0.4GB 的 LoRA 参数进行优化。
-
计算: 0.4 GB×2×2(Adam fp32 需要 8 字节每参数?这里用标准换算:0.4GB bf16 参数 -> fp32 优化器状态需 0.8GB * 2 = 约 1.6GB)≈ 2 GB
-
-
激活值:
-
由于需要计算梯度回传,激活值依然需要存储。这部分占用与全量微调基本一致,仍然取决于 Batch Size 和 Seq Length。
-
估算: 约 40GB。
-
LoRA 微调估算总量:
基础模型(64GB) + LoRA 权重(0.4GB) + 梯度(0.4GB) + 优化器(2GB) + 激活值(40GB) ≈ 107GB
结论:LoRA 可以将 32B 模型的微调显存需求从 400GB+ 降低到 约 110GB。这意味着:
单卡 A100-80GB:放不下(还差 30GB)。
单卡 A100-80GB + CPU/NVMe 卸载:勉强可以跑,但可能比较慢。
双卡 A100-80GB(通过张量并行或 ZeRO-3):可以非常流畅地跑起来。
单卡 H100-80GB(带 Transformer Engine):由于 H100 显存管理更高效,且激活值可能优化得更好,单卡 H100 是可以跑起来的。
3. 详细对比表格
| 项目 | 全量微调 (Full FT) | LoRA 微调 | 说明 |
|---|---|---|---|
| 模型参数 (Weights) | 64 GB (bf16) | 64 GB (bf16) | 基础模型必须加载,LoRA 不节省这部分 |
| 可训练参数 | 64 GB (bf16) | < 0.5 GB (bf16) | LoRA 仅训练极少参数 |
| 梯度 (Gradients) | 64 GB | < 0.5 GB | 只对可训练参数计算梯度 |
| 优化器状态 (Optimizer) | 256 GB (fp32) | ~2 GB (fp32) | LoRA 最大的节省所在 |
| 激活值 (Activations) | 中高 (依赖 batch size) | 中高 (同左) | 两者基本持平,这是 LoRA 的瓶颈所在 |
| 总显存估算 | ~420 GB - 450 GB | ~100 GB - 120 GB | 相差约 4 倍 |
| 硬件需求 | 8×A100-80GB | 2×A100-80GB 或 1×H100-80GB | 门槛大幅降低 |
4. 显存优化技巧
如果你想进一步降低显存占用,可以尝试以下方法:
-
QLoRA:在 LoRA 的基础上,将基础模型量化为 4-bit 或 8-bit。例如,将 32B 模型量化到 4-bit,模型权重可以从 64GB 降至 16GB 左右。这样总显存占用可以降到 16GB(基础模型) + 40GB(激活值) + 几 GB(LoRA) ≈ 60GB。这就能在单卡 A6000(48GB)或单卡 RTX 4090(24GB,但需要配合梯度检查点)上运行了。
-
梯度检查点:用计算换显存。启用后,激活值占用可以降低 50%-70%,但训练速度会变慢约 20%-30%。
-
更小的 Batch Size:如果显存不够,优先减小 Batch Size 或 Sequence Length。
总结
-
Qwen2.5-32B 全量微调:硬件门槛极高,适合有大规模集群、追求极限性能的场景。
-
Qwen2.5-32B + LoRA 微调:硬件门槛适中,适合资源有限的情况。在效果与全量微调非常接近的情况下,显存需求降至 1/4,是微调 32B 级别模型的首选方案。
更多推荐


所有评论(0)