在Python中如何解决PyTorch模型训练过程中的随机性种子设置?

雨晨大大_8643

雨晨大大_8643

2026-06-20

396人浏览

原创

不够。只设 torch.manual_seed 无法覆盖 random、numpy、CUDA、DataLoader 多进程及 cuDNN 等多个独立随机源,必须同时固定这四类种子、禁用 cudnn.benchmark、启用 cudnn.deterministic,并为 DataLoader 显式配置 generator 和 worker_init_fn。

在python中如何解决pytorch模型训练过程中的随机性种子设置?

PyTorch训练结果不一致,是不是只设 torch.manual_seed 就够了?

不够。只调用 torch.manual_seed 只能控制 PyTorch CPU 张量的初始化和部分算子(如 torch.rand),但训练中还有多个独立的随机源未被覆盖,导致即使种子相同,不同运行间 loss 或权重更新仍可能漂移。

必须同时固定以下四个来源:

  • python 自带的 random 模块(影响数据采样、增强逻辑等)
  • numpy(很多自定义 transform、label shuffle 依赖它)
  • torch CPU 和 GPU(torch.cuda.manual_seed_all 对多卡尤其关键)
  • 如果用了 Dataloader 的 shuffle=True,还需设 generator 参数(否则 shuffle 内部用的是未受控的默认 RNG)

如何正确设置全部随机种子?

推荐封装成一个函数,在训练脚本最开头(import 后、模型/数据加载前)调用:

def set_seed(seed: int):
    import random
    import numpy as np
    import torch
    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    if torch.cuda.is_available():
        torch.cuda.manual_seed_all(seed)

但注意:这还不够——DataLoader 的 shuffle 默认不认这个 seed。必须显式传入 generator:

train_loader = DataLoader(
    dataset,
    batch_size=32,
    shuffle=True,
    generator=torch.Generator().manual_seed(42)  # 必须单独设!
)

别用 torch.Generator(device="cuda"),除非你确定所有 worker 都在 GPU 上跑(实际几乎不会),否则会报错或失效。

为什么开了 num_workers > 0 还是不复现?

因为每个 worker 子进程会继承主进程的 seed,但 Python 的 random 和 numpy 状态**不会自动同步到子进程**,导致每个 worker 内部的随机行为不可控。

Python Dependency Candidate Fetcher 2
Python Dependency Candidate Fetcher 2

根据包的能力以及 Jupyter 环境中的导入语句,从候选列表中挑选最适合用户表格工作流的 Python 包。

下载

解决方法是在 DataLoader 中加 worker_init_fn:

def worker_init_fn(worker_id):
    import random
    import numpy as np
    import torch
    worker_seed = torch.initial_seed() % 2**32
    random.seed(worker_seed)
    np.random.seed(worker_seed)
<p>train_loader = DataLoader(
dataset,
num_workers=4,
worker_init_fn=worker_init_fn,
generator=torch.Generator().manual_seed(42)
)</p>

这里的关键是用 torch.initial_seed() —— 它返回当前 worker 初始化时的真实 seed,比硬编码更可靠;而 % 2**32 是为了适配 numpy.random.seed() 要求的 uint32 范围。

还有哪些容易被忽略的随机性来源?

这些点不常被文档强调,但实测会影响复现性:

  • torch.backends.cudnn.enabled = True(默认开启)时,cuDNN 会启用非确定性算法加速卷积。必须关掉:torch.backends.cudnn.enabled = False
  • 更进一步,设 torch.backends.cudnn.deterministic = True(强制使用确定性算法),同时 torch.backends.cudnn.benchmark = False(禁用 benchmark,否则首次运行会选快但不确定的 kernel)
  • 如果你用了 torch.compile 或 torch._dynamo,目前(v2.3)仍存在非确定性行为,建议暂时关闭
  • 某些第三方库(如 albumentations)内部用 cv2 或自己的 RNG,需查其文档看是否支持 seed 注入

GPU 显存分配顺序、TensorRT 插件、甚至某些 NCCL 版本下的分布式 all-reduce 都可能引入微小差异——真正追求 100% 复现,得在完全相同的软硬件环境里跑,且接受训练速度明显下降。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python pytorch

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1851

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

5004

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

30117

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3587

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3607

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1243

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2783

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习