经常会遇到有人在网上说,TensorFlow的计算结果比pytorch的高上几个百分点,也有人说RTX3090的计算结果没有A100的好,还有人说NPU的计算结果比GPU的高,而且这种说法在业内也是极为常见的,甚至在读书时的实验室里和人交流也会有这种反馈,这里对其说说自己的理解。

  1. 算法本质导致的随机性,系统性的偏差。神经网络本身由于其随机种子带来的随机性,导致不同随机种子的运行结果有一定差距,可以说深度学习本身就是一个随机性很大的领域,即使使用同一个计算框架,同一个项目代码,运行同一个数据在同一个设备上,也会出现不同运行次数下的性能差距的,这一点可以参考AI的强化学习领域,一般认为具有统计性表现的强化学习实验需要20次,但是由于运行时间问题,很多paper中的运行次数只有3次或5次,虽然统计学认为30次具有统计特性,但是在非强化学习的AI领域,一般5次就可以做一个均值了。

  2. 不同框架对不同神经网络的操作实现方式不同,比如TensorFlow和pytorch,这二者虽然底层都是调用NVIDIA的CUDA和CUDNN,但是在上层的具体操作的包装和使用上是不同的,而这种对神经网络的不同kernel的实现也会导致出现最终结果的性能差距。具体可以参考各个计算框架的API文档,如TensorFlow对CNN的卷积实现和pytorch的卷积实现的具体实现方式的不同。在jax中对某个操作的实现和TensorFlow中的某个实现,如log(exp X)的实现,会导致第5位或第6位浮点数不一致,出现累积效果后必然导致算法最终结果的不一致。

  3. 硬件运行原理导致的随机性。不同硬件的随机函数实现原理不同。现在的深度学习框架都是使用伪随机数的方式生成随机数,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),运算出的结果性能会有一定百分数的差别呢的更多相关文章

  1. 深度学习--全连接层、高阶应用、GPU加速

    深度学习--全连接层.高阶应用.GPU加速 MSE均方差 Cross Entropy Loss:交叉熵损失 Entropy 熵: 1948年,香农将统计物理中熵的概念,引申到信道通信的过程中,从而开创 ...

  2. Deep learning深度学习的十大开源框架

    Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用 ...

  3. 基于深度学习的中文语音识别系统框架(pluse)

    目录 声学模型 GRU-CTC DFCNN DFSMN 语言模型 n-gram CBHG 数据集 本文搭建一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉字. 声学模型 ...

  4. Caffe——清晰高效的深度学习(Deep Learning)框架

    Caffe(http://caffe.berkeleyvision.org/)是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清(http://daggerfs.com/ ...

  5. 学习《深度学习与计算机视觉算法原理框架应用》《大数据架构详解从数据获取到深度学习》PDF代码

    <深度学习与计算机视觉 算法原理.框架应用>全书共13章,分为2篇,第1篇基础知识,第2篇实例精讲.用通俗易懂的文字表达公式背后的原理,实例部分提供了一些工具,很实用. <大数据架构 ...

  6. 【神经网络与深度学习】【CUDA开发】服务器(多GPU)caffe安装和编译

    一. 前提 多GPU交互在神经网络是常见的,所以在安装caffe之前需要安装NCCL,来保证多GPU之间的相互交流.  多GPU,这里指的是2个及2个以上英伟达显卡,而不是笔记本中的集显和独显. 二. ...

  7. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

    比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...

  8. 深度学习框架TensorFlow在Kubernetes上的实践

    什么是TensorFlow TensorFlow是谷歌在去年11月份开源出来的深度学习框架.开篇我们提到过AlphaGo,它的开发团队DeepMind已经宣布之后的所有系统都将基于TensorFlow ...

  9. 广告行业中那些趣事系列9:一网打尽Youtube深度学习推荐系统

    最新最全的文章请关注我的微信公众号:数据拾光者. 摘要:本篇主要分析Youtube深度学习推荐系统,借鉴模型框架以及工程中优秀的解决方案从而应用于实际项目.首先讲了下用户.广告主和抖音这一类视频平台三 ...

  10. 百度Paddle会和Python一样,成为最流行的深度学习引擎吗?

    PaddlePaddle会和Python一样流行吗? 深度学习引擎最近经历了开源热.2013年Caffe开源,很快成为了深度学习在图像处理中的主要框架,但那时候的开源框架还不多.随着越来越多的开发者开 ...

随机推荐

  1. LeetCode 682. Baseball Game 棒球比赛(C++/Java)

    题目: You're now a baseball game point recorder. Given a list of strings, each string can be one of th ...

  2. LeetCode 409. Longest Palindrome 最长回文串(C++/Java)

    题目: Given a string which consists of lowercase or uppercase letters, find the length of the longest ...

  3. ssh练习

    根据要求完成部署 根据如下要求,完成部署过程 1.恢复7.8.9.31.41所有机器的快照 7 8 9 web服务 nginx ​ 172.16.1.xx ​ ​ nfs-31 提供共享文件存储 ​ ...

  4. 随机二次元图片API第三弹

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` 随机二次元图片API第三弹 日期:2020-3-10 阿珏 ...

  5. HTML5画布-小球碰撞

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` HTML5画布-小球碰撞 日期:2017-7-18 阿珏 ...

  6. httpx的使用

    urllib和requests库已经可以爬取大多数网站的数据,但对于一些强制使用HTTP/2.0协议访问,这时urllib和requests是无法爬取数据的,因为只支持HTTP/1.1,不支持HTTP ...

  7. 忘记Linux密码这样破解

    忘记了Linux的密码该怎么办呢?有人想到重装系统.我想说除非你不想干了! 在这里使用CentOS7来教大家怎么 破解Linux的密码 (不能知道原来的密码,但是可以强行修改) 1.在grub引导界面 ...

  8. Freertos学习:01 移植到STM32

    --- title: rtos-freertos-01-移植到STM32 EntryName: rtos-freertos-01-porting-on-stm32 date: 2020-06-17 1 ...

  9. Linux系统获取开发板的文件系统并打包成img文件

    应用情形: 在实际的开发中,由于原系统包含的功能有限,而根据项目的需要,安装了相应的库及运行项目程序所创建的各种文件,和所做 的各种配置,想将调试好的系统打包发布,进行批量生产,就可参考本文提供的方法 ...

  10. Springboot整合Apollo

    一.Apollo作用 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址-- 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境.分集群管理配置,完善 ...