Pytorch:RNN模型的DataParallel中出错

Pytorch:RNN模型的DataParallel中出错,pytorch,Pytorch,我正在尝试将torch.nn.DataParallel用于RNN模型。我的模型如下所示: class-EncoderRNN(nn.Module): 定义初始大小(自身大小、声音大小、隐藏大小): super(EncoderRNN,self)。\uuuu init\uuuuu() self.hidden\u size=隐藏的大小 self.embedding=nn.embedding(人声大小、隐藏大小) self.gru=nn.gru(隐藏大小、隐藏大小、批处理优先=True) def转发(自身

我正在尝试将torch.nn.DataParallel用于RNN模型。我的模型如下所示:

class-EncoderRNN(nn.Module):
定义初始大小(自身大小、声音大小、隐藏大小):
super(EncoderRNN,self)。\uuuu init\uuuuu()
self.hidden\u size=隐藏的大小
self.embedding=nn.embedding(人声大小、隐藏大小)
self.gru=nn.gru(隐藏大小、隐藏大小、批处理优先=True)
def转发(自身、输入批次、输入批次长度、隐藏):
嵌入=自嵌入(输入\批量)
压缩输入=nn.utils.rnn.pack\u填充的\u序列(嵌入式,输入\u批处理\u长度.cpu().numpy(),批处理\u优先=真)
输出,隐藏=self.gru(压缩输入,隐藏)
返回输出,隐藏
类解码RRNN(nn.模块):
定义初始大小(自身大小、隐藏大小、语音大小):
超级(DecoderRNN,self)。\uuuu init\uuuuuu()
self.hidden\u size=隐藏的大小
self.embedding=nn.embedding(声音大小、隐藏大小)
self.gru=nn.gru(隐藏大小、隐藏大小、批处理优先=True)
self.out=nn.Linear(隐藏大小、声音大小)
self.softmax=nn.LogSoftmax(dim=1)
def转发(自身、目标批次、目标批次长度、隐藏、序列=假):
嵌入=自嵌入(目标批次)
输出=F.relu(嵌入式)
如果列车:
#减1以消除
packed\u target=nn.utils.rnn.pack\u padded\u序列(输出,(目标批处理长度-1).cpu().numpy(),
批次(第一个=真)
输出,隐藏=self.gru(打包的\u目标,隐藏)
输出=self.softmax(self.out(输出[0]))
返回输出,隐藏
我在声明模型时实现了DataParallel,如下所示:

encoder=nn.DataParallel(编码器)
解码器=nn.DataParallel(解码器)
代码在具有4个GPU的服务器上运行,我收到以下错误消息:

/home/cjunjie/NLP/docsummary/model.py:18:UserWarning:RNN模块权重不是单个连续内存块的一部分。这意味着它们需要在每次调用时被压缩,这可能会大大增加内存使用。要再次压缩权重,请调用展平参数()。
输出,隐藏=self.gru(压缩输入,隐藏)
回溯(最近一次呼叫最后一次):
文件“train.py”,第144行,在
列车迭代(编码器、解码器、文件数据集)
文件“train.py”,第110行,在train_迭代中
目标索引、编码器、解码器、编码器优化器、解码器优化器、标准)
列车中第41行的文件“train.py”
编码器输出,编码器隐藏=编码器(输入批次,输入批次长度,编码器隐藏)
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/modules/module.py”,第357行,在调用中__
结果=自我转发(*输入,**kwargs)
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/parallel/data_parallel.py”,第74行,向前
返回自聚集(输出、自输出设备)
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/parallel/data_parallel.py”,第86行,位于聚集区
返回聚集(输出,输出设备,dim=self.dim)
文件“/home/cjunjie/anaconda3/lib/python3.6/site-packages/torch/nn/parallel/scatter_-gather.py”,第65行,聚集
返回聚集映射(输出)
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/parallel/scatter\u-gather.py”,第60行,聚集图
返回类型(输出)(映射(聚集映射,zip(*输出)))
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/parallel/scatter\u-gather.py”,第60行,聚集图
返回类型(输出)(映射(聚集映射,zip(*输出)))
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/utils/rnn.py”,第39行,新__
返回super(PackedSequence,cls)。\uuuuu新的\uuuuu(cls,*args[0])
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/parallel/scatter\u collect.py”,第57行,聚集图
返回聚集。应用(目标设备、dim、*输出)
文件“/home/cjunjie/anaconda3/lib/python3.6/site packages/torch/nn/parallel/_functions.py”,第58行,向前
断言全部(映射(lambda i:i.is_cuda,输入))
断言错误

我搜索了同样的问题,但没有一个有解决办法。有人能帮忙吗?

为了在GPU上运行代码,您需要将变量和模型权重复制到cuda。我怀疑你没有将模型重量复制到cuda。要做到这一点,你必须这样做

encoder.cuda()
decoder.cuda()