TF2.0アドベントカレンダー19日目の記事です.
まずお詫びですが本来ならAMDでTensorflow2.0環境下においてもどれぐらい定番モデルで性能が出るかを軽くテストしようと思ってたのですがまさかのTF公式ベンチマークが2.0未対応だったと言うオチだったので今から直して動かす時間もないのでAMD GPUでも一応TF2.0が動きますよ!と言うお話に変更しました。
##テスト環境
Ubuntu18.04とRadeonⅦでテストしてます.
ROCm versionはv2.10です(version 2.1という意味ではない)
#AMD GPUにおけるTensorflow
##ROCmとは
最近は有名になってきましたが2016年にOpenGPUに一環としてROCmがリリースされ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です。
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
大体これでROCm環境のセットアップは終わります
導入が成功したかどうかは/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と置き換えて使う感じが正しいのでしょうか
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年版)
定番の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付き】
ipynbをcolabからダウンロードさせていただき例によってtensorflow-gpuの部分をrocm==2.0.1に書き換えて実行させていただきました.
ひとまずチュートリアル1の学習タスクを走らせてみたところの様子です.
HBM2 16GBが食い尽くされとる・・
Tensorflow-rocmあるあるなんですが最初のepochで異常に時間を食うと言う特徴があります。
以下をご覧ください
Epoch1/10だけ98sもかかっておりなにしとるんじゃと言った感じです。
ただそれ以降はcolab(おそらくTeslaK80?)で12sほどでしたが6sで済んでるので実際性能は出せてると思うんですが最初のepochで以上に時間が掛かるのをどうにかしてほしいですね...
VRAMを食い過ぎなだけな気もしますが...
チュートリアル2:Functional APIの学習タスクを試しましたが(batchサイズを試しに64にしてみるなどしています)
やはり最初のエポックで大爆死しています.
まだやはり一応動きますの段階を脱してるとは言えない感じですかねこれは...
1epochでもさっきほど時間を取ってません、もしかしてVRAM確保とかに時間かけてるのかな・・・
時間があればrocprfあたりで動作検証したほうがいいかもしれないですがこれはまた今度どこかで…
ちなみにちゃんと学習結果も再現できました
#まとめ
対応したが動くとは言ってない
時間がなくてしっかり検証してなくて申し訳無いのですが一応動くよってことを覚えてもらえば幸いです。
#謝礼
参考にさせていただいたカレンダーの皆さんありがとうございました、せっかく書いてもらったにも関わらずまともに動かなくて若干申し訳なさを感じております。