sun*_*227 1 python parallel-processing distributed pytorch
现在我正在使用 训练模型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,))
Run Code Online (Sandbox Code Playgroud)
我应该移动
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
Run Code Online (Sandbox Code Playgroud)
进入函数main_worker()
以确保每个进程都有正确的种子和 cudnn 设置?顺便说一句,我已经尝试过这个,这种行为会让训练速度慢2倍,这真的让我很困惑。
非常感谢您的帮助!
生成的子进程不会继承您在父进程中手动设置的种子,因此您需要在函数中设置种子main_worker
。
同样的逻辑也适用于cudnn.benchmark
和cudnn.deterministic
,因此如果您想使用它们,您main_worker
也必须将它们设置为。如果你想验证这一点,你可以在每个进程中打印它们的值。
cudnn.benchmark = True
尝试通过对某些操作的各种实现进行基准测试(例如可用的卷积算法)来找到适合您的模型的最佳算法。找到最佳算法需要时间,但一旦完成,进一步的迭代可能会更快。被确定为最佳的算法仅适用于所使用的特定输入大小。如果在下一次迭代中您有不同的输入大小,则需要再次运行基准测试,以便确定该特定输入大小的最佳算法,该算法可能与第一个输入大小不同。
我假设您的输入大小有所不同,这可以解释速度减慢的原因,因为在父进程中设置基准时未使用基准。cudnn.benchmark = True
仅当您的输入大小固定时才应使用。
cudnn.determinstic = True
也可能对性能产生负面影响,因为某些非确定性的底层操作需要替换为确定性版本,这往往会更慢,否则首先会使用确定性版本,但是性能影响不应太大。
归档时间: |
|
查看次数: |
2764 次 |
最近记录: |