事情本身不复杂,线索都在日志里。在 24GB 的 4090 上用 SGLang 0.4.2 起 Qwen2.5-14B,加载完权重后捕获 CUDA graph 时 OOM,日志停在 capture cuda graph 这一步,显存已用到 23GB。

第一反应是「上下文长度按模型上限预分配」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。CUDA graph 会额外占用一块静态显存。也可能是max_running_requests 默认值偏大。

少数情况下是另一张卡上还有训练进程抢显存。

动手时先关掉 CUDA graph 用 eager 模式起服务

python -m sglang.launch_server --model-path Qwen/Qwen2.5-14B-Instruct --disable-cuda-graph

再往下把并发请求数降下来

python -m sglang.launch_server --model-path Qwen/Qwen2.5-14B-Instruct --max-running-requests 16

限制静态显存占用比例

python -m sglang.launch_server --model-path Qwen/Qwen2.5-14B-Instruct --mem-fraction-static 0.82

剩下的就是启动后看一眼稳态显存

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

这台环境是别人交接的,不少默认值被动过,只能一项项核。

同事提醒我看一下最近一次发布,时间点确实对得上。

改完先别撤,确认这几项。服务正常监听,首批请求返回 200,显存稳定在 20GB 左右不再冲顶。

容易忽略的是,关掉 CUDA graph 会损失一部分吞吐,显存够时再开回来,别把它当成永久配置。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189