【動くとは言ってない】Tensorflow2.0のAMD GPU向け環境構築【Tensorflow-rocm2.0.0】

TF2.0アドベントカレンダー19日目の記事です.

 まずお詫びですが本来ならAMDでTensorflow2.0環境下においてもどれぐらい定番モデルで性能が出るかを軽くテストしようと思ってたのですがまさかのTF公式ベンチマークが2.0未対応だったと言うオチだったので今から直して動かす時間もないのでAMD GPUでも一応TF2.0が動きますよ!と言うお話に変更しました。

##テスト環境

Ubuntu18.04とRadeonⅦでテストしてます.
ROCｍ versionはv2.10です(version 2.1という意味ではない）



#AMD GPUにおけるTensorflow

##ROCｍとは
 最近は有名になってきましたが2016年にOpenGPUに一環としてROCｍがリリースされCUDA互換をめざしたGPGPUプラットフォームが公開されました。 当時はカスタムLinuxカーネルをぶち込めだのHaswell以降のCPUとHawaii以降のGPUアーキテクチャとPCIE3.0のサポートを用意しろだの当時の水準としては若干厳しい要求水準でした。
まだTensorflowも出てきてそれほど経って居らずCUDAのみでしたがそれから3年が経ち相対的に要求水準も下がったのもあって導入も用意になりました。

##必要環境

[ROCm（RadeonOpenCompute)の対応CPUやGPU、OSについて]  (https://qiita.com/T_keigo_wwk/items/c9cb42663afeed1838d9)
[公式Document] (https://rocm-documentation.readthedocs.io/en/latest/Installation_Guide/Installation-Guide.html#supported-operating-systems)

大体ココらへんに書いてありますが端的に言うとMacとWindowsでは動きません、AMDのGPUが採用されていることからMacユーザーの方から興味を持ってもらえることがありますがLinuxでしか基本動作しません。

個人的にはUbutnuがなんだかんだで導入ハードルが一番低い気がします。

またAPUでは動きません、PCIeにぶっ刺すタイプのGPUをご検討ください。
要約するとPolaris以降で（ただしNaviを除く）のディスクリートGPUとHaswell or Rezen以降のCPUでPCIE GEN3を搭載したlinuxマシンをご用意ください.


できればVega10以降のアーキテクチャが望ましいです、またNavi(RX5700/5700XT）は現時点ではまだ未対応です、ご注意ください
~~なんだかんだで制約多いやんけ~~
##ROCmのセットアップ

私が環境のセットアップに使ってるシェルスクリプトです
ubuntu 18.04を想定しています.



基本的にリポジトリを追加してdkmsからROCmをインストールして各種ライブラリを入れていく感じです
```yes | sudo apt install miopen-hip ```などがありますがこれはNVIDIAに相当するところのcudnnです。


```shell


wget -qO - http://repo.radeon.com/rocm/apt/debian/rocm.gpg.key | sudo apt-key add - 
echo 'deb [arch=amd64] http://repo.radeon.com/rocm/apt/debian/ xenial main' | sudo tee /etc/apt/sources.list.d/rocm.list
yes | sudo apt update
yes | sudo apt install rocm-dkms
sudo usermod -a -G video $LOGNAME
yes | sudo apt install roctracer-dev
yes | sudo apt install rccl
yes | sudo apt install rocblas
yes | sudo apt install hipblas
yes | sudo apt install rocfft
yes | sudo apt install rocsparse
yes | sudo apt install miopen-hip 
yes | sudo apt install miopengemm
yes | sudo apt install hipsparse 
yes | sudo apt install rocrand

echo 'export PATH=$PATH:/opt/rocm/bin:/opt/rocm/profiler/bin:/opt/rocm/opencl/bin/x86_64' | sudo tee -a /etc/profile.d/rocm.sh
# docker 

prf=`cat <<'EOF'
export HIP_VISIBLE_DEVICES=0
export HCC_HOME=/opt/rocm/hcc
export ROCM_PATH=/opt/rocm
export HIP_PATH=/opt/rocm/hip
export PATH=/usr/local/bin:$HCC_HOME/bin:$HIP_PATH/bin:$ROCM_PATH/bin:/opt/rocm/opencl/bin/x86_64:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/rocm/opencl/lib/x86_64
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
EOF
`
echo "$prf" >> ~/.bashrc

```
必要に応じてpip3などを入れるなどします

```
yes | sudo apt-get install python-pip python2.7 python2.7-dev python3 |
yes | sudo apt install python3-pip |
```


参考 https://www.gpueater.com/help_ja.html


大体これでROCｍ環境のセットアップは終わります

導入が成功したかどうかは```/opt/rocm/bin/rocminfo ```(PATHが通ってれば```rocminfo```のみで大丈夫です)でGPU情報が表示されるかどうかでわかります。
失敗している場合はエラーを吐くはずです


#Tensorflow-rocm2.0の導入

CUDA向けのtensorflow-gpuと同様に

```
pip3 install tensorflow-rocm==hoge_tensorflow_version
```

で大丈夫です.
2系のパッケージとしては現時点で

```
2.0.0b1, 2.0.0b2, 2.0.0b3, 2.0.0, 2.0.1, 2.1.0rc0
```
が用意されています.

#Dockerについて

ROCmでは公式Docker imageが用意されてます、またNvidia dockerのような面倒くさいインストールも無用です

```
docker pull rocm/tensorflow:rocm2.10.0-tf2.0-dev
```

ROCmとDockerをインストールして上記のイメージをpullするだけよいです。
使い方としてはtensorflow-gpuのimageと置き換えて使う感じが正しいのでしょうか

https://hub.docker.com/r/rocm/tensorflow/tags

rocm-tfのイメージは各種用意されているのでお好きなイメージをpullして使ってください.


#動かしてみる

TF2でも一応AMD GPUが使えるよ!と言う話でした

ただし信頼性の観点ではかなり微妙で

https://github.com/tensorflow/docs/blob/master/site/ja/tutorials/images/cnn.ipynb
ココらへんとかテストしたんですが（tensorflow-gpuをtensorflow-rocmに置き換えて）なぜか勝手にCPUを使ったりしているので正直凄い怪しいところがあります.

##適当にいくつかカレンダーの皆さんが書いてくれやつを試せるだけ試してみる.

ちゃんと動かないんだなこれが!w

##一本目
[TensorFlow 2.0でのMINSTの実行とTensorBoardでの可視化まで(2019年版)](https://qiita.com/syabuo/items/abc0d51ad8cffcdbcded)

定番のMINST

```
 python ./minst.py 
2019-12-19 03:34:08.688838: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libhip_hcc.so
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
```

内部で謎のコアダンプを起こして死亡

https://github.com/ROCmSoftwarePlatform/tensorflow-upstream/issues/652
過去バージョンのROCmでもなんかあったっぽい

##2本目
[KerasでInceptionとか色々な自作Modelを作ってみる話【Colab付き】](https://qiita.com/Suguru_Toyohara/items/3b694b41f4adb843cd23)
ipynbをcolabからダウンロードさせていただき例によってtensorflow-gpuの部分をrocm==2.0.1に書き換えて実行させていただきました.


ひとまずチュートリアル1の学習タスクを走らせてみたところの様子です.
![Screenshot from 2019-12-19 03-53-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/e71b8b1b-c8ea-8eb4-938a-98d1990ead9c.png)

HBM2 16GBが食い尽くされとる・・

Tensorflow-rocmあるあるなんですが最初のepochで異常に時間を食うと言う特徴があります。
以下をご覧ください
![Screenshot from 2019-12-19 03-57-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/895f8fd8-462a-4071-6ac4-a5e02e8d3300.png)

Epoch1/10だけ98sもかかっておりなにしとるんじゃと言った感じです。
ただそれ以降はcolab(おそらくTeslaK80?)で12sほどでしたが6sで済んでるので実際性能は出せてると思うんですが最初のepochで以上に時間が掛かるのをどうにかしてほしいですね...
 VRAMを食い過ぎなだけな気もしますが...

チュートリアル2:Functional APIの学習タスクを試しましたが（batchサイズを試しに64にしてみるなどしています）
![Screenshot from 2019-12-19 04-17-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/4ad6558c-dfff-9c7a-892e-60a72231b30a.png)

やはり最初のエポックで大爆死しています.


まだやはり一応動きますの段階を脱してるとは言えない感じですかねこれは...

あと何故か100epochテストでは
![Screenshot from 2019-12-19 04-26-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/48ab76fb-da76-75b6-8aee-03c5f81f3ebf.png)

1epochでもさっきほど時間を取ってません、もしかしてVRAM確保とかに時間かけてるのかな・・・

時間があれば[rocprf](https://github.com/ROCm-Developer-Tools/rocprofiler)あたりで動作検証したほうがいいかもしれないですがこれはまた今度どこかで…

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/45f30785-f317-0fc3-8b15-54b5be334442.png)
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/16dcea0b-0d4a-99cd-d00e-738fea55bfee.png)

ちなみにちゃんと学習結果も再現できました
#まとめ

対応したが動くとは言ってない

時間がなくてしっかり検証してなくて申し訳無いのですが一応動くよってことを覚えてもらえば幸いです。


#謝礼

参考にさせていただいたカレンダーの皆さんありがとうございました、せっかく書いてもらったにも関わらずまともに動かなくて若干申し訳なさを感じております。