为什么没有运行中的进程却出现cuda out of memory报错
CUDA无运行进程时触发OOM的成因及排查方案
常见成因
- 异常进程残留显存:之前崩溃、被强制终止的CUDA进程未触发系统自动显存回收逻辑,残留的显存占用不会在
nvidia-smi的进程列表中展示,但会占用实际显存空间 - 框架隐式预占显存:PyTorch、TensorFlow等深度学习框架初始化CUDA上下文时,会预占一部分显存做缓存池,如果当前显卡剩余显存小于框架预占阈值,会直接触发OOM
- 隐藏进程占用:共享服务器场景下,其他用户在容器、虚拟机或cgroup隔离环境中运行的CUDA进程,普通权限用户执行
nvidia-smi无法查看,也会出现无可见进程但显存被占的情况 - 显存碎片化:历史进程频繁申请、释放不同大小的显存块,导致显存空间被切割为大量不连续的小片段,哪怕总剩余显存足够,也无法满足大Tensor的连续显存申请需求,触发OOM
排查与解决步骤
- 第一步:清理残留显存
执行fuser /dev/nvidia*命令查看所有占用NVIDIA设备的进程PID,终止无业务用途的进程即可释放残留显存。如果需要彻底重置显存管理,可执行sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm重置驱动模块(该操作会中断所有正在运行的CUDA进程,共享显卡环境谨慎操作)。 - 第二步:调整框架显存配置
关闭框架的显存预占逻辑,改为动态申请:
PyTorch配置示例:
TensorFlow配置示例:import torch # 限制0号卡的单进程显存占用上限为80% torch.cuda.set_per_process_memory_fraction(0.8, device=0)import tensorflow as tf gpus = tf.config.experimental.list_physical_devices('GPU') for gpu in gpus: # 开启显存动态增长,按需申请显存 tf.config.experimental.set_memory_growth(gpu, True) - 第三步:排查隐藏进程占用
执行nvidia-smi --query-gpu=memory.used,memory.total --format=csv查看显卡总已用显存,如果数值远大于可见进程的显存占用总和,说明存在隔离环境中的隐藏进程占用,联系服务器管理员排查即可。 - 第四步:处理显存碎片化问题
代码中尽量复用Tensor变量,避免频繁创建销毁大显存对象。推理场景下可调用torch.cuda.empty_cache()(PyTorch)主动释放框架缓存的碎片化显存,供其他显存申请使用。
内容的提问来源于stack exchange,提问作者Wei Zhang
相关产品推荐
相关产品推荐

