［正式版リリース］GPUを活用した機械学習ツールNVIDIA RAPIDSをArch Linux + CUDA11.5 でビルドした(Ver21.12版) (1) cuDF, RMM

#前置き
**NVIDIA の Rapidsai の最新ブランチから 21.12 に上がり、ほぼ全コンポーネントの正式リリースが出たので、ビルドしてみる。**（ビルド出来たが、全部じゃなくてもテストがまずまず通ればOKとする。

Release Statement は[こちら](https://medium.com/rapids-ai/rapids-release-21-12-fc5cfcfc1cb8)

GPUを活用した機械学習ツールNVIDIA RAPIDSのビルド方法。今回は **21.12**）での構築方法を紹介。Arch Linux の環境では、CUDA11.5.1 + GCC11 (not GCC10)がデフォルト開発環境になってしまってるけど、大抵のコンポーネントまではGCC11でビルドできる。Arch Linux では、CUDA11.5.1のポストプロセッサとしてのGCCに11（最新バージョン）を設定してるが、RapidsAIでは CUDA11.5.1 に、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/cfd8ace0d7e6ae88dd36)。cuMLというRAPIDS の基本コンポーネントの一部のビルド手順。ついでに、cuSignal という信号制御ライブラリ<del>や、cuxfilter という描画データ変換ライブラリ</del>も。
3. **基本構成その3** ・・・ [こちら](https://qiita.com/daisuzu_/items/9a9cd44a535da0f6aed7)。グラフを扱う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_rapidsai_2112)に、PKGBUILDとかビルド順とか。で済ませたいですが、補足説明を。あと参考までにビルドの依存関係をつけます。
![ 2021-11-16 23.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64164/70acb509-ceca-f85e-a808-dea759d3b270.png)


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


##ビルド順
０  事前に、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_rapidsai_2112/tree/main/arrow)
CUDFのキモである大規模データの管理はこのライブラリに依存している。バージョンは6.0.1。今回はC++ライブラルだけでなく、Pythonライブラリも同時生成している。なお、動作確認テストではApache ORCのPythonラッパが必要らしいが[このように](https://github.com/noirello/pyorc/issues/10)Apache Arrowと ORCは共存できない。実際両方ロードしようとするとコアを吐く。

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

4.[rmm]
(https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai_2112/tree/main/rmm)
Rapidsaiから提供。rmmというC++(ヘッダファイルとCMAKE定義ファイルのみだが）、およびpython-rmm というPyhonライブラリ両方提供

5．[nvcomp](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai_2112/tree/main/nvcomp)
データ圧縮ライブラリ

6.[python-nvtx](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai_2112/tree/main/python-nvtx)
7.[python-distributed](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai_2112/tree/main/python-distributed)
8.[python-dask](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai_2112/tree/main/python-dask)
9.[python-dask-cuda](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai_2112/tree/main/python-dask-cuda)

CUDFのビルド前に必要

10.[cuDF](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai_2112/tree/main/cudf)
ここでは、cuDF のC++ライブラリ（cudf）だけでなく、Pythonのライブラリ (python-cudf)も一緒にビルドしている。実は pythonライブラリには分散処理用の dask-cudf も含まれているが、今回は、まとめて Python-cudf というパッケージにひとまとめにしている。



```
$ python
Python 3.9.9 (main, Nov 20 2021, 21:30:06) 
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cudf
>>> import dask_cudf
>>> 
```

前述したとおり、pytest する際は、、Apache ORC 周りはテストしないよう回避しておこう。

#今後の予定
(一旦はなし)

#記録
1. (2021.11.16 23:58 JST)...初版(バージョン21.12+CUDA11.5対応)
1. (2021.11.17 00:10 JST)...Python-rmm が抜けていたのを訂正
1. (2021.11.17 22:50 JST)...cuGRAPH のビルド記事もアップしたのでリンクを追加
1. (2021.11.21 11:25 JST)...cuML のビルド記事もアップしたのでリンクを追加
1. (2021.12.06 20:30 JST)...RMM、cuDFの21.12正式版が出たので一部表現を変更
1. (2021.12.10 09:10 JST)...全コンポーネント21.12リリース。
1. (2021.12.21 09:20 JST)...Python3.10 & cudf 21.12.02リリース。

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

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