在多个GPU上运行LSTM会得到“输入张量和隐藏张量不在同一设备上”

时间:2019-02-04 07:31:44

标签: python gpu lstm pytorch

我正在尝试在pytorch中训练LSTM层。我正在使用4个GPU。初始化时,我添加了.cuda()函数将隐藏层移动到GPU。但是,当我使用多个GPU运行代码时,出现此运行时错误:

RuntimeError: Input and hidden tensors are not at the same device

我试图通过在以下正向函数中使用.cuda()函数来解决该问题:

self.hidden = (self.hidden[0].type(torch.FloatTensor).cuda(), self.hidden[1].type(torch.FloatTensor).cuda()) 

这行代码似乎可以解决问题,但令我担心的是,是否在不同的GPU中看到了更新的隐藏层。我应该将向量在前进功能的末尾移回cpu进行批处理,还是有其他方法可以解决此问题。

1 个答案:

答案 0 :(得分:1)

在张量上调用.cuda()时,Pytorch默认将其移动到current GPU device(GPU-0)。因此,由于数据并行性,当您的模型转到另一个模型时,您的数据位于另一个GPU中,这会导致您面临运行时错误。

为递归神经网络实现数据并行性的正确方法如下:

from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence

class MyModule(nn.Module):
    # ... __init__, other methods, etc.

    # padded_input is of shape [B x T x *] (batch_first mode) and contains
    # the sequences sorted by lengths
    #   B is the batch size
    #   T is max sequence length
    def forward(self, padded_input, input_lengths):
        total_length = padded_input.size(1)  # get the max sequence length
        packed_input = pack_padded_sequence(padded_input, input_lengths,
                                            batch_first=True)
        packed_output, _ = self.my_lstm(packed_input)
        output, _ = pad_packed_sequence(packed_output, batch_first=True,
                                        total_length=total_length)
        return output

m = MyModule().cuda()
dp_m = nn.DataParallel(m)

对于多GPU设置,您还需要相应地设置CUDA_VISIBLE_DEVICES环境变量。

参考文献: