事情本身不复杂,线索都在日志里。在 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 会损失一部分吞吐,显存够时再开回来,别把它当成永久配置。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
