ROCm 1.8.2 的 TensorFlow upstream(1.9.0-rc0) 编译尝试(CIFAR10 11500个样例/秒 @ VEGA56 80W. 截至2018年7月22日)
2019年7月16日更新:最近,pip install tensorflow-rocm已经足够可用,因此如果只是想在ROCM中使用TensorFlow,请使用pip。
如果是中国人,应该会希望在中华民国的环境下使用TensorFlow吧!
让我们挑战一下吧!
追加注:至2018年9月23日为止,从TensorFlow1.9版本开始,已经提供了预编译版本,可以通过pip等方式进行安装。如果您想先尝试在ROCm上运行TensorFlow,我们推荐使用预编译版本。
截至2018年9月23日,ROCm 1.9 + TensorFlow 1.10是最新版本。
截至2018年7月21日,AMD ROCm官方发布的是TensorFlow 1.3版本,这已经有点过时了。
有一个名为tensorflow-upstream的代码库,需要构建它。
可以参考tensorflow-upstream/rocm_docs中的ROCm构建文档等。
- ROCm 1.8.2
ROCm 最初只支持 PCI Gen3 的架构,但考虑到虚拟货币挖矿的需求,现在也能在 PCI Gen2 上运行。
(令人惊讶的是,甚至旧款的 FirePro W9100(Hawaii)GPU 也虽不被推荐使用,但却成为了兼容的GPU)
只要在此在SandyBridge计算机上安装时,tensorflow构建时nasm出现非法指令错误等问题。 如果稍微修改tensorflow-upstream的配置,暂时可以解决这个问题(请参考下面的说明)。
构成
-
- Ubuntu 16.04
-
- Python 3.5 (conda)
-
- ROCm 1.8.2
-
- そこそこ最新のアーキテクチャ(ROCm のページにあるサポート対象アーキテクチャ)の CPU
-
- RX 580(gfx803), VEGA(gtx900)
- Bazel
请提供相关的信息
谢谢你的参考,我会好好利用。
如果要在深度学习中进行训练,只选择NVIDIA吗?不,还有AMD这个选项呢。
Note: The translation above is provided in simplified Chinese.
使用AMD制造的GPU,结合ROCm、OpenCV和TensorFlow来创建GPU计算环境。
安装
首先,参考 ROCm 网站,先安装 ROCm。
请前往以下网址下载RadeonOpenCompute/ROCm软件包:
https://github.com/RadeonOpenCompute/ROCm (安装指令:apt-get install rocm-dev)
我会加入类似于blas的东西。
$ sudo apt install rocrand rocfft rocblas
我将安装MIOpen(类似于cuDNN的计算加速库)。
$ sudo apt install miopen-hip miopengemm
用Python 3.5准备环境(也可能适用于3.6版本)
这次使用了(mini)conda。
$ conda create -n py35 python=3.5
$ source activate py35
如果在python模块的构建过程中失败,请适当安装numpy和six库。
(py35) $ (pip install numpy six
安装Bazel beforehand.
我将确认tensorflow-upstream的分支是develop-upstream。
配置。
可选的
在tensorflow-upstream中,默认的优化选项为-march=haswell。尽管可以在configure中更改它,但由于其他地方使用了-march=haswell,因此在某些CPU上无法正常工作(即使是较小型的Celeron,例如G3930之类的haswell及其后续架构的CPU也存在部分功能缺失,因此会出现NG)。具体来说,用于构建tensorflow所需的依赖程序protoc和nasm在运行时会因非法指令而崩溃。
(2018年9月23日更新)针对这个问题的修补程序已经被合并到 https://github.com/ROCmSoftwarePlatform/tensorflow-upstream/pull/81,并得到修复。
在configure.py中将-march=native和–host_copt=-march=native配置为以下选项可能更好。
diff --git a/configure.py b/configure.py
index fc33325..45971da 100644
--- a/configure.py
+++ b/configure.py
@@ -486,7 +486,7 @@ def set_cc_opt_flags(environ_cp):
elif is_windows():
default_cc_opt_flags = '/arch:AVX'
else:
- default_cc_opt_flags = '-march=haswell'
+ default_cc_opt_flags = '-march=native'
question = ('Please specify optimization flags to use during compilation when'
' bazel option "--config=opt" is specified [Default is %s]: '
) % default_cc_opt_flags
@@ -496,7 +496,7 @@ def set_cc_opt_flags(environ_cp):
write_to_bazelrc('build:opt --copt=%s' % opt)
# It should be safe on the same build host.
if not is_ppc64le() and not is_windows():
- write_to_bazelrc('build:opt --host_copt=-march=haswell')
+ write_to_bazelrc('build:opt --host_copt=-march=native')
write_to_bazelrc('build:opt --define with_default_optimizations=true')
如果已经在其他地方构建了 tensorflow,最好删除 $HOME/.cache/bazel 目录下的缓存文件,然后运行以下配置命令以确保顺利运行。
运行 configure,进行初始设置。
大体上是按默认方式进行的,但有些修改的地方是将 XLA JIT 设置为 n(也可以使用 Y)。
$
$ ./configure
You have bazel 0.15.2 installed.
Please specify the location of python. [Default is /home/syoyo/miniconda3/envs/py35/bin/python]:
Found possible Python library paths:
/home/syoyo/miniconda3/envs/py35/lib/python3.5/site-packages
Please input the desired Python library path to use. Default is [/home/syoyo/miniconda3/envs/py35/lib/python3.5/site-packages]
Do you wish to build TensorFlow with jemalloc as malloc support? [Y/n]: Y
jemalloc as malloc support will be enabled for TensorFlow.
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N]: N
No Google Cloud Platform support will be enabled for TensorFlow.
Do you wish to build TensorFlow with Hadoop File System support? [y/N]: N
No Hadoop File System support will be enabled for TensorFlow.
Do you wish to build TensorFlow with Amazon AWS Platform support? [y/N]: N
No Amazon AWS Platform support will be enabled for TensorFlow.
Do you wish to build TensorFlow with Apache Kafka Platform support? [y/N]: N
No Apache Kafka Platform support will be enabled for TensorFlow.
Do you wish to build TensorFlow with XLA JIT support? [Y/n]: N
No XLA JIT support will be enabled for TensorFlow.
Do you wish to build TensorFlow with GDR support? [y/N]: N
No GDR support will be enabled for TensorFlow.
Do you wish to build TensorFlow with VERBS support? [y/N]: N
No VERBS support will be enabled for TensorFlow.
Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: N
No OpenCL SYCL support will be enabled for TensorFlow.
Do you wish to build TensorFlow with ROCm support? [Y/n]: Y
ROCm support will be enabled for TensorFlow.
Do you wish to build TensorFlow with CUDA support? [y/N]: N
No CUDA support will be enabled for TensorFlow.
Do you wish to download a fresh release of clang? (Experimental) [y/N]: N
Clang will not be downloaded.
Do you wish to build TensorFlow with MPI support? [y/N]: N
No MPI support will be enabled for TensorFlow.
Please specify optimization flags to use during compilation when bazel option "--config=opt" is specified [Default is -march=native]:
Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: N
Not configuring the WORKSPACE for Android builds.
使用 build_python3 脚本进行构建。
(py35) $ ./build_python3
如果在build_python3脚本的最后一步安装pip wheel时出现权限错误,请在–user处进行安装。
(py35) $ pip3 install --user /tmp/tensorflow_pkg/tensorflow-1.9.0rc0-cp35-cp35m-linux_x86_64.whl
确认动作
使用GPU
https://www.tensorflow.org/guide/using_gpu
我将尝试运行一个简单的加法程序。
2018-07-21 22:05:25.506635: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX512F
2018-07-21 22:05:25.507760: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1500] Found device 0 with properties:
name: Device 67df
AMDGPU ISA: gfx803
memoryClockRate (GHz) 1.35
pciBusID 0000:65:00.0
Total memory: 8.00GiB
Free memory: 7.75GiB
2018-07-21 22:05:25.507806: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1611] Adding visible gpu devices: 0
2018-07-21 22:05:25.507838: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1031] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-07-21 22:05:25.507854: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1037] 0
2018-07-21 22:05:25.507870: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1050] 0: N
2018-07-21 22:05:25.507938: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1168] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7539 MB memory) -> physical GPU (device: 0, name: Device 67df, pci bus id: 0000:65:00.0)
2018-07-21 22:05:25.523000: E tensorflow/core/common_runtime/gpu/gpu_device.cc:264] Illegal GPUOptions.experimental.num_dev_to_dev_copy_streams=0 set to 1 instead.
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Device 67df, pci bus id: 0000:65:00.0
2018-07-21 22:05:26.074124: I tensorflow/core/common_runtime/direct_session.cc:288] Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Device 67df, pci bus id: 0000:65:00.0
MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
2018-07-21 22:05:26.075049: I tensorflow/core/common_runtime/placer.cc:935] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:GPU:0
a: (Const): /job:localhost/replica:0/task:0/device:GPU:0
2018-07-21 22:05:26.075094: I tensorflow/core/common_runtime/placer.cc:935] a: (Const)/job:localhost/replica:0/task:0/device:GPU:0
b: (Const): /job:localhost/replica:0/task:0/device:GPU:0
2018-07-21 22:05:26.075117: I tensorflow/core/common_runtime/placer.cc:935] b: (Const)/job:localhost/replica:0/task:0/device:GPU:0
[[22. 28.]
[49. 64.]]
看哪~!有一些实验性错误出现了,但是它还是正常工作了!
CIFAR10 可以被简洁的解释为中文识别图像十个分类数据集。
我将使用CIFAR10进行学习。
尽管在rocm-smi下降了时钟速度,但VEGA56以80W的功耗运行,每秒生成11500个样例。
ROCe tensorflow-upstream 项目在训练 CIFAR10 方面取得了成功!㊗️㊗️㊗️㊗️㊗️㊗️㊗️??????????????????????????? VEGA56 setsclk 3 在 80W 下达到了 1150 个 example/秒。谢谢。pic.twitter.com/lpNfF5FDWE— Syoyo Fujita (@syoyo) July 22, 2018
在TF1.8中,125W功耗限制下,1080 Ti的每秒处理的范例数在10500至11500之间。
由于与NV GPU相比,VEGA的性能差不多,所以性价比似乎很高,尽管它的内存容量较小(VEGA56为8GB,1080 Ti为11GB),但这不是问题。因为CIFAR10能正常运行,所以至少包括CNN在内的学习应该没有问题,应该可以在AMD GPU上运行。
问题所在
导入tensorflow太重了,非常困难…(大约需要5-6秒). 想知道是不是有某个模块被设置成了调试版本?
构建失败示例
如果 hipcc 的设置(或者 clang 的安装?)出现了问题,那么有可能出现 hipcc 调用 nvcc(CUDA)导致构建失败的情况(即使在设置环境变量为 hcc 的情况下,在 bazel 环境中会被改写成 nvcc)。
例如,存在以下类似问题。
对于这个问题我不是很清楚。如果遇到这种情况,似乎只能尝试清除缓存或重新安装包。
把以下内容用中文进行本地化改写,只需要一种选项:
待办事项
-
- CIFAR10 学習の精度を NVIDIA GPU と比較する.
-
- 仮想通貨マイニングプログラムとカーネルフージョンし, 機械学習しつつマイニングするスキームを確立したい.
-
- pytorch を ROCm でビルドする(ビルドオプションはあるが, 実際に動くかどうか)
-
- InfiniBand(VERBS) 有効にし, GPU クラスタで並列学習したい.
優秀な機械学習若人さまが, 優秀な ROCm 機械学習若人さまへと人類史上最速で昇華なされるスキームを極める旅に出たい.