如何在非 NVIDIA 设置上加速深度学习?

2024-01-12

由于我只有 AMD A10-7850 APU,并且没有资金购买 800-1200 美元的 NVIDIA 显卡,因此我正在尝试利用我拥有的资源通过 TensorFlow/Keras 加速深度学习。

最初,我使用了 Tensorflow 的预编译版本。 InceptionV3 大约需要 1000-1200 秒来计算 1 个 epoch。进展缓慢得令人痛苦。

为了加快计算速度,我首先使用优化器自编译了 Tensorflow(使用 AVX 和 SSE4 指令)。这导致计算时间减少大约 40%。上面执行的相同计算现在只需要大约 600 秒即可完成。这几乎是可以忍受的——有点像你可以看着油漆变干。

我正在寻找进一步减少计算时间的方法。我只有一块集成 AMD 显卡,它是 APU 的一部分。 (如何)(C/c)我可以利用此资源来进一步加快计算速度?

更一般地说,假设其他人也有类似的货币限制和英特尔设置。没有独立 NVIDIA 卡的人如何利用其集成显卡芯片或其他非 NVIDIA 设置来实现比仅使用 CPU 更快的性能?那可能吗?为什么/为什么不?为了实现这个目标需要做什么?或者这在不久的将来(2-6 个月)可能实现?如何?


经过几个月的研究这个主题,我可以看到 3.5 条可能的前进路径:

1.)Tensorflow + OpenCl,如上面评论中提到的:

这个领域似乎正在发生一些变化。在 Codeplay 上,Lukasz Iwanski 刚刚在这里发布了关于如何让张量流与 opencl 一起运行的全面答案(我只会提供如上所述的链接,因为那里的信息可能会发生变化):https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl

使用集成显卡的潜力是诱人的。这种与 APU 的组合的使用也值得探索。但我不确定这效果如何,因为 OpenCl 支持仍处于开发早期,并且硬件支持非常有限。此外,OpenCl 与手工制作的优化代码库不同。 (更新2017-04-24:我在遇到一些问题后得到了编译代码here https://github.com/benoitsteiner/tensorflow-opencl/issues/65!)不幸的是,希望提高速度在我的设置中 (iGPU)没有实现。

CIFAR 10 数据集:

  1. Tensorflow(通过 pip ak 未优化):1700 秒/纪元,390% CPU 利用率。
  2. Tensorflow(SSE4、AVX):1100 秒/epoch(390% CPU) 利用率。
  3. Tensorflow (opencl + iGPU):150% CPU 时为 5800 秒/纪元 以及 100% GPU 利用率。

您的里程可能会有很大差异。所以我想知道其他人在你的设置上相对而言(未优化、优化、opencl)得到了什么?

需要注意的是:opencl 实现意味着所有繁重的计算都应该在 GPU 上完成。 (2017/4/29更新)但实际上还不是这样,因为有些功能还没有实现。这导致在 CPU 和 GPU RAM 之间不必要地来回复制数据 https://github.com/lukeiwanski/tensorflow/issues/7。再次,即将发生的变化 https://github.com/tensorflow/tensorflow/pull/9117应该改善这种情况。此外,对于那些有兴趣提供帮助和想要加快速度的人,我们可以做一些对 opencl 的 TensorFlow 性能产生重大影响的事情。

但目前的情况是:1 iGPU

在这一点上,我应该补充一点,至少 Caffe 和/或 Theano + OpenCl 已经在进行类似的努力。所有情况下的限制步骤似乎是将 CUDA/cuDNN 功能手动移植到 openCl 范例。

2023 年 6 月 29 日更新:请参阅下面第 5 节及以后的部分,了解最新更新。保留这些部分只是因为概念仍然相关,但性能数字不再相关。

2.) RocM + MIOpen

RocM https://github.com/RadeonOpenCompute/ROCm代表 Radeon 开放计算,似乎是一系列计划的大杂烩,这些计划正在/将使非 NVIDIA(主要是 Radeon 设备)上的深度学习成为可能。它包括 3 个主要组件:

  • HIP:一种将 CUDA 代码转换为 AMD GPU 可以使用的代码的工具。
  • ROCk:AMD CPU+GPU 设备的 64 位 Linux 内核驱动程序。
  • HCC:C/C++编译器,将代码编译成异构系统架构环境(HSA)的代码。

