多GPU的简洁实现

http://zh.d2l.ai/chapter_computational-performance/multiple-gpus-concise.html

有个疑问,为什么net是放在了0和1两个GPU上,但当train的时候,却只把X和y移到了GPU[0]上呢?谢谢!

5 Likes

pytorch中,网络被Dataparallel“包装”后,在前向过程会把输入tensor自动分配到每个显卡上。
而Dataparallel使用的是master-slave的数据并行模式,主卡默认为0号GPU,所以在进网络之前,只要移到GPU[0]就可以了。

2 Likes

我有两张GPU,代码跑时候报错信息如下:
module must have its parameter and buffers on device cuda:0(device_ids[0]) but found one of them on device:cpu
请问是什么原因呢

从13.1节里面的例子来看,应该还要把网络也迁移一下

net = nn.DataParallel(net, device_ids=devices).to(devices[0])

1 Like

反向传播不用 l.mean().backward()吗?直接 l.backward()?第三章3.6是 l.mean().backward()

你好,我是用pycharm运行代码时出现一下问题:

warnings.warn('PyTorch is not compiled with NCCL support')

我自己看了写答案,它们说python不支持nccl,如果我把net = nn.DataParallel(net, device_ids=devices).to(devices[0])去掉,就不会出现这个warning,我的问题是:

  1. 有没有办法去掉这个warning
  2. 如果有,改变nccl之后对结果有什么影响?例如精度或者速度?

谢谢

1 Like

CrossEntropyLoss默认好像是mean,3.6是因为使用的是自定义的crossentropy

1 Like

你可以检查一下你的devices变量,我估计里面有cpu :joy:

注意,这部分的代码的原始库进行相应了的修改,请使用英文版教材中的实例代码