news 2026/5/1 11:08:31

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/5/1 8:36:51

基于vue的演唱会门票售票预约系统_y425v64z_springboot php python nodejs

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

作者头像 李华
网站建设 2026/5/1 9:56:01

BookNLP:5大核心功能解析,如何让长文本分析变得简单高效

BookNLP:5大核心功能解析,如何让长文本分析变得简单高效 【免费下载链接】booknlp BookNLP, a natural language processing pipeline for books 项目地址: https://gitcode.com/gh_mirrors/bo/booknlp BookNLP是一个专门为书籍和长文档设计的自然…

作者头像 李华
网站建设 2026/4/26 17:46:29

Neovim代码补全终极指南:从新手到专家的快速上手教程

还在为每次都要手动输入冗长的函数名而浪费时间吗?是否经常因为记不清API参数而频繁切换窗口查看文档?Neovim的现代化代码补全功能将彻底革新你的编程工作流。本指南将带你一步步解锁Neovim的智能提示潜能,让你在编码时享受到前所未有的流畅体…

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

Typst文件嵌入深度指南:告别重复代码的5大核心技巧

你是否曾经在文档编写中陷入这样的困境:同样的内容需要在多个地方重复出现,每次修改都要逐一更新?Typst的文件嵌入功能正是解决这一痛点的利器。作为现代化的排版系统,Typst提供了强大而灵活的文件嵌入机制,让你能够构…

作者头像 李华
网站建设 2026/4/21 12:49:54

SeedVR-3B视频修复实战指南:从模糊到高清的一键蜕变

SeedVR-3B视频修复实战指南:从模糊到高清的一键蜕变 【免费下载链接】SeedVR-3B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR-3B 还在为模糊不清的老视频发愁吗?监控画面太暗看不清车牌?家庭录像充满噪点&am…

作者头像 李华
网站建设 2026/5/1 8:30:28

Refine+Next.js+Ant Design+Turbopack技术栈深度集成与性能优化实践

RefineNext.jsAnt DesignTurbopack技术栈深度集成与性能优化实践 【免费下载链接】refine 一个用于构建内部工具、管理面板、仪表盘和B2B应用程序的React框架,具有无与伦比的灵活性。 项目地址: https://gitcode.com/GitHub_Trending/re/refine 在当今快速迭…

作者头像 李华