TIPS & TRICKS

Splunkでディープラーニング分析機能とGPUアクセラレーションを使用する

Splunkは、誰もがデータから貴重なインサイトを獲得できる、高度な分析機能を備えたマシンデータプラットフォームです。そのユースケースに限りはなく、SPLを活用することでどのような分析でも実行できます。SPLはかなり前から、機械学習機能をネイティブにサポートしており、Splunk Machine Learning Toolkit (MLTK)をインストールするだけで、予測を始められます。

Splunkのお客様は、すでに膨大な量のデータをSplunkに収集されており、さらに高度な分析を望まれるようになってきました。そうしたお客様に最適なのが機械学習です。パワフルなSPLを機械学習のコマンドやアルゴリズムで拡張すると、データから驚くようなインサイトを得られるようになります。

ご存じのように、Splunkのユースケースは創造力次第で無限にあり、ハイレベルなユースケースを求める方にとっては普通の機械学習ですら十分ではありません。さらなるパワーを求める方のためにSplunkプラットフォームの機能を拡張するのは極めて当然であり、私たちはかねてからプラットフォームでディープラーニングを簡単に使えるようにする取り組みを続けています。その成果の1つが、Splunk .conf19において、Anthony TellezとPhilipp Driegerが発表したDeep Learning Toolkit (DLTK) for Splunkです。

一般的なエンタープライズ環境では、Splunkクラスターはベアメタルサーバーか仮想インフラで動く分散環境で実行されます。しかし、ディープラーニングをGPUなどの専用のハードウェアで実行すると、モデルのパフォーマンスが格段に上がります。

一般的なエンタープライズ環境

では、GPUのない環境でディープラーニングを実行するにはどうしたらよいのでしょうか。心配は無用です。DLTKは、一般的なエンタープライズ環境とは別の専用のハードウェアにプラットフォームの処理機能を簡単に拡張できるように設計されています。

DLTKなら、外部のディープラーニングDockerイメージに接続できるのです!その方法はいたってシンプルです。

この記事では、Splunk DLTKのサーチヘッドをAWSで実行中のGPUが動くDocker環境に統合し、ディープラーニング分析を実行する方法を説明します。

前提条件

ここからは、Splunk Deep Learning Toolkitのインストールと設定が完了し、ローカルのDockerで実行できるようになっていると仮定して説明します。DLTKのインストールがまだの場合は、こちらの手順に沿ってインストールしてください。DLTKが起動するようになったら、これから説明するように設定して外部のDockerイメージに接続できます。

注: DLTKには、Splunk Machine Learning Toolkit (MLTK)アプリが必要です。MLTKの権限の共有は、[All apps (system) (すべてのアプリ(システム))]に設定してください。

MLTKアプリ

注: GPUインスタンスは、一般的なインスタンスよりもかなり高額です。必要のない場合は実行したままにしないことをお勧めします。

ステップ1:ディープラーニング用AMIをデプロイする

まず、AWSインスタンスを起動する必要があります。このAWSインスタンスは必須です。AWSマネジメントコンソールで新しいインスタンスの起動を選択すると、使用できるAMIテンプレートのウィザードが表示されます。このウィザードで、Deep Learning AMI (Ubuntu 18.04)を検索して、UbuntuベースのAMI — Deep Learning AMI (Ubuntu 18.04) Version 30.xを選択します。このイメージには、TensorFlow、MXNet、PyTorch、Chainer、Kerasなどの主要なフレームワークと、最新バージョンであるNVIDIA Driver 440.33.01があらかじめインストールされています。

インスタンスを起動するリージョンで、AWSコンソールから[Launch Instance (インスタンスを起動)]を選択し、「Deep Learning AMI (Ubuntu 18.04)」を検索します。

インスタンスを起動するリージョン

[Select (選択)]ボタンをクリックすると、必要なインスタンスタイプを選択する画面が表示されます。ここでは、AWS GPUインスタンスG4インスタンスを使用します。Amazon EC2 G4は、2,000を超えるNVIDIA CUDA Coreと320のTuring Tensor Coreを搭載した最新世代のNVIDIA T4 GPUを搭載しています。この記事では、初めての設定であることを考え、GPUを1つとvCPUを4つ装備した最も手頃なインスタンスタイプ(g4dn.xlarge)を使用します。

