加载模型时抛出 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 固定成最小值复现,再逐项加大,很快能算出这张卡的实际上限。