【深度学习】torch消除模型训练的随机性,使结果可复现

本文探讨了深度学习中随机性对实验结果的影响,尤其是在复现研究和模型验证时。介绍了如何通过设置随机种子、控制Python、Numpy、PyTorch、DataLoader以及CUDA的随机性来确保一致性。此外,还提到了一个特定的分割任务中,由于UpsamplingBilinear2D操作的随机性导致的问题,并提供了解决方案。参考PyTorch官方文档,消除随机性有助于提高实验的可复现性和准确性。

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

目录

背景

方法

1、设置随机种子

2、消除Python与Numpy的随机性

3、消除torch的随机性

4、消除DataLoader的随机性


背景

现有的深度学习框架存在一定的随机性,在复现论文、验证模块有效性,SOTA实验时有很大的干扰,在之前的实验中,我所遇到的因随机性产生的模型准确率的差距可达10%。因此,消除随机性很有必要。

方法

1、设置随机种子

随机种子的设置可以使随机函数在当前种子下产生相同的随机数:

SEED=1234

SEED可以设置为任意值:0、666、123456等

2、消除Python与Numpy的随机性

import random
import numpy as np

random.seed(SEED)
np.random.seed(SEED)

3、消除torch的随机性

import torch
torch.manual_seed(SEED)
torch.cuda.manual_seed(SEED) # 适用于显卡训练
torch.cuda.manual_seed_all(SEED) # 适用于多显卡训练

4、消除DataLoader的随机性

在使用torch时,一般都会使用DataLoader加载数据集,这个类使用了多线程的处理方式,因此会造成一定随机性,可以使用如下方式消除:

def worker_init_fn(worker_id):
    random.seed(SEED + worker_id)

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

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=worker_init_fn
    generator=g,
)

 5、消除CUDA随机性(适用于GPU训练)

from torch.backends import cudnn

cudnn.benchmark = False
cudnn.deterministic = True

6、对于分割任务,UpsamplingBilinear2D随机性bug

最近遇到的一个bug,在消除了上述所有随机性后训练结果仍然复现,折腾了半天发现是双线性插值上采样的坑,如官方文档所说:

我使用的服务器显卡是NVIDIA RTX A40 48G,cuda版本为11.1,同样的问题在另一台服务器上就没出现,可能是cuda版本的问题,解决方法是将bilinear改为了nearest,但是可能会损失一定的精度。

参考:https://pytorch.org/docs/stable/notes/randomness.html

<think>嗯,用户想在深度学习训练中设置随机种子以确保实验可复现性。这个问题挺常见的,因为复现结果对研究很重要。首先,我得回忆一下随机种子在深度学习中的作用。通常,训练过程中涉及多个随机源,比如权重初始化、数据加载的shuffle、dropout层等。如果这些地方的随机性不控制,每次运行结果可能不同。 用户可能知道设置随机种子,但具体怎么操作可能不清楚。比如,Python自带的random模块,还有numpy的随机数生成,以及深度学习框架如TensorFlow或PyTorch都有自己的随机种子设置方法。需要分别设置这些库的种子,才能确保所有随机操作都被控制。 另外,框架特定的设置也很重要。比如在PyTorch中,除了设置Python、numpy和自身的种子,还需要设置CUDA的确定性选项,因为GPU运算可能有非确定性的算法。不过启用确定性可能会影响性能,这点需要提醒用户。 然后,还要考虑数据加载时的shuffle,如果在DataLoader里用了shuffle=True,那么设置随机种子后,每次加载的顺序应该一致。但如果有多个进程,可能还需要设置worker_init_fn来确保每个进程的随机种子不同但确定。 用户可能遇到的问题包括:设置了种子但结果还是不同,这时候需要检查是否遗漏了某些库的种子设置,或者是否有硬件相关的非确定性因素,比如GPU的并行计算。这时候可能需要更严格的设置,比如在PyTorch中使用torch.backends.cudnn.deterministic = True和torch.backends.cudnn.benchmark = False。 总结起来,步骤应该是:1)设置各个库的随机种子;2)配置框架的确定性选项;3)处理数据加载的多进程问题;4)注意硬件相关的非确定性因素。此外,还要提醒用户即使这样,某些情况下可能还是无法完全复现,比如不同版本的库或硬件差异。</think>在深度学习训练中,设置随机种子是确保实验可复现性的关键步骤。以下是具体操作方法及注意事项: ### 一、核心随机种子设置 1. **Python内置随机模块** 使用标准库`random`设置全局种子: ```python import random random.seed(42) # 设置Python全局随机种子 ``` 2. **NumPy随机数生成** 对涉及科学计算的随机操作进行控制: ```python import numpy as np np.random.seed(42) # 设置NumPy随机种子 ``` 3. **深度学习框架设置**(以PyTorch为例) ```python import torch torch.manual_seed(42) # 设置CPU随机种子 if torch.cuda.is_available(): torch.cuda.manual_seed_all(42) # 设置所有GPU随机种子 ``` ### 二、框架级确定性配置 ```python # 强制使用确定性算法(可能影响性能) torch.backends.cudnn.deterministic = True # 关闭算法自动优化(保证计算稳定性) torch.backends.cudnn.benchmark = False ``` ### 三、数据加载器设置 处理多进程数据加载时的随机性: ```python def seed_worker(worker_id): worker_seed = torch.initial_seed() % 2**32 numpy.random.seed(worker_seed) random.seed(worker_seed) DataLoader( dataset, batch_size=32, num_workers=4, worker_init_fn=seed_worker, # 关键设置 generator=torch.Generator().manual_seed(42) # 数据shuffle种子 ) ``` ### 四、特殊注意事项 1. **GPU相关随机性** 某些CUDA操作(如卷积)可能存在硬件级非确定性,建议: - 使用相同型号GPU - 保持CUDA/cuDNN版本一致 2. **并行计算影响** 多线程/多进程操作可能引入随机性差异,可通过设置环境变量控制: ```python import os os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8" # 针对NVIDIA GPU ``` 3. **第三方库依赖** 若使用其他机器学习库(如scikit-learn),需单独设置其随机种子: ```python from sklearn.model_selection import train_test_split train_test_split(..., random_state=42) ``` $$ \text{随机种子作用域公式:} S = \{ \text{Python}, \text{NumPy}, \text{DL框架}, \text{GPU} \} $$ ### 五、验证方法 通过连续两次运行验证设置效果: ```python # 第一次运行 output1 = model(input_data) # 重置模型后第二次运行 output2 = model(input_data) assert torch.allclose(output1, output2) # 应返回True ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

McGregorWwww

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值