pytorch 模型复现

一般来说,设置相同的随机种子,在相同参数条件下,能使pytorch模型复现出相同的结果。随机种子的设置代码如下:

def get_random_seed(seed):random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.backends.cudnn.deterministic = Truetorch.backends.cudnn.benchmark = Falseget_random_seed(42)

相关的说明可参考:PyTorch系列 | 随机种子与可复现性 或 pytorch reproducibility

但当我采用这种方式时,却并不管用。从pytorch相关issue中了解到:有些算法是不确定的,如果你的网络模型中使用了这类算法,那么即使你设置了相同的随机种子也无法完全复现。虽然可以通过torch.backends.cudnn.deterministic = True选用确定性的算法,但某些算法只有不确定的实现方式。

在代码中添加torch.use_deterministic_algorithms(True),它会强制使用确定性算法,如果使用了不确定算法,则会出现RuntimeError错误。我在添加该代码后得到如下提示:

RuntimeError: Deterministic behavior was enabled with either torch.use_deterministic_algorithms(True) or at::Context::setDeterministicAlgorithms(true), but this operation is not deterministic because it uses CuBLAS and you have CUDA >= 10.2. To enable deterministic behavior in this case, you must set an environment variable before running your PyTorch application: CUBLAS_WORKSPACE_CONFIG=:4096:8 or CUBLAS_WORKSPACE_CONFIG=:16:8. For more information, go to https://docs.nvidia.com/cuda/cublas/index.html#cublasApi_reproducibility

它提示我通过设置环境变量CUBLAS_WORKSPACE_CONFIG=:4096:8CUBLAS_WORKSPACE_CONFIG=:16:8可以启用确定性操作。

于是我在代码中添加了os.environ['CUBLAS_WORKSPACE_CONFIG']=":4096:8"。随后出现了如下错误:

RuntimeError: reflection_pad2d_backward_cuda does not have a deterministic implementation, but you set ‘torch.use_deterministic_algorithms(True)’. You can turn off determinism just for this operation, or you can use the ‘warn_only=True’ option, if that’s acceptable for your application. You can also file an issue at https://github.com/pytorch/pytorch/issues to help us prioritize adding deterministic support for this operation.

上面提到反向传播中使用的reflection_pad2d_backward_cuda 只有非确定算法实现方式。而强制使用torch.use_deterministic_algorithms(True)将会抛出错误。(可以通过torch.use_deterministic_algorithms(True, warn_only=True)将错误改为警告)

现在问题很明确了,不确定性算法无法避免(或许可以修改代码替换掉模型中的不确定性算法)。但通过上面的一系列设置,其实我们已经把算法的不确定性降到了最低,这种情况下能使复现的结果比较接近,不会偏差太大。

为验证固定随机种子的效果,我做了三组实验,条件分别为①固定随机种子,尽可能选用随机参数(设置torch.backends.cudnn.deterministic = True);②只固定随机种子;③不进行限定。
在相同实验条件下进行100次实验,每次实验中网络进行10次反向传播,得到输出结果(选取输出张量的第一个值)如下:

Fix seed & deterministicFix seedNo restrictions
0.3155944940.3127974270.500693619
0.308120430.3132260440.451529086
0.3143489960.31047523-0.18644166
0.3107444050.31160301-0.123521239
0.3146435020.3130797450.147185132
0.3133639690.313408256-0.154002443

其方差依次为:0.00228085 0.002338273 0.264102969。可以看到,相比不固定随机种子,固定随机种子得到的结果方差更小,结果更加接近。

如果结果能比较接近的话,其实也不用太过纠结是否能完全复现。

扩展

我在训练的过程中发现,当代码在cpu上运行时,结果是可以复现的。而切换到gpu上时,就出现了上面的问题,不确定性算法是在gpu中引入的。

上面的错误中说reflection_pad2d_backward_cuda does not have a deterministic implementation,显然,reflection_pad2d_backward_cuda 是cuda上的操作,即gpu上进行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA基础以太网

以太网数据通信 物理层:网线网卡(PHY芯片) 数据链路层:Mac层(数据有效传输) 如图所示:FPGA中的Mac层中的MII接口负责控制PHY芯片,PHY芯片通过网线与PC端进行以太网数据传输。 FPGA中&#xff…

Oracle 服务器日常巡检

文章目录 1、数据库基本状况检查2、数据库相关资源使用情况检查3、检查Oracle数据库性能4、数据库服务器CPU、MEM、I/O性能5、数据库服务器安全检查 Oracle数据库的日常巡检内容包括: (1)Oracle数据库基本状况检查; &#xff08…

揭露 bbr 的真相

信 bbr 的伙计们,我又要泼冷水了,哈哈。 从先 bbr 的海报开始,相信大家也是被它唬住的: 注意横坐标标度是对数,这就凸显了优势。 把它展开到自然数坐标,再把其它对照画在一个坐标系里,在此之…

让代码变美的第二天 - 策略模式

