先说结论:显存就是AI的命门
大模型时代,显存决定了你能跑多大的模型、多长的上下文、多大的batch size。显存不够,要么模型加载不了,要么跑起来直接OOM(Out of Memory),要么慢到怀疑人生。7B模型至少14GB,13B至少26GB,70B至少140GB——这只是参数,还没算KV Cache和中间激活。
为什么大模型吃显存?
1. 模型参数住在显存里
模型参数(权重)必须在显存里才能被GPU计算。以FP16为例:
- 7B模型:7B × 2 bytes = 14GB
- 13B模型:13B × 2 = 26GB
- 70B模型:70B × 2 = 140GB
2. KV Cache是隐形杀手
推理时,Transformer的Self-Attention会缓存Key和Value,大小和序列长度、batch size成正比。公式:KV Cache大小 = 2 × batch_size × seq_len × num_layers × hidden_dim × dtype_size。比如7B模型(32层,hidden_dim=4096),seq_len=2048,batch_size=1,FP16:2×1×2048×32×4096×2 ≈ 1GB。如果batch_size=16,直接16GB。长上下文(比如32K)更是爆炸。
3. Batch size受限
训练时,batch size越大,显存占用越高,因为要存梯度、激活值。显存不够只能减小batch size,但会拖慢训练速度、影响收敛。
显存不够怎么办?
方案一:量化(省钱首选)
把FP16模型量化成INT8或INT4,显存直接减半或减四分之一。7B模型INT8只要7GB,INT4只要3.5GB。代价是精度轻微下降,但大部分场景足够。常见工具:bitsandbytes、GPTQ、GGML。
方案二:梯度累积(训练专用)
不增大batch size,而是累积多个小batch的梯度再更新参数。比如你只能跑batch_size=1,累积16步效果等价于batch_size=16,但显存不变。代码实现:
for i, data in enumerate(dataloader):
loss = model(data)
loss.backward()
if (i+1) % accumulation_steps == 0:
optimizer.step()
optimizer.zero_grad()方案三:模型并行/张量并行
把模型切分到多张GPU上。70B模型用2张A100(80GB)就能跑,但需要高速通信(NVLink)。适合有预算的团队。
方案四:CPU Offloading
把部分参数或KV Cache放到CPU内存,GPU用的时候再搬回来。速度慢,但能跑超大模型。
总结
显存是硬约束,选显卡先看显存。个人玩家:7B模型用12GB卡(RTX 3060 12G),13B用24GB(RTX 3090/4090),70B建议云GPU或量化到INT4。训练党:多卡并行+梯度累积。记住:显存不够,一切白搭。
