例のグラボでTensorFlow環境を作る

# 例のグラボとは
いつぞや6000円くらいで大量に中古が出回っていたマイニング用のGfxカードです。
AMDのRX470相当品のようです。ちなみに改造して映像出力にも使ってます。

# なんの情報か
自分でAMD GPUを使った環境を構築したのでその覚書です。

# 参考情報
以下のページを参考にさせていただきました。
https://qiita.com/hktm/items/ead2ed4ed3441fca7311
https://qiita.com/ymiura17/items/5ebd7e85abb679153447

# 環境
Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz(Skylake)
DDR3 20MByte
Radeon RX 470(8G)　映像出力改造済み
ubuntu 18.04.3 LTS

# 構築手順
以下、コマンドをそのまま記載します。
ディレクトリ構成とかが一緒で良ければこのままで動くはず。

## ROCm関連のインストール

ROCm関連の環境をインストールします。終わったら再起動を行います。

```
cd ~
sudo apt update
sudo apt dist-upgrade
sudo apt install libnuma-dev
wget -qO - http://repo.radeon.com/rocm/apt/debian/rocm.gpg.key | sudo apt-key add -
sudo sh -c 'echo deb [arch=amd64] http://repo.radeon.com/rocm/apt/debian/ xenial main > /etc/apt/sources.list.d/rocm.list'
sudo apt update
sudo apt purge compute-firmware
sudo apt purge $(dpkg -l | grep 'kfd\|rocm' | grep linux | grep -v libc | awk '{print $2}')
sudo apt autoremove rocm-dkms
sudo apt install -y rocm-dkms
sudo usermod -a -G video $LOGNAME
sudo apt install -y clinfo
sudo reboot
```

再起動したら以下のコマンドを入力し、正常に認識していることを確認します。

```
/opt/rocm/bin/rocminfo 
clinfo
```
正常に認識していたら各種情報が出力されます。

## 環境変数の設定
必要な環境変数を設定します。

```
echo 'export HIP_VISIBLE_DEVICES=0' >> ~/.profile
echo 'export HCC_HOME=/opt/rocm/hcc' >> ~/.profile
echo 'export ROCM_HOME=/opt/rocm/bin' >> ~/.profile
echo 'export HIP_PATH=/opt/rocm/hip' >> ~/.profile
echo 'export PATH=/usr/local/bin:$HCC_HOME/bin:$HIP_PATH/bin:$ROCM_HOME:$PATH:/opt/rocm/opencl/bin/x86_64' >> ~/.profile
echo 'export LD_LIBRARY=$LD_LIBRARY:/opt/rocm/opencl/lib/x86_64' >> ~/.profile
echo 'export LC_ALL="en_US.UTF-8"' >> ~/.profile
echo 'export LC_CTYPE="en_US.UTF-8"' >> ~/.profile
source ~/.profile
export PIP=pip3
export PYTHON=python3
export HIP_PLATFORM=hcc
export PLATFORM=hcc
```

## Python環境のインストール
ここでは直接システムに入れてしまったけど、Pyenvで切り替えできるようにしておくほうが良いです。

```
sudo apt update
sudo apt install -y build-essential python3 python3-dev python3-pip pkg-config check cmake libhdf5-dev
sudo pip3 install --upgrade pip
sudo pip3 install -y setuptools scipy numpy six pillow h5py
```

## ROCm関連の開発ツール・ライブラリ
ROCm関連に必要な開発ツール関連をインストールする。

```
sudo apt install git
sudo apt install -y --allow-unauthenticated rocm-dkms rocm-dev rocm-libs rocm-device-libs hsa-ext-rocr-dev hsakmt-roct-dev hsa-rocr-dev rocm-opencl rocm-opencl-dev rocm-utils rocm-profiler cxlactivitylogger miopen-hip miopengemm
sudo apt install rccl
mkdir src
cd src
export C_INCLUDE=PATH
export C_INCLUDE_PATH=/opt/rocm/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/opt/rocm/include:$CPLUS_INCLUDE_PATH
./install.sh 
cd ..
git clone https://github.com/ROCmSoftwarePlatform/hcFFT.git && cd hcFFT
./install.sh 
cd
```
## OpenCVのインストール
ここではソースコードからOpenCVを入れます。ちょっと古いけど問題が少ない3.4.3を入れています。
CPUのコア数が4なので、makeでは-j 4を指定しています。

```
cd ~/src
sudo apt install -y build-essential
sudo apt install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install -y python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install -y libxvidcore-dev libx264-dev
sudo apt install -y libgtk-3-dev
sudo apt install -y libatlas-base-dev gfortran pylint
sudo apt install -y python2.7-dev python3.5-dev
sudo apt install -y python2.7-dev python3.6-dev
sudo apt install -y unzip
wget https://github.com/opencv/opencv/archive/3.4.3.zip -O ~/src/opencv-3.4.3.zip
wget https://github.com/opencv/opencv_contrib/archive/3.4.3.zip -O ~/src/opencv_contrib-3.4.3.zip
unzip opencv-3.4.3.zip 
unzip opencv_contrib-3.4.3.zip 
cd opencv-3.4.3/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D USE_V4L=ON -D USE_V4L2=ON -D WITH_V4L=ON -D WITH_V4L2=ON -D INSTALL_C_EXAMPLES=OFF -D INSTALL_PYTHON_EXAMPLES=OFF -D BUILD_EXAMPLES=OFF -D WITH_QT=OFF -D WITH_QUICKTIME=OFF -D WITH_QTKIT=OFF -D WITH_OPENGL=OFF -D WITH_OPENCL=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D WITH_CUDA=OFF -D WITH_QUICKTIME=OFF -D WITH_GSTREAMER=OFF -D WITH_FFMPEG=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON ..
make -j4
sudo make install
sudo ldconfig
cd ~
```

## ROCm対応のTensorFlowのインストール
TensorFlowを入れます。現時点(2019/9/24)では1.14.1が入ります。
setuptoolsをアップグレードしないと入らなかったのでそれも合わせて行います。

```
sudo pip3 install --upgrade launchpadlib
sudo pip3 install --upgrade setuptools
pip3 install tensorflow-rocm
sudo pip3 install tensorflow-rocm
pip3 install tensorflow_datasets
```

以上の手順でインストールが行えました。

# 実行時の注意
 1.14.1ではRX470で動かすには以下の環境変数の設定が必要になります。
（ないとエラーで動きません）

```
export MIOPEN_DEBUG_GCN_ASM_KERNELS=0
```
この制約の詳細は以下参照
https://github.com/ROCmSoftwarePlatform/tensorflow-upstream/blob/develop-upstream/RELEASE.md#known-issues