pytorch 两个GPU同时训练的解决方案


Posted in Python onJune 01, 2021

使用场景

我有两个GPU卡。我希望我两个GPU能并行运行两个网络模型。

代码

错误代码1:

#对于0号GPU
os.environ['CUDA_VISIBLE_DEVICES']='0,1'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#对于1号GPU
os.environ['CUDA_VISIBLE_DEVICES']='0,1'
device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")

0号GPU不报错,1号GPU报错。错误如下

RuntimeError: Expected tensor for argument #1 ‘input' to have the same device as tensor for argument #2 ‘weight'; but device 0 does not equal 1 (while checking arguments for cudnn_convolution)

错误代码2:

#对于0号GPU
os.environ['CUDA_VISIBLE_DEVICES']='0'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#对于1号GPU
os.environ['CUDA_VISIBLE_DEVICES']='1'
device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")

0号GPU不报错,1号GPU报错。错误如下

CUDA: invalid device ordinal

正确代码如下:

#对于0号GPU
os.environ['CUDA_VISIBLE_DEVICES']='0'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#对于1号GPU
os.environ['CUDA_VISIBLE_DEVICES']='1'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

pytorch 多个gpu遇到的问题

目前所在学校的计算机系自己搭建了个GPU Farm,设备是GTX 1080 Ti的,看起来还算ok,但其实细究起来还挺鸡肋的。但是总对于数据量巨大的项目,还是需要跑代码吧,将就着用了。因为资源有限,分配到超过1个gpu需要排队,所以从来没尝试过使用多个gpu。最近由于数据量变大,也急于取得进展,因此开始尝试分配多个gpu。使用的过程中出现的问题,在此做个记录。

首先,因为不同平台的GPU Farm搭建的规则不一样,如何分配到多个gpu在此就不做记录了。不得不说,学校的GPU Farm资源少的可怜,分配到2个gpu常常要排队半小时。

以下罗列遇到的问题。

torch.nn.DataParallel()

因为对pytorch的理解还不够深,因此为了提高速度,从官网上注意到DataParallel,据说最简单的方法是直接用

model = torch.nn.DataParallel(model)
model.cuda()

来实现,但是万万没想到它给我带来的时间浪费还真不是一星半点。

首先我分配到了2个gpu设备,之后在我的代码中只添加了如上的命令,而后便收到了如下报错

ValueError: only one element tensors can be converted to Python scalars

这个报错直指我的 loss.item(),通过debug我发现它的tensor dimension的确变成了2个elements。在做了更多无效debug和上网查阅之后,我鬼使神差地调整回了1个gpu想看看效果会不会不一样,然后居然顺利运行了。

稍微思考一下,感觉倒是很合理。假设两个gpu并行同时各自训练一个batch,那么得到的loss自然应该是2个elements,浅显地认为将其看做两个batch训练的loss结果就可以了。

目前手头有比较急于出结果的数据集和项目,因此暂时没有过多的时间去研究具体为什么会有这种情况的出现,不过这也证实了想要合理正确地运用多个gpu同时作业,显然不是那么简单地几行代码就能解决的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python提取字典key列表的方法
Jul 11 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
python opencv判断图像是否为空的实例
Jan 26 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
python如何修改文件时间属性
Feb 05 Python
使用Django实现商城验证码模块的方法
Jun 01 #Python
pytorch通过训练结果的复现设置随机种子
Jun 01 #Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 #Python
详细介绍python类及类的用法
教你怎么用PyCharm为同一服务器配置多个python解释器
用python批量解压带密码的压缩包
May 31 #Python
变长双向rnn的正确使用姿势教学
You might like
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
bootstrap data与jquery .data
2014/07/07 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
vue配置多页面的实现方法
2018/05/22 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
[09:59]DOTA2-DPC中国联赛2月7日Recap集锦
2021/03/11 DOTA
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
Python中一般处理中文的几种方法
2019/03/06 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Python 数据分析之逐块读取文本的实现
2020/12/14 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
Hotels.com越南:酒店预订
2019/10/29 全球购物
财务会计专业毕业生自荐信
2013/10/02 职场文书
年度考核自我评价
2014/01/25 职场文书
2014年公司迎新年活动方案
2014/02/24 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
2015年共青团工作总结
2015/05/15 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
Python中requests库的用法详解
2022/06/05 Python