AMD製GPU + ROCm + OpenCV + TensorFlow でGPUコンピューティング環境をつくる

## はじめに
今回はAMD製のGPU『Radeon RX Vega 56』を搭載した自作PCにGPUコンピューティングの環境を構築します。
手順としてはこのような流れで行いますが、初心者の方でもコピーアンドペーストでできるように書いていきたいと思います。

1. UbuntuのブートUSBからOSをインストールする
1. ROCmをインストールする
1. Python3のライブラリをインストールする
1. MIOpenをインストールする
1. OpenCVをインストールする
1. TensorFlowをインストールする

## 環境
Radeon RX Vega 56 Air Boost 8G

## UbuntuのブートUSBからOSをインストールする
UbuntuのブートUSBの作成方法は[前回の記事](https://qiita.com/hikotomootsuki/items/0bacdd144365c2da1165)に詳しい手順がありますので参考にしてください。
実際にブートUSBからOSをインストールする方法は[こちらの記事](https://linuxfan.info/ubuntu-18-04-install-guide)にスクリーンショット付きで分かりやすく解説されています。

## ROCmをインストールする
ROCm(Radeon Open Compute platform)とは、AMD製のGPUを使ってGPUコンピューティングするためのプラットフォームです。
NVIDIA社のGPUを使う場合はCUDA（Compute Unified Device Architecture）と呼ばれるものがあるのですが、今回はAMD社のGPUを使うためROCmをインストールします。

Ubuntuがインストールできたらターミナルを開き、下記のコマンドをひとつずつ順番に打ち込みます。
詳しく知りたい方は[こちらのGitHub](https://github.com/RadeonOpenCompute/ROCm)をご覧ください。

```terminal
sudo apt update
sudo apt dist-upgrade
sudo apt install libnuma-dev
sudo reboot

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 libhsakmt
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
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
```

[GPU EATER](https://gpueater.com/help#python)というGPUクラウドサービスの公式サイトのヘルプも参考にさせていただきました。

## Python3のライブラリをインストールする
次に主要なPython3のライブラリをインストールします。
下記のコマンドをひとつずつ順番に打ち込んでください。

```terminal
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
```

正しくインストールできているか確認します。
次のようにPython3を立ち上げて、試しにNumPyをインポートしてみてエラーがでなければ完了です。

```terminal
python3
>>> import numpy
>>> quit()
```

## MIOpenをインストールする
続いて、MIOpen(Machine Learning Open)をインストールします。
MIOpenは先ほどインストールしたROCmと組み合わせることで、より高度な機械学習ができるようになります。

```terminal
sudo apt update

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

cd ~/src
git clone https://github.com/ROCmSoftwarePlatform/hcRNG.git && cd hcRNG
./install.sh

cd ~/src
git clone https://github.com/ROCmSoftwarePlatform/hcFFT.git && cd hcFFT
./install.sh
```

## OpenCVをインストールする
[こちらのサイト](http://www.python36.com/how-to-install-opencv340-on-ubuntu1604/)を参考にさせていただきました。
「#」が付いている行は説明なので飛ばして1行ずつコマンドを打ち込みます。

```terminal
# Update packages
sudo apt update
sudo apt upgrade

# Install dependencies
sudo apt install -y build-essential
sudo apt install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

# To process images
sudo apt install -y python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

# To process videos
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install -y libxvidcore-dev libx264-dev

# For GUI
sudo apt install -y libgtk-3-dev

# For optimization
sudo apt install -y libatlas-base-dev gfortran pylint

# To build OpenCV binding for both python 2 and 3
sudo apt install -y python2.7-dev python3.5-dev

# To Download OpenCV
mkdir -p ~/src

# To Download OpenCV 3.3.0
wget https://github.com/opencv/opencv/archive/3.3.0.zip -O ~/src/opencv-3.3.0.zip

# To Download OpenCV Contrib 3.3.0
wget https://github.com/opencv/opencv_contrib/archive/3.3.0.zip -O ~/src/opencv_contrib-3.3.0.zip

# We need to unzip to extract the zip files
sudo apt install -y unzip

# Extract OpenCV and OpenCV Contrib
cd ~/src
unzip opencv-3.3.0.zip
unzip opencv_contrib-3.3.0.zip
cd opencv-3.3.0
mkdir build
cd build

# Run cmake
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 ..
```

次のコマンドを打ち込み、出力された数字を覚えておいてください。

```terminal
nproc
```

今回は「8」でしたのでその数字に合わせて次のコマンドを打ちます。

```terminal
$ make -j8
```

続いてこちらのコマンドを打てば、OpenCVのインストールは完了です。

```terminal
sudo make install
sudo ldconfig
```

それでは正しくインストールできたか確認してみます。
エラーがでなければ成功です。

```terminal
python3
>>> import cv2
>>> cv2.__version__
>>> quit()
```

## TensorFlowをインストールする
最後にTensorFlowをインストールします。
[こちらのサイト](https://github.com/ROCmSoftwarePlatform/tensorflow/blob/rocm-v1/rocm_docs/tensorflow-install-basic.md#install-tensorflow-rocm-port)を参考にしています。

```terminal
sudo pip3 install wheel cython
wget http://repo.radeon.com/rocm/misc/tensorflow/tensorflow-1.3.0-cp35-cp35m-linux_x86_64.whl
sudo pip3 install tensorflow-1.3.0-cp35-cp35m-linux_x86_64.whl && rm tensorflow-1.3.0-cp35-cp35m-linux_x86_64.whl
```

正常にインストールできているか確認してみます。

```terminal
python3
>>> import tensorflow
>>> quit()
```

以上で全てのインストールが終了しました。お疲れ様でした。

## 最後に
今回はAMD+ROCm(OpenCL)の上に機械学習や画像処理などに必要な主要ライブラリをインストールしてGPUコンピューティング環境を構築しました。
初心者の方でも気軽に真似できるようにインストールの手順をメインに書いており、それぞれのライブラリなどの専門知識は極力避けましたので、興味のある方はご自身で調べてみてください。
GPUといえばNVIDIA+CUDAが有名でドキュメントの量も圧倒的に多いので、AMD製のGPUを使う方に少しでも参考になれば幸いです。