我开始学习 Keras,我相信它是 Tensorflow 和 Theano 之上的一层。但是,我只能使用 AMD GPU,例如 AMD R9 280X。
如何设置我的 Python 环境,以便我可以通过 Keras/Tensorflow 对 OpenCL 的支持来使用我的 AMD GPU?
我在 OSX 上运行。
我正在 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 设备编译它。这是一个非常通用的目标,也是一个非常通用的编译器
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 训练器正在工作,其他的都已提交,但尚未测试
每个元素的操作,使用 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 还使用 Computecpp 开发了一个 fork,https://www.codeplay.com/products/computesuite/computecpp 据我所知,他们的 fork 比我自己的要求更高,就它适用于哪些特定的 GPU 设备而言。您需要查看平台支持说明(位于 hte computecpp 页面底部),以确定您的设备是否受支持。 codeplay 分支实际上是一个官方的 Google 分支,在这里:https://github.com/benoitsteiner/tensorflow-opencl
这篇文章的最初问题是:如何让 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/... - //张量流/编译器/...
更新:在我的设置上执行此操作需要很长时间。需要很长时间的部分是所有正在运行的测试。我不确定这意味着什么,但我的很多测试都在 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(带 SSE + AVX):~ 1100 s/epoch
Tensorflow (w/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。
可以通过 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
import plaidml.keras
plaidml.keras.import_backend()
from keras import backend as K
这是一个老问题,但自从我过去几周试图自己解决这个问题以来:
OpenCL 对 Theano 的支持屡试不爽。他们添加了一个似乎仍然有问题的 libgpuarray 后端(即,该进程在 GPU 上运行,但答案是错误的——比如 MNIST 上 8% 的准确度,而 DL 模型在 CPU 或 nVidia 上的准确度高达 95% 以上CUDA)。此外,由于 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 直接排列为可翻译的。有些概念不是完美的地图,但总的来说它看起来不错。
现在,终于,在尝试了解 OpenCL 等 3-4 周之后,我发现本教程可以帮助您快速入门。这是让 hipCaffe 启动和运行的一步一步。与 nVidia 不同,请确保您有支持的硬件!!!! https://rocm.github.io/hardware.html。认为您可以在没有他们支持的硬件的情况下使其正常工作?祝你好运。你已经被警告过了。一旦你启动并运行 ROCM(并运行验证测试),这里是 hipCaffe 教程——如果你启动了 ROCM,你将在 10 分钟内进行 MNIST 验证测试——太棒了! https://rocm.github.io/ROCmHipCaffeQuickstart.html
Theano 确实支持 OpenCL,但仍处于早期阶段。 Theano 本身对 OpenCL 不感兴趣,依赖于 community support。
Most 的操作已经实现,主要是调整和优化给定的操作。
要使用 OpenCL 后端,您必须自己build libgpuarray
。
根据个人经验,我可以告诉您,如果幸运的话,您将获得 CPU 性能。内存分配似乎非常幼稚地实现(因此计算会很慢)并且在内存不足时会崩溃。但我鼓励您尝试甚至优化代码或帮助报告错误。
AMD ROCm 堆栈支持 Tensorflow 1.3:
https://github.com/ROCmSoftwarePlatform/tensorflow
一个预建的 docker 镜像也已经公开发布:
https://hub.docker.com/r/rocm/tensorflow/
如果您可以访问其他 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,我也会说调查链接。这是一个冗长的过程,但是遵循一个写得很好的指令一到三个小时(取决于硬件)并不会太浪费时间。
从技术上讲,如果您使用 OpenCL 之类的东西,您可以,但 Nvidia 的 CUDA 更好,而且 OpenCL 需要其他可能有效也可能无效的步骤。如果您有 AMD gpu,我建议您使用 Google Colab 之类的东西,他们提供免费的 Nvidia GPU,您可以在编码时使用。
不定期副业成功案例分享