適切なインスタンスタイプを選んだら、「Step:4 Add Storage (ステップ4:ストレージの追加)」が表示されるまで[Next (次へ)]をクリックします。このAMIのルートディスクのサイズは、デフォルトで90GBです。このあと大きなDockerイメージをダウンロードして使用するため、スペースがなくならないよう、150GBに変更します。本番環境向けに設定する際は、必要に応じてカスタマイズ(最適化)してください。

カスタマイズ(最適化)

Step 6:Configure Security Group (ステップ6:セキュリティグループの設定)」が表示されるまで[Next (次へ)]をクリックします。あとで、インスタンスにアクセスする特定のセキュリティグループを作成しますが、この段階ではまず以下のポートを有効にしてください。

  • TCP 22:SSHでリモートアクセス
  • TCP 32768:コンテナSPLアプリケーションサーバー
  • TCP 2375:リモートDocker API
  • TCP 8888:Jupyter Lab DEVイメージ
  • TCP 6006:Tensorboard DEVイメージ
     

Configure Security Group (ステップ6:セキュリティグループの設定)

この記事はテストが目的のため、すべてのIPソースが接続できるようにしますが、AWSのセキュリティグループのルールをDLTK/MLのサーチヘッドIPとご自分のIPのみに制限するのがベストです。特定のIPのみに制限するには、パブリックIPをポート22、8888、6006に追加する必要があります。それ以外は、DLTKをインストールしたSplunkサーチヘッドのIPのみを許可するようにします。

ステップ2:環境でGPUドライバーが動作していることを確認する

インスタンスが起動したら、マシンにsshでログインして、いくつか設定を行い、すべてに問題がないことを確認します。

注: AMIの設定プロセスを自動化するdevスクリプトを用意しています。この記事の最後の「クイックセットアップを参照してください。

ssh -i keys/id_rsa ubuntu@AWS_PUBLIC_IP

注: AWS_PUBLIC_IPを変更して、AWSインスタンス用のキーファイルとパブリックIPを使用します。

sshを使用してユーザー「ubuntu」としてリモートインスタンスにログインします。ログインすると、関連するすべてのフレームワークがすでにインストールされているのがわかります。しかも、NVIDIA Container Toolkitもすでにインストールされています。

NVIDIA Container Toolkit

本来なら、まずnvidia-smiコマンドを使用して、NVIDIAのドライバーが適切に動作していることを確認する必要がありますが、この記事では省略し、Dockerコンテナツールキットが適切にインストールされ、GPUにアクセスできるかどうかの確認に移りたいと思います。手早く確認する方法はいくつかありますが、nvidia-smi (NVIDIAシステム管理インターフェイス) Dockerコンテナイメージを起動し、Dockerでマシン上のGPUを使用するように指定するのも1つの方法です。これがうまくいったら、どのDockerイメージも起動できます。そして実行されたら、同じドライバーをイメージに渡すことができます(DLTKではこの方法をとります)。

次のコマンドを実行して、出力にTesla T4 GPUと表示されたら、うまくいっています。

docker run --runtime=nvidia --rm nvidia/cuda:10.2-base nvidia-smi

コマンドを実行

筆者はいつもnvtopをインストールします。nvtopは、GPUデバイス向けのntopのようなものです。以下のビルドプロセスに従ってください。場合によっては「Could not get lock file …」のようなエラーが出て、apt-getコマンドが失敗することがあります。これは想像以上に複雑な問題であるため、自動更新プロセスが終了するまで数分待つことをお勧めします。

sudo killall apt.systemd.daily ;sudo apt-get update ; sleep 5 ;sudo apt-get install -y libncurses5-dev
git clone https://github.com/Syllo/nvtop.git
mkdir -p nvtop/build && cd nvtop/build
cmake ..
make
sudo make install
nvtop

