• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    pytorch 两个GPU同时训练的解决方案

    使用场景

    我有两个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同时作业,显然不是那么简单地几行代码就能解决的。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • pytorch使用horovod多gpu训练的实现
    • 解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
    • pytorch 指定gpu训练与多gpu并行训练示例
    • 用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
    • pytorch 使用单个GPU与多个GPU进行训练与测试的方法
    • pytorch使用指定GPU训练的实例
    • 关于pytorch多GPU训练实例与性能对比分析
    • pytorch 如何在GPU上训练
    上一篇:使用Django实现商城验证码模块的方法
    下一篇:如何判断pytorch是否支持GPU加速
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    pytorch 两个GPU同时训练的解决方案 pytorch,两个,GPU,同时,训练,