问题出现得很突然,日志倒是留得挺全。ray 2.40 上用 ray.serve 部署 Qwen2.5-7B,num_replicas=2、每副本 gpu_memory_utilization=0.9,第二个副本启动时报 CUDA out of memory,第一个副本占满了整卡。

刚开始盯着「模型在两个进程里各加载一份权重」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。单副本申请的显存比例乘副本数超过 1。少数情况下是placement group 没把副本绑到不同 GPU。

不容易想到的是,KV cache 预分配按整卡算,没按副本均分。

第一件事是看集群里 GPU 与副本的分布

ray status --verbose

然后把每个副本的显存比例降到 0.45

python -c "print({'gpu_memory_utilization':0.45,'num_replicas':2})"

给每个副本显式申请 0.5 张卡

python -c "from ray import serve;print(serve.deployment(num_replicas=2, ray_actor_options={'num_gpus':0.5}))"

末了重启部署后确认两个副本都健康

python -c "from ray import serve;print(serve.status())"

改完先别撤,确认这几项。两个副本同时处于 HEALTHY,各自占用约 22GB 显存,压测时吞吐比单副本提升接近一倍。

容易忽略的是,按卡切分时显存是硬约束,副本数乘以利用率必须小于 1,留一点余量给 KV cache 增长,否则高峰期还是会 OOM。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189