将Keras&Tensorflow与AMD GPU结合使用


75

我开始学习Keras,我认为它是Tensorflow和Theano之上的一层。但是,我只能访问AMD GPU,例如AMD R9 280X。

如何设置Python环境,以便可以通过对OpenCL的Keras / Tensorflow支持来使用我的AMD GPU?

我在OSX上运行。


我相信新的Theano后端将支持OpenCL和NVIDIA卡。就Tensorflow而言,OpenCL支持存在一个未解决的问题。看起来并没有取得太大进展。
gobrewers14 2013年

3
TensorFlow或大多数其他神经网络程序包不支持AMD GPU。原因是NVidia投资了神经网络模块(CuDNN)的快速免费实现,而GPU神经网络的所有快速实现都依赖于该神经网络模块(Torch / Theano / TF),而AMD似乎并不关心这个市场。
Yaroslav Bulatov

4
最近,谷歌宣布,他们将购买AMD GPU,以在其数据中心中使用机器学习应用程序。如果没有路线图更通用地支持GPU,那么这样的举动就没有意义。
Thornhale

1
在大多数平台(当前为Mac / Win / Linux)上,您可以在PlaidML之上运行Keras。PlaidML是开放源代码,并且包括可在大多数GPU上使用的cuDNN的替代产品:github.com/plaidml/plaidml
Choong Ng

Answers:


67

我正在https://github.com/hughperkins/tensorflow-cl为Tensorflow写一个OpenCL 1.2后端

用于OpenCL的tensorflow分支具有以下特征:

  • 它针对任何/所有OpenCL 1.2设备。它不需要OpenCL 2.0,不需要SPIR-V或SPIR。不需要共享虚拟内存。等等 ...
  • 它基于名为'cuda-on-cl'的底层库,https://github.com/hughperkins/cuda-on-cl
    • cuda-on-cl的目标是能够获取任何NVIDIA®CUDA™源代码,并将其编译为OpenCL 1.2设备。这是一个非常通用的目标,也是一个非常通用的编译器
  • 目前,已实现以下功能:
  • 它是在Ubuntu 16.04(使用Intel HD5500和NVIDIA GPU)和Mac Sierra(使用Intel HD 530和Radeon Pro 450)上开发的

这不是Tensorflow唯一可用的OpenCL分支。Codeplay https://www.codeplay.com还使用Computecpp,https: //www.codeplay.com/products/computesuite/computecpp开发了一个fork ,据我所知,他们对fork的要求比我强。知道,它在哪些特定GPU设备上工作。您需要查看平台支持说明(在htecomputecpp页面底部),以确定是否支持您的设备。编解码分叉实际上是Google的官方分叉,位于此处:https : //github.com/benoitsteiner/tensorflow-opencl


我想知道:仅建立对Opencl 1.2的支持的合理性是什么?Opencl 2.0中似乎有许多功能可能对深度学习有用:developer.amd.com/tools-and-sdks/opencl-zone/…–
Thornhale

2
没有专用GPU的人有没有测试过使用集成GPU(英特尔或AMD)而不是仅使用CPU时张量流快多少?
Thornhale

2
@Thonhale的基本原理是:针对可移植性。例如,在同一平台上,Mac Sierra Radeon Pro 450驱动程序仅支持OpenCL 1.2,而Intel HD 530驱动程序也支持。(这基本上是一台全新的Mac Book Pro)
休·珀金斯

36

这篇文章的最初问题是:如何使Keras和Tensorflow与AMD GPU一起运行。

这个问题的答案如下:

1.)如果您可以使Tensorflow正常工作(可选地在您的虚拟/ conda环境中),则Keras将正常工作。

