现场是这样的。想在一张 24GB 卡上同时跑 7B 对话模型和 bge-m3 向量模型,第一个占了 15GB,第二个加载到一半报 CUDA out of memory,nvidia-smi 里前一个进程还在跑。

中间走过弯路,把「向量模型没有量化,默认按 fp32 加载」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。两个进程各自持有独立 CUDA 上下文,显存不能共享;7B 用 fp16 光权重就要 14GB 以上;推理框架默认按比例预留显存,把剩余空间占满。

量每个进程的真实占用

nvidia-smi --query-compute-apps=pid,used_memory --format=csv

给对话模型设显存上限并降精度

python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B-Instruct --gpu-memory-utilization 0.55 --dtype half

向量模型改到 CPU 上跑

python -c "from sentence_transformers import SentenceTransformer;print(SentenceTransformer('BAAI/bge-m3',device='cpu'))"

两个服务都起来后看总占用

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

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

别只看报错消失,验证要多做一步。两个服务同时可用,显存合计不超过 22GB,两个接口各返回一次正常响应且没有 OOM。

向量化对延迟不敏感,放 CPU 往往够用,别为了省几毫秒把显存挤爆。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189