最近被pytorch的模型复现搞了一波心态,每次训练结果不一样,一开始还以为自己的网络优化有效,谁知每次训练结果是不固定的,调了很久终于让模型固定了下来,在此记录下这个坑。 针对pytorch1.7.1进行随机种子的设置,使得网络每次训练结果固定。这样就能方便查看是修改网络导致的精度提升还是随机性导致的。
def setup_seed(seed):
np.random.seed(seed)
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8'
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.manual_seed(seed)
torch.use_deterministic_algorithms(True)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.enabled = False
torch.backends.cudnn.benchmark = False
除了cuda和cudnn的随机性,若使用Dataloder的话也要注意设置,参照官网:https://pytorch.org/docs/stable/notes/randomness.html。
def worker_init_fn(worked_id):
worker_seed = torch.initial_seed() % 2**32
np.random.seed(worker_seed)
random.seed(worker_seed)
Data.DataLoader(
dataset=xxx,
batch_size=xxx,
shuffle=xxx,
worker_init_fn=worker_init_fn,
num_workers=0,
)
上述操作应该只能保证在同一设备固定,除非两台设备装的所有环境都一样,可能两台设备的结果都一样。 如果经过上述操作在同一设备仍然固定不了,这就是个值得思考的问题。看看是不是设置了nn.LSTM的dropout参数,听说这个是不能用随机种子固定的,有空到时试一下。
|