【Pytorch】固定随机数种子

在对神经网络模型进行训练时,有时候会存在对训练过程进行复现的需求。然而,每次运行时 Pytorch、Numpy 中的随机性将使得该目的变得困难重重。在程序运行前固定所有随机数的种子有望解决这一问题。基于此,本文记录了 Pytorch 中的固定随机数种子的方法。

在使用 Pytorch 对模型进行训练时,通常涉及到随机数的模块包括:Python、Pytorch、Numpy、Cudnn。因此,在开始训练前,需要针对这些涉及随机数的模块进行随机数种子的固定。

1. Python

Python 本身涉及到的随机性主要是 Python 自带的 random 库随机化和 Hash 随机化问题,需要通过 os 库对其进行限制:

python 复制代码
import os, random
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
2. Numpy

在使用 Numpy 库取随机数时,需要对其随机数种子进行限制:

python 复制代码
import numpy as np
np.random.seed(seed)
3. Pytorch

当 Pytorch 使用 CPU 进行运算时,需要设定 CPU 支撑下的 Pytorch 随机数种子:

python 复制代码
import torch
torch.manual_seed(seed)

当 Pytorch 使用 GPU 进行运算时,需要设定 GPU 支撑下的 Pytorch 随机数种子:

python 复制代码
import torch
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # 使用多 GPU 时使用

需要特别注意的是:目前很多博客和知乎回答提出 torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) 具有相同的作用。这个结论需要注意 Pytorch 版本。在笔者所用的 Pytorch 2.1 版本下,这两个函数的作用完全不同。参考官方文档:torch.cuda.manual_seedtorch.cuda.manual_seed_all(seed)

当 Pytorch 使用 Cudnn 进行加速运算时,还需要限制 Cudnn 在加速过程中涉及到的随机策略:

python 复制代码
import torch
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
总结

基于上述库的固定随机数方法总结为:

python 复制代码
def set_random_seed(seed: int) -> None:
	random.seed(seed)
	os.environ['PYTHONHASHSEED'] = str(seed)
	np.random.seed(seed)
	torch.manual_seed(seed)
	torch.cuda.manual_seed_all(seed)
	torch.backends.cudnn.benchmark = False
	torch.backends.cudnn.deterministic = True

seed = 114514
set_torch_seed(seed)

如果在实践中还调用了其他涉及随机性的第三方库,则需要根据上述思路对该固定随机数方法进行动态补充。

相关推荐
song150265372982 分钟前
如何选择适合的AI视觉检测设备?
人工智能
FE_C_P小麦2 分钟前
AI Prompt 提示词模板【转载】
人工智能
桂花饼8 分钟前
量化双雄争霸:九坤 IQuest-Coder-V1 的技术突破
人工智能·aigc·nano banana 2·openai兼容接口·claude opus 4.5·sora2 pro
undsky_14 分钟前
【n8n教程】:RSS Feed Trigger节点,玩转RSS订阅自动化
人工智能·ai·aigc·ai编程
摘星编程18 分钟前
【RAG+LLM实战指南】如何用检索增强生成破解AI幻觉难题?
android·人工智能
人工智能培训19 分钟前
什么是马尔可夫决策过程(MDP)?马尔可夫性的核心含义是什么?
人工智能·深度学习·机器学习·cnn·智能体·马尔可夫决策
数据饕餮21 分钟前
提示词工程实训营08- 写作助手:文章、报告、创意文案——从“写作困难户“到“高产作家的蜕变秘籍
人工智能·大模型·提示词工程
wenzhangli722 分钟前
告别手撸架构图!AI+Ooder实现漂亮架构+动态交互+全栈可视化实战指南
人工智能·架构·交互
线束线缆组件品替网23 分钟前
Amphenol LTW 防水线缆 IP67/IP68 结构解析
运维·网络·人工智能·汽车·硬件工程·材料工程
码农水水36 分钟前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php