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程序运行效率的6个方法
Mar 31 Python
简单介绍Python中利用生成器实现的并发编程
May 04 Python
Python基础入门之seed()方法的使用
May 15 Python
Django入门使用示例
Dec 12 Python
python实现停车管理系统
Nov 30 Python
Python闭包思想与用法浅析
Dec 27 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
如何理解python中数字列表
May 29 Python
Django自带用户认证系统使用方法解析
Nov 12 Python
python基础之while循环语句的使用
Apr 20 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面向对象全攻略 (七) 继承性
2009/09/30 PHP
让PHP以ROOT权限执行系统命令的方法
2011/02/10 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
php页面缓存方法小结
2015/01/10 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
2012/12/13 Javascript
jQuery网页右侧广告跟随滚动代码分享
2020/04/20 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Python正则表达式匹配HTML页面编码
2015/04/08 Python
python获取指定目录下所有文件名列表的方法
2015/05/20 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
自荐信怎么写好
2013/11/11 职场文书
有关爱国演讲稿
2014/05/07 职场文书
国旗下的演讲稿
2014/05/08 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
沈阳故宫导游词
2015/01/31 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
Java中的Kotlin 内部类原理
2022/06/16 Java/Android