pytorch两个GPU同时训练怎么实现,会有遇到哪些问题
Admin 2022-06-28 群英技术资讯 760 次浏览
我有两个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")
目前所在学校的计算机系自己搭建了个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同时作业,显然不是那么简单地几行代码就能解决的。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
GUI(图形用户界面),顾名思义就是用图形的方式,来显示计算机操作的界面,更加方便且直观。本文将用一行代码实现GUI界面的制作,需要的可以参考一下
小伙伴们还记不记得,在高考数学题后面的大题总会出现对数函数,需要我们画成对数函数图才能解答。之前小编向大家介绍对数log函数的表示方法,其实一般我们在使用对数函数的时候,会和对数函数图配合使用解决实际问题。那你知不知道在python中也可以画对数函数图呢?本文小编就以代码的形式向大家演示在python中绘制对数函数图的过程。
这篇文章主要介绍了python实战之利用pygame实现贪吃蛇游戏(二),文中有非常详细的代码示例,对正在学习python的小伙伴们有很好的帮助,需要的朋友可以参考下
python中break语句与continue语句有什么区别?当代码执行到break时,就会立刻结束break所在的循环;break语句是结束整个循环的过程,不在判断执行循环的条件是否成立。
我们可以通过列表生成式简单直接地创建一个列表,但是受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008