成功すると、以下のようにGPUが表示されるはずです。

自動更新プロセスが終了

ステップ3:DockerのリモートAPIを有効にする

Deep Learning Toolkitアプリでは、ローカルまたはリモートのDockerコンテナを使用してディープラーニングの開発環境や本番環境をホストできます。本番環境に適しているKubernetesクラスターもサポートしていますが、この記事では触れません。DockerはリモートAPIを提供していますが、デフォルトでは有効になっていません。Docker APIはデフォルトでは安全ではなく、特定のプロセスに沿ってSSLとクライアント証明書を有効にする必要があります。

以下の論理構成図は、SplunkとDocker環境上の開発用イメージとのやり取りを示しています。

SplunkとDocker環境上の開発用イメージとのやり取り

この記事では、セキュリティ関連の設定は省略してリモートAPIに接続します。 

注: 本番環境では省略しないことをお勧めします。誰もがDockerサーバーにアクセスでき、すべてのデータが暗号化されていないテキストで送信されることになります。

以下のコマンドを実行して、まずDocker APIを有効にします。 

cat /lib/systemd/system/docker.service |sed 's/containerd.sock/containerd.sock -H=tcp:\/\/0.0.0.0:2375/g' |sudo tee /lib/systemd/system/docker.service sudo systemctl daemon-reload;sleep 2;sudo service docker restart

次のコマンドを使ってテストします。

curl http://localhost:2375/images/json

コマンドを使ってテスト

上記のように表示されれば、準備は万端です。 

ゴールデンイメージのダウンロード

Splunkからディープラーニングジョブを実行するのは、魔法のように簡単です。ここからは、その理由を解き明かしましょう。こちらのリポジトリには、関連するすべてのドキュメントと事前構築済みの最新のイメージがあり、これらを使うことで、さまざまなアルゴリズムを開発または実行できます。アルゴリズムは、DLTKのコンテンツセクションに表示されます。開発作業をすばやく始められるように、必要なすべてのフレームワーク、ツール、アプリ、アルゴリズムが設定され、SPLとも統合されている事前構築済みのDockerイメージがすでに用意されています。次のことができます。

  • SPLからfitコマンドとapplyコマンドを使用して、任意のカスタムアルゴリズムをネイティブに呼び出せます
  • Splunkインスタンスから、モデルで使用する準備ができたステージング用データを(通常はトレーニング目的で)送信できます
  • モデルを評価するためのその他の関連するSPLコマンドを実行できます
  • SPLからモデルに直接パラメーターを渡せます。たとえば、hidden layersやepochs、その他サポートするパラメーターを渡せます
     

最後に、アルゴリズムを独自に開発した場合は、関連するSPLコマンド(たとえばfit)を実行するときにそのアルゴリズムを使用できます。この場合、Splunkは関連するデータセットを送信し、ユーザーが開発したモデルを実行して、Splunkインスタンスに結果を返します。つまり、データセットを生成する他のSPLコマンドと変わりません。  

筆者は、通常はAWSインスタンスにログインしてイメージを手動でダウンロードします。初めて実行するときは少し時間がかかるため、この方法の方が進捗を確認しやすいからです。ubuntuユーザーとしてログインしているAWSインスタンスからイメージを手動でダウンロードするには、以下のコマンドを実行します。

docker pull phdrieger/mltk-container-golden-image-gpu:latest

DLTKでも同じことができます。[Configuration (構成)] -> [Containers (コンテナ)]にアクセスし、[Golden Image GPU (3.x) (ゴールデンイメージGPU (3.x))]を選択します。[GPU Runtime (GPUランタイム)]は[nvidia]に設定してください。

DLTK

なお本番環境では、必要なフレームワークと特定のノートブックおよびアルゴリズムのみでイメージを独自に構築するのが一般的です。 

ステップ4:DLTKをリモートDockerに接続する

