DataParallel模型训练滞后

时间:2019-06-23 08:21:53

标签: python pytorch autograd

我正在处理PyTorch 1.1上的一个问题,当时我正在训练有关时间序列数据的模型。数据保存在张量列表中,其中每个张量可以分成多批进行并行化。

当批处理大小为1时,仅使用两个GPU中的一个(这是预期的),并且模型可以平稳地训练。但是,当批处理大小> 1(这不是mini_batch大小变量,而是允许模型用于并行化的批处理数目)时,程序将陷入反向传播(line loss.backward())。在调试时,损失变量在多批次和单批次情况下的属性都相同(除了浮点值本身),因此我无法弄清楚出了什么问题。

我发现PyTorch以前在Tesla K80 GPU上存在问题,但是我也尝试过使用Tesla P100s,但问题仍然存在,所以这似乎不是问题所在。我也在这里查看了几乎所有相关的帖子,但是似乎都没有解决/解决我当前遇到的问题。我的培训代码附在下面。

非常感谢您的帮助。谢谢!

def train_minibatch(self, model, optimizer, mini_batch=10):
        model.train()

        train_loss_value = 0
        predictions = []
        targets = []

        for batch_idx, ts in enumerate(self.train_loader):

            batch_loss_value = 0
            batch_predictions = []
            batch_targets = []

            optimizer.zero_grad()

            for i in range(len(ts)):

                output = model(ts[i].to(self.device))
                target = torch.argmax(cues[:, i], dim=1)
                prediction = output.max(1, keepdim=True)

                torch.cuda.synchronize()

                loss = sum([F.nll_loss(output[j, :].unsqueeze(0), target[j].unsqueeze(-1), weight=self.w) for j in range(len(target))])
                loss = loss / mini_batch
                loss.backward()

                if i > 0 and i % mini_batch == 0:
                    optimizer.step()
                    optimizer.zero_grad()

                train_loss_value += loss.item()
                predictions.extend(prediction.tolist())
                targets.extend(target.tolist())

                batch_loss_value += loss.item()
                batch_predictions.extend(prediction.tolist())
                batch_targets.extend(target.tolist())

            self.print_eval(batch_loss_value, batch_predictions, batch_targets, idx=batch_idx, header='batch idx:')

0 个答案:

没有答案