最近发现相同的代码,参数,结果总是不一样,因此上网查了查,却发现了新版的pytorch和cuda要做到可复现多么麻烦
以官网https://pytorch.org/docs/stable/notes/randomness.html为准。
之前的代码想做到可复现性,只需要两句:
torch.random.seed(2021)
np.random.seed(2021)
但是现在不行了,需要以下几点
1. 种子设置
SEED = 2021
random.seed(SEED)
np.random.seed(SEED)
torch.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
2. 避免不确定算法
torch.backends.cudnn.deterministic = True
3. 避免卷积不确定
torch.backends.cudnn.benchmark = False
4. 避免RNN/LSTM不确定性
设置环境变量。cuda=10.2时:
CUDA_LAUNCH_BLOCKING=1
cuda>=10.2时:
CUBLAS_WORKSPACE_CONFIG=:16:8
或者
CUBLAS_WORKSPACE_CONFIG=:4096:2
5. 避免数据加载器的不确定性,使用worker_init_fn参数
def seed_worker(worker_id):
worker_seed = torch.initial_seed() % 2**32
numpy.random.seed(worker_seed)
random.seed(worker_seed)
DataLoader(
train_dataset,
batch_size=batch_size,
num_workers=num_workers,
worker_init_fn=seed_worker
)
希望能有用吧。