如何在PyTorch中进行分布式训练时设置随机种子?

9lowa7mx  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(232)

现在我正在使用torch.distributed训练模型,但我不确定如何设置随机种子。例如,这是我当前的代码:

def main():
    np.random.seed(args.seed)
    torch.manual_seed(args.seed)
    torch.cuda.manual_seed(args.seed)

    cudnn.enabled = True
    cudnn.benchmark = True
    cudnn.deterministic = True 

    mp.spawn(main_worker, nprocs=args.ngpus, args=(args,))

我是不是该把

np.random.seed(args.seed)
    torch.manual_seed(args.seed)
    torch.cuda.manual_seed(args.seed)

    cudnn.enabled = True
    cudnn.benchmark = True
    cudnn.deterministic = True

在函数main_worker()中插入一个函数,以确保每个进程都有正确的种子和cudnn设置?顺便说一下,我已经尝试过了,这种行为会使训练速度慢2倍,这真的让我很困惑。
非常感谢你的任何帮助!

ghhaqwfi

ghhaqwfi1#

派生的子进程不会继承您在父进程中手动设置的种子,因此您需要在main_worker函数中设置种子。
同样的逻辑也适用于cudnn.benchmarkcudnn.deterministic,所以如果你想使用它们,你也必须在main_worker中设置它们。如果你想验证这一点,你可以在每个进程中打印它们的值。
cudnn.benchmark = True通过对某些操作的各种实现进行基准测试,尝试为您的模型找到最佳算法这将花费时间来找到最佳算法,但是一旦完成,进一步的迭代将潜在地更快。仅适用于所使用的特定输入大小。如果在下一次迭代中您有不同的输入大小,则需要再次运行基准测试,以确定针对该特定输入大小的最佳算法,其可以与第一输入尺寸不同。
我假设您的输入大小不同,这可以解释速度变慢的原因,因为基准测试在父进程中设置时没有使用。cudnn.benchmark = True只应该在输入大小固定的情况下使用。
cudnn.determinstic = True也可能对性能产生负面影响,因为某些非确定性的底层操作需要用确定性版本替换,这往往会更慢,否则首先会使用确定性版本,但性能影响不应该太大。

相关问题