琢磨了很久,终于解决了实验可复现的问题,截图留个纪念。
解决方案:
pytorch版本:1.9
python版本:3.8
由于pytorch版本更新,增加了很多需要固定的随机因素。
1.设置随机种子
# 可直接调用此函数
def set_seed(seed=0):
print('seed = {}'.format(seed))
os.environ['PYTHONHASHSEED'] = str(seed)
# 使用lstm需要添加下述环境变量为:16:8,如果cuda版本为10.2,去百度一下应该将环境变量设为多少。
os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":16:8"
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.
# torch.backends.cudnn.benchmark = True
# use_deterministic_algorithms用于自查自己的代码是否包含不确定的算法,报错说明有,根据报错位置查询并替代该处的算法。1.8之前的版本好像没有此方法。
torch.use_deterministic_algorithms(True)
torch.backends.cudnn.enabled = False
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
2.设置dataloader
# 这部分不要动,官方给的。。。
def seed_worker(worker_id):
worker_seed = torch.initial_seed() % 2 ** 32
np.random.seed(worker_seed)
random.seed(worker_seed)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
pin_memory=True,
batch_size=args.batch_size,
shuffle=True,
num_workers=args.num_workers,
drop_last=True,
# 此处添加seed,不需要括号哦,问为什么,我也不晓得
worker_init_fn=seed_worker)
——————————————————————————————————————
注意:把其他部分的cuda加速或者随机种子代码删掉,版本不匹配无法使用上述代码那就重装一下pytorch。
——————————————————————————————————————