设置随机种子可以控制每次程序运行时的随机性保持一致,使得结果可复现。
def seed_torch(seed=1029):
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
seed_torch()
上述代码在单gpu下可以保证多次运行的前向 & 后向 数值上完全一致。
但在多gpu下,不同次运行的前向完全一致,后向有偏差。第一个batch 的偏差在1e-10量级,但随着训练的深入,偏差会不断累积。导致性能差异。后弦中出现偏差的层不稳定,追踪了几次,有时出现在pooling,有时在bn。具体原因不详。