显然,RocM 旨在发挥 AMD 同时拥有 CPU 和 GPU 技术的优势。他们加速深度学习的方法利用了这两个组件。作为 APU 拥有者,我对这种可能性特别感兴趣。但请注意:Kaveri APU 的支持有限(仅支持集成图形)。未来的 APU 尚未发布。看来,要使这个项目达到成熟状态,还有很多工作要做。鉴于 AMD 已宣布其 Radeon Instinct 卡将于今年(2017 年)发布,大量工作有望使这种方法在一年内变得可行。

对我来说,问题是 RocM 提供了构建深度学习库的工具。它们本身并不代表深度学习库。作为一名不专注于工具开发的数据科学家,我只想要一些有用的东西。并且不一定对构建我想要的东西然后进行学习感兴趣。在我所在的公司,一天中没有足够的时间来做好这两件事。

2023 年 6 月 29 日更新:请参阅下面第 5 节及以后的部分,了解最新更新。保留这些部分只是因为概念仍然相关,但性能数字不再相关。

NVIDIA 当然有 CUDA 和 cuDNN,它们是针对 NVIDIA GPU 优化的手工汇编代码库。所有主要的深度学习框架都构建在这些专有库之上。 AMD 目前根本没有类似的东西。

我不确定 AMD 在这方面能否成功达到 NVIDIA 的水平。但 Carlos Perez 在 2017 年 4 月 3 日发表的一篇文章中透露了 AMD 的意图here http://instinct.radeon.com/en-us/the-potential-disruptiveness-of-amds-open-source-deep-learning-strategy/。最近斯坦福大学讲座 https://www.youtube.com/watch?v=2LksDHe43rU还笼统地谈论了 Ryzen、Vega 和深度学习的结合。本质上,文章指出 MIOpen 将代表这个为 AMD 设备手工制作的优化深度学习函数库。这个库预计在2017年上半年发布。我不确定这些库要多久才能被纳入主要的深度学习框架中,以及此时功能实现的范围是什么。

但显然,AMD 已经与 Caffe 的开发人员合作,对代码基础进行“嬉皮化” https://www.slideshare.net/insideHPC/hip-and-caffe-porting-and-profiling-with-amds-rocm。基本上,CUDA 代码通过 HIP 自动转换为 C 代码。自动化处理了绝大多数代码基础,只有不到 0.5% 的代码需要更改并需要手动处理。与手动翻译成 openCl 代码相比,人们开始感觉到这种方法可能更可持续。我不清楚的是低级汇编语言优化在哪里。

(更新2017-05-19)但随着AMD Vega卡的即将发布(首先是不面向消费者的专业Frontier版卡),有迹象表明,主要深度学习框架will通过 MIOpen 框架支持 https://www.reddit.com/r/Amd/comments/6bklro/we_are_radeon_technologies_group_at_amd_and_were/dhqoalj/. A 福布斯文章 https://www.forbes.com/sites/moorinsights/2017/05/16/amd-targets-machine-learning-with-new-radeon-vega-frontier-optimized-software/#b6a9a1b3e5bb今天发布的内容显示了 MiOpen 在性能方面比过去几个月取得的进步:看起来意义重大。 (更新2017-08-25) MiOpen已正式发布。我们在这里不再谈论假设。现在我们只需要尝试一下这个框架的工作效果如何。

3.) Neon

Neon https://github.com/NervanaSystems/neon是 Nervana(现已被 Intel 收购)的开源深度学习框架。我提到这个框架的原因是它似乎使用起来相当简单。其语法与 Keras 一样简单直观。更重要的是,该框架的速度比 Tensorflow 快 2 倍一些基准 https://github.com/soumith/convnet-benchmarks由于对这些计算进行了一些手工制作的汇编语言优化。将计算时间从 500 秒/时期减少到 300 秒/时期是不容小觑的。 300 秒 = 5 分钟。所以一小时内可以得到 15 个 epoch。大约 3.5 小时内进行了大约 50 个 epoch!但理想情况下,我想在一小时内完成这些类型的计算。为了达到这些级别,我需要使用 GPU,而目前只有 NVIDIA 在这方面提供全面支持:当 GPU 可用时,Neon 也会使用 CUDA 和 cuDNN(当然,它必须是 NVIDIA GPU) )。如果您可以访问其他英特尔硬件,这当然是一种有效的方法。毕竟,开发 Neon 的动机是让事情在非 NVIDIA 设置(例如 Nervana 的定制 CPU,以及现在的 Intel FPGA 或 Xeon Phis)上也能达到最佳状态。

3.5.) 英特尔 Movidius