あとは、DLTKでリモートDocker APIの場所を指定するだけで、準備は完了です。設定が短時間で簡単に終わるため、時間をたっぷり使って、保有するデータのためのモデルの開発に集中できます。設定が完了すると、DLTKは、コンテナを作成、起動、停止するコマンドや、ステータス情報を取得するコマンドをDockerに送信できるようになります。この情報はすべてDLTKのUIに表示され、場合によっては関連するSplunkの設定ファイルに書き込まれます。

[Configuration (構成)] -> [Setup (設定)]にアクセスし、以下のように詳細を入力します。AWS_INSTANCE_GPU_IPは、お使いのAWS GPUインスタンスのパブリックIPに置き換えてください。

  • Docker Host (Dockerホスト):tcp://AWS_INSTANCE_GPU_IP:2375
  • Endpoint URL (エンドポイントURL): AWS_INSTANCE_GPU_IP
  • External URL (外部URL): AWS_INSTANCE_GPU_IP
     

リモートDockerインスタンス

SplunkをリモートDockerインスタンスに接続できたら、[Configuration (構成)] -> [Containers (コンテナ)]にアクセスし、(設定がまだの場合は)GPUランタイムのオプションを[nvidia]に設定して、ゴールデンイメージを起動します。

コンテナモデルステータスの結果

コンテナが立ち上がったら、[Container Model Status (コンテナモデルステータス)]の結果をクリックすると、実行中のコンテナの詳細を見ることができます。最初は、まだ作成していないためモデルは表示されません。

AWSインスタンスのCLI

AWSインスタンスのCLIで以下のコマンドを使用することもできます(トラブルシューティングする場合)。

docker ps # Show docker images running
docker logs --follow CONTAINER_ID # Show docker image log output

ステップ5:Splunkを使ってディープラーニングを実行する

楽しい部分に入る前に、SPLコマンドの実行時に舞台裏で何が起きているかについて、もう少し詳しく説明したいと思います(このセクションは飛ばしてステップ6へ進んでもかまいません)。DLTKを使用してモデルを独自に開発する詳しい方法については、DLTKアプリ内のユーザーガイドをご覧ください。 

コンテンツライブラリにある「Neural Network Classifier DGA-Pytorch」ユースケースを例に説明しましょう。説明に沿って実際に実行するには、DGAアプリをインストールして設定しておく必要があります。元のデータセットから生成された特徴量が必要になるためです。DGAアプリがインストールされておらず、時間を短縮したい場合は、「Multiclass Neural Network Classifier-Pytorch」を使用できます。

ユースケースを開くと、関連するダッシュボードが表示されます。このダッシュボードは、dgaデータセット全体にSPL fitコマンドを実行するように設定されています。コマンドは次のようになります。

これは、DGAアプリで生成された、関連する特徴量を含むデータセットです。

| inputlookup dga_domains_features.csv 

「fit MLTKContainer」コマンドを使用してデータセットを実行することで、pytorch_nn.ipynb Jupyterノートブックをベースとするモデル、pytorch_nn_dga_nn_classifier.ptが作成されます。epochs、hidden layersなどのパラメーター(キーと値のペア)をモデルに渡すこともできます。

| fit MLTKContainer algo=pytorch_nn epochs=$epochs$ batch_size=$batch_size$ hidden_layers=$hidden_size$ class from PC_1 PC_2 PC_3 ut_consonant_ratio ut_digit_ratio ut_domain_length ut_meaning_ratio ut_shannon ut_vowel_ratio into app:dga_nn_classifier

継続して開発を行う場合は、mode=stageパラメーターを使用できます。このパラメーターは、モデルは実行せず、リクエストされたデータをコンテナイメージ上にロードします。モデルが作成されると、コンテナイメージに転送されたデータセットに適用されます。そして、すべての結果がSplunkに返されます。このモデルは、/srv/app/model/data内のコンテナに格納されます。

コンテナイメージ転送

ステップ6:GPUでモデルを実行する

ここまでくれば、ネイティブのSPLコマンドを使用するだけで、開発用コンテナイメージで、あらかじめ定義されたアルゴリズムをデータセットに適用できます。DLTKアプリにアクセスして、[Content (コンテンツ)]メニューオプションをクリックします。[Classifier (分類アルゴリズム)]セクションまでスクロールして、実行するユースケースを選択します。以降では、[Neural Network Classifier DGA - Pytorch]を詳しく見ていきます。これを実行するには、Splunk DGAアプリをインストールし、設定しておく必要があります。 

