首页 > 其他分享 >深度学习框架:为啥不同的框架,不同的运行设备(GPU/CPU/NPU),运算出的结果性能会有一定百分数的差别呢

深度学习框架:为啥不同的框架,不同的运行设备(GPU/CPU/NPU),运算出的结果性能会有一定百分数的差别呢

时间:2024-02-02 12:11:59浏览次数:31  
标签:随机性 框架 不同 随机数 NPU GPU 运行

经常会遇到有人在网上说,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只能自娱自乐,不会被人当做啥有价值的研究的,虽然我也曾经想过弄弄,不过考虑这个自己目前难以接受的实验成本,也就只能在这理论层面上探讨了。



标签:随机性,框架,不同,随机数,NPU,GPU,运行
From: https://www.cnblogs.com/devilmaycry812839668/p/18002958

相关文章

  • Node学习——Koa框架
    1.简介koa框架是一个遵循洋葱模型的轻量级的nodejs框架,将大部分工作都抛给中间件来处理,框架只专注于compose各个中间件,并按照use注册的顺序逐个执行中间件。2.安装使用安装:npminstallkoa-s使用:constKoa=require('koa');constapp=newKoa;app.listen(3000);3.中间件的使......
  • 第17天:信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等
    框架:简单代码的一个整合库,如果使用框架就只需要学习使用框架调用即可如:文件上传功能是需要很多代码来实现的,框架把这个代码进行封封装,调用即可影响:如果采用框架开发,代码的安全性是取决于框架的过滤机制 #Python-开发框架-Django&FlaskDjango1、识别插件2、Set-Cookie:expi......
  • 响应式的 WebFlux 框架更优雅,性能更强!
    spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架。这个框架包含了spring-framework和springmvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。你可以在项目中同时使用spring-webmvc和spring-webflux,或者只用其中一个来开发web应用。所谓......
  • Blazor快速开发框架Known-更换数据库
    本文介绍如何更换框架默认的数据库,下面以MySQL数据库为例:操作步骤双击KIMS.Shared项目,打开项目文件,引用MySqlConnector数据库访问包<PackageReferenceInclude="MySqlConnector"Version="2.3.3"/>其他数据库访问包如下://SQLite<PackageReferenceInclude="Microsoft.Da......
  • 华为显卡已经支持pytorch计算框架
    相关链接:https://support.huawei.com/enterprise/zh/doc/EDOC1100079287/a21c08dehttps://www.zhihu.com/question/624955377/answer/3240350483https://www.hiascend.com/document/detail/zh/ModelZoo/pytorchframework/pies/pies_00004.htmlAscend/pytorch项目地址:https:......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1+编辑二、TextClock组件TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示,最高精度到秒级。子组件无。接口TextClock......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1+编辑二、TextPicker组件TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示,最高精度到秒级。子组件无。接口TextPic......
  • 【APP自动化进阶】APP自动化项目框架实战
    一、自动化项目介绍1.涉及技术栈pythonappiumseleniumpytestalluresubprocessadb2.实现的功能概述APP自动化执行支持pytest生成测试报告多线程执行自动开启、关闭appium、allure等服务二、框架及项目结构项目目录app---apk文件base---核心方法driver.py-......
  • Java 框架
    框架是整个或者部分系统的可重用设计,从应用角度看框架,可以被当作一组抽象构建及构件实例间交互的方法;从应用目的的角度看,SpringSpring定义Spring通常指的是SpringFramework,它是一个开源框架。Spring是包含众多工具方法的IoC容器。什么是容器容器时用来容纳某种物品的基......
  • 英伟达H20 GPU中企首个订单已签订,计划今年第二季度量产
    据东方国信发布的消息,该公司联同紫光股份、新华三集团签署了一份协议,其中新华三集团将向东方国信供应英伟达特供版H20GPU算力服务器。这是英伟达特供版AI芯片在中国市场的第一个订单。此外,据报道,百度、字节跳动、腾讯和阿里巴巴四家企业共同向英伟达订购了价值50亿美元的AI芯片......