在科研中最怕的事之一:就是自己的模型结果无法复现,有时哪怕设置了随机种子也无法复现结果。这篇文档介绍一些常用的方法。
下面是一个设置随机数的函数,对于 pytorch 下面的函数就够用了。
def set_seed(seed): try: import tensorflow as tf tf.random.set_random_seed(seed) except Exception as e: print("Set seed failed,details are ", e) try: import torch torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False except Exception as e: print("Set seed failed,details are ", e) pass import numpy as np np.random.seed(seed) import random as python_random python_random.seed(seed) # cuda env import os os.environ["CUDA_LAUNCH_BLOCKING"] = "1" os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":16:8"
后面分别对 pytorch 和tensorflow 介绍特殊的情况。
官方的文档提到,对于 RNN 类模型会因为 cuDNN 和 CUDA 的原因导致结果无法复现,可以通过设置环境变量来解决。(之前的代码已经设置)
CUDA_LAUNCH_BLOCKING=1
CUBLAS_WORKSPACE_CONFIG=:16:8
或者 CUBLAS_WORKSPACE_CONFIG=:4096:2
.原文如下:
There are known non-determinism issues for RNN functions on some versions of cuDNN and CUDA. You can enforce deterministic behavior by setting the following environment variables:
On CUDA 10.1, set environment variable CUDA_LAUNCH_BLOCKING=1
. This may affect performance.
On CUDA 10.2 or later, set environment variable (note the leading colon symbol)CUBLAS_WORKSPACE_CONFIG=:16:8
or CUBLAS_WORKSPACE_CONFIG=:4096:2
.
See the cuDNN 8 Release Notes for more information.
除了之前的 set_seed(seed)
外还需要设置 PYTHONHASHSEED
环境变量为 0
,即PYTHONHASHSEED=0
。但注意 (不要在代码里设置),应该在外部执行时加上,例如:
CUDA_VISIBLE_DEVICES="" PYTHONHASHSEED=0 python your_program.py
以上就是 Pytorch/Tensorflow 确保结果可复现结果的方法,有问题可以评论,看到会立即回复。