2017-08-25 更新:我遇到了本文 https://newsroom.intel.com/news/intel-democratizes-deep-learning-application-development-launch-movidius-neural-compute-stick/。英特尔发布了一款基于USB3.0棒的“深度学习”加速器。显然,它与 Cafe 配合使用,允许用户对网络和推理进行常见的基于 Cafe 的微调。强调这一点很重要:如果您想从头开始训练自己的网络,那么这里的措辞非常模糊。因此,我假设,除了微调网络之外,训练本身仍然应该在具有更多并行计算的东西上完成。但真正令人兴奋的是:当我检查定价时,这根棍子的价格仅为 79 美元。与普通 NVIDIA 1070-80(ti) 卡的成本相比,这根本不算什么。如果你只是想使用已经可用于某些相关任务的常见网络拓扑来解决一些视觉问题,你可以使用这个棒来微调它以适应你自己的用途,然后编译代码并将其放入这个棒中以快速进行推理。这根棍子可以覆盖许多用例,而且 79 美元还是值得的。这就是英特尔,他们提议全力以赴。他们的模型是使用云(即 Nervana Cloud)进行训练。然后,使用该芯片进行原型推理或能耗重要的推理。这是否是正确的方法,留给读者来回答。

2023年6月29日更新:

目前,看起来主要的 ML 库现在都在一定程度上支持 AMD。

4.) TensorFlow-DirectML

2023 年重新审视这个话题,似乎这个领域已经取得了很多进展。借助 TensorFlow-DirectML,可以在具有 AMD 显卡的 Tensforflow 中工作。

Source: https://community.amd.com/t5/radeon-pro-graphics/amd-gpus-support-gpu-accelerated-machine-learning-with-release/ba-p/488595 https://community.amd.com/t5/radeon-pro-graphics/amd-gpus-support-gpu-accelerated-machine-learning-with-release/ba-p/488595

5.) PyTorch 2.0

看来 Pytorch 2.0 现在也支持在 AMD GPU 上进行训练和推理。但并非所有 GPU 都受支持。因此,用户在购买之前必须仔细检查是否支持给定的 GPU。

Source: https://pytorch.org/blog/experience-power-pytorch-2.0/ https://pytorch.org/blog/experience-power-pytorch-2.0/

鉴于 Pytorch 和 Tensorflow 都具有某种形式的 AMD GPU 支持,到 2023 年,AMD GPU 上的训练和推理似乎终于成为可能。

但有一些警告:除了不支持所有 GPU(例如:较旧的 iGPU)之外,同一层的不同 GPU 之间的性能也是未知的。当我找到比较 AMD GPU 训练和推理性能的基准时,我会将它们列在这里。

此外,即使库或库分支支持 AMD GPU 上的机器学习,这些库的更新频率似乎也较低,因为社区较小。从这个角度来看,支撑力度还是有差距的。

Tim Dettmers 发表了一篇非常有见地的文章,有关使用 AMD GPU 进行 ML 训练的部分 https://timdettmers.com/2023/01/30/which-gpu-for-deep-learning/#Will_AMD_GPUs_ROCm_ever_catch_up_with_NVIDIA_GPUs_CUDA。简而言之:在 AMD 将张量核心引入其 GPU 中(这可能会在下一次迭代中实现),并围绕其使用开发出更大的社区之前,NVIDIA 仍将在这些领域占据优势。至少在未来 1-2​​ 年。

目前看来,尽管主要障碍已经被消除,并且已经取得了重大进展,但没有 NVIDIA 的深度学习的实现仍然稍微困难一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在非 NVIDIA 设置上加速深度学习? 的相关文章

