如何在非 NVIDIA 设置上加速深度学习?
Posted
技术标签:
【中文标题】如何在非 NVIDIA 设置上加速深度学习?【英文标题】:How can I speed up deep learning on a non-NVIDIA setup? 【发布时间】:2017-08-25 20:42:03 【问题描述】:由于我只有 AMD A10-7850 APU,并且没有资金购买 800 至 1200 美元的 NVIDIA 显卡,因此我正在努力利用现有资源来加速深度学习张量流/keras。
最初,我使用的是 Tensorflow 的预编译版本。 InceptionV3 大约需要 1000-1200 秒来计算 1 个 epoch。它一直非常缓慢。
为了加快计算速度,我首先使用优化器自编译了 Tensorflow(使用 AVX 和 SSE4 指令)。这导致计算时间减少了大约 40%。上面执行的相同计算现在只需要大约 600 秒来计算。这几乎是可以忍受的——就像你可以看着油漆变干一样。
我正在寻找进一步减少计算时间的方法。我只有一块集成的 AMD 显卡,它是 APU 的一部分。 (如何)(C/c)我利用这个资源来进一步加快计算速度?
更一般地说,假设其他人有类似的货币限制和英特尔设置。没有独立 NVIDIA 卡的人如何利用他们的集成图形芯片或其他非 NVIDIA 设置来实现比仅 CPU 更快的性能?那可能吗?为什么/为什么不?需要做些什么来实现这个目标?或者这在不久的将来(2-6 个月)会成为可能吗?怎么样?
【问题讨论】:
【参考方案1】:在研究这个话题几个月后,我可以看到 3.5 条可能的前进道路:
1.) 上面 cmets 中提到的 Tensorflow + OpenCl:
这个领域似乎有一些动静。在 Codeplay 上,Lukasz Iwanski 刚刚在此处发布了有关如何让 tensorflow 与 opencl 一起运行的综合答案(我将仅提供上述链接,因为那里的信息可能会发生变化):https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl
使用集成显卡的潜力非常诱人。将这种组合与 APU 结合使用也值得探索。但我不确定这将如何运作,因为 OpenCl 支持仍处于早期开发阶段,并且硬件支持非常有限。此外,OpenCl 不同于手工制作的优化代码库。 (2017 年 4 月 24 日更新:在遇到一些问题here 后,我已经获得了要编译的代码!)不幸的是,ON MY SETUP (iGPU) 提高速度的希望没有实现。
CIFAR 10 数据集:
-
Tensorflow(通过未优化的 pip ak):1700 秒/纪元,390% CPU
利用率。
Tensorflow(SSE4、AVX):1100 秒/纪元,390% CPU
利用率。
Tensorflow (opencl + iGPU): 5800sec/epoch at 150% CPU
和 100% 的 GPU 利用率。
您的里程可能会有很大差异。所以我想知道其他人在你的设置上相对来说是什么(未优化 vs 优化 vs opencl)?
需要注意的是:opencl 实现意味着所有繁重的计算都应该在 GPU 上完成。 (2017/4/29 更新)但实际上还没有实现,因为有些功能还没有实现。这导致unnecessary copying back and forth of data between CPU and GPU ram。同样,imminent changes 应该会改善这种情况。此外,对于那些有兴趣提供帮助和想要加快速度的人,我们可以做一些事情,这些事情将对使用 opencl 的 tensorflow 的性能产生可衡量的影响。
但就目前而言:1 个 iGPU
在这一点上,我应该补充一点,至少 Caffe 和/或 Theano + OpenCl 已经在进行类似的努力。在所有情况下,限制步骤似乎是将 CUDA/cuDNN 功能手动移植到 openCl 范例。
2.) RocM + MIOpen
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 正在提供用于构建深度学习库的工具。它们本身并不代表深度学习库。作为一个不专注于工具开发的数据科学家,我只想要一些有用的东西。并且不一定对构建我想要学习的东西感兴趣。在我所在的公司,一天中没有足够的时间来做好这两件事。
NVIDIA 当然有 CUDA 和 cuDNN,它们是针对 NVIDIA GPU 优化的手工汇编代码库。所有主要的深度学习框架都建立在这些专有库之上。 AMD 目前根本没有这样的东西。
我不确定 AMD 在这方面会取得多大的成功。但是,在 Carlos Perez 于 2017 年 4 月 3 日here 发布的一篇文章中,AMD 的意图有所揭示。最近的lecture at Stanford 也笼统地谈论了 Ryzen、Vega 和深度学习的结合。从本质上讲,文章指出 MIOpen 将代表这个手工制作的 AMD 设备优化深度学习函数库。该库将于 2017 年上半年发布。我不确定这些库将在多长时间内被纳入主要的深度学习框架,以及届时功能实现的范围将是什么。
但显然,AMD has already worked with the developers of Caffe to "hippify" the code basis。基本上,CUDA 代码通过 HIP 自动转换为 C 代码。自动化处理了绝大多数代码基础,只剩下不到 0.5% 的代码需要更改并需要人工注意。将其与手动翻译成 openCl 代码进行比较,人们开始觉得这种方法可能更可持续。我不清楚的是低级汇编语言优化从何而来。
(2017-05-19 更新)但是随着 AMD Vega 卡的即将发布(不是面向消费者的专业 Frontier Edition 卡将是第一个),有迹象表明major deep learning frameworks will be supported through the MIOpen framework。今天发布的Forbes article 显示了 MiOpen 在过去几个月在性能方面取得的进步:它看起来很重要。 (2017-08-25 更新) MiOpen 正式发布。我们不再在这里谈论假设。现在我们只需要试试这个框架的效果如何。
3.) 霓虹灯
Neon 是 Nervana(现已被英特尔收购)的开源深度学习框架。我提到这个框架的原因是它看起来相当简单易用。语法与 Keras 一样简单直观。更重要的是,由于对这些计算进行了一些手工制作的汇编语言优化,该框架在 some benchmarks 上的速度比 Tensorflow 快 2 倍。潜在地,将计算时间从 500 秒/epoch 减少到 300 秒/epoch 是无可厚非的。 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 年 8 月 25 日更新:我遇到了 this article。英特尔发布了基于 USB3.0 棒的“深度学习”加速器。显然,它可以与 Cafe 一起使用,并允许用户执行常见的基于 Cafe 的网络微调和推理。这是很重要的强调:如果你想从头开始训练自己的网络,这里的措辞非常含糊。因此,我假设,除了微调网络之外,训练本身仍然应该在具有更多并行计算的东西上完成。不过,真正令人兴奋的是:当我检查价格时,这根棍子的价格仅为 79 美元。与普通 NVIDIA 1070-80(ti) 卡的成本相比,这算不了什么。如果您只是想使用已经可用于某些相关任务的常见网络拓扑来解决一些视觉问题,您可以使用此棒对其进行微调以适应自己的用途,然后编译代码并将其放入此棒中以快速进行推理。这根棍子可以覆盖许多用例,再花 79 美元就值得了。这就是英特尔,他们提议全力以赴支持英特尔。他们的模型是使用云(即 Nervana Cloud)进行训练。然后,将此芯片用于原型推理或能耗问题的推理。这是否是正确的方法留待读者回答。
目前看来,没有 NVIDIA 的深度学习仍然难以实现。一些有限的速度增益是困难的,但通过使用 opencl 可能是可能的。其他举措听起来很有希望,但需要时间来弄清楚这些举措将产生的真正影响。
【讨论】:
您能否指出有关如何使用 CIFAR 10 数据集运行您所指的基准的说明? 好吧,我玩过 AMD 和 ROCm。 AMD 不能与最新的 Tensorflow 一起使用,只能与 2017 年的 1.0.1 版本一起使用。改为购买 NVidia 卡,现在所有 GPU 加速软件都可以使用。 我可以确认您对 Intel Movidius 的假设。您需要在其他地方进行训练,然后将训练好的模型导入 OpenVino 以在 Movidius 上进行推理。当前版本可以从 Caffe、TensorFlow、MXNet、Kaldi 和 ONNX 导入训练好的模型。如果您走这条路,则在定义模型时需要牢记 OpenVino 的局限性。它不支持所有拓扑或操作。【参考方案2】:如果您的平台支持 opencl,您可以考虑将其与 tensorflow 一起使用。在 Linux 上this github repository 有一些实验性支持。一些初步说明位于the documentation section of of this github repository。
【讨论】:
这里还有一些关于 OpenCL 实施状态的高级信息,以防万一也有帮助。但是Benoit的分支链接是正确的去处codeplay.com/portal/…以上是关于如何在非 NVIDIA 设置上加速深度学习?的主要内容,如果未能解决你的问题,请参考以下文章
什么是CUDA和CUDNN?——GeForce NVIDIA显卡用于深度学习计算的GPU加速工具