将 Keras 和 Tensorflow 与 AMD GPU 结合使用
Posted
技术标签:
【中文标题】将 Keras 和 Tensorflow 与 AMD GPU 结合使用【英文标题】:Using Keras & Tensorflow with AMD GPU 【发布时间】:2016-10-19 22:53:26 【问题描述】:我开始学习 Keras,我相信它是 Tensorflow 和 Theano 之上的一层。但是,我只能使用 AMD GPU,例如 AMD R9 280X。
如何设置我的 Python 环境,以便我可以通过 Keras/Tensorflow 对 OpenCL 的支持来使用我的 AMD GPU?
我在 OSX 上运行。
【问题讨论】:
我相信新的Theano backend 将支持 OpenCL 以及 NVIDIA 卡。就 Tensorflow 而言,有一个 open issue 用于 OpenCL 支持;看起来进展不大。 TensorFlow 或大多数其他神经网络包不支持 AMD GPU。原因是 NVidia 投资了神经网络块 (CuDNN) 的快速免费实现,所有 GPU 神经网络的快速实现都依赖于(Torch/Theano/TF),而 AMD 似乎并不关心这个市场。 最近,谷歌宣布他们将购买 AMD GPU 用于他们的数据中心,大概也用于机器学习应用程序。如果没有更通用地支持 gpus 的路线图,那么这样的举动是没有意义的。 在大多数平台上(目前是 Mac/Win/Linux),您可以在 PlaidML 之上运行 Keras。 PlaidML 是开源的,包括可在大多数 GPU 上运行的 cuDNN 替代方案:github.com/plaidml/plaidml 在 Linux 上安装 Opencl 的简单方法gist.github.com/kytulendu/3351b5d0b4f947e19df36b1ea3c95cbe 【参考方案1】:Theano确实支持 OpenCL,但仍处于早期阶段。 Theano 本身对 OpenCL 不感兴趣,依赖于community support。
Most 的操作已经实现,主要是调整和优化给定操作的问题。
要使用 OpenCL 后端,您必须自己 build libgpuarray
。
根据个人经验,我可以告诉您,如果幸运的话,您将获得 CPU 性能。内存分配似乎非常天真地实现(因此计算会很慢)并且在内存不足时会崩溃。但我鼓励您尝试甚至优化代码或帮助报告错误。
【讨论】:
在这方面过去 6 个月有什么变化吗? Theano 已停产 @ErikAigner 官方。错误仍然得到修复,社区可以做出贡献。 确实,Theano was discontinued.【参考方案2】:我正在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 设备编译它。这是一个非常通用的目标,也是一个非常通用的编译器 目前,实现了以下功能: 每个元素的操作,使用 Eigen over OpenCL,(更多信息在https://bitbucket.org/hughperkins/eigen/src/eigen-cl/unsupported/test/cuda-on-cl/?at=eigen-cl) blas / 矩阵乘法,使用 Cedric Nugteren 的 CLBlast https://github.com/cnugteren/CLBlast 减少,argmin,argmax,再次使用 Eigen,根据之前的信息和链接 学习、培训师、梯度。至少,StochasticGradientDescent 训练器正在工作,其他训练器已提交,但尚未测试 它是在 Ubuntu 16.04(使用 Intel HD5500 和 NVIDIA GPU)和 Mac Sierra(使用 Intel HD 530 和 Radeon Pro 450)上开发的这不是 Tensorflow 唯一可用的 OpenCL 分支。还有一个由 Codeplay https://www.codeplay.com 开发的 fork,使用 Computecpp,https://www.codeplay.com/products/computesuite/computecpp 据我所知,他们的 fork 比我自己的要求更高,就它适用于哪些特定的 GPU 设备而言。您需要查看平台支持说明(位于 hte computecpp 页面底部),以确定您的设备是否受支持。 codeplay fork 其实是 Google 官方的 fork,在这里:https://github.com/benoitsteiner/tensorflow-opencl
【讨论】:
我想知道:仅构建对 Opencl 1.2 的支持的理由是什么。 Opencl 2.0 中似乎有许多对深度学习有用的特性:developer.amd.com/tools-and-sdks/opencl-zone/… 有没有人测试过使用集成 GPU(Intel 或 AMD)而不是仅使用 CPU 时张量流的速度能提高多少? @Thonhale 的基本原理是:瞄准可移植性。例如,Mac Sierra Radeon Pro 450 驱动程序仅支持 OpenCL 1.2,英特尔 HD 530 驱动程序也支持同一平台。 (这基本上是一个全新的 Mac Book Pro)【参考方案3】:这篇文章的最初问题是:如何让 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。
满足先决条件后,配置您的构建。请注意,编译 Tensorflow 有 3 个选项:Std Tensorflow(稳定)、Benoits Steiner 的 Tensorflow-opencl(开发性)和 Luke Iwanski 的 Tensorflow-opencl(高度实验性),您可以从 github 获取。另请注意,如果您决定从任何 opencl 版本构建,使用 opencl 的问题将丢失,因为假定您正在使用它。相反,这意味着如果您从标准 tensorflow 进行配置,则当配置脚本要求您使用 opencl 和 CUDA 时,您需要选择“是”。
然后像这样运行测试:
$ bazel test --config=sycl -k --test_timeout 1600 -- //tensorflow/... -//tensorflow/contrib/... -//tensorflow/java/... -//tensorflow /编译器/...
更新:在我的设置中执行此操作需要很长时间。需要很长时间的部分是所有正在运行的测试。我不确定这意味着什么,但我的很多测试都在 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 develop”命令实际安装tensorflow。请注意,上面提到了使用 tensorflow-cl 的替代方法:
https://github.com/hughperkins/tensorflow-cl
我目前无法辨别哪种方法更好,尽管这种方法似乎不太活跃。发布的问题更少,解决这些问题的对话也更少。去年有很大的推动力。自 2016 年 11 月以来,尽管 Hugh 似乎在撰写本文时几天前已经推送了一些更新,但其他推动已经消退。 (更新:如果你阅读了一些文档自述文件,这个版本的 tensorflowo 现在只依赖于社区支持,因为主要开发人员正忙于生活。)
更新(2017-04-25):我有一些基于下面测试 tensorflow-opencl 的笔记。
这个包的未来用户应该注意,使用 opencl 意味着所有繁重的计算都转移到了 GPU 上。我提到这一点是因为我个人认为计算工作负载将在我的 CPU 和 iGPU 之间共享。这意味着 GPU 的能力非常重要(特别是带宽和可用 VRAM)。以下是使用 MY SETUP 的 CIFAR10 数据集(带有 iGPU 的 A10-7850)计算 1 个 epoch 的一些数字。您的里程几乎肯定会有所不同!
Tensorflow(通过 pip 安装):~ 1700 s/epoch Tensorflow (w/ 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 中表示,使用上述内容,应该可以做深在 AMD GPU 上学习。事实上,不仅计划支持 Tensorflow,还计划支持 Cafe2、Cafe、Torch7 和 MxNet。
【讨论】:
我很想看到 AMD 采取行动 - 我个人拥有所有 AMD 卡 - 但我们现在被告知 很快 太久了(并不是说 AMD 拥有所有这里控制TensorFlow等是否实现)。 AMD 是否有任何您偶然知道的“问题跟踪器”等价物? 你知道自从你写下这个答案后场景发生了怎样的变化吗?【参考方案4】:这是一个老问题,但由于我过去几周一直试图自己解决这个问题:
-
OpenCL 对 Theano 的支持屡试不爽。 他们添加了一个 libgpuarray 后端,该后端似乎仍然存在问题(即,该进程在 GPU 上运行,但答案是错误的——比如 8% 的准确率MNIST 用于在 CPU 或 nVidia CUDA 上获得约 95+% 准确度的 DL 模型)。此外,由于 nVidia 堆栈上约 50-80% 的性能提升现在来自 CUDNN 库,因此 OpenCL 将被抛在脑后。 (见下文!):)
ROCM 看起来很酷,但是文档(甚至是关于 ROCM 是什么/它的作用的明确声明)很难理解。他们正在尽最大努力,但他们是 4+落后数年。它不适用于 RX550(在撰写本文时)。所以不要浪费你的时间(这是一周中的一周去的地方:))。起初,ROCM 似乎是驱动程序集的新成员(取代 AMDGPU-Pro 或增强它),但实际上它是一个内核模块和一组库,基本上取代了 AMDGPU-Pro。 (认为这相当于 Nvidia-381 驱动程序 + CUDA 某种库)。 https://rocm.github.io/dl.html(老实说,我还没有测试过性能或试图让它与更新的 Mesa 驱动程序一起工作。我会在某个时候这样做。
将 MiOpen 添加到 ROCM,本质上就是 CUDNN。 他们也有一些非常清晰的迁移指南。但更好。
他们创建了“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
【讨论】:
欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. 仅供参考,您链接的页面不再存在,并重定向到其他不完全包含答案的地方。 让我查看下周的最新状态以更新答案。【参考方案5】:如果您可以访问其他 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 支持选项。如果 opencl 实现有效,即使您没有 gfx8+ 或 Polaris gpu,我也会说调查链接。这是一个冗长的过程,但遵循一个写得很好的指令一到三个小时(取决于硬件)并不会太浪费时间。
【讨论】:
【参考方案6】:Tensorflow 1.3 已在 AMD ROCm 堆栈上得到支持:
https://github.com/ROCmSoftwarePlatform/tensorflow预建的 docker 镜像也已公开发布:
https://hub.docker.com/r/rocm/tensorflow/【讨论】:
【参考方案7】:可以通过 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 上都运行良好。 这三个命令在每个脚本的顶部工作:import plaidml.keras
plaidml.keras.import_backend()
from keras import backend as K
我收到一个错误,通过github.com/plaidml/plaidml/issues/1027#issuecomment-617032218修复【参考方案8】:
从技术上讲,如果您使用 OpenCL 之类的东西,则可以,但 Nvidia 的 CUDA 更好,而且 OpenCL 需要其他可能有效也可能无效的步骤。如果您有 AMD gpu,我建议您使用 Google Colab 之类的东西,他们提供免费的 Nvidia GPU,您可以在编码时使用。
【讨论】:
以上是关于将 Keras 和 Tensorflow 与 AMD GPU 结合使用的主要内容,如果未能解决你的问题,请参考以下文章
keras 与 tensorflow.python.keras - 使用哪一个?