当前位置: 首页 > news >正文

Pytorch训练固定随机种子(单卡场景和分布式训练场景)

模型的训练是一个随机过程,固定随机种子可以帮助我们复现实验结果。

接下来介绍一个模型训练过程中固定随机种子的代码,并对每条语句的作用都会进行解释。

def seed_reproducer(seed=2333):random.seed(seed)os.environ["PYTHONHASHSEED"] = str(seed)np.random.seed(seed)torch.manual_seed(seed)if torch.cuda.is_available():torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.deterministic = Truetorch.backends.cudnn.benchmark = Falsetorch.backends.cudnn.enabled = True

这是一个自定义函数,函数的参数就是我们传入的种子的数值,类型为int,作用就是消除训练过程中的随机性,以确保实验得可重复性,具体使用方法为在初始化模型和dataset前调用该函数即可。

接下来逐句讲解每个语句的作用。


random.seed(seed)

  • 作用:设置python内置random模块的种子,确保所有使用random模块产生的随机数序列是确定的;
  • 应用场景:适用于任何使用random模块的地方,例如数据增强、采样等。

os.environ["PYTHONHASHSEED"] = str(seed)

  • 作用:设置python的哈希种子,python字典和其他哈希表结构依赖于哈希函数,而哈希函数的行为在不同运行之间可能会不同,通过设置PYTHONHASHSEED环境变量,可使哈希结果在同一种子下保持一致;
  • 应用场景:确保字典键值对顺序的一致性,避免因哈希碰撞引起的非确定性行为。

np.random.seed(seed)

  • 作用:设置Numpy库的随机种子;
  • 应用场景:适用于所有使用Numpy生成随机数的地方,例如初始化权重、数据打乱等。

torch.manual_seed(seed)

  • 作用:为Pytorch设置全局种子,确保所有使用Pytorch身材的随机数(包括张量操作)都是确定性的;
  • 应用场景:适用于所有使用Pytorch生成随机数的地方。

 为了方便结合代码进行理解,在这里单独把后半部分的代码复制一下。

if torch.cuda.is_available():torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.deterministic = Truetorch.backends.cudnn.benchmark = Falsetorch.backends.cudnn.enabled = True

if torch.cuda.is_available():

条件判断,只有当CUDA可用时才进行以下设置,这确保了代码可以在没有GPU的环境中正常运行。

torch.cuda.manual_seed(seed)

  • 作用:为当前GPU设置随机种子,这确保了所有在当前GPU上生成的随机数都是确定的;
  • 应用场景:适用于单个GPU的随机数生成。

torch.cuda.manual_seed_all(seed)

  • 作用:为所有可用的GPU设置相同的随机种子,这确保了在多GPU环境中,每个GPU上随机生成的随机数都是一致的;
  • 应用场景:适用于多GPU环境中的随机数生成。

torch.backends.cudnn.deterministic = True

  • 作用:确保cuDNN使用确定性的算法,某些cuDNN算法是具有随机性的,启用此选项可以提高结果的可重复性,但是可能会降低性能;
  • 应用场景:适用于需要严格可重复性的实验。

torch.backends.cudnn.benchmark = False

  • 作用:禁用cuDNN的自动选择最佳卷积算法的功能,默认情况下cuDNN会在首次运行时尝试找到最适合硬件的算法,这可能会导致结果的不确定性,禁用此选项可以确保每次都是用相同的算法;
  • 应用场景:适用于需要严格可重复性的实验。

torch.backends.cudnn.enabled = True

  • 作用:启用cuDNN,虽然设置了deterministicbenchmark参数来控制cuDNN的行为,但仍然需要确保cuDNN是启用的;
  • 应用场景:所有需要使用GPU加速pytorch计算的场景。

多卡训练的情况

对于多卡训练的情况,设置随机种子的方式需要特别注意,以确保每个进程(或者称为“rank”)生成的随机数序列是不同的,同时还需要保证整个训练过程的可重复性。基于上述要求,随机种子可使用如下代码进行修改:

seed = args.seed + utils.get_rank()
  • args.seed:我们指定的seed的数值,通常在模型训练的配置文件中,或者通过命令行参数传入模型的训练脚本;
  • utils.get_rank():这是自定义的一个函数,位于自定义库utils中,具体作用是获得当前进程的全局序号,比如在进行分布式训练时,有2台机器(我们成之为2个节点),每台机器有8张GPU,则一共会有2*8=16个进程,每个进程都会有唯一的序号,从0~15。

因此我们看到,对于分布式训练场景,随机种子只需要确定一个全局种子(args.seed)在加上一个增量(utils.get_rank()),而这个增量对于每个进程来说是固定的。

下面是get_rank()函数的具体实现:

import torch.distributed as distdef is_dist_avail_and_initialized():# 判断当前环境中是否支持分布式训练if not dist.is_available():return False# 检查当前环境是否已经成功初始化了分布式训练环境if not dist.is_initialized():return Falsereturn Truedef get_rank():# 判断分布式训练是否可用且是否已成功初始化if not is_dist_avail_and_initialized():return 0return dist.get_rank()

http://www.lryc.cn/news/500775.html

相关文章:

  • Conda + JuiceFS :增强 AI 开发环境共享能力
  • 人工智能-人机交互的机会
  • 【系统架构核心服务设计】使用 Redis ZSET 实现排行榜服务
  • elasticsearch基础总结
  • 【慕伏白教程】Zerotier 连接与简单配置
  • Brain.js(九):LSTMTimeStep 实战教程 - 未来短期内的股市指数预测 - 实操要谨慎
  • C# 字符串(String)
  • 二进制文件
  • 【电子元器件】音频功放种类
  • linux之vim
  • QT的ui界面显示不全问题(适应高分辨率屏幕)
  • 数据结构--串、数组和广义表
  • LLMs之Agent之Lares:Lares的简介、安装和使用方法、案例应用之详细攻略
  • 1-1.mysql2 之 mysql2 初识(mysql2 初识案例、初识案例挖掘)
  • 企业邮箱为什么不能经常群发邮件?
  • 集成运算放大电路反馈判断
  • 媒体查询、浏览器一帧渲染过程
  • 高级排序算法(一):快速排序详解
  • 3.2 网络协议IP
  • 2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组)
  • excel如何让单元格选中时显示提示信息?
  • oscp备考,oscp系列——Kioptix Level 3靶场
  • 信创改造-达梦数据库配置项 dm.ini 优化
  • 日本IT-需要掌握哪些技术框架?一篇通读
  • 错题:Linux C语言
  • 多表设计-一对多一对多-外键
  • Ch1:古今的manipulation与仿真、ROS和Drake介绍
  • JAVA秋招面试题精选-第一天总结
  • 服务器卸载安装的 Node.js
  • 深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(下)