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

15

由于我只有一台AMD A10-7850 APU电脑,而且没有资金购买价值800-1200美元的NVIDIA显卡,因此我正在尽力利用自己的资源通过tensorflow/keras加速深度学习。

最初,我使用了预编译版本的Tensorflow。InceptionV3计算1个epoch需要大约1000-1200秒。速度非常慢。

为了加速计算,我首先使用优化器(使用AVX和SSE4指令)自己编译了Tensorflow。这使得计算时间减少了大约40%。现在相同的计算只需要大约600秒就能完成。虽然仍然很慢,但已经勉强可以接受 - 就像看油漆干燥一样。

我正在寻找进一步缩短计算时间的方法。我只有一个集成在APU中的AMD显卡。我如何利用这个资源进一步加速计算呢?

更普遍地说,假设还有其他人面临类似的财政限制和Intel设置。如何让没有独立的NVIDIA显卡的任何人都能够利用他们的集成图形芯片或其他非NVIDIA设置来实现快于仅使用CPU的性能?这是可能的吗?为什么/为什么不?为实现这一目标需要做什么?或者是否在不久的将来(2-6个月)会有可能出现?如何实现?

2个回答

21
经过几个月的研究,我可以看到有3.5条可能的前进路径:
1.) 如上面的评论中提到的,使用Tensorflow + OpenCl:
这个领域似乎正在发生一些变化。在Codeplay,Lukasz Iwanski刚刚发布了一个全面的答案,介绍了如何使用opencl运行tensorflow(因为信息可能会变化,所以我只提供一个链接):https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl

使用集成图形的潜力很诱人。同时,值得探索将其与APU结合使用。但我不确定这样做的效果如何,因为OpenCl支持仍处于早期开发阶段,硬件支持非常有限。此外,OpenCl并不等同于经过优化的手工编写的库。(更新于2017-04-24:在遇到一些问题后,我已成功编译了代码here!)不幸的是,对于我的设置(iGPU),期望的速度改进没有实现

CIFAR 10数据集:

  1. Tensorflow(通过pip安装未经优化):每个周期1700秒,CPU利用率390%。
  2. Tensorflow(SSE4,AVX):每个周期1100秒,CPU利用率390%。
  3. Tensorflow(opencl + iGPU):每个周期5800秒,CPU利用率150%,GPU利用率100%。

因个体差异可能会导致结果显著不同,所以我想知道其他人在您的设置上相对而言(未经优化 vs 经过优化 vs OpenCl)得到了什么结果?

需要注意的是:OpenCL实现意味着所有繁重的计算都应该在GPU上完成。(更新于2017/4/29)但实际情况并非如此,因为一些功能尚未实现。这导致了在CPU和GPU内存之间不必要的数据来回复制。再次强调,即将到来的改变将改善这种情况。此外,对于那些有兴趣提供帮助和想要加快速度的人来说,我们可以做一些对TensorFlow与OpenCL性能有明显影响的事情。
但就目前而言:1个iGPU << 4个具有SSE+AVX的CPU。也许更强大的GPU配备更大的内存和/或OpenCL 2.0实现可能会产生更大的差异。
此时,我应该补充一点,至少Caffe和/或Theano + OpenCl也在进行类似的工作。在所有情况下,限制因素似乎是将CUDA/cuDNN功能手动移植到OpenCl范式中。
更新日期2023年6月29日:请参考下面的第5节及以后的内容,了解最新的更新。这些部分仅保留是因为概念仍然相关,但性能数据已不再相关。
2.) RocM + MIOpen RocM代表Radeon Open Compute,似乎是一个混合倡议,将使非NVIDIA(主要是Radeon设备)上的深度学习成为可能。它包括三个主要组件:
  • HIP:一种将CUDA代码转换为可由AMD GPU使用的代码的工具。
  • ROCk:用于AMD CPU+GPU设备的64位Linux内核驱动程序。
  • HCC:一种将代码编译为异构系统架构环境(HSA)代码的C/C++编译器。
