显存预算:从参数量到显存账
前置知识点
- 微调是什么:定义与全景 入门
一句话定义
显存预算把「我这张卡能不能训这个模型」变成一道算术题:权重 + 梯度 + 优化器状态 + 激活值四项相加,再按精度与优化手段打折。
为什么重要
OOM(显存溢出)是微调的第一堵墙。不会算账的人靠反复试错撞墙;会算账的人拿到需求五分钟内判断可行性、该买什么卡、该开哪些优化。显存账也是理解 QLoRA(kp-007)与各种显存优化(kp-017)的前提。
前置知识
kp-001 中全参微调与 PEFT 的区别;知道 1 字节 = 8 位,fp16/BF16 占 2 字节,fp32 占 4 字节。
核心概念
显存四大件:权重(模型参数本体)、梯度(反向传播产生的同形状张量)、优化器状态(AdamW 的一阶/二阶动量 m、v)、激活值(前向计算的中间结果,随序列长度与批量增大)。
原理与机制
设参数量为 P(单位:十亿参数记为 B),全参微调用 AdamW 时的近似账目(单位:字节/参数):
即 fp16 权重 2B、fp16 梯度 2B、fp32 主权重 4B、fp32 动量 m+v 共 8B;激活值 M_act 随 batch × seq_len 增长,7B 模型在 4K 序列、batch 1 时约数 GB,是主要的弹性项。
LoRA 只训练新增参数 P_lora(通常 < 1% P),账目变为:
QLoRA 把冻结权重压成 4-bit(0.5 字节/参数):
典型数值(batch=1、短序列近似):7B 全参约 112GB+,7B LoRA 约 16-20GB,7B QLoRA 约 5-7GB,70B QLoRA 约 40-48GB(两张 24G 卡或一张 48G 卡 + 激活优化)。
图示
全参 AdamW (每参数字节)
fp16权重▓2 fp16梯度▓2 fp32主权重▓▓▓▓4 动量m+v▓▓▓▓▓▓▓▓8 +激活值(弹性大项)
LoRA : 冻结权重(只读) + 仅对 ΔW 计梯度/优化器 → 状态项缩小千倍直观类比
显存像一张餐桌:权重是常驻的大件家具,梯度与优化器状态是随行李箱(只有可训练参数才带),激活值是流水线上的半成品,批量越大堆得越多。QLoRA 的作用是把家具压缩打包。
实例或案例
需求:单卡 RTX 4090(24G)微调 Qwen2.5-7B。算账:QLoRA 下 0.5×7=3.5G 权重 + LoRA 参数状态约 0.3G + 激活值。开梯度检查点与 FlashAttention 后激活可压到 3-6G(seq 1024、batch 2),总计约 8-12G,可行;若改 LoRA(fp16 权重 14G)+ 相同激活则逼近 20G,需减序列长度或批量。结论一次算清,不用试错。
操作步骤
- 确认参数量 P 与精度计划(fp16/BF16/4-bit)。
- 套公式:全参 16P;LoRA 2P+16P_lora;QLoRA 0.5P+16P_lora,单位 GB 时 P 按十亿参数计(7B → 0.5×7=3.5G)。
- 预留激活值:按 batch × seq_len 估 3-8G 起步,开梯度检查点后再复测。
- 与卡的实际可用显存(标称减去系统占用约 1-2G)比较,留 20% 余量。
- 超 OOM 边界时按顺序启用:减小 batch → 梯度累积 → 梯度检查点 → 降精度 → QLoRA(见 kp-017)。
排错清单
- 刚加载模型就 OOM:权重项超了,降精度或换更小模型。
- 第一个 step 就 OOM:激活值项超了,减 batch/seq、开梯度检查点。
- 训练中后期 OOM:序列长度不均匀出现长样本,设 max_seq_len 截断或分桶。
- 显存够但极慢:可能在用 fp32 全量训练,检查精度配置。
常见误区
- 只算权重:优化器状态占全参微调显存的一半以上,是最常被漏算的大项。
- 认为 LoRA 显存与 rank 无关地小:rank 加大则 P_lora 与激活(含 LoRA 分支计算)都涨,64 以上的 rank 对显存的影响不可忽略。
- 混淆训练与推理显存:推理只需权重 + KV cache(约为训练的零头),所以「能推理」远不等于「能训练」。
与其他知识点的关系
LoRA 把可训练参数缩到多小,见 kp-005;QLoRA 的 4-bit 账目细化见 kp-007;梯度检查点、FlashAttention、ZeRO 等激活与状态优化见 kp-017。
延伸阅读
Rajbhandari et al. 2020《ZeRO: Memory Optimizations Toward Training Trillion Parameter Models》(系统化拆解了训练显存四大件)。
自测题
- 7B 模型全参微调(AdamW、BF16 计算)显存下限约多少?
答:约 16×7=112G 权重+梯度+优化器状态,另加激活值,因此至少需要多卡或 ZeRO 分片。
- QLoRA 相比 LoRA 省的是哪一项?
答:冻结权重的存储项——从 2 字节/参数(fp16)降到约 0.5 字节/参数(NF4),梯度与优化器状态本来就只作用于 LoRA 参数。
- 为什么训练中后期才 OOM?
答:多为长样本导致激活峰值超限,应设置 max_seq_len 截断或对长度分桶。