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 subprocess模块学习总结
Mar 13 Python
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
python实现简单的单变量线性回归方法
Nov 08 Python
python的继承知识点总结
Dec 10 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
详解Python 切片语法
Jun 10 Python
使用python实现滑动验证码功能
Aug 05 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
使用python实现多维数据降维操作
Feb 24 Python
matplotlib 三维图表绘制方法简介
Sep 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/01/01 PHP
服务器web工具 php环境下
2010/12/29 PHP
开启PHP的伪静态模式
2015/12/31 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
javascript控制台详解
2015/06/25 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
用headjs来管理和加载js 提高网站加载速度
2016/11/29 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
Python getopt模块处理命令行选项实例
2014/05/13 Python
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
python中xrange用法分析
2015/04/15 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python占用的内存优化教程
2019/07/28 Python
python实现猜数字游戏
2020/03/25 Python
python中删除某个元素的方法解析
2019/11/05 Python
python将数据插入数据库的代码分享
2020/08/16 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
应用服务器有那些
2012/01/19 面试题
JAVA API 实用类 String详解
2021/10/05 Java/Android
python垃圾回收机制原理分析
2022/04/13 Python