LoginSignup
13
16

More than 3 years have passed since last update.

ROCm 1.8.2 で TensorFlow upstream(1.9.0-rc0)をコンパイルする試み(CIFAR10 11500 examples/sec @ VEGA56 80W. 2018 年 7 月 22 日時点)

Last updated at Posted at 2018-07-21

2019 年 7 月 16 日追記: 最近では pip install tensorflow-rocm が十分動くので, 単に TensorFlow を ROCm で使いたい場合は pip を使いましょう.


漢なら ROCm で TensorFlow 動かしたいですよね!

チャレンジしましょう!

2018 年 9 月 23 日追記: 昨今では TensorFlow 1.9 あたりから prebuilt 版が出てきて pip とかでインストールできるようになりました. まずは ROCm で TensorFlow 試したい場合は prebuilt 版をおすすめします.

2018 年 9 月 23 日時点では ROCm 1.9 + TensorFlow 1.10 が最新です.

2018 年 7 月 21 日時点では, AMD ROCm オフィシャルで配布されているのは TensorFlow 1.3 になります.
これではちょと古いですよね..

tensorflow-upstream repo がありますのでこれをビルドします.

ROCm でのビルドのドキュメントなどが tensorflow-upstream/rocm_docs にありますので参考にしましょう.

  • ROCm 1.8.2

ROCm は, 元来 PCI Gen3 以降のアーキティクチャ対応だったのですが, 仮想通貨マイナーのことも考慮してか, PCI Gen2 でも動くようになりました.
(いつのまにか FirePro W9100(Hawaii) あたりの古い GPU も非推奨ですが動作する GPU になっていました)

ただ, こちらで SandyBridge マシンにインストールしようとしたら, tensorflow ビルド時に nasm が illegal instruction で落ちるなどしました. こちらについては tensorflow-upstreamconfigure を少し書き換えればとりあえずは解決します(後述の解説を参照ください)

構成

  • Ubuntu 16.04
  • Python 3.5 (conda)
  • ROCm 1.8.2
  • そこそこ最新のアーキテクチャ(ROCm のページにあるサポート対象アーキテクチャ)の CPU
  • RX 580(gfx803), VEGA(gtx900)
  • Bazel

参考情報

参考になります, ありがとうございます.

深層学習で学習やるならNVIDIA一択?いや、AMDという選択肢がありますよ
https://qiita.com/kz_lil_fox/items/d1a18f58e9e5033e7e14

AMD製GPU + ROCm + OpenCV + TensorFlow でGPUコンピューティング環境をつくる
https://qiita.com/hktm/items/ead2ed4ed3441fca7311

セットアップ

ROCm のサイトを参考に, 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

numpy, six を入れます(他, python module 周りでビルドに失敗したら適宜パッケージを入れてください)

(py35) $ (pip install numpy six

Bazel をインストールしておきます.

tensorflow-upstream の branch は develop-upstream であることを確認しておきます.

configure します.

optional

tensorflow-upstream では, 最適化オプションは -march=haswell がデフォルトになっており, これを configure で変えても他のところで -march=haswell を使っているところがあるため, 一部 CPU では動作しません(マイナー御用達の Celeron でも, たとえば G3930 など haswell 以降のアーキテクチャでも CPU 機能が一部かけているためか NG になります). 具体的には, tensorflow をビルドするために必要な依存プログラムの protocnasm あたりが, 実行時に Illegal instruction で落ちてしまいます.

(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 を走らせると確実そうです.

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 のインストールで permission エラーが出る場合は, --user あたりでインストールしておきます.

(py35) $ pip3 install --user /tmp/tensorflow_pkg/tensorflow-1.9.0rc0-cp35-cp35m-linux_x86_64.whl

動作確認

Using GPUs
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.]]

Voila~! なんか experimental のエラーがでていますが, 動作はしました!

CIFAR10

CIFAR10 を学習させてみます.
rocm-smi でクロックを下げていますが, VEGA56 で 80W で 11500 examples/sec でました.

tf1.8 で 125W powerlimit な 1080 Ti で 10500 ~ 11500 examples/sec でした.

と比べても VEGA は NV GPU と同等くらいの性能が出ているので, メモリ容量すくない(VEGA56 は 8GB, 1080 Ti は 11 GB)という問題はありますが, コスパよさそうです. (CIFAR10 が動いたので, 少なくとも CNN あたりを含む学習はこれで問題なく AMD GPU で動くはず)

問題点

import tensorflow がめちゃくちゃ重くてつらい...(5,6 秒くらいかかる). どこかのモジュールがデバッグビルドになっているのかしら?

ビルド失敗例

hipcc の設定(or clang のインストール?)がうまくいっていないと, hipcc が nvcc(CUDA) を呼び出すようになりビルドに失敗するケースがあります.
(環境変数に hcc を設定しても, bazel での環境ではなにやら書き換えられて nvcc になる.)

たとえば以下のような issue があります.

これについてはよくわかりません. 遭遇したらなにかしらキャッシュをクリアするなりパッケージを再インストールするしかなさそうです.

TODO

  • CIFAR10 学習の精度を NVIDIA GPU と比較する.
  • 仮想通貨マイニングプログラムとカーネルフージョンし, 機械学習しつつマイニングするスキームを確立したい.
  • pytorch を ROCm でビルドする(ビルドオプションはあるが, 実際に動くかどうか)
  • InfiniBand(VERBS) 有効にし, GPU クラスタで並列学習したい.
  • 優秀な機械学習若人さまが, 優秀な ROCm 機械学習若人さまへと人類史上最速で昇華なされるスキームを極める旅に出たい.
13
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16