现场是这样的。把文本分类模型导成 ONNX 后用 onnxruntime-gpu 1.18 的 CUDAExecutionProvider 推理,服务一启动 nvidia-smi 就显示占了 22GB,而模型只有 400MB,同卡上的训练任务直接 OOM。在 session 里传了 gpu_mem_limit 也没有变化,日志里没有任何提示。

中间走过弯路,把「同进程多个 session 各建一份 arena,彼此不知道对方占用」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。CUDA arena 默认按 kNextPowerOfTwo 扩展,块大小向上翻倍;gpu_mem_limit 要放在 provider_options 里,写错层级就不生效;cudnn 算法搜索会预留一块工作区,不会被释放。

上来先列出可用的 provider 与当前选项

python -c "import onnxruntime as ort;print(ort.get_available_providers())"

显式设置 arena 扩展策略与上限

python -c "o={'device_id':0,'arena_extend_strategy':'kSameAsRequested','gpu_mem_limit':8*1024**3};print(o)"

随后改完立刻看卡上的实际占用

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

末了确认推理输出与改动前一致

python -c "import onnxruntime as ort;s=ort.InferenceSession('m.onnx');print(s.get_outputs()[0].name)"

别只看报错消失,验证要多做一步。服务启动后显存占用降到 3GB 以内,同卡训练任务能正常分配,推理结果与改动前逐元素一致。

提醒一点。ORT 的默认 arena 会按块翻倍向上取整,卡越大占得越狠,多任务共卡时必须改掉扩展策略。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189