2017-06-16 13 views
2

ここでは、文字ベースの言語生成を実行するためにRNNモデルだ:私は私の4つのGPU間での入力のバッチを分割するために、DataParallelを使用してモデルをインスタンス化DataParallelとPytorchにRNN機能を並列化する方法

class RNN(nn.Module): 
    def __init__(self, input_size, hidden_size, output_size, n_layers): 
     super(RNN, self).__init__() 
     self.input_size = input_size 
     self.hidden_size = hidden_size 
     self.output_size = output_size 
     self.n_layers = n_layers 

     self.encoder = nn.Embedding(input_size, hidden_size) 
     self.GRU = nn.GRU(hidden_size, hidden_size, n_layers, batch_first=True) 
     self.decoder = nn.Linear(hidden_size, output_size) 


    def forward(self, input, batch_size): 
     self.init_hidden(batch_size) 
     input = self.encoder(input) 
     output, self.hidden = self.GRU(input, self.hidden) 
     output = self.decoder(output.view(batch_size, self.hidden_size)) 
     return output 

    def init_hidden(self, batch_size): 
     self.hidden = Variable(torch.randn(self.n_layers, batch_size, self.hidden_size).cuda()) 

は、
net = torch.nn.DataParallel(RNN(n_chars, hidden_size, n_chars, n_layers)).cuda() 

ここにはfull codeがあります。

残念なことに、DataParallelは最初の次元としてBATCH_SIZEを有するように入力を必要とするが、GRU機能が隠されたテンソルの第二次元としてBATCH_SIZEを有することが期待:

output, self.hidden = self.GRU(input, self.hidden) 

コードであるとして、次のエラーが(プリントアウトを注意スローそのエンコーダは正しく)4つのGPU上で実行される表示:

ここ
... 
forward function: encoding input of shape: (16L, 1L) 
forward function: encoding input of shape: (16L, 1L) 
forward function: encoding input of shape: (16L, 
forward function: encoding input of shape: 

forward function: GRU processing input of shape: 
1L) 
((16L, 16L1L, 1L), 100L) 
forward function: GRU processing input of shape: 
(16L, 1L, 
forward function: GRU processing input of shape:100L) 
(16L 
forward function: GRU processing input of shape:, 1L, 100L) (
16L, 1L, 100L) 

Traceback (most recent call last): 
    File "gru2.py", line 166, in <module> 
    output = net(c, batch_size) 
    File "/root/miniconda2/lib/python2.7/site-packages/torch/nn/modules/module.py", line 206, in __call__ 
    result = self.forward(*input, **kwargs) 
    File "/root/miniconda2/lib/python2.7/site-packages/torch/nn/parallel/data_parallel.py", line 61, in forward 
    outputs = self.parallel_apply(replicas, inputs, kwargs) 
    File "/root/miniconda2/lib/python2.7/site-packages/torch/nn/parallel/data_parallel.py", line 71, in parallel_apply 
    return parallel_apply(replicas, inputs, kwargs) 
    File "/root/miniconda2/lib/python2.7/site-packages/torch/nn/parallel/parallel_apply.py", line 45, in parallel_apply 
    raise output 
RuntimeError: Expected hidden size (2, 16L, 100), got (2L, 64L, 100L) 

モデル有する2層、BATCH_SIZE = 64、及びhidden_​​size = 100

転送機能でGRU操作をどのように並列化するのですか?

答えて

2

パラメータdim = 1を設定するだけです(例:

net = torch.nn.DataParallel(RNN(n_chars, hidden_size, n_chars, n_layers), dim=1).cuda() 
関連する問題