我正在使用 PyTorch Lightning 训练图像分类模型并在具有多个 GPU 的机器上运行,因此我使用推荐的分布式后端以获得最佳性能ddp
(DataDistributedParallel)。这自然会拆分数据集,因此每个 GPU 只会看到数据的一部分。
但是,对于验证,我想计算整个验证集的准确性等指标,而不仅仅是部分。我该怎么做?我在官方文档中发现了一些提示,但它们没有按预期工作或让我感到困惑。正在发生的事情是每个validation_epoch_end
都称为验证数据的num_gpus
时间1/num_gpus
。我想汇总所有结果并且只运行validation_epoch_end
一次。
在本节中,他们声明在使用 dp/ddp2 时,您可以添加一个附加函数,如下所示
def validation_step(self, batch, batch_idx):
loss, x, y, y_hat = self.step(batch)
return {"val_loss": loss, 'y': y, 'y_hat': y_hat}
def validation_step_end(self, self, *args, **kwargs):
# do something here, I'm not sure what,
# as it gets called in ddp directly after validation_step with the exact same values
return args[0]
然而,结果并没有被聚合,validation_epoch_end
仍然被称为num_gpu
时间。这种行为不可用ddp
吗?还有其他方法可以实现这种聚合行为吗?