GPUを活用した機械学習ツールNVIDIA RAPIDSをArch Linux + CUDA11.4 でビルドした(Ver21.10版) (1) CUDF, RMM

#前置き
**NVIDIA の Rapidsai が 21.10 に上がったので、最速じゃないけどなる早でビルド用スクリプトを出してみた**（ビルド出来たが、全部じゃなくてもテストがまずまず通ればOKとする）

GPUを活用した機械学習ツールNVIDIA RAPIDSのビルド方法。今回は **21.10**）での構築方法を紹介。Arch Linux の環境では、CUDA11.4.2 + GCC11 (not GCC10)がデフォルト開発環境になってしまってるけど、大抵のコンポーネントまではGCC11でビルドできる。ただし、CUGRAPHはGCC11はビルド不可。GCC10じゃないとビルド出来ない。なお、Arch Linux では、CUDA11.4.2のポストプロセッサとしてのGCCに11を設定してるが、RapidsAIでは CUDA11.4.2 に、GCC10を設定しないとビルドできなかった。


# やったこと＝RAPIDS のビルド
データ処理、機械学習のフレームワーク[RAPIDS](https://rapids.ai/)を  [Arch Linux](https://www.archlinux.org/)  でビルドした。ただし、ビルドまでにエライ手間がかかったので、皆さんへの共有も兼ねて
0. **基本構成その0** ・・・ Cupyのビルド方法については[こちらの記事](https://qiita.com/daisuzu_/items/971ff080bb8e16d7c815)で紹介してます。
1. **基本構成その1** ・・・ いまここ。RMM, cuDFというRAPIDS の基本コンポーネントの一部のビルド手順。
2. **基本構成その2** ・・・ [こちら](https://qiita.com/daisuzu_/items/032db63947604b960f8d)。CUMLというRAPIDS の基本コンポーネントの一部のビルド手順。ついでに、cuSignal という信号制御ライブラリや、cuxfilter という描画データ変換ライブラリも。
3. **基本構成その3** ・・・ [こちら](https://qiita.com/daisuzu_/items/ce2f2f7839ee98713f9d)。グラフを扱うCUGraphのビルド手順。

# RAPIDSについて
## RAPIDS って何？
NVIDIAが中心となってとりまとめている、GPUを使ったデータ処理＆機械学習のフレームワークツールのスイート。[Rapidsai](https://rapids.ai/)から提供。何が出来るかについては、例えば[石黒さんの記事](https://qiita.com/shin_ishiguro/items/8f39aac45acc8363a42e)とか参照のこと。
##主なコンポーネント
1. RMM（RAPIDS Memory Manager）...GPU上での分散メモリ処理のためのライブラリ
2. CUDF（DataFrame library）...データ前処理・管理のためのライブラリ（Pandas に相当）
3. CUML（Machine Learning library）...機械学習のためのライブラリ（SciPy, SciKit-Learn に相当）。ただし[API一覧](https://docs.rapids.ai/api/cuml/stable/api.html)のとおり、かなりのアルゴリズムがManifold関連中心に充実しているのに対して、scikit-learn に存在するAPIが未実装だったりするのでまだまだ発展形だったりする。
4. [CuPy](https://cupy.chainer.org/)...Preferred Networksによって開発されている線形代数を中心とした数式計算処理ライブラリ群（Numpyに相当）。RAPDISのコンポーネントでは無いが、大きく依存している

#ビルド方法
[GitHubリンク](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110)に、PKGBUILDとかビルド順とか。で済ませたいですが、補足説明を。あと参考までにビルドの依存関係をつけます。(あらたに rmm というパッケージが python-rmm とは別に登場)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64164/1751744e-04bd-bd22-d558-3ea091e9c00d.png)


#事前想定
* NVIDIA GeForce RTX/GTXを持っている人
* CUDA含めた開発環境が揃っている。
* Arch Linux の使い手。EndeavourOSなど派生ディストリビューションでもOKだが、Manjaro のように独自リポジトリを持ち、カーネル、ドライバなどのリリースのペースが異なるものは関知しません。
* yay とか PKGBUILD とかが何やってるかが、ある程度わかること。

##ビルド順
０  事前に、pacman で spdlog をインストールしてください

```
sudo pacman -S spdlog
```

その後、 /etc/makepkg.cfg のコンパイルフラグに、「-DSPDLOG_FMT_EXTERNAL」というフラグをつけて、SPDLOGはOSにインストールしたほうを呼び出す設定にしてください。

```
CFLAGS="-march=rocketlake -mtune=native -DSPDLOG_FMT_EXTERNAL -O3 -pipe -fno-plt -fexceptions \
        -Wp,-D_FORTIFY_SOURCE=2,-D_GLIBCXX_ASSERTIONS \
        -Wformat -Werror=format-security \
        -fstack-clash-protection -fcf-protection"
```


2[Apache Arrow](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/apache-arrow)
CUDFのキモである大規模データの管理はこのライブラリに依存している。バージョン5.0.0を入れてる
なお、ORC(Optimized Row Columnar)を使うためには、事前に
2.5[Apache Orc](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/apache-orc)
を入れておく必要がある。なお、Pythonラッパとして、pyorcがあるが、これはApache謹製ではないので、使うのはご用心。

３[NVTX](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/nvtx)
The NVIDIA® Tools Extension SDK 

４[rmm](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/rmm)
21.08ではcudf rmm をまとめてたが、バージョンアップのときのアンインストール＆インストールの手間のため、rmmとcudfを分離した。

５[CUDF](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/cudf)
~~ここでは、CUDF のライブラリだけでなくRMMのC++ヘッダやcmake定義もインストールされる。その関係で、CUDFのマイナーバージョンアップのときは、CUDF（およびビルド依存したコンポーネント）を一度外さないといけないっぽい。~~というのはなくなり、rmmはrmm、cudfはcudf で別々にインストールするようにした。

６[Python RMM](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-rmm)
RMMのPythonライブラリは別途ビルドが必要

７[Python PyArrow](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-pyarrow)
Apache Arrowの Python ラッパ

８[Python Distributed](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-distributed)
０[Python Dask](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-distributed)
Arch Linux の現時点(2021.9.1)に入っているバージョン(2021.3.0)だとdask-cudf周りが動かないっぽいのでバージョンを(2021.9.1)にあげている


１０[Python NVTX](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-nvtx)
[NVIDIA Tools Extension Library](https://docs.nvidia.com/nsight-visual-studio-edition/2020.1/nvtx/index.html)のPython実装。

１１[Python Dask CUDA](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai21108/tree/main/python-dask-cuda)
Python でDASKまわり特にCUDAと連携するための箇所を制御するためのライブラリ（らしい）。１１のCudfでDASKとの連携をビルドするために必要

１２[Python CUDF](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-cudf)
CUDFのPython ラッパ。

```
$ python
Python 3.9.6 (default, Jun 30 2021, 10:22:16) 
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cudf
>>> import dask_cudf
>>> 
```

とやってエラーがでなければいちおう成功。実際、pytest も。2108では通らなかった binop (２項演算子、スカラ型とベクトル型の演算とか)かなり通ってるけど、Apache ORC 周りは異常終了してしまう。



を実行する必要がある


#記録
1. (2021.10.8 1:48 JST)...初版(21.10版)
2. (2021.10.8 9:25 JST)...微修正
2. (2021.10.8 21:08 JST)...パッケージrmm書き忘れの訂正
2. (2021.10.13 13:52 JST)...rmm/cudf のバージョンが 21.10.00から21.10.01に更新
2. (2021.10.15 22:43 JST)...Apache ORCの記載漏れに今更気づく。とりあえず追加修正。

#おことわり
この記事は、筆者以外の方の環境でも同様に成功することを保証するものではありません。**ビルドや動作確認の失敗**（ないとは思いますが）**環境が破壊されても責任は一切負いかねます**（基本的には自己責任でお願いします。）。

#今回紹介したリンク
[https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110)