DGAアプリを設定しておらず、このアプリが動作していない場合は、[Normal Network Classifier - Pytorch]を選択できます。こちらは、DLTKに含まれる有名なアヤメのデータセットを使用します。

DGAアプリ設定

この記事では、Pytorchフレームワークで開発されたシンプルなニューラルネットワーク分類アルゴリズムを使用し、DGAデータセットに適用します。異なるデータセットでも性質が似ている場合は、同じアルゴリズムを使用できます。 

DGAアプリをインストールしていない場合は、アヤメの分類も問題としては似ているため、同じアルゴリズムを適用できます。SPLコマンドのすべてのパラメーターを使って、アルゴリズムに関連データを与え、モデルのパラメーターを定義することができます。あとはDLTKフレームワークが処理してくれます。 

選択肢1:アヤメの品種を分類するニューラルネットワーク分類アルゴリズムを実行

この実験は、[Neural Network Classifier - Pytorch]をクリックするだけで実行できます。エポックの値を変えてモデルを実行し、違いを見てみてください。 

選択肢2:DGAドメインのニューラルネットワーク分類アルゴリズムを実行(最初にDGAアプリの設定が必要)

まず、エポックを100に設定してDGAユースケースを実行し、結果を見てみましょう。結果内では、モデルのパフォーマンスも確認できます。先ほども述べたように、ネイティブのSPLコマンドを使用して、関連するモデルのパラメーターや、そのパフォーマンスのメトリクスを表示できます。エポックを100に指定して実行すると、モデルのパフォーマンスがかなり悪いことがわかります。ただし、モデルの実行にはわずか数秒しかかかりませんでした。パフォーマンスを改善するには、データセットのパス数を増やします(エポックを増やします)。なお、パスごとにDGAのデータセット全体(10万レコード)が学習されます。「sample」などのSPLコマンドを使用してデータのサブセットを使用すると、時間を最小限におさえられます。

DGAドメインのニューラルネットワーク分類アルゴリズム

エポック数を1万回にして実行すると、GPUの稼働率が最大に上がり、モデルのパフォーマンスが著しく改善されていることを確認できます。プロセス全体(データの送信、モデルの実行、結果の返却)にかかった時間は3分を切り、モデルの実行時間は1分未満でした。CPUで実行していたら、少なくとも1時間はかかっていたことでしょう。 

エポック数を1万回にして実行

プロセス全体

 

まとめ

このブログをお読みいただき、ありがとうございました。わずか数分でGPUインフラを立ち上げてDLTKを設定し、ディープラーニングの力でデータを活かせるようになることがおわかりいただけたと思います。

ご紹介した設定は開発、テスト専用ですので、本番環境での実行をお考えの場合は、Splunkエンジニアまでご相談ください。

セキュリティノート

AWSセキュリティルールを使用して、アクセスをサーチヘッドIPとご自分のIPのみに制限し、Docker APIの保護を強化してください。本番環境での設定については、Splunk社員までお問い合わせください。

クイックセットアップ

1. 前述のステップ1に従ってAWSディープラーニングAMIを起動します
2.AWSイメージのCLIで以下のコマンドを実行します(sshでログイン)

bash <(wget -qO- https://gist.githubusercontent.com/dlamspl/06c539dc3dbce52fcf9f37382ebf7e32/raw/29e03e2dfe564e21609bcca76185e86ce1b0d1ee/dltk_config_ami_clear.sh)

3.コンテナ環境を設定します(お使いのAWSインスタンスのIPに置き換えてください)

コンテナ環境を設定

GPUを徹底的に活用して、すばらしい成果を!


付録

このブログはこちらの英語ブログの翻訳、丸山 潤一によるレビューです。

Splunk
Posted by

Splunk

TAGS
Show All Tags
Show Less Tags