2.)如其他人所述,要使Tensorflow在AMD GPU上运行,可行的一种方法是编译Tensorflow以使用OpenCl。为此,请阅读下面的链接。为了简洁起见,我将在此处总结所需的步骤:

  • 您将需要AMD专有驱动程序。这些当前仅在Ubuntu 14.04(Ubuntu决定更改UI呈现方式之前的版本)上可用。在撰写本文时,对Ubuntu 16.04的支持仅限于通过AMDProDrivers的一些GPU。想要在AMD GPU上进行深度学习的读者应该意识到这一点!

  • 使用OpenCl支持编译Tensorflow还需要您获取并安装以下先决条件:OpenCl标头,ComputeCpp。

  • 满足先决条件后,配置构建。请注意,有3种编译Tensorflow的选项:Std Tensorflow(stable),Benoits Steiner的Tensorflow-opencl(正在开发)和Luke Iwanski的Tensorflow-opencl(正在试验),您可以从github中提取它们。另请注意,如果您决定从任何opencl版本进行构建,则将丢失使用opencl的问题,因为假定您正在使用它。相反,这意味着,如果您从标准tensorflow配置,则在配置脚本要求您对CUDA使用opencl和“否”时,需要选择“是”。

  • 然后像这样运行测试:

    $ bazel test --config = sycl -k --test_timeout 1600-// tensorflow / ...-// tensorflow / contrib / ...-// tensorflow / java / ...-// tensorflow / compiler / ...

更新:在我的设置上执行此操作会花费很长时间。需要很长时间的部分是所有测试都在运行。我不确定这意味着什么,但是我的许多测试都在1600秒后超时。可以缩短测试时间,但要花更多的时间进行超时。另外,您可以只构建张量流而无需测试。在撰写本文时,测试已经进行了2天。

或者只是像这样构建pip包:

bazel build --local_resources 2048,.5,1.0 -c opt --config=sycl //tensorflow/tools/pip_package:build_pip_package

请实际阅读Codeplay上的博客文章:Lukas Iwansky于2017年3月30日发布了有关如何使Tensorflow与OpenCl一起使用的综合教程文章。因此,这是最近的文章。还有一些细节,我在这里没有写。

如以上许多文章所述,很少的信息散布在整个网络中。Lukas的文章在价值方面增加的是,所有信息都集中在一个地方,这应该使得设置Tensforflow和OpenCl的艰巨程度有所减轻。我只会在这里提供一个链接:

https://www.codeplay.com/portal/03-30-17-setting-up-tensorflow-with-opencl-using-sycl

这里发布了更完整的演练:

http://deep-beta.co.uk/setting-up-tensorflow-with-opencl-using-sycl/

它的主要区别在于,明确告知用户他/她需要:

  • 创建到子文件夹的符号链接
  • 然后通过“ python setup.py development”命令实际安装tensorflow。

注意上面提到了使用tensorflow-cl的替代方法:

https://github.com/hughperkins/tensorflow-cl

尽管目前看来这种方法不太活跃,但我无法确定哪种方法更好。发布的问题更少,而解决这些问题的对话也越来越少。去年有很大的推动。自2016年11月以来,更多的推动力减弱了,尽管在撰写本文时,休(Hugh)似乎在几天前已经推动了一些更新。(更新:如果您阅读了一些文档自述文件,那么此版本的tensorflowo现在仅依靠社区支持,因为主要开发人员忙于生活。)

更新(2017-04-25):我有一些基于下面测试tensorflow-opencl的注释。

  • 该软件包的未来用户应注意,使用opencl意味着将所有繁重的工作都转移到GPU上。我之所以这样说是因为我个人认为计算工作量将在我的CPU和iGPU之间共享。这意味着GPU的功能非常重要(特别是带宽和可用的VRAM)。

以下是一些数字,用于使用“我的设置”(带有iGPU的A10-7850)的CIFAR10数据集来计算1个历元。您的里程几乎肯定会有所不同!

  • Tensorflow(通过pip安装):〜1700 s / epoch
  • Tensorflow(带SSE + AVX):〜1100 s / epoch
  • Tensorflow(带有opencl和iGPU):〜5800 s / epoch

