我正在处理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:')