Deterministic Pytorch: pytorch如何保证可重复性

为了在PyTorch中实现确定性训练,需设置随机种子以保证相同输入产生相同结果,例如设置cuDNN为非确定性模式。通过torch.backends.cudnn.enabled = False禁用cuDNN,或在效率更重要时使用torch.backends.cudnn.benchmark = True以自动寻找高效算法。但若输入数据每次迭代变化,可能降低效率。常见做法是同时开启cuDNN并启用benchmark。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

       要想整个模型是确定性的,我们需要设定好随机种子,这样当程序运行到具有random的模块时,由于伪随机的种子是相同的,那么随机得到的结果也是相同的。需要设定的随机种子如下。

def set_seed(self, seed=0):
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed) #为CPU设置种子用于生成随机数,以使得结果是确定的
    torch.cuda.manual_seed(seed) #为当前GPU设置随机种子;
    torch.cuda.manual_seed_all(seed) #如果使用多个GPU,为所有的GPU设置种子。
    torch.backends.cudnn.deterministic = True # CPU和GPU结果一致
    torch.backends.cudnn.benchmark = False

cuDNN使用非确定性算法,并且可以使用torch.backends.cudnn.enabled = False来进行禁用

如果设置为torch.backends.cudnn.enabled =True,说明设置为使用使用非确定性算法

然后再设置:

torch.backends.cudnn.benchmark = true

那么cuDNN使用的非确定性算法就会自动寻找最适合当前

### PyTorch中的确定性上采样和下采样 为了确保在PyTorch中实现可重复的结果,在使用上下采样函数时,设置随机种子是必要的。这可以通过`torch.manual_seed()`来完成[^1]。 当涉及到具体的层如用于上采样的`nn.Upsample`或用于下采样的池化层(例如最大池化`nn.MaxPool2d`),这些操作本身通常是确定性的——即对于相同的输入总是给出相同的结果。然而,某些情况下可能会遇到非确定行为,比如在多线程或多GPU环境中运行模型时。因此,除了设定全局随机种子外,还需要配置环境变量以强制执行确定性计算模式: ```python import os os.environ['CUBLAS_WORKSPACE_CONFIG'] = ":4096:8" import torch torch.use_deterministic_algorithms(True) ``` 上述代码片段通过调整CUDA库的工作空间大小并启用PyTorch的确定算法选项来增强程序的行为一致性。 下面是一个简单的例子展示如何创建一个带有确定性上采样功能的小型神经网络模块: ```python class DeterministicUpsampler(torch.nn.Module): def __init__(self, scale_factor=2): super(DeterministicUpsampler, self).__init__() self.upsample_layer = torch.nn.Upsample(scale_factor=scale_factor) def forward(self, x): return self.upsample_layer(x) if __name__ == "__main__": import numpy as np # 设置随机数种子以获得一致结果 seed_value = 42 torch.manual_seed(seed_value) model = DeterministicUpsampler() input_tensor = torch.randn((1, 3, 64, 64)) output_tensor = model(input_tensor) print(output_tensor.shape) ``` 同样地,可以定义类似的类来进行下采样处理,只需替换相应的层即可。需要注意的是,虽然大多数标准卷积和池化操作都是确定性的,但在分布式训练或其他复杂场景下仍需谨慎对待可能存在的不确定性因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值