news 2026/6/23 16:39:54

PyTorch 多卡训练常见坑:设置 CUDA_VISIBLE_DEVICES 后仍 OOM 在 GPU 0 的解决之道

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PyTorch 多卡训练常见坑:设置 CUDA_VISIBLE_DEVICES 后仍 OOM 在 GPU 0 的解决之道

PyTorch 多卡训练常见坑:设置 CUDA_VISIBLE_DEVICES 后仍 OOM 在 GPU 0 的解决之道

问题现象

服务器有两张 GPU(GPU 0 和 GPU 1),GPU 0 正在跑一个大模型任务。

你想在 GPU 1 上单独跑另一个 PyTorch 程序,于是这样启动:

CUDA_VISIBLE_DEVICES=1python train.py --gpu1

程序日志显示:

using GPU : 1 可见 GPU 数量: 1 当前 GPU ID: 0 GPU 名称: NVIDIA GeForce RTX 3090 # 正确是 GPU 1

一切看似正常,但运行几步后报错:

RuntimeError: CUDA out of memory ... (GPU 0; 23.69 GiB total capacity; ...)

明明只看到一张卡,为什么还在物理 GPU 0 上爆显存?

根本原因

这是 PyTorch(尤其是 1.x 版本)的历史遗留 bug:

即使通过CUDA_VISIBLE_DEVICES正确限制了可见 GPU,PyTorch 在首次初始化 CUDA 上下文时,仍会在原始的物理 GPU 0 上分配少量内存(用于内部通信、缓存等)。

后续模型运行虽然在指定的 GPU 上,但只要触发某些操作(如大 tensor 分配、某些模块 forward),就会唤醒 GPU 0 的旧上下文,导致显存被占用,最终 OOM。

解决方案

在所有模型创建和数据移动之前,强制设置当前设备

importtorch# 在创建 net、前,紧跟 import torch 之后torch.cuda.set_device(0)# 这里的 0 是逻辑 ID,即你通过 CUDA_VISIBLE_DEVICES 指定的那张卡

加上这行后,PyTorch 会彻底绑定到新上下文,旧的 GPU 0 上下文不再被触碰,问题瞬间解决。

最佳实践代码结构

importargparseimportosimporttorch# 先 import torchparser=argparse.ArgumentParser()parser.add_argument("--gpu",type=str,default='1')args=parser.parse_known_args()[0]os.environ['CUDA_VISIBLE_DEVICES']=args.gpu# 关键:强制设置设备torch.cuda.set_device(0)torch.cuda.empty_cache()# 可选,保险起见再清一次# 现在才导入模型等fromnetimportNet# ...

额外建议

  • 单卡训练时不要使用torch.nn.DataParallel,它会引入额外开销并可能触发旧 bug。
  • 先用小 batchSize(如 2~4)验证跑通,再逐步增大。
  • 监控命令:watch -n 1 nvidia-smi

总结

一句torch.cuda.set_device(0)就能彻底解决这个让人抓狂的“ GPU 0 占用”问题。记住:限制可见 GPU 后,必须再强制设置当前设备,才能完全隔离。

希望这个坑能帮到更多遇到同样问题的朋友!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 17:11:40

基于vue的线上商城购物系统_q90ol4sn_springboot php python nodejs

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/6/23 12:09:26

MPV播放器窗口管理终极指南:从零掌握精确定位技巧

MPV播放器窗口管理终极指南:从零掌握精确定位技巧 【免费下载链接】mpv 🎥 Command line video player 项目地址: https://gitcode.com/GitHub_Trending/mp/mpv 还在为MPV播放器窗口乱跑而烦恼吗?每次打开视频都要手动调整窗口位置&am…

作者头像 李华
网站建设 2026/6/23 16:39:47

DFT + SUMO + GALORE = DFT模拟实验光谱效果

核心结论DFTGALORE 在模拟实验光谱(如 soft PES、HAXPES)时,结果更贴合实验,优势在于针对实验的专门化修正机制。 VASPKIT 作为综合性后处理工具,偏向多维度电子结构分析(如能带、光学性质)&…

作者头像 李华
网站建设 2026/6/22 23:37:04

31、Ubuntu 网络配置全攻略

Ubuntu 网络配置全攻略 1. 网络配置工具概述 当在 Ubuntu 系统中添加或更换网络硬件后,需要对新硬件进行配置,可通过命令行或图形化配置工具来完成。对于 Linux 新手和网络新手而言,图形化工具 nm - connection - editor 是更好的选择。不过,手动和图形化方法都需要超级…

作者头像 李华
网站建设 2026/6/23 1:17:34

Sparklines:如何在3分钟内为你的数据监控系统添加可视化能力

Sparklines:如何在3分钟内为你的数据监控系统添加可视化能力 【免费下载链接】spark ▁▂▃▅▂▇ in your shell. 项目地址: https://gitcode.com/gh_mirrors/spark/spark 在当今数据驱动的DevOps环境中,实时监控和快速决策变得至关重要。Spark…

作者头像 李华
网站建设 2026/6/22 16:50:06

29、Ubuntu系统下数字设备与音视频使用全攻略

Ubuntu系统下数字设备与音视频使用全攻略 1. 数字设备操作 1.1 从Rhythmbox中弹出设备 在Rhythmbox中使用iPod或其他数字设备后,可通过以下两种方式弹出设备: - 点击Rhythmbox窗口左窗格中的设备条目,然后点击窗口顶部附近的“弹出”按钮。 - 右键点击左窗格中的设备图…

作者头像 李华