Splunk DLTK + GPU : UMAP による次元削減のサンプルコードを実行してみよう


# はじめに

Splunk DLTKのサンプルコードを実行しながら、仕組みを理解してみたいと思います。
今回は、NVIDIA社が提供しているRapidsというライブラリにある **UMAP** という次元削減法を使い、大量のデータを次元削減後に可視化してみたいと思います。

**（注意) 今回のサンプルコード実行には、GPU環境が必須になります。**

### UMAPとは?
最新の次元削減法とのことです。他のPCA,t-SNEなどの手法と比べ高速に処理ができるというのもポイントらしいです。

こちらを参考にさせていただきました。
https://qiita.com/cheerfularge/items/27a55ebde4a671880666

### Rapidsとは?

NVIDIAが提供しているオープンソースなGPUアクセラレーションプラットフォーム。以前[CUDAを使ったサンプルコード](https://qiita.com/maroon/items/d6bb13fd58c4d4127855)を紹介しましたが、このRapidsはそのCUDA上で動作して、様々なライブラリー群やAPIが利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/5633d1b0-717d-9fb4-ad47-e69531a7108c.png)

図：https://www.slideshare.net/NVIDIAJapan/rapids-120510206

# 事前準備

Rapidsは、デフォルトのGoldenイメージには入っていないので、新規に Rapidsのコンテナを立ち上げる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/351ff38d-a2ad-a2e5-e2f2-8dd7f651e13c.png)

またRAPIDSを使う上で GPUは必須になります。GPU環境のセットアップについてはこちらのBlogをご覧ください。
https://www.splunk.com/en_us/blog/tips-and-tricks/splunk-with-the-power-of-deep-learning-analytics-and-gpu-acceleration.html

また今回は、サンプルデータとして、DGA Appに含まれるデータを利用しますので、こちらのAppも事前にインストールしておいてください。
https://splunkbase.splunk.com/app/3559/

DLTKのセットアップや使い方についてはこちらをご覧ください。
https://qiita.com/maroon/items/5a8b027631a674d6d8be

# サンプルコードを確認

それでは DLTKに含まれる rapids_umap_dga.ipynb をみていきたいと思います。

最初はライブラリーのインポートです。cudfと UMAPが読み込まれてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/fb584a26-9aaf-36c5-11f5-1a165b1f27c1.png)


### Stage1: データ取得

次にデータ取得です。Splunkからデータを加工して保存したものを読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/83ce63ee-5a09-0d46-ce81-8ebe6d425531.png)


Splunk側での実行は以下の通りです。(サンプルコードにはmode=stageが抜けているので注意）
こちらのデータセットを利用するために、予め [DGA App](https://splunkbase.splunk.com/app/3559/)を追加しておく必要があります。今回は10万件のデータを利用しております。

```:Splunk側で実行
| inputlookup dga_domains_features.csv 
| fit MLTKContainer mode=stage algo=rapids_umap plot="datashader" class from ut* PC* into app:dga_rapids_umap
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/8e4f3247-6aa2-0fc1-95b6-1367f8406a7b.png)



### Stage2 & Stage3: 初期化 & 学習
Stage2,3 の関数では、特に何もしていないため、紹介はスキップします。

### Stage4: 適用(apply)

今回の目玉の箇所です。少し長いので前半のplotしている箇所と、後半のapply箇所で分けたいと思います。

最初に３つほどある関数定義は、matplotlibやseabornによるグラフ作成とpngとして保存する関数定義になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/4e9c769a-b9d5-9fa1-7263-54c23ce92657.png)


次の関数定義は、applyになります。GPUで扱うため、Rapidsのライブラリーを使ってデータをGPU上に呼び込み、umapを使って計算し、DataFrameに変換してからリターンします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/5e65fb40-f34f-beb0-5f4c-2334c52b8b4d.png)



# サンプルダッシュボード

上記を一通り実行したら、DLTKのサンプルダッシュボードを見てましょう。

「Sample」-[Data Mining] - [Rapids UMAP on DGA]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392303/888495ac-b482-aefa-21c4-0046c4f894b1.png)

左側のグラフが scatterplot で右側のグラフが datashader になります。Jupyter Notebook側で作成されたグラフが、Splunkのダッシュボードで表示されております。

# 最後に

MLTKには、UMAPを使った次元削減は用意されておりませんが、DLTKを使ってこのようにUMAPを利用できるようになりました。しかもGPUとの組み合わせにより100,000件のデータ分析も瞬時に出すことが可能になります。是非お試しください。