news 2026/6/10 1:32:00

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/9 20:03:58

快速上手Apache Airflow自定义Docker镜像构建终极指南

快速上手Apache Airflow自定义Docker镜像构建终极指南 【免费下载链接】airflow Airflow 是一款用于管理复杂数据管道的开源平台,可以自动执行任务并监控其状态。高度可定制化、易于部署、支持多种任务类型、具有良好的可视化界面。灵活的工作流调度和管理系统&…

作者头像 李华
网站建设 2026/6/8 19:47:14

Zen Browser语言定制完全指南:从界面切换到个性化翻译

Zen Browser语言定制完全指南:从界面切换到个性化翻译 【免费下载链接】desktop 🌀 Experience tranquillity while browsing the web without people tracking you! 项目地址: https://gitcode.com/GitHub_Trending/desktop70/desktop Zen Brows…

作者头像 李华
网站建设 2026/6/9 15:47:28

我为什么当博主

文章目录前言一. 我的知识库,不能只喂给领导二. 我的脚本工具,在硬盘里快要“抑郁”了三. 我想找个地方,说点“人话”总结前言 时间过得真快,还记得我的第一帖发表时间是2025.10.18,转眼间已经二个月了,从…

作者头像 李华
网站建设 2026/6/9 14:17:12

微服务灰度发布实战:从理论到落地的完整解决方案

微服务灰度发布实战:从理论到落地的完整解决方案 【免费下载链接】pig 项目地址: https://gitcode.com/gh_mirrors/pig/pig 在微服务架构日益普及的今天,如何安全、平滑地发布新版本功能成为每个技术团队必须面对的挑战。灰度发布作为降低发布风…

作者头像 李华
网站建设 2026/6/9 23:59:11

Easy Dataset使用手册:从零开始构建LLM微调数据集

Easy Dataset使用手册:从零开始构建LLM微调数据集 【免费下载链接】easy-dataset A powerful tool for creating fine-tuning datasets for LLM 项目地址: https://gitcode.com/gh_mirrors/ea/easy-dataset 还在为LLM微调数据准备而头疼吗?Easy D…

作者头像 李华
网站建设 2026/6/10 10:00:45

包依赖分析工具终极指南:快速解决版本冲突

包依赖分析工具终极指南:快速解决版本冲突 【免费下载链接】rushstack Monorepo for tools developed by the Rush Stack community 项目地址: https://gitcode.com/gh_mirrors/ru/rushstack 在大型monorepo项目中,包依赖管理往往成为开发者的噩梦…

作者头像 李华