丑陋的模样 public Fruit buyFruit(String name) {if ("苹果".equals(name)) {return new BuyApple().buy();} else if ("香蕉".equals(name)) {return new BuyBanana().buy();} else if ("西瓜".equals(name)) {// 买西瓜if (true) {// todo} e…

JVM jstat 查看内存新生代老年代回收情况,排查oom

jstat 命令 jstat - [-t] [-h] [ []] option:我们经常使用的选项有gc、gcutil vmid:java进程id interval:间隔时间,单位为毫秒 count:打印次数 每秒打印一次 jstat -gc 9162 1000S0C:年轻代第一个survivor的容量…

实时音视频方案汇总

若有好的方案欢迎留言讨论,非常感谢,汇总了一些,从市面上了解的一些低时延的端到端的方案,仅供参照,若有问题,也欢迎留言更正! 方案 方案描述 时延 备注 1大华同轴高清电缆200米电缆&#xf…

致远OA wpsAssistServlet 任意文件上传漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、产品简介 致远OA互联新一代智慧型协同运营平台以中台的架构和技术…

linux effective_protection函数实现

函数的目的是根据 cgroup 的配额来计算它实际能从上层group中瓜分的额度。 以 min 为例: struct page_counter {/** Make sure usage does not share cacheline with any other field. The* memcg->memory.usage is a hot member of struct mem_cgroup.*/atomic_…

8.jib-maven-plugin构建springboot项目镜像,docker部署配置

目录 1.构建、推送镜像 1.1 执行脚本 2.2 pom.xml配置 ​2.部署镜像服务 2.1 执行脚本 2.2 compose文件 3.docker stack常用命令 介绍:使用goole jib插件构建镜像,docker stack启动部署服务; 通过执行两个脚本既可以实现构建镜像、部…

Scala---方法与函数

一、Scala方法的定义 有参方法&无参方法 def fun (a: Int , b: Int) : Unit {println(ab) } fun(1,1)def fun1 (a: Int , b: Int) ab println(fun1(1,2)) 注意点: 方法定义语法 用def来定义可以定义传入的参数,要指定传入参数的类型方法可以写返…

Stable Diffusion1.5网络结构-超详细原创

目录 1 Unet 1.1详细整体结构 1.2 缩小版整体结构 1.3 时间步编码 1.4 CrossAttnDownBlock2D 1.4.1 ResnetBlock2D 1.4.2 Transformer2DModel 1.4.2.1 BasicTransformerBlock 1.4.2.1.1 SelfAttention 1.4.2.1.2 CrossAttention 1.4.2.1.3 FeedForward 1.4.3 DownS…

windows虚拟内存自定义分配以及mysql错误:Row size too large (> 8126)

文章目录 虚拟内存概要windows-server配置虚拟内存技术名词解释关于mysql错误Row size too large (> 8126)问题分析解决办法 虚拟内存概要 虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的程序均需经由内存执行,若执行的程序占用…

pdf文档转word文档

很久以前写的代码了,当时好象是因为朋友临时需要,找了好几个工具都是要付费,单独为了一个文档花钱好象有点划不来,就用python简单做了个,今天不小心划拉了出来,反正收着也没什么用,贴出来开心一…

Angular, React,Vus三大主流前端开发框架Setup

Angular: //文档 https://angular.dev/ //创建项目 1. npm install -g angular/cli2. ng new my-angular-app//启动 npm run start//构建 npm run build//代码检查 ESlint React: //文档 https://create-react-app.dev/docs/getting-started //TypeScript https://www.types…

遥感领域最热门的研究主题介绍

遥感是有效地直接从地球收集数据的最重要技术之一。由于生态信息科学的进步,遥感技术在日常生活的多个研究方面变得非常有价值,其中包括大气物理学、生态学、土壤和水污染、土壤科学、地质学、火山爆发和地球演化。以下是遥感领域的主要趋势研究主题&…

抖音订单列表查询api接口

怎么获取订单列表接口 请求地址:响应示例及参数

.bashrc文件中环境变量配置错误,导致linux命令无法正常使用

问题描述 配置环境变量时出错,导致linux命令无法使用 解决方案: 执行下面命令 export PATH/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin vim就可以使用了,将错误纠正 vim ~/.bashrc 环境生效 source ~/.bashrc…

(论文阅读30/100)Convolutional Pose Machines

30.文献阅读笔记CPMs 简介 题目 Convolutional Pose Machines 作者 Shih-En Wei, Varun Ramakrishna, Takeo Kanade, and Yaser Sheikh, CVPR, 2016. 原文链接 https://arxiv.org/pdf/1602.00134.pdf 关键词 Convolutional Pose Machines(CPMs)…

IDEA 中设置 File Header 以及自定义类、方法注释模板的方法

目录 1 设置 File Header2 自定义类、方法注释生成类注解模板生成方法注解模板 1 设置 File Header File -> Settings -> File and Code Templates -> Includes -> File Header -> 编辑 2 自定义类、方法注释 File -> Settings -> Live Templates -&g…

ETCD 集群安装、部署、备份和使用

命令的含义是:在 /etcd_backup/ 目录下查找 30 天前创建的文件或目录,并将它们全部删除。 find /bak/backup/ -ctime 30 -exec rm -r {} \;