ROCm TensorFlow 1.10 を pip でインストールし動かす(CIFAR10 10500 example/sec with VEGA56 @ 70W)

漢なら ROCm TensorFlow で AMD GPU でお手軽機械学習したいですよね!

やりましょう!

ROCm 版 TensorFlow が 1.9 から pip で入るようになり, ソースコードからビルドせずに済むようになりセットアップがお手軽になりました.
(2018 年 9 月 26 日時点では 1.10 が最新です. ちなみにソースコードビルドは HIPCC でのカーネルコンパイルが激重なので 8 コアマシンでもコンパイルに 1 時間くらいかかります)

## 環境

* Python 3.5(conda)
* Ubuntu 16.04
* ROCm 1.9

## インストール

https://github.com/ROCmSoftwarePlatform/tensorflow-upstream

を参考に pip でインストールします.

```
$ pip3 install tensorflow-rocm
```

他に rocm 関連のパッケージを入れておかないとエラーになりますので, 適宜インストールしておきます.

### 問題

すでに古い ROCm 環境があり, それを apt update でアップデートしていると(2018 年 9 月 27 日 1.9 最新), 実行時にエラーがでます

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">TensorFlow ROCm 1.10 prebuit(pip install tensorflow-rocm), VEGA で seg fault して動かないつらい... 😢😢😢 優秀な TensorFlow ROCm 若人を合法的なあらゆるどんな手段を使ってでも探し出し ROCm TensorFlow 動かしていただくお仕事発注したい. 日々精進あるのみですね. <a href="https://t.co/MD4tqvbRON">pic.twitter.com/MD4tqvbRON</a></p>&mdash; Syoyo Fujita ⚡️ No ray tracing No life (@syoyo) <a href="https://twitter.com/syoyo/status/1044223363298713605?ref_src=twsrc%5Etfw">September 24, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


https://github.com/ROCmSoftwarePlatform/tensorflow-upstream/issues/142

/opt/rocm/bin/clang-ocl の実行で失敗してしまいました.

/opt/rocm/bin/clang-ocl が 4.0 ベースなのでそれが原因かなと思いましたが, そうでもなさそうでした.
いろいろ試行錯誤しましたが, 結局は一度 rocm 周りのパッケージをアンインストールし, 再インストールすることで解決しました.
(とくに rocm-clang-ocl, rocm-dev 周りを再インストールするとよさそうです)


## 学習させてみる.

rocm-smi で powerlimit した VEGA で 10500 example/sec @ 70W でました. 
ありがとうございます.

```
2018-09-27 17:26:49.407868: step 760, loss = 2.76 (10613.8 examples/sec; 0.012 sec/batch)
2018-09-27 17:26:49.529923: step 770, loss = 2.92 (10487.1 examples/sec; 0.012 sec/batch)
2018-09-27 17:26:49.651210: step 780, loss = 3.02 (10553.4 examples/sec; 0.012 sec/batch)
2018-09-27 17:26:49.770673: step 790, loss = 2.68 (10714.7 examples/sec; 0.012 sec/batch)
2018-09-27 17:26:50.036888: step 800, loss = 2.65 (4808.1 examples/sec; 0.027 sec/batch)
2018-09-27 17:26:50.177454: step 810, loss = 2.57 (9106.1 examples/sec; 0.014 sec/batch)
2018-09-27 17:26:50.301198: step 820, loss = 2.65 (10343.9 examples/sec; 0.012 sec/batch)
2018-09-27 17:26:50.423603: step 830, loss = 2.56 (10457.1 examples/sec; 0.012 sec/batch)
2018-09-27 17:26:50.545656: step 840, loss = 2.71 (10487.3 examples/sec; 0.012 sec/batch)
2018-09-27 17:26:50.667657: step 850, loss = 2.67 (10491.7 examples/sec; 0.012 sec/batch)
```

https://qiita.com/syoyo/items/4a9c3e17969757ab5422 
(この時に比べると, 今回はより一段 powerlimit しているので, 性能および消費電力は下がっています)

## Multi GPU で学習させてみる

VEGA56 x 2 マシンで, multi gpu で train させてみます.

```
$ python cifar10_multi_gpu_train.py --num_gpus 2
...
2018-09-27 17:29:08.279953: step 850, loss = 2.46 (10747.8 examples/sec; 0.012 sec/batch)
2018-09-27 17:29:08.515126: step 860, loss = 2.54 (12189.3 examples/sec; 0.011 sec/batch)
2018-09-27 17:29:08.743001: step 870, loss = 2.51 (12183.3 examples/sec; 0.011 sec/batch)
2018-09-27 17:29:08.978603: step 880, loss = 2.48 (11522.1 examples/sec; 0.011 sec/batch)
2018-09-27 17:29:09.212675: step 890, loss = 2.31 (9640.6 examples/sec; 0.013 sec/batch)
2018-09-27 17:29:09.443209: step 900, loss = 2.31 (10924.3 examples/sec; 0.012 sec/batch)
2018-09-27 17:29:09.877480: step 910, loss = 2.33 (9057.1 examples/sec; 0.014 sec/batch)
2018-09-27 17:29:10.095742: step 920, loss = 2.49 (10323.9 examples/sec; 0.012 sec/batch)
2018-09-27 17:29:10.304525: step 930, loss = 2.39 (14770.1 examples/sec; 0.009 sec/batch)
2018-09-27 17:29:10.543152: step 940, loss = 2.30 (9138.4 examples/sec; 0.014 sec/batch)
2018-09-27 17:29:10.770725: step 950, loss = 2.39 (10940.6 examples/sec; 0.012 sec/batch)
2018-09-27 17:29:11.008373: step 960, loss = 2.23 (11419.9 examples/sec; 0.011 sec/batch)
2018-09-27 17:29:11.240093: step 970, loss = 2.50 (10688.7 examples/sec; 0.012 sec/batch)
2018-09-27 17:29:11.476931: step 980, loss = 2.58 (10522.3 examples/sec; 0.012 sec/batch)
2018-09-27 17:29:11.701987: step 990, loss = 2.39 (12594.5 examples/sec; 0.010 sec/batch)
2018-09-27 17:29:11.937152: step 1000, loss = 2.36 (9670.3 examples/sec; 0.013 sec/batch)
2018-09-27 17:29:12.412415: step 1010, loss = 2.34 (11320.1 examples/sec; 0.011 sec/batch
```

15000 examples/sec が出るときがありますが, 総じて 11000 ~ 12000 くらいと, 10 ~ 20% くらいの性能向上でしょうか. host CPU が貧弱 + host memory 4 GB なので, CPU or メモリがボトルネックという可能性もありそうです.

まだまだ課題はありますが, AMDGPU で TensorFlow で機械学習させるスキームが整いつつある予感がありますね. 

## tacotron は動かない

keithito Tacotron 


https://github.com/keithito/tacotron/

を動かそうとしましたが, rocFFT が complex float/double に対応していないため, エラーになって動きませんでした. 音声処理周りはしばらく様子見ですね...

(2018/11/30 追記): ROCm 1.9.2 + rocm tesnsorflow 1.12 で推論デモが動作するのを確認しました. ただ, 結果がおかしいような...?　



# TODO

* CIFAR10 以外で学習がうまくいくか試す. 
* Threadripper 2990WX + VEGA 4 枚差しで multi gpu train を試したい. 
* 優秀な TensorFlow 若人さまが, **人類史上最速で優秀な ROCm TensorFlow 若人さまへと昇華なされるスキーム**を確立したい