【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)

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

相关推荐
_WndProc9 分钟前
【Python】Flask网页
开发语言·python·flask
笑衬人心。10 分钟前
初学Spring AI 笔记
人工智能·笔记·spring
互联网搬砖老肖11 分钟前
Python 中如何使用 Conda 管理版本和创建 Django 项目
python·django·conda
luofeiju20 分钟前
RGB下的色彩变换:用线性代数解构色彩世界
图像处理·人工智能·opencv·线性代数
测试者家园22 分钟前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
张较瘦_26 分钟前
[论文阅读] 人工智能 + 软件工程 | Call Me Maybe:用图神经网络增强JavaScript调用图构建
论文阅读·人工智能·软件工程
大模型真好玩27 分钟前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp
前端付豪35 分钟前
11、打造自己的 CLI 工具:从命令行到桌面效率神器
后端·python
前端付豪35 分钟前
12、用类写出更可控、更易扩展的爬虫框架🕷
后端·python
Baihai_IDP41 分钟前
vec2text 技术已开源!一定条件下,文本嵌入向量可“近乎完美地”还原
人工智能·面试·llm