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

#前置き
GPUを活用した機械学習ツールNVIDIA RAPIDSのビルド方法。今回は最新版＝21.08）での構築方法を紹介。Arch Linux の環境では、CUDA11.4.2 + GCC11 となっているのですが、一応ビルドできて、テストも数値エラーやメモリエラーは起きるが一応最後までまわる。


# やったこと＝RAPIDS のビルド
データ処理、機械学習のフレームワーク[RAPIDS](https://rapids.ai/)を  [Arch Linux](https://www.archlinux.org/)  でビルドした。ただし、ビルドまでにエライ手間がかかったので、皆さんへの共有も兼ねて
0. **基本構成その0** ・・・ Cupyのビルド方法については[こちらの記事](https://qiita.com/daisuzu_/items/971ff080bb8e16d7c815)で紹介してます。
1. **基本構成その1** ・・・ [こちら](https://qiita.com/daisuzu_/items/6b2564450c75f25cc882)。RMM, cuDFというRAPIDS の基本コンポーネントの一部のビルド手順。
2. **基本構成その2** ・・・ いまここ。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 とかが何やってるかが、ある程度わかること。

##ビルド順
０．  [RMM/CUDFビルド記事](https://qiita.com/daisuzu_/items/6b2564450c75f25cc882)のとおり、Python CUDF までインストールが終わっていることを想定。CUMLのビルドには、１〜３がいずれも（多分）必要。また、[Cupyビルド記事](https://qiita.com/daisuzu_/items/971ff080bb8e16d7c815)にあるCupyもインストールが終わっていることが必要

1 [treelite](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/treelite)
Distrubuted/Deep Machine Learning Community (DMLC) から提供されるDecision Tree 探索用ライブラリ。ライブラリ＋ヘッダファイル(DMLCも含む）にくわえて**Pythoパッケージも生成**(python-treelite)


2 [faiss](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/faiss)
FaceBookがレコメンデーション機能などに提供している近傍検索ライブラリ。ライブラリ＋ヘッダだけでなくPythonパッケージも生成される。

３[cumlprims](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/cumlprims)
NVIDIAからプロプライエタリで提供されるライブラリ。CUMLのビルドに必須。現時点では[Condaパッケージ](https://anaconda.org/nvidia/libcumlprims/files)の形式で提供されている。Condaパケージだが、EarlyAccess用に[Nightly Build](https://anaconda.org/rapidsai-nightly/libcumlprims/files)版もある。

４[CUML](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/cuml)
RAPIDSが提供する各種計算ライブラリ。21.08 をインストール。ライブラリ＋ヘッダファイルが生成される。

5 openucx
Unified Communication Xは、Arch Linux の [AUR](https://aur.archlinux.org/)から取得してください。

6 [python-ucx](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-ucx)
UCXのPythonラッパ。GPU間で通信を行う場合に必要らしい（シングルGPUでも使える）

9[python-CUML](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-cuml)
CUMLのPythonラッパ。

ここまでビルドして以下が確認できればOK。


```
$ 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 cuml
>>> 
```

その後、テスト実施

事前に、scikit-learn や、今回のリポジトリから提供されている1パッケージ、[python-umap](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai21１０/tree/main/python-umap)もインストールしておく。

```
$ cd src/cuml/python/cuml/test/
$ pytest -v .
```

とやって、一通りテストが回れば成功。筆者の環境ではテスト（--run_streess/--run_quantity/--run_unit は付けてない）は一通り回る。が、一部項目では計算結果が想定と一致せずFAILとはなっている。

10(オプション) [cuSignal](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-cusignal)
信号処理ライブラリ、Cupy (とCUDA)が入ってたらビルドできます。

11(オプション) [cuxfilter](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-cuxfilter)
データをGPUを用いて描画データ変換するためのライブラリCUDFが入ってたらビルドできます(その他必要なライブラリは ArchLinuxや AURに入っている)。



#記録
1. (2021.10.8 22:18 JST)...Rapidsai 21.10初版
2. (2021.10.10 23:56 JST)...CUXFILTERを追加


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

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