Help us understand the problem. What is going on with this article?

Deep learning に対応!! Splunk DL Toolkit に触ってみた

概要

Splunkが DeepLearningに対応しました(驚愕)。昨年の .conf で発表があり beta 版としてアングラで動いてたらしいですが、今回正式に Deep Learning Toolkit もリリースされて追加できるようになりました。 もちろんGPUなどにも対応しており、Tensorflow /Keras / PyTorch そして 複数の NLP ライブラリが利用可能です。

今回はどんな感じで実装できるのか、まずはセットアップしてみたいと思います。

ちなみに Youtubeで概要とセットアップなどが紹介されてますので、こちらも合わせてチェックしてください。
https://www.youtube.com/watch?v=IYCvwABLyh4

マニュアルはなさそうでして、DL Toolkit アプリをインストールすると簡単なセットアップガイドが載ってるため、そこを参照しながら作成しました。

Deep Learning Toolkit for Splunkとは?

以下のイメージのように、Splunk環境とは別に Container 環境を用意して、そこで Deeplearning (以下DL) で作成したモデルの学習や本番データへの適用を実行できるようになります。コンテナ環境ではGPUなども利用できるため学習時間を短縮させることも可能です。

image.png

以下のように、Splunk側から fit / apply などのコマンドと一緒に DLのモデルを指定すると、コンテナ環境上にデータをロードし学習などをして結果をリプライします。そのため Splunk側からは従来の機械学習用のアルゴリズムと同様にモデルのスケジュール実行やアラートなど運用に取り込むことが可能となります。

image.png

また、splunkbase をみると、現在のところサポート対象外のようなので、利用の際は注意してご利用ください。

構成について

シングル構成と、 Splunk 環境と Docker 環境を分離した構成の2パターンが構成できます。
以下のように、Client(ユーザーPC)からも Dockerにアクセスするため、分離する場合は、External IPが必要になります。

image.png

また Docker環境に対して Splunkから Docker命令ができるようにするのと、レポジトリーにアクセスするため DockerホストからInternetへアクセスできる必要があります。

事前準備

・Splunk環境は、現在(10/28時点)では Splunk 7.3 のみです。 8には対応してませんので注意ください。
・Splunk Machine Learning Toolkit 4.4
・Python for Scientific Computing 1.4
・Deep Learning Toolkit for Splunk 2.3

<コンテナ環境>
・ Docker

セットアップ

今回は、最初ということもありシンプルにシングルノード構成でセットアップします。分離する場合はおそらくリモートから Dockerhostに対して命令できるような追加の設定が必要になると思われます。

1. 各種アプリのインストール

まずは、Splunk 7.3 の環境に対して、以下のアプリをインストールします。やり方は通常のアプリと同じです。
・Splunk Machine Learning Toolkit 4.4
・Python for Scientific Computing 1.4
・Deep Learning Toolkit for Splunk 2.3

2. Docker 環境の準備

今回はシングルノード構成なので、同じホスト上に Docker をインストールします。

## docker のインストール
$ sudo yum install docker

## docker サービスの立ち上げ
$ sudo service docker start

基本的にはこれだけで利用できます。あとはboot時に dockerサービスが立ち上がるように設定するとかくらいでOKです。

boot時に起動設定
sudo chkconfig docker on

3. セットアップ

DL Toolkit のセットアップ画面に行くと、以下のようにあります。

image.png

最初に、MLTK/PSCがインストールされているかチェックされます。
ここで、MLTKは、Global permissionが必要とあるので、アプリ設定画面で permissionを変更しましょう。
image.png

そして2番目の設定項目で、私の環境は Linux の single node 構成なので、下にある Exampleを参考に以下のように入力しました。

DockerHost : unix://var/run/docker.sock
Endpoint URL: localhost
External URL:

External URL は、自分のPCからアクセスできるような IPアドレスまたはホスト名を入力します。また FW設定などある場合は、8888 / 6006 に対してアクセスできるように変更してください。

あとは、Save ボタンを押すと、以下のようなメッセージが現れたら完了です。
image.png

もし、うまく現れない場合は、Dockerhostにうまくアクセスできていないので、サービスが上がっているか、もしくはリモートアクセス権なども確認してみてください。

開発の流れ

さて、ここまで来たら基本的なセットアップは終了です。次にアプリ内にある 以下のモデル作成ガイドにしたがって進めたいと思います。
image.png

0 から 8までのステップが書いてあります。

