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) (すべてのアプリ(システム))]に設定してください。
注: GPUインスタンスは、一般的なインスタンスよりもかなり高額です。必要のない場合は実行したままにしないことをお勧めします。
まず、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 (次へ)]をクリックします。あとで、インスタンスにアクセスする特定のセキュリティグループを作成しますが、この段階ではまず以下のポートを有効にしてください。
この記事はテストが目的のため、すべてのIPソースが接続できるようにしますが、AWSのセキュリティグループのルールをDLTK/MLのサーチヘッドIPとご自分のIPのみに制限するのがベストです。特定のIPのみに制限するには、パブリックIPをポート22、8888、6006に追加する必要があります。それ以外は、DLTKをインストールしたSplunkサーチヘッドのIPのみを許可するようにします。
インスタンスが起動したら、マシンにsshでログインして、いくつか設定を行い、すべてに問題がないことを確認します。
注: AMIの設定プロセスを自動化するdevスクリプトを用意しています。この記事の最後の「クイックセットアップ」を参照してください。
ssh -i keys/id_rsa ubuntu@AWS_PUBLIC_IP
注: AWS_PUBLIC_IPを変更して、AWSインスタンス用のキーファイルとパブリックIPを使用します。
sshを使用してユーザー「ubuntu」としてリモートインスタンスにログインします。ログインすると、関連するすべてのフレームワークがすでにインストールされているのがわかります。しかも、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が表示されるはずです。
Deep Learning Toolkitアプリでは、ローカルまたはリモートのDockerコンテナを使用してディープラーニングの開発環境や本番環境をホストできます。本番環境に適しているKubernetesクラスターもサポートしていますが、この記事では触れません。DockerはリモートAPIを提供していますが、デフォルトでは有効になっていません。Docker APIはデフォルトでは安全ではなく、特定のプロセスに沿ってSSLとクライアント証明書を有効にする必要があります。
以下の論理構成図は、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)を実行するときにそのアルゴリズムを使用できます。この場合、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でリモートDocker APIの場所を指定するだけで、準備は完了です。設定が短時間で簡単に終わるため、時間をたっぷり使って、保有するデータのためのモデルの開発に集中できます。設定が完了すると、DLTKは、コンテナを作成、起動、停止するコマンドや、ステータス情報を取得するコマンドをDockerに送信できるようになります。この情報はすべてDLTKのUIに表示され、場合によっては関連するSplunkの設定ファイルに書き込まれます。
[Configuration (構成)] -> [Setup (設定)]にアクセスし、以下のように詳細を入力します。AWS_INSTANCE_GPU_IPは、お使いのAWS GPUインスタンスのパブリックIPに置き換えてください。
SplunkをリモートDockerインスタンスに接続できたら、[Configuration (構成)] -> [Containers (コンテナ)]にアクセスし、(設定がまだの場合は)GPUランタイムのオプションを[nvidia]に設定して、ゴールデンイメージを起動します。
コンテナが立ち上がったら、[Container Model Status (コンテナモデルステータス)]の結果をクリックすると、実行中のコンテナの詳細を見ることができます。最初は、まだ作成していないためモデルは表示されません。
AWSインスタンスのCLIで以下のコマンドを使用することもできます(トラブルシューティングする場合)。
docker ps # Show docker images running
docker logs --follow CONTAINER_ID # Show docker image log output
楽しい部分に入る前に、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内のコンテナに格納されます。
ここまでくれば、ネイティブのSPLコマンドを使用するだけで、開発用コンテナイメージで、あらかじめ定義されたアルゴリズムをデータセットに適用できます。DLTKアプリにアクセスして、[Content (コンテンツ)]メニューオプションをクリックします。[Classifier (分類アルゴリズム)]セクションまでスクロールして、実行するユースケースを選択します。以降では、[Neural Network Classifier DGA - Pytorch]を詳しく見ていきます。これを実行するには、Splunk DGAアプリをインストールし、設定しておく必要があります。
DGAアプリを設定しておらず、このアプリが動作していない場合は、[Normal Network Classifier - Pytorch]を選択できます。こちらは、DLTKに含まれる有名なアヤメのデータセットを使用します。
この記事では、Pytorchフレームワークで開発されたシンプルなニューラルネットワーク分類アルゴリズムを使用し、DGAデータセットに適用します。異なるデータセットでも性質が似ている場合は、同じアルゴリズムを使用できます。
DGAアプリをインストールしていない場合は、アヤメの分類も問題としては似ているため、同じアルゴリズムを適用できます。SPLコマンドのすべてのパラメーターを使って、アルゴリズムに関連データを与え、モデルのパラメーターを定義することができます。あとはDLTKフレームワークが処理してくれます。
選択肢1:アヤメの品種を分類するニューラルネットワーク分類アルゴリズムを実行
この実験は、[Neural Network Classifier - Pytorch]をクリックするだけで実行できます。エポックの値を変えてモデルを実行し、違いを見てみてください。
選択肢2:DGAドメインのニューラルネットワーク分類アルゴリズムを実行(最初にDGAアプリの設定が必要)
まず、エポックを100に設定してDGAユースケースを実行し、結果を見てみましょう。結果内では、モデルのパフォーマンスも確認できます。先ほども述べたように、ネイティブのSPLコマンドを使用して、関連するモデルのパラメーターや、そのパフォーマンスのメトリクスを表示できます。エポックを100に指定して実行すると、モデルのパフォーマンスがかなり悪いことがわかります。ただし、モデルの実行にはわずか数秒しかかかりませんでした。パフォーマンスを改善するには、データセットのパス数を増やします(エポックを増やします)。なお、パスごとにDGAのデータセット全体(10万レコード)が学習されます。「sample」などのSPLコマンドを使用してデータのサブセットを使用すると、時間を最小限におさえられます。
エポック数を1万回にして実行すると、GPUの稼働率が最大に上がり、モデルのパフォーマンスが著しく改善されていることを確認できます。プロセス全体(データの送信、モデルの実行、結果の返却)にかかった時間は3分を切り、モデルの実行時間は1分未満でした。CPUで実行していたら、少なくとも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プラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。