显然,RocM旨在发挥AMD在拥有CPU和GPU技术方面的优势。他们加速深度学习的方法利用了这两个组件。作为一个APU的拥有者,我对这种可能性特别感兴趣。但需要注意的是:Kaveri APU的支持有限(仅支持集成图形)。未来的APU尚未发布。而且看起来,还有很多工作要做才能使这个项目成熟起来。希望通过大量的工作,这种方法能够在一年内变得可行,因为AMD已经宣布他们的Radeon Instinct卡将在今年(2017年)发布。
对我来说,问题在于RocM提供了构建深度学习库的工具,但它们本身并不代表深度学习库。作为一个不专注于工具开发的数据科学家,我只想要一个能够正常工作的东西,并不一定对构建我想要的学习工具感兴趣。在我所在的公司里,没有足够的时间同时做好这两件事。
2023-06-29更新:请参考下面第5节及以后的内容,了解最新的技术进展。这些部分仅保留是因为概念仍然相关,但性能数据已不再相关。
NVIDIA当然有CUDA和cuDNN,这是专门为NVIDIA GPU优化的手工汇编代码库。所有主要的深度学习框架都建立在这些专有库之上。而AMD目前完全没有类似的东西。
我不确定AMD能否成功达到NVIDIA在这方面的水平。但是有一篇由Carlos Perez于2017年4月3日发布的文章here揭示了AMD的意图。最近在斯坦福大学的一次讲座中也以一般性的方式谈到了Ryzen、Vega和深度学习的结合。简而言之,该文章指出MIOpen将代表AMD设备的优化深度学习函数的手工定制库。该库计划在2017年上半年发布。我不确定这些库会在多快的时间内被纳入主要的深度学习框架,并且此时的功能实现范围会是什么样的。
但显然,AMD已经与Caffe的开发人员合作,将代码基础“嬉皮化”。基本上,通过HIP,CUDA代码会自动转换为C代码。自动化处理了绝大部分的代码基础,只有不到0.5%的代码需要更改和手动关注。与手动翻译为openCl代码相比,这种方法可能更具可持续性。我不清楚的是低级汇编语言优化在哪里发挥作用。
(更新于2017年5月19日)但随着AMD Vega显卡的即将发布(首先是面向专业用户的Frontier Edition显卡),有迹象表明主要的深度学习框架将会通过MIOpen框架得到支持。今天发布的一篇Forbes文章显示了MiOpen在性能方面在过去几个月内取得的进展:这似乎是相当显著的。 (更新于2017年8月25日)MiOpen已正式发布。我们不再只是在假设中讨论了。现在我们只需要试用一下这个框架的工作效果如何。
3.) Neon Neon 是 Nervana(现已被 Intel 收购)的开源深度学习框架。我提到这个框架的原因是它似乎非常容易使用。语法与 Keras 一样简单直观。更重要的是,该框架通过一些手工编写的汇编语言优化,在某些基准测试中实现了比 Tensorflow 快两倍的速度。将计算时间从每个周期的 500 秒缩短到 300 秒绝对不是小事。300 秒等于 5 分钟。所以在一个小时内可以完成 15 个周期,大约 3.5 小时可以完成约 50 个周期!但理想情况下,我希望能在一个小时内完成这些计算。要达到这个水平,我需要使用 GPU,而目前只有 NVIDIA 在这方面提供全面支持:Neon 在 GPU 可用时也使用 CUDA 和 cuDNN(当然,必须是 NVIDIA 的 GPU)。如果您有其他 Intel 硬件可用,这当然也是一个有效的选择。毕竟,Neon 的开发初衷就是为了使其在非 NVIDIA 设置上(如 Nervana 的定制 CPU,现在是 Intel 的 FPGA 或 Xeon Phi)也能够最佳运行。

3.5.) 英特尔 Movidius

更新2017-08-25:我遇到了这篇文章。英特尔发布了一款基于USB3.0插件的“深度学习”加速器。显然,它可以与Cafe配合使用,并允许用户对网络进行常见的基于Cafe的微调和推理。这很重要,强调一下:如果你想从头开始训练自己的网络,这里的措辞非常模糊。因此,我会假设除了微调网络之外,训练本身仍应该在具备更多并行计算能力的设备上进行。然而,真正的亮点是:当我查找定价时,这个插件只需79美元。与你平均NVIDIA 1070-80(ti)显卡的成本相比,这几乎不算什么。如果你只想利用已经适用于某些相关任务的常见网络拓扑来解决一些视觉问题,你可以使用这个插件将其微调为你自己的用途,然后编译代码并将其放入这个插件以快速进行推理。这个插件可以满足许多用例,而且只需79美元,可能是值得的。由于这是英特尔,他们提出了全力支持英特尔的模式。他们的模型是在训练时使用云(即Nervana Cloud)。然后,使用这个芯片进行原型推理或能量消耗至关重要的推理。这是否是正确的方法留给读者来回答。

更新日期2023年6月29日:
目前看来,主要的机器学习库在某种程度上已经支持AMD。
4.) TensorFlow-DirectML
在2023年重新审视这个话题时,我们发现在这个领域取得了很大的进展。通过TensorFlow-DirectML,可以在Tensforflow中使用AMD显卡进行工作。
来源: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是否受支持。
来源: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进行机器学习训练的部分。简要总结如下:在AMD引入张量核心(tensor cores)并显著加速机器学习训练和推理的GPU之前,这可能会在下一代产品中实现,并且在其使用方面建立更大的社区之前,NVIDIA在这些领域仍将保持优势,至少在接下来的1-2年内。
此时,尽管主要障碍已经消除,并取得了显著进展,但似乎在没有NVIDIA的情况下,实现深度学习仍然稍微困难一些。

请问您能否指导我如何运行您提到的基准测试,使用_CIFAR 10数据集_的说明在哪里? - Maxim Egorushkin
1
好的,我尝试了 AMD 和 ROCm。AMD 不能与最新版本的 Tensorflow 一起使用,只能使用 2017 年的 1.0.1 版本。于是我决定购买了一张 NVidia 显卡,现在所有支持 GPU 加速的软件都可以正常运行了。 - Maxim Egorushkin
1
我可以确认您关于Intel Movidius的假设。您需要在其他地方进行培训,然后将训练好的模型导入OpenVino以在Movidius上进行推理。当前版本可以从Caffe、TensorFlow、MXNet、Kaldi和ONNX中导入训练好的模型。如果您选择这种方式,则需要在定义模型时考虑OpenVino的限制。它不支持每种拓扑或操作。 - Josh Davis

2

这里有一些关于OpenCL实现状态的高级信息,如果这也有所帮助的话。但是,Benoit的分支链接是正确的去处https://www.codeplay.com/portal/02-14-17-bringing-the-acceleration-of-opencl-to-tensorflow-with-sycl - Rod Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接