GPU显存显示为空但触发CUDA out of memory错误,如何无需重启解决
无root临时修复方案
- 先清理所有ray残留进程,大部分情况下是ray的僵尸worker没有被主进程回收,占用了CUDA上下文导致OOM:
ps aux | grep ray | grep -v grep | awk '{print $2}' | xargs kill -9
- 手动清理CUDA残留缓存与IPC内存片段:
import torch for dev_id in [0, 1]: with torch.cuda.device(f"cuda:{dev_id}"): torch.cuda.empty_cache() torch.cuda.ipc_collect()
- 调整ray tune运行参数,避免进程复用积累显存/上下文泄漏:在你的tune启动代码中添加
reuse_actors=False参数,禁止同一个worker进程跑多轮trial;同时在单trial训练代码的末尾添加上方的CUDA缓存清理逻辑,每轮trial跑完主动释放显存资源。 - 启动训练前先设置环境变量修正CUDA设备编号逻辑,避免设备编号和PCI地址不匹配导致的映射错误:
export CUDA_DEVICE_ORDER=PCI_BUS_ID # 之后再执行你的训练启动命令
根因说明与长期修复建议
你遇到的是NVIDIA 460.x版本驱动的已知CUDA上下文泄漏bug,该版本驱动在配合多进程训练框架(如ray)使用时,会出现进程退出后CUDA主上下文不释放的问题,且nvidia-smi无法观测到对应的显存占用。如果可以联系管理员将NVIDIA驱动升级到470.x及以上的LTS版本,即可彻底解决该问题。
dmesg中输出的mapping multiple BARs日志也验证了多卡地址映射存在冲突,设置CUDA_DEVICE_ORDER=PCI_BUS_ID可以大幅降低该问题的触发概率。
内容的提问来源于stack exchange,提问作者Kjyong
相关产品推荐
相关产品推荐

