经常会遇到有人在网上说,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. VMware搭建集群环境

    集群地址分配 名称 IP 子网掩码 网关 DNS flink01 192.168.22.211 255.255.255.0 192.168.22.2 114.114.114.114 flink02 1 ...

  2. INTEL S4500 960G 入手评测

    INTEL S4500 960G 入手评测 简易上个图: CDI AS SSD: CDM: AS SSD AND CDM: -

  3. C#开发的目录图标更改器 - 开源研究系列文章 - 个人小作品

    因为有一些项目保存在文件夹里,然后想着用不同的图标来显示该文件夹,但是Windows提供的那个修改文件夹的操作太麻烦,需要的操作太多(文件夹里鼠标右键,属性,自定义,更改图标,选择文件,选择图标,点击 ...

  4. JavaScript防抖与节流笔记

    JavaScript防抖与节流 概念 防抖(debounce)与节流(throttle)是两个相似但有本质区别的两个概念,但两个概念的存在都是为了控制在特定条件下函数最大的执行次数.这在例如将函数执行 ...

  5. k8s安装prometheus

    安装 在目标集群上,执行如下命令: kubectl apply -f https://github.com/512team/dhorse/raw/main/conf/kubernetes-promet ...

  6. Flutter 借助SearchDelegate实现搜索页面,实现搜索建议、搜索结果,解决IOS拼音问题

    搜索界面使用Flutter自带的SearchDelegate组件实现,通过魔改实现如下效果: 搜素建议 搜索结果,支持刷新和加载更多 IOS中文输入拼音问题 界面预览 拷贝源码 将SearchDele ...

  7. Linux驱动:使用workqueue、tasklet处理中断

    Linux驱动:使用workqueue.tasklet处理中断 背景 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化.但是,中断是一个随机事件,它随时会到来,如果关中断 ...

  8. Android 中的property_get/property_set

    Android 中的property_get/property_set 背景 在安卓中调试Linux驱动层以及应用层之间的一些功能时,需要获取一些属性. 参考: https://blog.csdn.n ...

  9. KEIL5 编译生成 hex、bin文件

    --- title: file_name date: 2020-05-31 10:27:10 categories: tags: - stm32 - keil - config --- KEIL 工程 ...

  10. Unity中指定相机截屏,并将图片转为Base64

    问题背景: 需求就是只截场景,不包含UI,并将截图保存为Base64格式给到Web展示. 方案: 指定相机截图: 1 /// <summary> 2 /// 指定相机截屏 3 /// &l ...