在使用pytorch进行深度神经网络学习时,遇到了代码不能复现的情况,很是令人烦恼,经过一番实验,找到了一种设置方法。都说设置随机种子就能解决,但有的代码即使设置了随机种子,一些pytorch代码在CPU上运行能得到一致的结果,使用cuda版pytorch在GPU多次运行结果依旧不一样,后来网查查发现,有些pytorch算法cuda没有支持确定性实现。另外有网友建议不要使用torchvision,torchvision有些缺件还是蛮好用的。
当前的随机种子设置为:
import random
manualSeed = 1
random.seed(manualSeed)
np.random.seed(manualSeed)
torch.manual_seed(manualSeed)
torch.cuda.manual_seed(manualSeed)
torch.cuda.manual_seed_all(manualSeed)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
# 这么设置使用确定性算法,如果代码中有算法cuda没有确定性实现,则会报错,可以验证代码中有没有cuda没有确定性实现的代码
# torch.use_deterministic_algorithms(True)
# 这么设置使用确定性算法,如果代码中有算法cuda没有确定性实现,也不会报错
torch.use_deterministic_algorithms(True, warn_only=True)
os.environ['CUBLAS_WORKSPACE_CONFIG']=':4096:8'
注:虽然部分算法没有cuda确定性实现,但是用CUDA训练比CPU训练快太多了,平常基本还是要用CUDA训练,虽然训练结果不能保证完全一样,但是设置随机种子后,初始化的参数一样,结果应该也不会差太多。
参考文献:
2.Set warning or error with use_deterministic_algorithms #64883
3.RuntimeError: adaptive_max_pool2d_backward_cuda does not have a deterministic implementation……报错