当前位置: 首页 > news >正文

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 后,必须再强制设置当前设备,才能完全隔离。

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

http://www.cnnetsun.cn/news/48529.html

相关文章:

  • 基于vue的线上商城购物系统_q90ol4sn_springboot php python nodejs
  • MPV播放器窗口管理终极指南:从零掌握精确定位技巧
  • DFT + SUMO + GALORE = DFT模拟实验光谱效果
  • 31、Ubuntu 网络配置全攻略
  • Sparklines:如何在3分钟内为你的数据监控系统添加可视化能力
  • 29、Ubuntu系统下数字设备与音视频使用全攻略
  • 34、Linux系统的文件共享与安全防护指南
  • 37、Ubuntu社区交流、资讯获取及常见问题解决指南
  • 40、Ubuntu系统常见问题及解决方法
  • 42、Ubuntu硬盘手动分区及相关资源指南
  • 超强音频机器人实战指南:让你的TeamSpeak服务器秒变音乐厅
  • LMMS音乐制作完全指南:从入门到精通的免费创作平台
  • 云原生监控实战:5分钟构建高可用可观测性平台
  • TensorBoard自定义配色实战:5步打造专业级可视化体验
  • 终极数据库教程:从零开始构建完整知识体系
  • 小米MiMo-Audio-7B:开启音频大模型少样本学习新纪元
  • Home Assistant位置服务故障排查:5步快速修复指南
  • 一劳永逸的Yuedu书源数据备份全攻略
  • 重组蛋白专题:E-cadherin/钙离子依赖性跨膜蛋白
  • 15、Linux文件访问机制深度解析
  • Pelco KBD300A 模拟器:04+2. PyInstaller 5.13.2 打包全解析
  • rembg Python 3.13迁移实战:5大常见问题排雷指南
  • Wipe Pro(专业数据擦除软件)
  • 微信视频号下载工具(支持直播回放、直播流)
  • DeepSeek-V3.1双模式大模型:重新定义AI效率与场景适应性
  • Archery数据导出终极指南:3分钟学会Excel和JSON高效导出
  • 快手直播录制完整避坑指南:DouyinLiveRecorder终极解决方案
  • RuoYi-Vue终极指南:3步构建企业级Java应用系统
  • MOSES:重新定义药物发现中分子生成的基准测试
  • DeepSeek-Coder-V2:开源代码大模型的性能突破与行业影响