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时间戳与时间字符串互相转换实例代码
Nov 28 Python
详解Python中的__init__和__new__
Mar 12 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
Python中列表、字典、元组数据结构的简单学习笔记
Mar 20 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 Python
浅谈django orm 优化
Aug 18 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
python接口调用已训练好的caffe模型测试分类方法
Aug 26 Python
Python函数基本使用原理详解
Mar 19 Python
python collections模块的使用
Oct 16 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
Feb 03 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 for 循环语句使用方法详细说明
2010/05/09 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
微信小程序实现tab左右切换效果
2020/11/15 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python文件操作整理汇总
2014/10/21 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
幼儿园教学管理制度
2014/02/04 职场文书
大学生暑期实践感言
2014/02/26 职场文书
学雷锋演讲稿汇总
2014/05/10 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
教师岗位说明书
2015/09/30 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
python执行js代码的方法
2021/05/13 Python
go goroutine 怎样进行错误处理
2021/07/16 Golang
mysql 生成连续日期及变量赋值
2022/03/20 MySQL