您可以看到在这种特殊情况下,性能会更差。我将其归因于以下因素:

  • iGPU只有1GB。这导致在CPU和GPU之间进行大量来回复制。(Opencl 1.2尚无法通过指针传递数据;相反,必须来回复制数据。)
  • iGPU仅具有512个流处理器(和32 Gb / s的内存带宽),在这种情况下比使用SSE4 + AVX指令集的4个CPU慢。
  • tensorflow-opencl的开发尚处于起步阶段,尚未对SYCL等进行许多优化。

如果您使用具有更多VRAM和更多流处理器的AMD GPU,则可以肯定会获得更好的性能。我想读一下人们正在取得的成就,以了解可能的成就。

如果/当更新被推送时,我将继续保持这个答案。

3.)目前正在暗示一种替代方法,那就是使用AMD的RocM计划和miOpen(等效于cuDNN)库。这些是/将是启用深度学习的开源库。需要注意的是RocM支持目前仅适用于Linux,并且miOpen尚未发布,但是Raja(AMD GPU负责人)在AMA中表示,使用上述内容,应该可以在Linux上进行深度学习。 AMD GPU。实际上,不仅计划为Tensorflow提供支持,而且还为Cafe2,Cafe,Torch7和MxNet提供支持。


我很想看到AMD付诸行动-就我个人而言,我拥有所有的AMD卡-但我们很快就被告知(不是AMD在这里拥有所有有关TensorFlow等实现方式的控制权)。AMD是否有您偶然发现的等效“问题跟踪器”?
ehiller

自编写答案以来,您知道场景发生了什么变化吗?
Maxie Berkmann

21

可以通过PlaidML Keras后端使用AMD GPU。

最快:PlaidML通常比流行的平台(如TensorFlow CPU)快10倍(或更多),因为它支持所有GPU,独立于品牌和型号。PlaidML加速了AMD,Intel,NVIDIA,ARM和嵌入式GPU上的深度学习。

最简单:PlaidML安装简单,并支持多个前端(当前为Keras和ONNX)

免费:PlaidML是完全开源的,并且不依赖具有专有和限制性许可证的任何供应商库。

对于大多数平台,开始加速深度学习就像运行一些命令一样容易(假设您已安装Python(v2或v3)):

virtualenv plaidml
source plaidml/bin/activate
pip install plaidml-keras plaidbench

选择您要使用的加速器(许多计算机,尤其是笔记本电脑,有多个):

plaidml-setup

接下来,尝试对MobileNet推理性能进行基准测试:

plaidbench keras mobilenet

或者,尝试培训MobileNet:

plaidbench --batch-size 16 keras --train mobilenet

与keras套装一起使用

os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"

欲获得更多信息

https://github.com/plaidml/plaidml

https://github.com/rstudio/keras/issues/205#issuecomment-348336284


我一直使用plaidML,并根据GPU进行了一些基准测试。它在我的所有Mac上都运行良好。
布莱恩·巴特勒

1
这三个命令在每个脚本的顶部起作用: import plaidml.keras plaidml.keras.import_backend() from keras import backend as K
Bryan Butler

7

这是一个古老的问题,但是由于我花了过去的几周时间自行解决:

  1. OpenCL对Theano的支持屡见不鲜。他们添加了一个libgpuarray后端,该后端似乎仍然存在错误(即,该过程在GPU上运行,但答案是错误的-例如,对于DL模型,MNIST的精度为8%,而CPU或nVidia的精度为〜95 +% CUDA)。另外,由于nVidia堆栈上约50-80%的性能提升来自CUDNN库,因此OpenCL只是尘土飞扬。(见下文!) :)
  2. ROCM看起来很酷,但是文档(甚至清楚地声明了ROCM是什么/做什么)也很难理解。他们正在尽力而为,但落后了4年多。在RX550上,它并非并非不能工作(截至撰写本文时)。因此,请不要浪费您的时间(这是一周的时间之一:))。乍一看,ROCM似乎是驱动程序集的新成员(替代AMDGPU-Pro或对其进行了扩充),但实际上它是一个内核模块和一组库,它们实际上替代了AMDGPU-Pro。(可以认为这相当于某些库中的Nvidia-381驱动程序+ CUDA)。https://rocm.github.io/dl.html(老实说,我仍然没有测试过性能或试图使其与最新的Mesa驱动程序兼容。我会在某个时候这样做。
  3. 将MiOpen添加到ROCM,这实际上是CUDNN。他们也有一些非常清晰的迁移指南。但是更好。
  4. 他们创建了“ HIP”,它是从CUDA / CUDNN到MiOpen的自动翻译器。由于他们直接将API排列成可翻译的状态,因此看起来效果很好。有些概念并不是完美的地图,但总的来说看起来不错。

