经常会遇到有人在网上说,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. 使用 ClickHouse 做日志分析

    原作:Monika Singh & Pradeep Chhetri 这是我们在 Monitorama 2022 上发表的演讲的改编稿.您可以在此处找到包含演讲者笔记的幻灯片和此处的视频. 当 ...

  2. MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过

    这是一个轻松赚钱的项目. 短视频时代,谁掌握了流量谁就掌握了Money! 所以给大家分享这个经过精心打造的MoneyPrinterPlus项目. 它可以:使用AI大模型技术,一键批量生成各类短视频. ...

  3. 项目管理--PMBOK 读书笔记(13)【项目相关方管理】

    1.相关方分矩阵 工具与技术 核查表 又叫检查表,计数表,收集属性数据,解决问题.   焦点小组&访谈: 特点:慢,焦点小组是一对多,访谈时多对多.   抽样统计&控制图: 控制图反应 ...

  4. 一次phoniex表查询报出 org.apache.hadoop.hbase.NotServingRegionException

    org.apache.hadoop.hbase.NotServingRegionException: SYSTEM.STATS,,1607503004410.334266e1a9b7d9859dbfb ...

  5. k8s使用rbd作为存储

    k8s使用rbd作为存储 如果需要使用rbd作为后端存储的话,需要先安装ceph-common 1. ceph集群创建rbd 需要提前在ceph集群上创建pool,然后创建image [root@ce ...

  6. vue3实现模拟地图上,站点名称按需显示的功能

    很久很久没有更新博客了,因为实在是太忙了,每天都有公司的事情忙不完....... 最近在做车辆模拟地图,在实现控制站点名称按需显示时,折腾了好一段时间,特此记录一下.最终界面如下图所示: 站点显示需求 ...

  7. 机器学习(一)——递归特征消除法实现SVM(matlab)

    机器学习方法对多维特征数据进行分类:本文用到非常经典的机器学习方法,使用递归特征消除进行特征选择,使用支持向量机构建分类模型,使用留一交叉验证的方法来评判模型的性能. 构建模型:支持向量机(Suppo ...

  8. 超越datetime:Arrow,Python中的日期时间管理大师

    介绍 Arrow是一个Python库,它提供了一种合理且对人类友好的方法来创建.操作.格式化和转换日期.时间和时间戳.它实现了对datetime类型的更新,填补了功能上的空白,提供了一个智能的模块AP ...

  9. Linux开机启动三种方式

    有的时候,我们开机启动一些命令或者是一段脚本,又或者是开机启动自定义的服务. 下面归纳了2种实现的方式. 方式1-开机启动命令 vim /etc/rc.local #添加你想执行的命令 chmod + ...

  10. python重拾第七天-面向对象进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...