0: コンテナ準備とセットアップ (開発用のコンテナ環境のロードと起動)
1. モデル作成の準備 ( jupyter labで、 pythonコードがモデル名になるため、サンプルコードを参考にコピーして新規モデルを保存します)
2. コードを書くために、サンプルデータをコンテナ上にロードします。
3. モデルの中身作成 ( jupyter labで、モデルの中身のコードを書きます。cnn / lstm など自由にモデルを作成することが出来ます)
4. 実データを使ってモデルの学習をする。 ( fit コマンドを使って、splunk上で作成したモデルを呼び出して学習させる)
5. 学習状況を確認 (tensorboardを使って、学習状況を確認します)
6. 実モデルのテスト&評価 (apply コマンドで 学習済みのモデルを使って、今まで利用していなかったデータに対して適用し評価する)
7. モデルの反復、改良、再トレーニング (モデルをさらにいいものにするため、上記を繰り返します)
8. 本番データへの適用 (完成したモデルを使って実運用をする。 apply コマンドで適用)

Step 0: 最初に開発用のコンテナ環境を作成します。

すでに4つのコンテナが DockerHub上に用意されており、利用したいライブラリや環境(GPUなど)により、選択してロードします。今回はGPUがないので、Tensorflow CPUを選択しました。

image.png

Startすると、Jupyter NotebookやTensorboard環境にもアクセスできるようになります。

ちなみにRebuildしたりローカルのリポジトリに登録したい場合は、こちらからダウンロードして変更できます。
https://github.com/splunk/splunk-mltk-container-docker

Step 1. JupyterLabを用いたモデル作成の準備

"JUPYTER LAB" ボタンをクリックして、jupyter lab にアクセスします。(pass: Splunk4DeepLearning)

/notebook に移動すると、サンプルでいくつもの pythonコードが用意されております。 (my_ と頭文字にあるのは私がコピーしたものです)
image.png

これらの pythonコードがモデル名となっております。そのため本来はわかりやすいように名前をつける必要があります。
ガイドをよく読むと命名規則(推奨)が書いてありました。 <algo_type> _ <NN_type> _ <activation_function>

今回は気づかずに univariate_cnn_forecast.ipynb をコピーして、別名 (my_univariate_cnn_forecast.ipynb)で保存してしまったためこのまま進めさせていただきます。

Step 2. Splunk上のデータをコンテナ環境上にロードする

Splunkのサーチで、以下のコマンドを実行し、コンテナ環境にデータをロードします。このタイミングで epochs やbatch_sizeなどのオプションもパラメーターとして指定できます。

mode=stage と指定することで、実際には fitせずにデータをコンテナ環境にロードするようになります。
(データはコンテナ内の /srv/notebook/data に保存されます)

Splunk上で実行
| inputlookup internet_traffic.csv 
| timechart span=120min avg("bits_transferred") as bits_transferred 
| eval bits_transferred=round(bits_transferred) 
| fit RobustScaler bits_transferred 
| fit MLTKContainer algo=forecast_rnn_internet_traffic mode=stage epochs=100 batch_size=3 RS_bits_transferred _time by RS_bits_transferred into app:internet_traffic_forecast_model

image.png

ちなみに、コンテナ内のディレクトリを確認すると、確かにデータが読み込まれているのが確認できます。
image.png

Step 3. モデルの中身の作成

ここでは、保存した my_univariate_cnn_forecast.ipynb の中身を見ていきます。

Stage0: ライブラリーインポート

こちらは、このまま利用します。
image.png

Stage1: Splunkからのデータロードの確認

先ほどコンテナ上にロードしたデータが読み込めるか確認します。

image.png

Stage2. モデルの作成と初期化

ここでロードしたデータを使って、モデルの作成と初期化を行います。
詳細は省きますが、ここでkerasを使って sequential() にてモデルの中身を定義してます。それ以外にもパラメーターをセットしております。

image.png
image.png

Stage3. fit モデルの定義

モデルの初期化は終わり、データの読み込みといくつかのパラメータがセットされた状態です。Stage3で、実際にモデルを学習させていきます。

image.png
image.png

Stage4. Apply の定義

先ほど作成したモデルを適用していきます。
ここでは定義だけしてありますが、Splunk側から Applyコマンドで呼び出すことができます。

image.png

Stage5. モデルの保存

モデルの保存を定義してます。

image.png

その他 ( load model / summary model)

他のモデルを読み込んで続きを作ったり、サマリーを確認する際の方法です。

