cupy on HIP(ROCm）のビルドに関するメモ

#まえがき

Radeon GPUでTensorflowやpytorchのタスクを動作可能にしたROCmですが最近cupyに対応するようになりました.

https://qiita.com/kz_lil_fox/items/05bb375225e80fa99e39
元々非公式ならリポジトリである程度動いていたようですが最近公式のrcリポジトリでも対応したようです.
今までCUDA専用だったCupyがAMDに対応したことになり、Chainer/CuPyのROCm対応が一歩前進したことを意味します.


https://github.com/cupy/cupy/releases/tag/v7.0.0rc1


>Experimental support of AMD GPUs are added (#1094). See the installation guide for how to install CuPy with AMD support. Note that this feature is still experimental, and we do not guarantee the API stability.
Supported Versions: ROCm 2.6+.

まだ実験的サポートっぽいので（7.00rc1だし当たり前ですが）バグだらけの継ぎ接ぎ状態だと思われますが環境構築から簡単なテストまでやりたいと思います。

##追加情報
2019/12/02現在
先程ビルドエラーのfixがマスターブランチに追加されたみたいです.
https://github.com/cupy/cupy/commit/04cc7c264b3e6d22ad5093cd1a42a34da388d426
今後ちゃんとリリースが出ると思いますがすぐやりたい人はやってみてください

##公式ドキュメント
https://github.com/cupy/cupy/pull/1094
https://docs-cupy.chainer.org/en/latest/install_rocm.html
一応英語チュートリアルがちゃんとあるので詳細はこちらをご参照ください。
おそらく動作要件はROCmにある程度準拠すると思われます


#テスト環境①
ROCm Version: 2.9.6
OS ubuntu 18.04.1
GPU0 RadeonⅦ
GPU1 GTX1080Ti(テスト用兼画像出力用）
CPU Xeon  E5-2603 v4
gcc g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0

#テスト環境②

ROCm Version: 2.9.6
OS ubuntu 16.04.3
GPU0 RadeonⅦ
GPU1 GTX1080Ti(テスト用兼画像出力用）
CPU Xeon　 E5-2603 v4
gcc  g++ (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
こっちではビルドが成功した

備考 テスト環境②でのみビルド成功

#実際の環境構築

```
sudo apt update
sudo apt upgrade
git clone https://github.com/cupy/cupy.git -b v7.0.0rc1
```

7.0.0rc1をcloneしてみます.

環境変数の指定が必要なので任意のアーキテクチャに合わせる必要があります

私は```~/.bashrc```に環境変数を設定してます



```
export HCC_AMDGPU_TARGET=gfx900
#ここ使ってるGPUアーキテクチャにあわせる
export __HIP_PLATFORM_HCC__
export CUPY_INSTALL_USE_HIP=1
export PATH=$ROCM_HOME/bin:$PATH
```
あとはここらへんを追加して ```source ~/.bashrc```すればいいと思います.

```
sudo apt install hipblas hipsparse rocrand
```
またここらへんが追加済みであるか確認しておくと良いでしょう.
またcompileにg++が必要です. gccはたいてい入ってると思いますが念の為確認しましょう

```$ g++ --version```

またPython環境破壊を防止する為ここではminicondaを使用しています
https://qiita.com/T_keigo_wwk/items/1817b6488526778aa8f2


```
conda create -n cupy python=3.6
cd cupy #cupyのRepository内に入る
conda activate cupy
pip install -U setuptools pip
pip install cython
```

これのインストールはそこそこ時間かかります.
そのうちビルド済みバイナリとかpipで直接入るようになるとうれしいです

``` python setup.py install``` または ```pip install . ``` , ```python setup.py develop```
以上の方法でビルドできます






##ビルドエラーについて

以下のエラーがよく発生しており、いまいちよくわかっていない

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/d6f2df6f-2335-ca38-1a00-21c99e9e7848.png)

```cudaDeviceGetByPCIBusId’ was not declared in this scope```



#condaを使う場合の注意

>If you are using certain versions of conda, it may fail to build CuPy with error g++: error: unrecognized command line option ‘-R’. This is due to a bug in conda (see conda/conda#6030 for details). If you encounter this problem, please downgrade or upgrade it.

特定バージョンでビルドがうまくいかないらしいです.
おそらく最新バージョンを使えば問題ないと思います.

2019年10月現在このバージョンが最新版ですので可能ならconda以外のパッケージ管理が安全かもしれません.


#簡単な動作テストをしてみる.

```
pip install jupyter
```

jupyter notebookを使ってみます

テストコードを書いてくださっていた方がいらっしゃるのでこれを使います
https://qiita.com/samacoba/items/d18e6cf09f544477aff4
>pythonで簡単にGPU計算ができるCupyを紹介


```
git clone https://github.com/samacoba/Mytest.git
jupyter-notebook
```

/Mytest/No_01_cupy_array.ipynbを試しに実行してみます.

![Screenshot from 2019-10-31 02-57-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/3c201e27-13d4-52fd-a5f7-0807a5a568f4.png)


一応無事に実行されましたが本当にAMDのGPUで実行されているのかはわからないですが一応エラーなく行列計算をすることができました


次にこちらに乗っていたテストを試してみます
https://qiita.com/kz_lil_fox/items/05bb375225e80fa99e39


```
cd ..
cd cupy
python ./examples/gemm/sgemm.py 
m=1398 n=1197 k=2886
start benchmarking

=============================Result===============================
hand written kernel time 2.475200080871582 ms
cuBLAS              time 1.054854393005371 ms
```

#トラブルシュート

```
python ./setup.py --install
Options: {'package_name': 'cupy', 'long_description': None, 'wheel_libs': [], 'wheel_includes': [], 'no_rpath': False, 'profile': False, 'linetrace': False, 'annotate': False, 'no_cuda': False, 'use_hip': True}

-------- Configuring Module: cuda --------
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
gcc: warning: /opt/rocm/include/: linker input file unused because linking not done
/home/rocm-test/miniconda3/compiler_compat/ld: /opt/rocm/include/: file not recognized: Is a directory
collect2: error: ld returned 1 exit status
Cannot build a stub file.
Original error: command 'g++' failed with exit status 1

************************************************************
* CuPy Configuration Summary                               *
************************************************************

Build Environment:
  Include directories: ['/opt/rocm/include', '/opt/rocm/rocrand/include']
  Library directories: ['/opt/rocm/lib', '/opt/rocm/rocrand/lib']
  nvcc command       : (not found)

Environment Variables:
  CFLAGS          : /opt/rocm/include/
  LDFLAGS         : (none)
  LIBRARY_PATH    : (none)
  CUDA_PATH       : (none)
  NVTOOLSEXT_PATH : (none)
  NVCC            : (none)
  ROCM_HOME       : /opt/rocm

Modules:
  cuda      : No
    -> Include files not found: ['hip/hip_runtime_api.h', 'hip/hiprtc.h', 'hipblas.h', 'hiprand/hiprand.h']
    -> Check your CFLAGS environment variable.

ERROR: CUDA could not be found on your system.
Please refer to the Installation Guide for details:
https://docs-cupy.chainer.org/en/stable/install.html
```

こんな感じでパスが通ってないと怒られる

```
export PATH=$ROCM_HOME/bin:$PATH
export ROCM_PATH=/opt/rocm
export ROCM_HOME=/opt/rocm
```

あたりを追加したら治った.

#まとめ
まだ安定してビルド出来てないことがある
ビルドがまだ困難な段階にあるので本格的な使用に耐えるものではなくテスト版であると考えると良さそうです.
動作報告とかまだ少ないのが厳しいところ

#参考
https://gist.github.com/colspan/54d68ea4e63c61e5d67fc5a98406e651



#付録(Dockerでのテスト）
ビルドエラーが発生する環境をDockerで再現できたのでメモ代わりにdockerfileを残しておく
rocmとdockerインストールされる環境なら再現可能なはずです


```dockerfile

FROM rocm/dev-ubuntu-16.04:2.7


LABEL OBJECT="HIP on Cupy v7.0.0 Run Test"
## rocm-dev  16,04-test

RUN sudo apt update && sudo apt install -y \
    wget software-properties-common \
    hipblas hipsparse rocrand rocthrust

RUN sudo apt install -y  git
RUN sudo apt install -y g++
#python3 setup
RUN sudo apt install -y python3-pip
RUN sudo pip3 install cython

# define parameters
#Test GPU is Radeon7(vega20)
ENV HCC_AMDGPU_TARGET gfx906
ENV __HIP_PLATFORM_HCC__ ''
ENV ROCM_HOME /opt/rocm
ENV CUPY_INSTALL_USE_HIP 1
ENV PATH ${ROCM_HOME}/bin:${PATH}
ENV CFLAGS "-I${ROCM_HOME}/hip/include -I${ROCM_HOME}/hipblas/include -I${ROCM_HOME}/hipsparse/include -I${ROCM_HOME}/hiprand/include ${CFLAGS}"
ENV LDFLAGS "-L${ROCM_HOME}/hipblas/lib -L${ROCM_HOME}/hipsparse/lib -L${ROCM_HOME}/hiprand/lib ${LDFLAGS}"
ENV NVCC hcc
ENV CUDA_PATH ${ROCM_HOME}/bin



#cupy build&install
WORKDIR /opt
RUN sudo chmod 777 /opt
RUN git clone https://github.com/cupy/cupy.git -b  v7.0.0

#RUN git clone https://github.com/cupy/cupy.git 
RUN cd cupy &&  python3  setup.py develop

```
#補足説明
一応 master branchでもHIP buildのマージがなされているようなのでこちらも要チェックである.

v7.0.0rc1リリースは前述の通りプレリリースであり、まともにビルドがまだ出来ません.
一方11/30現在、cupyコミッターによる修正が行われており、一応こちらでもdepブランチですがビルド成功を確認しました.
マスターブランチ等にそのうちマージされると思うのでリポジトリの様子を見て必要なブランチやリリースをcloneしてください.

12/05追記! v7.0.0がrcではなくなりました!
https://github.com/cupy/cupy/releases/tag/v7.0.0

各種fixも追加されているのでこちらをご使用ください.