深度学习实验可复现设置

深度学习实验可复现设置

Pytorch

设置随机种子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 为pytorch, numpy, python.random设置随机种子
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)
# torch.backends.cudnn.benchmark = False
# torch.backends.cudnn.deterministic = True

# 若dataloader设置了num_workers,则需为线程设置随机种子
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'  # 将会增加24M的GPU显存
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


深度学习实验可复现设置
https://wangaaayu.github.io/blog/posts/89953fb9/
作者
WangAaayu
发布于
2023年10月28日
更新于
2024年1月13日
许可协议