深度学习实验可复现设置
Pytorch
设置随机种子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def set_seed(seed, workers): os.environ['PYTHONHASHSEED'] = str(seed) random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed)
seed = 123 def seed_worker(worker_id): np.random.seed(seed + worker_id) random.seed(seed + worker_id) dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers, worker_init_fn=seed_worker)
|
若使用pytorch lightning,则使用seed_everything即可
1 2 3
| import lightning.pytorch as pl
pl.seed_everything(cfg.seed, workers=True)
|
设置CUDA卷积基准测试
CUDA卷积运算使用cuDNN库,可能导致不确定性
禁用基准测试功能可以解决该问题,但会严重降低计算效率
1
| torch.backends.cudnn.benchmark = False
|
设置CUDA卷积确定算法
虽然禁用CUDA卷积基准测试可以确保CUDA每次运行应用程序时都选择相同的算法,但算法本身可能是不确定的
启用确定算法可以解决该问题
1
| torch.backends.cudnn.deterministic = True
|
避免不确定的算法
配置PyTorch使其在可用的情况下使用确定性算法,而不是非确定性算法,并在已知操作是非确定性的(并且没有确定性替代方案)时抛出错误
该方法包括了torch.backends.cudnn.deterministic = True
1
| torch.use_deterministic_algorithms(True)
|
使用该方法时,如果代码中使用了CUDA的张量,并且CUDA版本在10.2及以上,需要设置环境变量CUBLAS_WORKSPACE_CONFIG
为:4096:8
或:16:8
1 2
| os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8' os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':16:8'
|
Tensorflow
为什么我用相同的模型,数据,超参,随机种子,在两台服务器会得到不同的结果? - TabChen的回答 - 知乎
参考
Reproducibility — PyTorch 2.1 documentation
2.1.4. Results Reproducibility — cuBLAS 12.3 documentation
PyTorch固定随机数种子-CSDN博客
Seed Everything - 可复现的 PyTorch(一) | Chenglu’s Log