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获取单个程序CPU使用情况趋势图
Mar 10 Python
python使用webbrowser浏览指定url的方法
Apr 04 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
Aug 07 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
pytorch多进程加速及代码优化方法
Aug 19 Python
Python接口测试文件上传实例解析
May 22 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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 array_map()数组函数使用说明
2011/07/12 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
php关联数组快速排序的方法
2015/04/17 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
2019/05/20 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
2018/05/17 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
opencv+python实现均值滤波
2020/02/19 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
linux面试题参考答案(6)
2014/08/29 面试题
EntityManager都有哪些方法
2013/11/01 面试题
艺术设计专业个人求职信范文
2013/12/11 职场文书
饲料采购员岗位职责
2013/12/19 职场文书
农林环境专业求职信
2014/03/13 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
市场部岗位职责
2015/02/12 职场文书
优秀党员个人总结
2015/02/14 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
Spring Security中用JWT退出登录时遇到的坑
2021/10/16 Java/Android
mysql幻读详解实例以及解决办法
2022/06/16 MySQL