news 2026/4/15 10:01:33

PyTorch中通过设置随机种子使训练结果可复现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PyTorch中通过设置随机种子使训练结果可复现

由于存在随机性,在同一台机子上,即使完全一致的代码,默认情况下,PyTorch每次训练的结果也有差异,无法复现。做了少许改动后,重新训练,结果有微小的变化,无法判断这变化是因改动导致的,还是因随机性导致的。

即使代码和各种超参、配置完全相同,只要存在随机性或非确定性算子,PyTorch的多次训练结果几乎多少都会有所差异,差异可能来自随机性、CUDA算子、并行执行、数值精度等多个层面:

1.权重初始化使用随机数,如nn.init.xavier_uniform_

2.DataLoader中的shuffle为True时以及DataLoader中的多进程worker,即num_workers不为0时

3.Dropout在训练时随机丢弃神经元

4.数据增强中RandomCrop、RandomFlip等

5.浮点数运算的非确定性,如浮点数运算的顺序、浮点数运算的累积误差

6.CUDA/GPU中的非确定性算子:Conv2d、BatchNorm等

7.cuDNN中的每次运行可能选不同kernel

即使同一台机子,不同GPU/驱动/CUDA版本也可能有差异

可以通过设置随机种子方式(控制所有随机源)来尝试复现训练结果,但无法保证在不同的PyTorch版本或不同平台上都能获得完全可复现的结果,此外,即使使用相同的随机种子,CPU和GPU执行的结果也可能无法复现。实现及测试代码如下:

import torch import torch.nn as nn import numpy as np import random import os def set_seed(seed=42): os.environ['PYTHONHASHSEED'] = str(seed) os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8' random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False torch.use_deterministic_algorithms(True) def seed_worker(worker_id): worker_seed = seed + worker_id np.random.seed(worker_seed) random.seed(worker_seed) return seed_worker def test_random(): data = [random.random() for _ in range(4)] print(f"random: {data}") data = [random.uniform(10, 20) for _ in range(4)] print(f"random: {data}") def test_numpy(): data = np.random.random(4) print(f"numpy: {data}") data = np.random.randn(4) print(f"numpy: {data}") class TinyNet(nn.Module): def __init__(self): super().__init__() self.fc = nn.Linear(8, 6) self.initialize_weights() def initialize_weights(self): nn.init.kaiming_uniform_(self.fc.weight, nonlinearity='relu') def forward(self, x): return self.fc(x) def test_torch(): data = torch.rand(4) print(f"torch: {data}") data = torch.randn(4) print(f"torch: {data}") model = TinyNet() weight_flat = model.fc.weight.flatten() for i in range(min(4, len(weight_flat))): print(f"{weight_flat[i]:.6f}", end=" ") print() # if num_workers is not 0 in DataLoader, then worker_init_fn and generator need to be set # worker_init_fu = seed_worker # set_seed(seed) # generator = torch.Generator().manual_seed(seed) if __name__ == "__main__": seed_worker = set_seed(42) # seed_worker is used by DataLoader test_random() test_numpy() test_torch() print("====== execution completed ======")

说明

1.random.seed(seed):Python随机数生成器设置种子

2.np.random.seed(seed):NumPy随机数生成器设置种子

3.torch.manual_seed(seed):PyTorch随机数生成器,为所有设备(包括CPU和CUDA)设置随机数生成器种子

4.torch.cuda.manual_seed(seed):设置当前GPU生成随机数的种子。即使CUDA不可用,调用此函数也是安全的;在这种情况下,它会被静默忽略

5.torch.cuda.manual_seed_all(seed):设置所有GPU上生成随机数的种子。即使CUDA不可用,调用此函数也是安全的;在这种情况下,它会被静默忽略

6.torch.backends.cudnn.deterministic = True:控制CUDA使用确定性算法

7.torch.backends.cudnn.benchmark = False:禁用基准测试功能,会导致cuDNN确定性地选择一个算法,但这可能会降低性能

8.torch.use_deterministic_algorithms(True):避免使用非确定性算法。确定性操作通常比非确定性操作慢,因此模型的单次运行性能可能会降低。在已知某个操作是非确定性操作(且没有确定性替代方案)时抛出错误

9.os.environ['CUBLAS_WORKSPACE_CONFIG'] = ':4096:8':当CUDA版本>=10.2时,需设置环境变量CUBLAS_WORKSPACE_CONFIG

10.os.environ['PYTHONHASHSEED'] = str(seed):设置哈希种子

执行结果如下图所示:执行多次,每次输出结果相同

GitHub:https://github.com/fengbingchun/NN_Test

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 7:20:53

Excalidraw语音注释功能设想:多模态交互探索

Excalidraw语音注释功能设想:多模态交互探索 在一场紧张的远程架构评审会上,主讲人一边讲解系统设计,一边手忙脚乱地切换麦克风和鼠标——刚说到“这个服务要加个熔断机制”,却不得不暂停讲述去拖拽一个新组件。思维被打断&#x…

作者头像 李华
网站建设 2026/4/15 15:29:35

Win10/11系统下WSL2+Ubuntu的全流程安装

Win10/11系统下WSL2Ubuntu的全流程安装 WSL介绍 WSL(Windows Subsystem for Linux)是微软为 Windows 10 和 Windows 11 提供的一个兼容层,允许用户在 Windows 环境下原生运行 Linux 发行版。WSL 可以让开发者和系统管理员在 Windows 上使用…

作者头像 李华
网站建设 2026/4/14 19:20:50

Excalidraw蓝绿发布策略:零停机更新服务

Excalidraw蓝绿发布策略:零停机更新服务 在远程协作日益成为工作常态的今天,一款白板工具是否“稳定可用”,往往直接决定了团队能否顺畅推进一次产品讨论或架构设计。Excalidraw 作为开源手绘风格协作白板的代表,凭借其简洁体验与…

作者头像 李华
网站建设 2026/4/15 8:16:20

Excalidraw CI/CD流水线搭建:代码变更自动部署

Excalidraw CI/CD 流水线构建:从代码提交到自动部署的实践 在现代团队协作中,可视化工具早已不再是可有可无的辅助品。尤其是在远程办公常态化、敏捷开发深入落地的背景下,像 Excalidraw 这类轻量级、高自由度的手绘风格白板工具&#xff0c…

作者头像 李华
网站建设 2026/4/15 8:31:20

【FreeRTOS实战】互斥锁专题

【FreeRTOS实战】互斥锁专题 更详细的开发过程请参考【FreeRTOS实战】信号量专题:从底层原理到中断同步。 5. 实际应用案例:从理论到STM32代码 5.1 案例1:优先级反转演示与解决方案 下面我们通过一个完整的STM32代码示例,演示…

作者头像 李华
网站建设 2026/4/10 10:32:12

我发现LLM实时翻译方言问诊 某县医院误诊率直降30%

📝 博客主页:Jax的CSDN主页 目录 当AI医生遇上老中医:一场2125年的健康闹剧 一、开场白:AI医生的"职业危机" 二、AI诊断的"三宗罪" 1. 模型幻觉的代价 2. 多模态数据的"薛定谔诊断" 3. 医患关系的&…

作者头像 李华