AMD MIGraphXのビルドについてメモ

AMD環境向けグラフ最適化エンジンのMIGraphXの環境構築・動作検証メモです
https://rocmsoftwareplatform.github.io/AMDMIGraphX/doc/html/
https://github.com/ROCmSoftwarePlatform/AMDMIGraphX
https://github.com/ROCmSoftwarePlatform/AMDMIGraphX/wiki

環境構築等はこちらを準拠しております.


###ROCm2.9での変更点

FP16/INT8のサポートが追加されたそうです

詳細は[こちら](https://rocm-documentation.readthedocs.io/en/latest/Current_Release_Notes/Current-Release-Notes.html"こちら")をご覧ください




##環境

CPU Xeon E5-2603 v4
GPU RadeonⅦ
RAM DDR4 48GB

OS Ubuntu 18.04.3 LTS
Kernel Linux rocm 5.0.0-31-generic 
Python環境 miniconda 4.7.10
ROCm vesion 2.9.6
cmake version 3.10.2
GNU gdb (Ubuntu 8.1-0ubuntu3.1) 8.1.0.20180409-git
MIGraphX Version 0.4

上記の環境を整えた上で本テストを行いました.

#環境構築

##依存関係・ビルド環境を整える.

ビルドにはROCM build tool(rbuild) が必要です
https://github.com/RadeonOpenCompute/rbuild

pipから直接installできるようになっているのでこれを使います.

また今回作業したディレクトリは/Home/user直下ではなく/test_dirを作ってから作業しました。
今回掲示したエラーコード内にユーザーディレクトリ名等が含まれている為適時読み替えてご参照ください.

```

conda create -n rbuild python=3.6
conda activate rbuild
pip install https://github.com/RadeonOpenCompute/rbuild/archive/master.tar.gz
sudo apt install cmake

```
##MIGraphXのビルド

```
git clone https://github.com/ROCmSoftwarePlatform/AMDMIGraphX.git
cd ./AMDMIGraphX/
rbuild build -d depend --cxx=/opt/rocm/bin/hcc

```

rbuildはちゃんとMIGraphXのディレクトリ内で動かさないと動作しないのでちゃんとcdしてください
またビルドは相当時間がかかります.40分~数時間単位で時間を見積もってください

#ライブラリのビルドとインストール

```
cd build
make
sudo make install
```

###ランニングテスト

```
make check
```
数分かかります.


今回の検証では最後にクリアできなかったテストがありました

```
The following tests FAILED:
	 36 - test_gpu_ops_test (Failed)
	 37 - test_gpu_quantization (Failed)
Errors while running CTest
test/CMakeFiles/check.dir/build.make:57: recipe for target 'test/CMakeFiles/check' failed
make[3]: *** [test/CMakeFiles/check] Error 8
CMakeFiles/Makefile2:10508: recipe for target 'test/CMakeFiles/check.dir/all' failed
make[2]: *** [test/CMakeFiles/check.dir/all] Error 2
CMakeFiles/Makefile2:10515: recipe for target 'test/CMakeFiles/check.dir/rule' failed
make[1]: *** [test/CMakeFiles/check.dir/rule] Error 2
Makefile:3850: recipe for target 'check' failed
make: *** [check] Error 2
```

>	 36 - test_gpu_ops_test (Failed)
	 37 - test_gpu_quantization (Failed)


この２つがクリアできてない.

ログを読み返すと


```
 89/191 Test  #37: test_gpu_quantization .................................................***Failed   14.06 sec
```

```
 48/191 Test  #36: test_gpu_ops_test .....................................................***Failed  Error regular expression found in output. Regex=[FAILED] 25.42 sec
[   RUN    ] test_literals
FAILED: test_literals
    what(): Missing metadata for __global__ function: _ZN8migraphx9version_13gpu6device8launcherIZZNS2_9gs_launchEP12ihipStream_tjjENKUlT_E_clIZZNS2_18nary_standard_implIZNS2_4reluES5_RKNS0_8argumentESC_E3$_0JSA_EEEvS5_S6_SA_DpT0_ENKUlTyTyS6_SF_E_clIPfJSI_EEEDaS6_SF_EUlTyS6_E_EEDaS6_EUlTyS6_E_EEvS6_

@0 = check_context -> float_type, {}, {}
scratch = @param:scratch -> float_type, {16}, {1}
output = @param:output -> float_type, {4, 4, 1, 1}, {4, 1, 1, 1}
@1 = hip::load_literal[shape=float_type, {4, 3, 3, 3}, {27, 9, 3, 1},id=0] -> float_type, {4, 3, 3, 3}, {27, 9, 3, 1}
@2 = load[offset=0,end=0](scratch) -> int8_type, {0}, {1}
@3 = load[offset=0,end=64](scratch) -> float_type, {4, 4, 1, 1}, {4, 1, 1, 1}
@4 = gpu::convolution[padding={0, 0},stride={1, 1},dilation={1, 1},padding_mode=0,group=1](@1,@1,@2,@3) -> float_type, {4, 4, 1, 1}, {4, 1, 1, 1}
@5 = gpu::relu(@4,output) -> float_type, {4, 4, 1, 1}, {4, 1, 1, 1}

CMake Error at gdb/test_test_gpu_ops_test/run.cmake:12 (message):
  Test failed
```

上記のエラーで落ちているようだ.


似たような報告が上がっており
https://github.com/ROCmSoftwarePlatform/AMDMIGraphX/issues/379


> 67/190 Test  #36: test_gpu_quantization .................................................***Failed  Error regular expression found in output. Regex=[FAILED] 17.09 sec
[   RUN    ] target_copy
void target_copy()
/home/mev/source/AMDMIGraphX/test/gpu/quantization.cpp:65:
    FAILED: migraphx::verify_range(cpu_result, gpu_result) 0
CMake Error at gdb/test_test_gpu_quantization/run.cmake:12 (message):
  Test failed

テストの通し番号が変わっている気がするがまだ改善されていないのかこちらの環境と同じ場所で落ちている.


こちらでも単体で実行したときのエラーを改めて見ていると上記報告とはエラーの内容が異なっています
本バージョンではint8にも対応したこともあって仕様が変わっているので不思議ではないですが・・

```
~/test_dir/AMDMIGraphX/build/bin$ ./test_gpu_quantization 
[   RUN    ] gpu_target_copy
[ COMPLETE ] gpu_target_copy
[   RUN    ] int8_quantization
terminate called after throwing an instance of 'std::runtime_error'
  what():  Missing metadata for __global__ function: _ZN8migraphx9version_13gpu6device8launcherIZZNS2_9gs_launchEP12ihipStream_tjjENKUlT_E_clIZZNS2_18nary_standard_implIZNS2_3mulES5_RKNS0_8argumentESC_SC_E3$_0JSA_SA_EEEvS5_S6_SA_DpT0_ENKUlTyTyS6_SF_E_clIPfJSI_SI_EEEDaS6_SF_EUlTyS6_E_EEDaS6_EUlTyS6_E_EEvS6_
Aborted (core dumped)
```

#ひとまず推論(BERTモデル）が動くか試してみる(現在作業中)

色々不調な部分があるようですが動くかどうか試してみます

https://github.com/google-research/bert