はじめに。以下の投稿では Splunkbase上で利用可能なSplunk WorksのソリューションであるDeep Learning Toolkit (DLTK)の機能について説明しています。Splunkは、Streaming MLやSplunk Machine Learning Environment (SMLE)など、緊密に統合されたML機能を新たに搭載し、MLポートフォリオを拡大しています。SplunkのMLポートフォリオの方向性については、Lila Fridley氏のブログ「機械学習ガイド:適切なワークフローの選択」をご覧ください。
Splunk Deep Learning Toolkit(DLTK)は、コンピュートリソースを外部のコンテナ環境にオフロードできる非常に強力なツールです。さらに、GPUやSPARK環境を利用することもできます。前回のDimitris Lambrou氏によるブログ「The Power of Deep Learning Analytics and GPU Acceleration」では、GPUベースの環境構築について詳しく紹介していますのでこちらもご覧ください。
Splunk DLTKはコンテナ環境としてKubernetesやOpenShiftだけでなく、Dockerにも対応しています。今回の記事では、DLTK 3.3とAmazon EKSをkubernetes環境として利用するためのセットアップを進めていきます。
EKSとKubernetesを管理するには、まずノートPCにいくつかのCLIツールをインストールする必要があります。スタートアップの詳細については、このドキュメントを参照してください。
注:EKSを管理するには、IAMユーザーがAmazonEKSClusterPolicyを持っている必要があります。
また、Splunk DeepLearning Toolkitも事前にインストールしておきましょう。このブログはDLTK 3.xを対象としています
この後のセットアップの流れを見てみましょう。Amazon EKSではComputer NodeとしてFargateとManaged Nodeがありますが、今回はManaged Nodeを使用しています。また、ストレージサービスはReadWriteManyに対応している必要があるので、今回はEFSを使用しました。ちなみにDLTK 4.0ではデフォルトのgp2が使えるようになっなっています。
最初に EKSクラスターを作成します。詳細はこちらをご覧ください。
$ eksctl create cluster \ --name <> \ --nodegroup-name <> \ --region <> \ --node-type <> \ --nodes <<1>> \ --ssh-access \ --ssh-public-key <> \ --managed
今回は検証用にt3.mediumのインスタンスタイプと1ノードを使用しています。その他の項目は必要に応じてカスタマイズしてください。クラスタやノードグループの作成に時間がかかります。
無事に作成されているか確認してみましょう。
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 443/TCP 14d
$ kubectl get node NAME STATUS ROLES AGE VERSION ip-192-168-81-176.us-east-2.compute.internal Ready 9d v1.18.9-eks-d1db3c
Splunk DLTK 3.xではストレージに「ReadWriteMany」のボリュームを使用しているため、EFSサービスを利用する必要があります。
EFS セットアップの詳細については、こちらを参照してお進みください。
$ kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=release-1.0"
A. Cluster's CIDR 情報を取得する
Amazon EKSクラスタのVPC IDを探します。このIDはAmazon EKSコンソールで見つけることができますが、以下のAWS CLIコマンドを使用することもできます。
$ aws eks describe-cluster --name <cluster_name> --query "cluster.resourcesVpcConfig.vpcId" --output text
クラスタのVPCのCIDR範囲を探します。これはAmazon VPCコンソールで見つけることができますが、以下のAWS CLIコマンドを使用することもできます。
$ aws ec2 describe-vpcs --vpc-ids vpc-<exampledb76d3e813&tt; --query "Vpcs[].CidrBlock" --output text
このCIDR情報は次のステップで使うことになります。
B. 新しいセキュリティグループを作成して、NFSアクセスを許可する
Amazon EFS マウントポイント用のインバウンド NFS トラフィックを許可するセキュリティグループを作成します。
C. Amazon EKSクラスタ用のAmazon EFSファイルシステムを作成する
D. アクセスポイントの作成
デフォルトでは、rootユーザーのみがこのファイルシステムにアクセスできるため、DLTKクラスタはコンテナのデプロイに失敗します。そのために新しいアクセスポイントを作成する必要があります。
StorageClass
このyamlファイルをローカルのラップトップにコピーして作成します。
storageclass.yaml
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <<efs-sc>> provisioner: efs.csi.aws.com allowVolumeExpansion: true
この storageclass をクラスタにデプロイします。
$ kubectl apply -f storageclass.yaml
deploymentを確認します。
$ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE efs-sc efs.csi.aws.com Delete Immediate true 14d gp2 (default) kubernetes.io/aws-ebs Delete WaitForFirstConsumer false 14d
Persistent Volume
このyamlファイルをローカルのラップトップにコピーして作成します。
pv.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: <<dltk-efs-volume>> spec: capacity: storage: 20Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Delete storageClassName: efs-sc csi: driver: efs.csi.aws.com volumeHandle: <<fs-xxxxx>>::<<fsap-xxxxxxxx>>
環境の名前とVolumeHandle("fs-xxxxx "と "fsap-xxxxxxxx")を変更します。AWSコンソールでEFSの設定を確認します。
このPersistent Volumeをクラスタに配置します。
$ kubectl apply -f pv.yaml
Verify the deployment.
$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE dltk-efs-volume 20Gi RWX Delete Available default/dltk efs-sc 25h
DLTK 3.xではkubernetesのIngressタイプとしてLoad BalancerやNode Portをサポートしています。現時点ではIngressタイプとしてNode Portを使用しています。
このノードポート範囲をセキュリティグループに追加します。
30000-32767: Node Port
このステップは任意であり、必要であれば省略しても構いません。このステップをスキップした場合は、DLTKのデフォルトの名前空間を使用します。
1. my-namespace.yamlという名前のYAMLファイルを新規に作成します。 (名前空間名<<dltk >>を好きなように変更してください。)
my-namespace.yamla
kind: Namespace metadata: name: <<dltk>> $ kubectl apply -f ./my-namespace.yaml
2. 名前空間を確認してください。
$ kubectl get namespaces NAME STATUS AGE default Active 15d dltk Active 33h kube-node-lease Active 15d kube-public Active 15d kube-system Active 15d
DLTKアプリ 上の Configuration → Setup に進みます。
[Container] に移動します。クラスタターゲットのkubernetesを選択します。そしてStart!
セットアップでエラーが発生した場合は、このコマンドを使用してトラブルシューティングを行ってください。
$ kubectl get deployments --namespace=dltk NAME READY UP-TO-DATE AVAILABLE AGE dev 1/1 1 1 30h $ kubectl describe deployment dev --namespace=dltk << More detail Information>>
$ kubectl get pods --namespace=dltk NAME READY STATUS RESTARTS AGE dev-7f9cdcc6d7-mzcdb 1/1 Running 0 30h $ kubectl describe pod <> --namespace=dltk << More detail Information>>
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE dltk Bound dltk-efs-volume1 20Gi RWX efs-sc 34h $ kubectl describe pvc <> --namespace=dltk << More detail Information>>
$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE dltk-efs-volume1 20Gi RWX Delete Bound dltk/dltk efs-sc 34h $ kubectl describe pv << dltk-efs-volume1>>
$ kubectl logs -f <<POD name>> --namespace=dltk
さらに、Splunk Infrastructure Monitoring を使ってAmazon EKSを監視することで、学習負荷をリアルタイムで監視することができます。
EKS環境でDLTKのセットアップが完了すると、コンピュータのリソースを簡単に拡張したり、縮退したりすることができます。さらに、複数のDLTKでこのEKSを共有することで、リソースを最適化することができます。
本日は、開発・テスト用のセットアップフローをご紹介しました。本番用に実行する必要がある場合は、お近くのSplunkのエンジニアにご相談ください。
このブログを書くにあたり、Philipp Driegerさんのアドバイスやサポートに感謝したいと思います。
最後にSplunk が提供するすべての ML サービスの詳細については、「機械学習ガイド:適切なワークフローの選択」をご覧ください。また今後出てくるBlogをお楽しみに。
----------------------------------------------------
Thanks!
丸山 潤一
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。