大模型微调算力需求测算,训练最低显存
微调一个7B模型,显存到底要多少?
答案不是一个固定数字,而是由参数、精度、优化器状态和批次大小共同决定。
以全量微调7B为例,FP16混合精度下通常需要约60GB以上显存;
换成LoRA微调,最低显存可以压到10GB到16GB左右;
QLoRA配合4bit量化,部分场景下8GB显卡也能跑起来。
下面按测算逻辑和实操步骤说清楚。
先搞懂显存被谁吃掉了
大模型训练显存主要分四块。模型权重:
参数量乘以每个参数的字节数,
FP16是2字节,
INT8是1字节,
INT4是0.5字节。梯度:
只有需要更新的参数才占梯度,
全量微调时梯度和权重同精度同大小。优化器状态:
Adam系列通常要存一阶动量和二阶动量,
FP32下每个参数额外占8字节。激活值:
中间层输出,
和批次大小、
序列长度强相关,
这部分最难精确预估,
也是OOM最常见的来源。
全量微调显存可以粗略记为:参数量 ×(权重字节 + 梯度字节 + 优化器字节)+ 激活显存。
7B模型FP16混合精度、Adam优化器下,权重14GB、梯度14GB、优化器状态约56GB,光这三项就超过80GB,实际通过分片和卸载能降到60GB上下。
LoRA只训练低秩矩阵,原模型权重冻结,梯度与优化器状态只作用在新增的小参数量上,因此显存大幅下降。
这是训练最低显存能压下来的关键原因。
动手估算:用命令先看显卡和模型
第一步先确认硬件现状。
登录服务器后执行:
nvidia-smi
看两个数:单卡总显存,以及当前已占用显存。
可用显存 = 总显存 − 已占用,空载环境一般接近总显存。
第二步看模型参数量。
如果模型已下载到本地,可以读取配置:
cat config.json | grep -E "num_hidden_layers|hidden_size|vocab_size"
参数量约等于 num_hidden_layers × 12 × hidden_size²。
比如7B模型通常对应32层、hidden_size 4096。
第三步用Python快速算权重占用:
params = 7e9
for name, bytes_per in [("FP16", 2), ("INT8", 1), ("INT4", 0.5)]:
print(name, round(params * bytes_per / 1024**3, 2), "GB")
输出结果就是纯权重占用,再叠加梯度、优化器状态和激活,才是训练最低显存的实际下限。
全量微调和LoRA的显存差距在哪
全量微调的显存公式是:
总显存 ≈ 参数量 × (2 + 2 + 8) + 激活显存
对应FP16权重、FP16梯度、FP32优化器状态。
7B模型下大约是84GB加激活,实际部署常用ZeRO-3或FSDP把优化器状态切分到多卡。
LoRA微调的显存公式是:
总显存 ≈ 基座权重 + LoRA参数量 × (梯度 + 优化器) + 激活显存
基座权重在FP16下约14GB,LoRA参数量通常只有原模型的0.1%到1%,梯度和优化器开销很小。
所以单卡24GB跑7B的LoRA微调是常见配置,16GB卡把批次和序列长度调小也能跑。
QLoRA进一步把基座量化到4bit,权重降到约3.5GB,训练最低显存可以进入8GB到12GB区间,代价是训练速度变慢、精度可能有轻微损失。
训练时OOM了怎么排查
遇到 CUDA out of memory,按下面顺序处理,不要一上来就换卡。
- 先降批次大小:
per_device_train_batch_size从8降到4或2,配合gradient_accumulation_steps保持等效批次。 - 再降序列长度:
max_seq_length从2048降到1024或512,激活显存往往能减半。 - 开启梯度检查点:在训练参数里设置
gradient_checkpointing=True,用时间换显存,通常能省30%到50%激活占用。 - 启用4bit量化加载:
load_in_4bit=True,配合bitsandbytes,适合显存紧张的LoRA场景。 - 清理缓存:训练脚本前加
torch.cuda.empty_cache(),确认没有残留进程占用。
每次调整后重新执行 nvidia-smi 观察峰值占用,确认稳定后再继续加批次。
避开这几个常见误区
误区一:只看模型大小不看优化器。 全量微调里优化器状态往往比权重还大,忽略它会严重低估显存。
误区二:把推理显存当训练显存。 推理不需要梯度和优化器状态,7B推理8GB能跑,训练同样模型可能要几十GB。
误区三:以为多卡自动解决一切。 没有正确配置ZeRO或FSDP,多卡只是各跑各的,显存不会自动分摊。
误区四:忽略系统预留。 CUDA上下文和框架本身会占用1GB到2GB,估算时留出余量,别卡在临界值上。
怎么验证估算是否靠谱
先跑一个最小训练步,只训练1步、批次设为1,观察峰值显存:
nvidia-smi --query-gpu=memory.used --format=csv -l 1
这个命令每秒刷新一次显存占用,跑起来后盯住峰值。
如果1步的峰值已经接近总显存,说明配置没有余量,需要继续降批次或序列长度。
如果峰值只有总显存的六成左右,可以逐步加大批次,直到稳定运行不再OOM。
最终判断标准很简单:连续训练100步以上不报OOM、显存峰值稳定、nvidia-smi 中没有明显的内存碎片增长,就说明当前配置是安全的。
常见疑问
7B模型LoRA微调最低要多少显存? 取决于序列长度和批次。
FP16基座加LoRA,单卡16GB可以起步;
开启梯度检查点和4bit量化后,8GB到12GB也有机会跑通,建议以实际训练一步的峰值为准。
估算出来的显存和实际差很多怎么办? 激活显存受序列长度和批次影响最大,公式只能给下限。
以最小批次实测峰值为准,再按比例放大,比纯理论计算可靠。
QLoRA能完全替代全量微调吗? 不能。
QLoRA胜在显存门槛低,适合验证和轻量场景;
全量微调效果上限更高,但显存和多卡要求也更高,需要按任务效果和硬件条件权衡。
多卡训练显存会翻倍吗? 不会。
数据并行下每张卡仍要放完整模型和优化器状态,显存压力并不会因为卡多而自动减半,必须配合ZeRO或FSDP这类切分策略。
把估算、实测、调参三步走完,你就能判断自己的显卡到底能不能微调目标模型。
建议先用最小批次跑通,再逐步加大配置,遇到OOM优先回看上面的排查顺序。