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实现的各种排序算法代码
Mar 04 Python
python list 合并连接字符串的方法
Mar 09 Python
Python中的包和模块实例
Nov 22 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
python实现Floyd算法
Jan 03 Python
Python编程中NotImplementedError的使用方法
Apr 21 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
python图形开发GUI库pyqt5的基本使用方法详解
Feb 14 Python
python中return如何写
Jun 18 Python
浅谈pytorch中的BN层的注意事项
Jun 23 Python
python利用文件时间批量重命名照片和视频
Feb 09 Python
python基础之匿名函数详解
Apr 21 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中数组首字符过滤功能代码
2012/07/31 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
Python中import机制详解
2017/11/14 Python
Python秒算24点实现及原理详解
2019/07/29 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
企划专员岗位职责
2013/12/09 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
销售团队获奖感言
2014/08/14 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
教师旷工检讨书
2015/08/15 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS