【NVIDIA DLI Teaching Kits】Google Colaboratory上でcuDFを動かすまで / 1章-labs-

概要
=

NVIDIA DLI教育キットでは、**NVIDIA**さんが提供するクラウド上の学習環境を使うことができる。
また、PCにGPUが乗っている方であれば、ローカル環境においてもキットを使える。

そうはいっても、この記事に辿り着いたみなさんの大半はローカル環境を汚したくない部類の人間だと私は勝手に思っている。

例えるならば、子供の落書きで家の壁を汚されるより、ラウンドワンでカラーボールを
投げさせておいた方がよっぽど素敵で楽しい。私もその部類に含まれると思う。

この記事は、そんな皆様がColab上でサクッとキットを利用できるように書きました。

## ところでタイトルのcuDFとはなんぞや？
本キットの第1章-labs-では、cuDFというpandasのGPU版のようなモジュールが登場する。
pandasとは多少異なる部分があるものの、GPU上で走らせてデータフレームを処理するため、
**pandasの数倍〜数十倍**の演算速度が期待できる。つまるところ、処理が爆速なライブラリである。
とくに、テーブル同士の結合が得意らしい。

https://acro-engineer.hatenablog.com/entry/2020/12/10/120000#:~:text=cuDF%E3%81%A8%E3%81%AF,%E5%8A%B9%E6%9E%9C%E3%82%92%E7%99%BA%E6%8F%AE%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

## Google_Colaboratoryについて

Googleが提供する、ブラウザー上でpythonを記述・実行できる便利なサービス。
初学者向け、インストールが必要ない点が魅力的。[Googleアカウント](https://support.google.com/accounts/answer/27441?hl=ja)を作成すれば誰でも使える。
ただ、cuDFのような外部モジュールの使用にあたってはこちらで環境構築をしないといけない。
面倒だねぇ。。~~ただ、Googleさんのお部屋を好き勝手に汚せるからむしろ楽しいかも....~~

無駄話もこの辺にしてRAPIDSをColabに入れてみよう。

目次
=
- <strong>RAPIDSのインストールについて</strong>
- <strong>ColabノートブックにRAPIDSを入れる</strong>
- <strong>cuDFを使ってみよう</strong>

## RAPIDSのインストールについて

```!python cudf.py
import cudf
```

ColabでcuDFを使うにはRAPIDSのインストールが必要になる。
しかし、本キット lecture_01のlabsはその過程をすっ飛ばし、いきなりcudfの説明に入っている。
![スクリーンショット 2022-10-06 2.15.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/eb066643-5bfc-e90c-49e1-9c22f9e453ba.png)
**なんと不親切.....**

初心者に環境構築を強いるとは少し酷ではないかNVIDIAさん。
そんなわけで環境構築を進めていこう。

## ColabノートブックにRAPIDSを入れる

**1. ググる**

スマホやPCという文明の利器を所持しているならば、探し物をするときにはまず<INS>「ググる」</INS>を使おう。
"rapids colab notebook"で検索すると、大体一番上に公式のノートブックが出てくる。
このリンク先に飛ぶと、rapids環境構築用のノートブックが勝手に開いてくれる。
![スクリーンショット 2022-10-09 23.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/6d6279bb-267d-8a1a-8d35-a7184c8361ec.png)
**2. ドライブにコピー**

共有されているノートブック上で環境構築を行なっても、あくまでそのノートブック上だけで
rapidsが使えるようになるだけで、自分のドライブにはなんの変化も起きない。

そこで、ノートブックをドライブにコピーし、自分のドライブでもrapidsを利用できるようにする。
たとえば、こんな感じでわかりやすい名前をつけてドライブにぶち込もう。
![スクリーンショット 2022-10-09 23.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/359f3e65-c250-8fee-2365-11c29d0b170c.png)
**3.　ノートブックの内容を確認する。**

"なんやワレ！ 英語なんて読めへんぞ!" と悪態をつく前に、
知らない単語が出てきたらとりあえず辞書か何かでその単語の意味をみなさんには
調べてほしい。調べてね？

**・Enviromental(環境の）
・Sanity(健全さ）
・Check(チェック）**

読み通してみると、環境健全性チェックという訳になることがおおまかに理解できるだろう。
とはいったもののこれはそんな大層なものではなく、Google_Colab特有の[GPUガチャ](https://qiita.com/koshian2/items/d33edc963ed6cfcad77e)によって
用意されたGPUが何なのかを確認するためのセルである。
![スクリーンショット 2022-10-09 23.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/ad765285-4584-ae7d-7bdc-f7b96dcacec2.png)
今回はTeslaT4というGPUが割り当てられたようだ。GPUガチャの中では当たりの部類か。
割り当てられるGPUは(K80)P4 < T4 < P100の順で性能が良い。ハズレのGPUを引いたとしても、
GPUを貸してくれるGoogleさんに感謝の念を伝えよう。

**4. Setup以下**

!nvidia-smiセクションを実行したあとに次のセルを実行すると、
**module not found: pynvml**　というメッセージが表示されると思う。

これは環境に<INS>pynvml</INS>というモジュールがないよ！だからセルを実行できないよ！
というpython側からのお叱りである。これを解決するためにはpipコマンドを用いて、
pynvml モジュールをインストールしてあげればよい。

```!python pynvml.py
!pip install pynvml
```
インストール後に再度セルを実行し、以下が表示されたら次のセルに進もう。
```!python gpu_check.py
***********************************************************************
Woo! Your instance has the right kind of GPU, a Tesla T4!
***********************************************************************
```
**<だいたいこんな感じ>**
・1. セルを追加し、!pip install pynvmlをコピペする。
・2. 次のセルを実行する。
・3. 上のメッセージが表示されたら次に進もう！

次のセルでは、Colabの環境をアップデートしたのち、カーネルを更新する。
何を言っているかがわからない場合は、とりあえずrapidsを使うための呪文だとここでは
認識しておこう。のちに勉強すればよい。

また、ここではプロセスを終了させるためにos._exit()を用いているため、
セッションが通常終了する前にクラッシュする。
```!python update_colab.py
!bash rapidsai-csp-utils/colab/update_gcc.sh
import os
os._exit(00)
```
こんな感じでセル実行のボタンが赤く~~血に~~染まるが、とくに問題はない、次のセルを実行しよう。
![スクリーンショット 2022-10-10 0.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/95f9ca21-fc9d-3259-9048-9296dd3a8787.png)
このセルでは、先ほどと同じようにセッションがクラッシュする。説明は上記と同様のため省略する。
クラッシュしたら次のセルを実行しよう。ちなみにこのセルではCondaColabをインストールしている。
```!python install_colab.py
import condacolab
condacolab.install()
```
このセルはCondaColabがちゃんとColabに収まったかどうかを確認するセルである。
```!python check_colab.py
import condacolab
condacolab.check()
--------------------------------------------------------------------------------------
#以下のメッセージが表示されたら次に進もう！
#✨🍰✨ Everything looks OK! <---絵文字もコードと合わせて表現できるのね。
```
このセルのセッションが終了したら、ようやくColabでRAPIDSおよびその提供モジュールであるcuDFが
使えるようになる。大体15分ほど待たされるので、その間音楽を聴いたりして好きに過ごしてね。
```!python install_rapids.py
!python rapidsai-csp-utils/colab/install_rapids.py stable
import os
os.environ['NUMBAPRO_NVVM'] = '/usr/local/cuda/nvvm/lib64/libnvvm.so'
os.environ['NUMBAPRO_LIBDEVICE'] = '/usr/local/cuda/nvvm/libdevice/'
os.environ['CONDA_PREFIX'] = '/usr/local'
```
<strong>終わり！ おしまい！</strong>
![スクリーンショット 2022-10-10 1.11.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/b087f8f3-7ab5-67cc-0724-ca0e5f9e8ee7.png)
## cuDFを使ってみよう
ようやくcuDFが使えるので、さっそくimportして使ってみよう。
```!python cudf.py
import cudf
```
importが完了したあと、cudfデータフレームを作成し、変数gdfに渡す。
dataframe2.pyでは、データフレームgdfに新たな列(index,value)を追加し、値を格納している。
最後に、gdfと記述し、現在のデータフレームの構成を確認する。
```!python dataframe.py
gdf = cudf.DataFrame()
#df = pandas.DataFrame() <---挙動はpandasのそれと同じ。
```
```!python dataframe2.py
#creates a column named 'index' with the values 0, 1, 2, 3, 4
gdf['index'] = [0, 1, 2, 3, 4]

#creates a column named 'value' with the values 10, 20, 30, 40, 50
gdf['value'] = [10, 20, 30, 40, 50]

#displays the current cudf dataframe
gdf
```
**やったね！ データフレームが表示されたよ。**
![スクリーンショット 2022-10-10 1.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884108/2a2d67e6-fc42-2e1c-3283-10d9bd10241d.png)


最後までお読みいただきありがとうございます。