目的
我们为了重现模型,希望随机的部分再次重现的时候,能够得到相同的值。有时候为了模型比对也需要如此。
设置
import torch
import numpy as np
import random
def set_seed(seed: int = 7) -> None:
"""
设置相关函数的随机数种子
:param seed: 随机数种子
:return: None
"""
# 随机数种子设定
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
# CUDA中的一些运算,如对sparse的CUDA张量与dense的CUDA张量调用torch.bmm(),它通常使用不确定性算法。
# 为了避免这种情况,就要将这个flag设置为True,让它使用确定的实现。
torch.backends.cudnn.deterministic = True
# 设置这个flag可以让内置的cuDNN的auto-tuner自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题。
# 但是由于噪声和不同的硬件条件,即使是同一台机器,benchmark都可能会选择不同的算法。为了消除这个随机性,设置为 False
torch.backends.cudnn.benchmark = False
set_seed()
s = torch.tensor([1, 2, 3])
g = torch.zeros((2, 1))
print("g", g)
print("g normal", g.normal_(0.0, 1.0))
set_seed()
w = torch.zeros((2, 1))
print("w", w)
print("w normal", w.normal_(0.0, 1.0))
这样输出的 g 和 w 是一样的。
# 模型比对
即使设置的种子,依然在比对复杂模型的时候有一定难度。原因在,模型可能有些差异,那么这时候,可以考虑使用 fake_weight,两个模型都使用同样的随机值初始化权重。使用 apply 函数将其权重都使用相同的随机值进行初始化。具体参考 easytext, `mrc/tests/models/test_mrc_ner.py`
网友评论