深度学习框架:为啥不同的框架,不同的运行设备(GPU/CPU/NPU),运算出的结果性能会有一定百分数的差别呢
经常会遇到有人在网上说,TensorFlow的计算结果比pytorch的高上几个百分点,也有人说RTX3090的计算结果没有A100的好,还有人说NPU的计算结果比GPU的高,而且这种说法在业内也是极为常见的,甚至在读书时的实验室里和人交流也会有这种反馈,这里对其说说自己的理解。
算法本质导致的随机性,系统性的偏差。神经网络本身由于其随机种子带来的随机性,导致不同随机种子的运行结果有一定差距,可以说深度学习本身就是一个随机性很大的领域,即使使用同一个计算框架,同一个项目代码,运行同一个数据在同一个设备上,也会出现不同运行次数下的性能差距的,这一点可以参考AI的强化学习领域,一般认为具有统计性表现的强化学习实验需要20次,但是由于运行时间问题,很多paper中的运行次数只有3次或5次,虽然统计学认为30次具有统计特性,但是在非强化学习的AI领域,一般5次就可以做一个均值了。
不同框架对不同神经网络的操作实现方式不同,比如TensorFlow和pytorch,这二者虽然底层都是调用NVIDIA的CUDA和CUDNN,但是在上层的具体操作的包装和使用上是不同的,而这种对神经网络的不同kernel的实现也会导致出现最终结果的性能差距。具体可以参考各个计算框架的API文档,如TensorFlow对CNN的卷积实现和pytorch的卷积实现的具体实现方式的不同。在jax中对某个操作的实现和TensorFlow中的某个实现,如log(exp X)的实现,会导致第5位或第6位浮点数不一致,出现累积效果后必然导致算法最终结果的不一致。
硬件运行原理导致的随机性。不同硬件的随机函数实现原理不同。现在的深度学习框架都是使用伪随机数的方式生成随机数,CPU端的随机数可以通过种子设定实现复现,而GPU上的随机数是无法实现复现的(由硬件设备和硬件上的软件特性共同决定,比如GPU,本身就是流式处理器,再加上其实现随机数的伪随机数算法限制,因此无法实现随机性的复现),只有jax框架可以实现GPU上的随机数复现,这是因为虽然GPU上硬件问题难以实现随机性复现,但是jax换用了另一种随机生成算法,从而实现了随机数复现。由于不同设备上随机数的实现算法不同,所以也必然存在不同随机数生成策略对算法性能的影响。
上面说的第一点和第三点都是随机性造成的不同,第二点是框架实现上的不同造成的。
解决第一点和第三点,需要有一个可以完全复现的随机数生成方法(可以允许相同随机种子后,CPU和GPU上的随机数不一致,但是需要保证第一次CPU上运行的和第二次CPU上运行的一致,第一次GPU上运行的和第二次GPU上运行的一致),目前只要jax框架可以做到这一点。
第二点,只能使用同一个计算框架来减少和避免,在保证第一点和第三点前提下只需要使用同一个计算框架即可保证这一点。
总结来说:
不同设备和不同计算框架造成的计算结果的差距是客观存在的,但是这并不能说明某个设备一定比另一个设备好,也不能说明某个计算框架就比某个计算框架好。但是,要注意,这种差距本身也是具有一定随机性的,这只能也仅能说对于你所运行的项目在你前几次的运行中获得的结果,某个设备比另一个设备的要好或是普遍要好,某个框架要比另一个的要好或普遍好,要知道,随着你的项目不同,运行次数不同,这种谁比谁好的表现也是不固定的,也是随机性的。至少目前没有任何数据支持某个设备或框架在某类问题上优于其他,也只能说对于每个项目会出现这种表现,并且也是在少量运行次数下的表现,要知道均值大的可能方差也大,比如TensorFlow运行一个项目3次的结果为:
90 93 87
pytorch运行3次的结果为:
89 90 88
但是,5次的结果可能:
TensorFlow:
90 93 87 82 90
pytorch运行3次的结果为:
89 90 88 89 91
如果仅看前3次结果,TensorFlow更好,看前5次,pytorch更好。
要知道,神经网络本身就是一个随机性很大的领域,并且我们也无法在随机性上对其进行保证(时间成本接受不了),因此我们在接受随机性造成的差异后也要接受这种随机差异并不能说明优劣。
PS. 不过即使由于jax框架的有趣的但繁琐的随机数生成方法,我们依旧无法保证用一个jax框架下的代码通过几次的运行,在不同设备上进行性能优劣的比较,因为毕竟jax也只能保证第一次CPU上运行的和第二次CPU上运行的一致,第一次GPU上运行的和第二次GPU上运行的一致,但也无法保证CPU上运行的和GPU上运行的一致。
要知道,只要运行的次数足够多(趋近无限大),在理论上来说,各个框架和各个设备的运行结果是不存在差异的,不过在这个过程中也必然存在谁趋近的速度比另一方要快的这个问题。
其实,完全保证随机性的计算方法也是可以实现的,但是会比较繁琐,比如不同框架、不同设备,均使用CPU上的numpy来生成随机数,然后再把numpy生成的随机数导入到不同框架和不同设备上,这样也是可以保证随机性的,不过这会是一个比较繁琐的事情。并且,如果有人花费大量时间,使用不同设备、不同框架,对某类任务,或某一个任务进行最终性能的对比,比如TensorFlow在TPU上和GPU上分别进行30次运行,看下哪个结果更好,我想这必然是一个既有趣但也无聊的research,因为这种research只能自娱自乐,不会被人当做啥有价值的研究的,虽然我也曾经想过弄弄,不过考虑这个自己目前难以接受的实验成本,也就只能在这理论层面上探讨了。
深度学习框架:为啥不同的框架,不同的运行设备(GPU/CPU/NPU),运算出的结果性能会有一定百分数的差别呢的更多相关文章
- 深度学习--全连接层、高阶应用、GPU加速
深度学习--全连接层.高阶应用.GPU加速 MSE均方差 Cross Entropy Loss:交叉熵损失 Entropy 熵: 1948年,香农将统计物理中熵的概念,引申到信道通信的过程中,从而开创 ...
- Deep learning深度学习的十大开源框架
Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用 ...
- 基于深度学习的中文语音识别系统框架(pluse)
目录 声学模型 GRU-CTC DFCNN DFSMN 语言模型 n-gram CBHG 数据集 本文搭建一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉字. 声学模型 ...
- Caffe——清晰高效的深度学习(Deep Learning)框架
Caffe(http://caffe.berkeleyvision.org/)是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清(http://daggerfs.com/ ...
- 学习《深度学习与计算机视觉算法原理框架应用》《大数据架构详解从数据获取到深度学习》PDF代码
<深度学习与计算机视觉 算法原理.框架应用>全书共13章,分为2篇,第1篇基础知识,第2篇实例精讲.用通俗易懂的文字表达公式背后的原理,实例部分提供了一些工具,很实用. <大数据架构 ...
- 【神经网络与深度学习】【CUDA开发】服务器(多GPU)caffe安装和编译
一. 前提 多GPU交互在神经网络是常见的,所以在安装caffe之前需要安装NCCL,来保证多GPU之间的相互交流. 多GPU,这里指的是2个及2个以上英伟达显卡,而不是笔记本中的集显和独显. 二. ...
- 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...
- 深度学习框架TensorFlow在Kubernetes上的实践
什么是TensorFlow TensorFlow是谷歌在去年11月份开源出来的深度学习框架.开篇我们提到过AlphaGo,它的开发团队DeepMind已经宣布之后的所有系统都将基于TensorFlow ...
- 广告行业中那些趣事系列9:一网打尽Youtube深度学习推荐系统
最新最全的文章请关注我的微信公众号:数据拾光者. 摘要:本篇主要分析Youtube深度学习推荐系统,借鉴模型框架以及工程中优秀的解决方案从而应用于实际项目.首先讲了下用户.广告主和抖音这一类视频平台三 ...
- 百度Paddle会和Python一样,成为最流行的深度学习引擎吗?
PaddlePaddle会和Python一样流行吗? 深度学习引擎最近经历了开源热.2013年Caffe开源,很快成为了深度学习在图像处理中的主要框架,但那时候的开源框架还不多.随着越来越多的开发者开 ...
随机推荐
- work11
1,简述String类中的equals方法与Object类中的equals方法的不同点. /* Object 类 1,它是所有类的一个根类 2,其他类默认继承Object类 常用方法: 1,toStr ...
- Linux Debian安装教程
Debian 是一个免费的开源操作系统,是最古老的 Linux 发行版之一,于 1993 年由 Ian Murdock 创建.它采用了自由软件协议,并且由志愿者社区维护和支持.Debian 的目标是创 ...
- @Transactional事务注解及请求接口的定义先后执行顺序设计
@Transactional事务注解及请求接口的定义先后执行顺序设计1.事务内查询,可能存在事务没有提交,导致查询数据查不出来. 2.或者可能跟请求参数作为查询条件,在某个条件下,请求参数发生变化,也 ...
- es创建索引及别名更新mapping方法 elasticsearch [nested] nested object under path [XXX] is not of nested type
[nested] nested object under path [XXX] is not of nested type这是因为在创建索引时没有指定类型为数组,这就是一个大坑,ES官方说可以不用指定 ...
- org.springframework.beans.BeanUtils.copyProperties对象赋值的常见问题
org.springframework.beans.BeanUtils.copyProperties对象赋值的常见问题 //codepublic static void copyProperties( ...
- Math.ceil,Math.round,Math.floor区别
Math.ceil,Math.round,Math.floor区别 //向上取整 System.out.println("amt1=" + Math.ceil(71.01)); / ...
- Java服务发起HTTPS请求报错:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException
Java服务发起HTTPS请求报错:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExcept ...
- Lecture6
Smiling & Weeping ---- 我渴望你的在场,又渴望你的缺席,你终究是我深藏的借口 第六章 GitFlow工作流实战 6.0 引言 在实际项目开发工作中,常常会有自测.联调.提 ...
- 基于 .NET CORE + VUE 前后端项目打包,实现批处理安装,一键部署
2023年7月18日 目前基于已完成了基于WPF界面的全自动部署小工具 自动判断相关.net core环境和依赖,自动部署mysql数据库,自动部署前后端web服务的功能. 有疑问的可以直接评论. - ...
- Coap 协议学习:具体协议介绍具体
协议框架 CoAP默认运行在UDP上,但它也支持运行在SMS,TCP等数据传输层上.本文主要是基于UDP上的CoAP协议介绍 1.消息模型 Messages COAP协议通信是通过在UDP上传输消息类 ...