image.png

最後まで実行が出来たら、作成したjupyter notebookを保存してください。

Step 4. fit コマンドによる学習

さて、モデルのコードは作成しましたので、実際にSplunkからデータを使って学習させたいと思います。
今回は forcast (時系列予測) なので必要ないですが、カテゴリー予測などの場合はデータを訓練データとテストデータに分けた上で学習&テストする必要があります。その際は Splunk の|sample コマンドを利用します。以下のようにやると10分割して7割を訓練データとして利用します。seed はシャッフルする際のキーであり、指定しておくと毎回同じようにシャッフルしてくれます。

| sample partitions=10 seed=1 | where partition_number<7

今回は forecast モデルなので、シャッフルすると時系列が崩れるため不要です。その代わりモデル内で holdback = 30 を指定しており、最後の30箇所を予測されるため、実データと比較できます。

| inputlookup internet_traffic.csv 
| timechart span=120min avg("bits_transferred") as bits_transferred 
| eval bits_transferred=round(bits_transferred) 
| fit RobustScaler bits_transferred 
| fit MLTKContainer algo=my_univariate_cnn_forecast epochs=100 batch_size=3 RS_bits_transferred _time by RS_bits_transferred into app:MyFirstModel

image.png

predicted_0 というフィールドが出来ており、学習により予測された値が表示されてます。

Step 5. Tensorboard を用いた学習状況の確認

学習したモデルについては、学習中の経過や精度などを Tensorboardを使って確認できます。
正直言って、Tensorboard の見方はよく分からないため、イメージ図だけ貼り付けておきます。(勉強せねば。。。)

・ モデルの中身を図示
image.png

・ epoch ごとのロス率
image.png

・よくわからん。 (Distributions)
image.png

・よくわからん。 (Histgrams)
image.png

Step 6. テストデータへの適用

Tensorboardを見ながら学習がうまく行ってそうだったら、テストデータへの適用をして評価します。
今回は forecast モデルなので、実は fit と同じになってしまうのですが、他のケースの場合は、データを分割して7割を訓練データ、残りの3割をテストデータとして訓練されたモデルをテストデータに対して適用して評価していきます。

例えば、先ほどの |sample コマンドを使う場合以下のような感じで applyの前にデータを分割します。

| sample partitions=10 seed=1 | where partition_number >= 7

改めていいますが、今回は時系列データ分析なのでシャッフルは不要です。以下のように適用します。

| inputlookup internet_traffic.csv 
| timechart span=120min avg("bits_transferred") as bits_transferred 
| eval bits_transferred=round(bits_transferred) 
| fit RobustScaler bits_transferred 
| apply app:MyFirstModel

image.png

見やすいように予測した最後の30箇所にズームするとこちらのようになりました。
予測値と実測値が同じように推移しているのがわかります。

image.png

Step 7. モデルの反復、改良、再学習

テストデータへの適用結果を見ながら、上記のステップを遡ってモデルの改良をしていくのを繰り返して、納得のいくモデルを作り上げます。

ちなみに、summary コマンドの結果です。すこし結果を整形しないと見づらいですね。

image.png

Step 8. 本番環境への適用

Step6 で実行した apply コマンドを使って、本番環境で運用を行います。学習済みのモデルを適用するだけなので負荷はそれほど高くないです。
コンテナ環境は開発用のコンテナのままなので、出来たモデル専用のコンテナをアサインすることも可能です。コンテナ管理の画面からモデルを選択してコンテナイメージを適用するだけです。

image.png

もちろん通常のSplunkコマンドから実行できるので、今までどおりレポートやダッシュボード、アラートへの組み込みが可能になります。
これがわざわざ Splunで DLを使う一番のメリットだと思います。

最後に

非常にざっくりとでしたが DeepLearning Toolkit for Splunk の概要でした。(もしかしたら利用方法が間違っている箇所があるかもしれませんが、その場合はご指摘頂けるとありがたいです)

データサイエンティストが一般的に使っている ツールやライブラリはそのまま利用し、Splunk内にある大量のデータを活用出来る点と、作成したモデルをそのまま Splunkに実装し運用できる点は非常に魅力的だと思いました。

正直コーディングするスキルや DLに対する経験が必要になるので、そのようなエンジニアに興味を持ってもらえるかは重要なファクターですね。

今後は、GPU環境を利用したり、NLPや Pytorch といった他のライブラリを活用したモデル・ユースケースを触ってみたいと思います。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away