加载模型时抛出 torch.cuda.OutOfMemoryError,提示 tried to allocate 几十 MB。显卡参数明明够,却连很小的张量都分配不出来,说明显存已经被别的东西占住或者被碎片切碎了。

先看真实占用

nvidia-smi --query-gpu=memory.used,memory.total \
  --format=csv

如果显示已用接近总量而你的进程还没开始跑,多半是上次异常退出留下的僵尸进程,nvidia-smi 里找到 PID 后 kill 掉即可。

再算模型实际需要多少

参数量乘以精度字节数是权重下限:7B 模型半精度约 14GB,再加上激活值和 KV 缓存,实际需要更多。按「参数量 × 2GB」粗估 7B 需要 14GB 以上,24G 显卡跑 7B 半精度是舒服的区间,13B 就要靠量化。

省显存的几个开关

model = AutoModelForCausalLM.from_pretrained(
    path, torch_dtype="float16",
    device_map="auto", load_in_4bit=True)

配合更小的 batch、更短的输入长度,以及用完及时 torch.cuda.empty_cache(),能挤出不少空间。但要注意量化会带来精度损失,评估集上先跑一遍再上线。

碎片化也会导致 OOM

显存剩余总量够却分配失败,设置环境变量 PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True 可以缓解,重启进程比反复重试更有效。

如果换模型后每次都在同一位置失败,把输入长度和 batch 固定成最小值复现,再逐项加大,很快能算出这张卡的实际上限。

作者 9823189

发表回复