现在,终于,经过3-4个星期的尝试弄清OpenCL等之后,我发现本教程可以帮助您快速入门。这是使hipCaffe正常运行的分步步骤。但是与nVidia不同,请确保您已支持硬件!https://rocm.github.io/hardware.html。认为没有他们支持的硬件就可以使它工作吗?祝好运。您已被警告。一旦您启动并运行了ROCM(并运行验证测试),这就是hipCaffe教程-如果您启动了ROCM,那么您将在10分钟内进行MNIST验证测试-甜! https://rocm.github.io/ROCmHipCaffeQuickstart.html


欢迎使用指向解决方案的链接,但是请确保没有该链接的情况下,您的回答是有用的:在该链接周围添加上下文,以便您的其他用户可以了解它的含义和含义,然后引用您所使用页面中最相关的部分如果目标页面不可用,请重新链接。只是链接的答案可能会被删除。
paper1111

仅供参考,您链接的页面不再存在,并重定向到其他地方,这些地方没有完全包含答案。
Maxie Berkmann

让我查看下周的最新状态以更新答案。
Thornhale


4

Theano确实支持OpenCL,但仍处于早期阶段。Theano本身对OpenCL不感兴趣,而是依靠社区的支持

大多数操作已经实现,而这主要是调整和优化给定操作的问题。

要使用OpenCL后端,您必须自己构建 libgpuarray

根据个人经验,我可以告诉您,如果幸运的话,您将获得CPU性能。内存分配似乎非常幼稚地实现(因此计算速度很慢),并且在内存用尽时会崩溃。但我鼓励您尝试甚至优化代码或帮助报告错误。


4
在这方面,过去6个月有什么变化吗?
Thornhale '17

5
Theano已停产
Erik Aigner

@ErikAigner正式。错误仍然修复,社区能够做出贡献。
nemo

1
实际上,Theano已停产
Josiah Yoder

3

如果您可以访问其他AMD GPU,请参阅此处:https : //github.com/ROCmSoftwarePlatform/hiptensorflow/tree/hip/rocm_docs

这应该使您朝着ROCm平台上的tensorflow的正确方向前进,但是Selly关于https://rocm.github.io/hardware.html的帖子就是解决此问题的方法。该页面并不是一个详尽的列表,我自己发现Xeon E5 v2 Ivy Bridge与ROCm可以很好地工作,即使它们列出了v3或更高版本,但是显卡也有些挑剔。gfx8或更高版本,但随着时间的推移会出现一些小小的例外,例如北极星和其他。

更新-看起来hiptensorflow在配置过程中具有支持opencl的选项。我会说,即使您没有gfx8 +或Polaris gpu(如果opencl实现也可以),请调查链接。这是一个漫长的过程,但是遵循一个编写良好的指令一到三个小时(取决于硬件)并不会造成太多损失。


0

从技术上讲,如果您使用类似OpenCL的方法,则可以,但Nvidia的CUDA更好,并且OpenCL需要其他步骤可能有效或无效。我建议如果您有AMD gpu,请使用Google Colab之类的工具,它们会提供免费的Nvidia GPU,供您在编码时使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.