随机推荐

  • 确定 JavaScript 中浏览器窗口的位置?

    由于各种愚蠢的原因 我希望能够检测屏幕上浏览器窗口的矩形 标题栏等等 这可能吗 还是 JavaScript 仅限于其页面的视图端口 Edit 我可能不清楚 但视图端口是窗口中可见的页面部分 这可能不是浏览器中常用的术语 但在图形中很常见 对
  • R如何在涉及3个变量的情况下创建类似数据透视表的数据框?

    我在 R 中有以下数据框 它为我提供了客户 1 2 和 3 的交易记录 每行显示交易已进行的期间类型以及花费的金额 id lt c 1 2 3 1 1 2 3 2 2 period lt c calib valid valid calib
  • C++:将函数分配给 tr1::function 对象

    我们的一个类提供了 tr1 function 回调对象 但是 当我尝试为其分配成员函数时 出现编译器错误 以下示例未经测试 仅用于说明 Foo h class Foo public Foo std tr1 function
  • 使用 foreach 循环清除 PHP 数组值的效率

    哪个对于清除数组中的所有值更有效 第一个需要我每次在第二个示例的循环中使用该函数 foreach array as i gt value unset array i Or this foreach blah blah as blah foo
  • 如何从layout.xml中删除默认的cardview边框

    我无法删除 CardView 的默认边框 以前有人遇到过这个问题吗 两条边界线重叠 CardviewDesign xml
  • 处理大量文本时防止内存问题

    我编写了一个程序 可以分析项目的源代码并根据代码报告各种问题和指标 为了分析源代码 我加载项目目录结构中存在的代码文件并从内存中分析代码 该代码在传递给其他方法进行进一步分析之前会经过大量处理 处理代码时 代码会传递给多个类 有一天 我在我
  • 谷歌地图dequeueBuffer:BufferQueue已被放弃

    我在使用 Google 地图小部件时遇到了一些问题 简而言之 我有 3 个页面 带有底部导航栏的主页 地图页面 脚手架主体中带有 GoogleMap 的基本状态小部件 以及另一个页面 每次我从地图页面切换得太快时 我都会收到此错误 并且整个
  • 视图、模型和 ViewModel 之间有哪些常见关系?

    我正在与设计师一起开发 Windows Phone 7 应用程序 我使用 XNA 进行了 C 开发 所以我了解 C 但不熟悉模型 视图 ViewModel 架构 我们的第一个破解是为任何给定视图激活多个 ViewModel 每个 ViewM
  • 即使 cpanm 声称它是最新的,也无法找到 perl 模块

    我尝试使用File Slurp module use v5 14 use warnings use File Slurp my text read file test txt 但是当我运行这个时 我收到错误 Can t locate Fil
  • SQL -> 关系代数

    假设我有以下关系 Branch branchNo PK street city postcode Staff staffNo PK fName lName sex branchNo FK 这对于这个问题来说并不重要 但是 PK 主键 FK
  • Xamarin 形成值转换器导致无限循环

    我试图获得一个使用转换器的简单双向绑定示例 但是一旦条目中的值发生变化 例如如果您输入 1 它就会陷入无限循环 它会到达 ConvertBack 方法的末尾并设置值正确 然后 它再次调用 ConvertBack 方法 除了这次的值是 11
  • SQL在两个表排列中向上或向下移动行

    我有两个以这种方式设计的表 并考虑到可能的元素重新排列 1 dbo test db 002 with columns id INT NOT NULL IDENTITY 1 1 PRIMARY KEY name NVARCHAR 255 an
  • 在 Go 代码中如何在超时时终止进程及其子进程?

    我遇到一种情况 我需要在一段时间后终止一个进程 我开始这个过程 然后 case lt time After timeout if err cmd Process Kill err nil return 0 fmt Errorf Failed
  • Markdown 中的语义标记

    我想使用简单的文本编辑器和 Markdown 做课堂笔记 有没有办法标记文本元素以使它们机器可读 例如 我想将某些单词和短语标记为 定义 然后 我可以运行某种脚本来显示单词及其相应的定义 我知道这已经过时了 但我刚刚开始接受 Markdow
  • 将命令行参数传递给 pip install

    我目前正在开发一个导入 Fortran 模块的 Python 项目 这setup py看起来与那个类似 from numpy distutils core import Extension from numpy distutils core
  • 在 JavaScript 中检测 Flash 对象点击

    有没有办法让 JavaScript jQuery 知道 Flash 对象何时被单击 并且仍然让 Flash 处理单击 我尝试将桌子放在物体顶部position fixed and a z index并将对象设置为param name wmo
  • 如何在iPhone上扩展键盘渐变?

    我发现很少有应用程序可以扩展键盘 但我想知道它们是如何做到的 这里有 2 个例子 文字学 http www textasticapp com images screenshot iphone5 png Prompt https pbs tw
  • Firefox 附加 RESTclient - 如何输入 POST 参数?

    我已经安装了 Firefox RESTclient 附加组件 但是我很难弄清楚如何传递 POST 参数 有特定的格式可以做到这一点吗 或者是否有其他工具可用于在 Mac OS X 上调试 REST API 如果您想提交 POST 请求 您必
  • 在 F# 中定义静态类

    是否可以在 F 中定义包含可重载成员的静态类 let模块绑定不能重载 即使它们被编译为静态类中的静态成员 type声明可以包含静态成员 但我不知道类型本身是否可以变为静态 我当前的解决方案是定义一个type使用私有构造函数并使用它 我想知道
  • 如何在非 NVIDIA 设置上加速深度学习?

    由于我只有 AMD A10 7850 APU 并且没有资金购买 800 1200 美元的 NVIDIA 显卡 因此我正在尝试利用我拥有的资源通过 TensorFlow Keras 加速深度学习 最初 我使用了 Tensorflow 的预编译