Torch 实验复现需要设置的随机种子

参考官方文档 Reproducibility

# torch
import torch
torch.manual_seed(0)
# python
import random
random.seed(0)
# numpy
import numpy as np
np.random.seed(0)
# cudnn
torch.backends.cudnn.benchmark = False # 语句1,关闭卷积优化
torch.backends.cudnn.deterministic = True # 语句2,使用确定性的操作,该语句在新版本torch(1.9及以后版本)中被以下语句3替代
torch.use_deterministic_algorithms(True) # 语句3,该语句新版本torch(1.9及以后版本)实现,功能更强大,建议使用该语句代替语句2使用

新版本里提供了torch.use_deterministic_algorithms()函数来check 是否使用不确定性算法。
上述参数设置为True时:torch.use_deterministic_algorithms(True) 将torch中的不确定性算法用已有的确定性算法替代,若没有替代算法时报错。
该语句与torch.backends.cudnn.deterministic = True的区别:
torch.backends.cudnn.deterministic = True只控制cuda卷积的确定性
torch.use_deterministic_algorithms(True)会check所有torch操作的确定性

torch.use_deterministic_algorithms() lets you configure PyTorch to use deterministic algorithms instead of nondeterministic ones where available, and to throw an error if an operation is known to be nondeterministic (and without a deterministic alternative).

While disabling CUDA convolution benchmarking (discussed above) ensures that CUDA selects the same algorithm each time an application is run, that algorithm itself may be nondeterministic, unless either torch.use_deterministic_algorithms(True) or torch.backends.cudnn.deterministic = True is set. The latter setting controls only this behavior, unlike torch.use_deterministic_algorithms() which will make other PyTorch operations behave deterministically, too.

TIP: 如果使用CUDA tensor并且CUDA版本在10.2及以上,需要额外设置CUBLAS_WORKSPACE_CONFIG 以保证可复现性。

Furthermore, if you are using CUDA tensors, and your CUDA version is 10.2 or greater, you should set the environment variable CUBLAS_WORKSPACE_CONFIG according to CUDA documentation: https://docs.nvidia.com/cuda/cublas/index.html#cublasApi_reproducibility

其余操作的确定性:
CUDA RNN and LSTM

In some versions of CUDA, RNNs and LSTM networks may have non-deterministic behavior. See torch.nn.RNN() and torch.nn.LSTM() for details and workarounds.

DataLoader

DataLoader will reseed workers following Randomness in multi-process data loading algorithm. Use worker_init_fn() and generator to preserve reproducibility:

def seed_worker(worker_id):
    worker_seed = torch.initial_seed() % 2**32
    numpy.random.seed(worker_seed)
    random.seed(worker_seed)

g = torch.Generator()
g.manual_seed(0)

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=seed_worker,
    generator=g,
)
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
dataloader是PyTorch中用于加载数据的工具,它可以方便地对数据进行预处理、转换和加载。在使用dataloader加载数据时,我们可以通过设置随机种子来控制数据的洗牌(shuffle)过程。 为什么需要设置随机种子呢?在训练深度学习模型时,通常需要将数据集随机打乱来增加模型的泛化性能,减少模型对数据的依赖性。随机洗牌可以打破输入数据的顺序性,使模型更好地学习数据的特征和规律。但是,在同样的训练过程中,我们希望每次运行时的随机结果都是一致的,这样才能确保模型的可复现性,方便我们进行调试和比较实验结果。 因此,我们可以通过设置随机种子来控制dataloader加载数据时的洗牌过程。在使用dataloader加载数据时,可以通过设置参数shuffle=True来开启洗牌功能。同时,我们可以通过设置参数torch.manual_seed(seed)来设置随机种子的值。这样,每次运行时,dataloader在洗牌数据时都会使用相同的随机种子,从而保证了每次的洗牌结果都是一致的。 例如,我们可以使用以下代码来设置随机种子为10,并开启洗牌功能: torch.manual_seed(10) dataloader = DataLoader(dataset, shuffle=True) 这样,每次运行时,dataloader都会使用相同的随机种子10进行数据洗牌,从而保证了每次的洗牌结果都是一致的。这对于实验结果的比较和模型的可复现性非常重要。 总之,通过设置随机种子,我们可以在dataloader加载数据时控制洗牌过程,确保每次洗牌结果的一致性,从而提高模型的可复现性和实验的可比性。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值