Ubuntu16.04とCUDA9.2とROCｍの両方の実行環境を構築しようとし失敗した話

ROCmとCUDAの混在環境を作る際うまくいかなかったので教訓として残します。
CUDAは動いたのですがROCmはこの方法だと干渉してしまうのか原因が不明ですが動きません。
ググるとこれと大体同じやり方でCUDA環境を構築している人が多いように思われたので記事化しました。

またOpenCLに関してはコンパイル環境ではなくアプリケーションの実行環境です。

ポリシーですがここではUbuntu標準のnanoエディタを使いますのでそこは適時任意のエディタに読み替えていただくようおねがいします

#目次
・テスト環境
・環境構築
・OpenCLベンチマーク LuxMark(OpenCLレンダリング）
・TensorFlow環境編
・各種運用手法


#テスト環境

CPU Xeon E5-2603 v4
MB  msi-x99 Gaming7
RAM DDR4-2400 32GB
GPU0 NVIDIA GTX1080Ti
GPU1 AMD Vega Frontier Edition
OS Ubuntu16.04.5 LST kernel version 4.13
テスト実行日　2019 02/14-02/16

以上のような環境においてテストを行った。

#環境構築
##OSインストール
http://releases.ubuntu.com/16.04/ubuntu-16.04.5-desktop-amd64.iso
からisoを落として任意のUSBメモリにライティングします。
自分はubuntuの標準ソフトでやりました
![Screenshot from 2019-02-14 17-59-09.png](https://qiita-image-store.s3.amazonaws.com/0/232732/b6e5e66b-c834-8d88-a957-5139bb0fc4c0.png)
また予期せぬトラブルを避けるため、install時にサードパーティドライバのインストールなどはしない設定でinstallを行いました。

これは余り直接記事の本筋とは関係ありませんが日本語入力環境は
https://www.server-world.info/query?os=Ubuntu_16.04&p=japanese
以上を参考に構築しました。
##ドライバインストール
まずはカーネルバージョンを念の為確認、

```
~$ uname -a
Linux *** 4.15.0-45-generic #48~16.04.1-Ubuntu SMP Tue Jan 29 18:03:48 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```
後にinstallするrcomでは4.13以降が必須なので事前に確認しておきます

次にCUDA環境を構築していきます。使用するCUDAバージョンはcuda9.2を使用します
CUDAのインストール方法は何通りも存在するので情報が錯綜して厄介な感じになっているのでこれ以外の方法もあることを
明記しておきます。

念の為これを忘れずにしてから本作業に入ります

環境構築の流れは

・ドライバーインストール
・CUDA tool kitのインストール
・ROCmのインストール

と言った流れになります
失敗要因としては下手にNVIDIAのGPUドライバーとtool kitのインストールを分離したところになります。


```bash
sudo apt update
sudo apt upgrade
```
次にNVIDIAのグラフィックドライバーを入れる準備をします

```bash
$ sudo lsmod | grep -i nouveau
nouveau              1724416  4
mxm_wmi                16384  1 nouveau
video                  45056  1 nouveau
i2c_algo_bit           16384  2 amdgpu,nouveau
ttm                   106496  2 amdgpu,nouveau
drm_kms_helper        172032  2 amdgpu,nouveau
drm                   401408  9 drm_kms_helper,amdgpu,ttm,nouveau
wmi                    24576  2 mxm_wmi,nouveau
```

こんな感じで出てきたらubuntuのnouveauドライバが生きてるのでこれを止めてからドライバのインストールをしたほうが無難
なようですのでドライバを止めに行きます


```
~$ cd /etc/modprobe.d/
```

この時blacklist.confというconfファイルが見つかりますがここでnouveauドライバを無効化するか、blacklist-nouveau.confを作って無効化する二通りのやりかたがあるみたいですがここではそのままblacklist.confに書きます

```
$ sudo nano blacklist.conf
$ sudo update-initramfs -u
$ sudo service gdm stop
```
blcaklist.confの最下行にblacklist nouveauと書いて保存して無効化します。
次に任意のディレクトリに戻ってドライバーのインストール作業をおこないます。
（この場合は~/driverというディレクトリを作って作業をおこないます）

また今回ダウンロードするのはversion410.93です。

```
$ cd
$ mkdir driver
$ cd driver
$ wget jp.download.nvidia.com/XFree86/Linux-x86_64/410.93/NVIDIA-Linux-x86_64-410.93.run
$ reboot
```

ここまでできたら一旦rebootしてログインする際は「Ctrl + alt + F1」でCUIに切り替えてログインして.runを入れた任意のディレクトリにcdして次のように.runを走らせます。

```
$ chmod +x NVIDIA-Linux-x86_64-410.93.run
$ sudo  ./NVIDIA-Linux-x86_64-410.93.run
$ reboot
```
なんか青い画面が出てきたら基本的に全部OKを選択してエンターキーを押します。

再起動後立ち上げてみると

```
~$ nvidia-smi 
Fri Feb 15 03:19:54 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.93       Driver Version: 410.93       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:05:00.0  On |                  N/A |
| 28%   54C    P0    65W / 300W |    297MiB / 11175MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       922      G   /usr/lib/xorg/Xorg                           172MiB |
|    0      1549      G   compiz                                       123MiB |
+-----------------------------------------------------------------------------+

```
と、出てきますここで疑問に思うのはCUDA version10.0と表示されるところです、なんせCUDA 9.2をこれから入れようとしてるのに勝手にCUDA10.0を入れたことにされてはたまりませんがこれの回答がstack overflowにありました
https://stackoverflow.com/questions/53422407/different-cuda-versions-shown-by-nvcc-and-nvidia-smi

cuda10.0をサポートするグラフィックドライバであると言う意味であって後方互換性は保たれていると言うことらしいです、それでもCUDA9.2と表示させたい場合はもっと古いドライバを探してあえて入れる必要がありそうです。

##CUDA-toolkitインストール編
nvccコンパイラなどのCUDAツール群がインストールされるパッケージを入れます。

以下のコマンドで入れようとするとどんなバージョンが入ってくるかわかったものではないので使用しないほうがいいです。

```
sudo apt install nvidia-cuda-toolkit
```

ではやっていきます

```
~$ mkdir cuda_tool_kit
~$ cd ./cuda_tool_kit/
~/cuda_tool_kit$ wget developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.2.148-1_amd64.deb
~/cuda_tool_kit$ sudo dpkg -i cuda-repo-ubuntu1604_9.2.148-1_amd64.deb
~/cuda_tool_kit$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
~/cuda_tool_kit$ sudo apt-get update
~/cuda_tool_kit$ sudo apt-get install cuda-9-2
```

でCUDA9.2がインストールできるはず、wgetで直接URLを叩くのではくデペロッパーのサイトから落としたい場合は
https://developer.nvidia.com/cuda-92-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=debnetwork
からどうぞ

このままだとパスが通ってないので使えませんのでパスを通します

```
export PATH=/usr/local/cuda-9.2/bin:${PATH}
```
~/.bashrcなどに以上を書いて保存して


```
~$ source .bashrc 
```
以上をします

```
~$ which nvcc
/usr/local/cuda-9.2/bin/nvcc
~$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Tue_Jun_12_23:07:04_CDT_2018
Cuda compilation tools, release 9.2, V9.2.148

```

これでパスが通ったことが確認できます。

次にROCm環境の構築をしていきますが環境が混在した時のパフォーマンスの変化などを調べたいのでluxmark(OpenCLによるレンダリングベンチマーク)でテストします


luxmarkは任意のディレクトリで

```
$ wget https://github.com/LuxCoreRender/LuxMark/releases/download/luxmark_v3.1/luxmark-linux64-v3.1.tar.bz2
$ tar xf ./luxmark-linux64-v3.1.tar.bz2 
$ rm luxmark-linux64-v3.1.tar.bz2
$ cd ./luxmark-v3.1/
$ ./luxmark
```

![Screenshot from 2019-02-15 17-36-29.png](https://qiita-image-store.s3.amazonaws.com/0/232732/9153bdf3-8bf6-77d8-a593-30861584e8f3.png)

スコアとして21000前後でした、事前にVegaFEで測定したときは45000ぐらいあったのでUbuntu＋OpenCL環境だとNVIDIAのGPUではパフォーマンスが出せないのかもしれません。


##ROCm環境構築編
次にAMDでCUDAのコードを変換して実行することで知られているROCm環境の構築をやっていきます。

```
$ 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'
$ reboot
```

再起動後立ち上がったら

```
$ sudo apt update
$ sudo apt-get install rocm-dev
$ sudo usermod -a -G video $LOGNAME
$ sudo apt install clinfo
```

次に.bashrcを編集します

```
export ROCM_PATH=/opt/rocm
export HCC_HOME=/opt/rocm/hcc
export HIP_PATH=/opt/rocm/hip
export PATH=$HCC_HOME/bin:$HIP_PATH/bin:$PATH
```
以上をbashrcに追加
次に

```
$ source .bashrc
$ reboot
```
以上でパスが通りますので再起動してます.


```
$ sudo /opt/rocm/bin/rocminfo 
hsa api call failure at line 900, file: /data/jenkins_workspace/compute-rocm-rel-2.1/rocminfo/rocminfo.cc. Call returned 4104
```

となってしまいます。
うまく行った時と手順が若干違うようにそのせいかなと思います。のでこうやるとCUDAしか何故か動かないですよって話です。
成功編も同日掲載予定です。

## 参考サイト

https://developer.nvidia.com/cuda-92-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=debnetwork
NVIDIAのデペロッパー向けのサイトです


#成功編

https://qiita.com/T_keigo_wwk/items/bfb59e2589b82bf5a8b3

最近アクセスがあってうまく行ってない方をRTしてる方が居ましたので掲載します。