GKEでのMLOpsエージェントのデプロイ¶
次の手順では、スプーラーとしてPub/Subを使用してMLOpsエージェントを、Google Kubernetes Engine(GKE)にデプロイする方法について説明します。 これにより、DataRobotの外部で開発されたカスタムPythonモデルを監視できます。 カスタムモデルはローカルマシンでスコアリングされ、Google Cloud Platform(GCP)に統計が送信されます。Pub/Sub。 最後に、(GKEにデプロイされた)エージェントがこのデータを使用し、DataRobot MLOpsダッシュボードに送り返します。
概要¶
DataRobot MLOpsは、DataRobot MLOpsエージェントを使用して一元化されたダッシュボードで、すべてのMLモデル(DataRobotまたは外部でトレーニングされたモデル)を監視する機能を提供します。 デプロイされたモデルと並行して実行されるJavaユーティリティであるエージェントは、Java、Python、Rプログラミング言語で開発されたモデルを監視できます。
MLOpsエージェントは、スプーラー(つまり、ファイルシステム、GCP Pub/Sub、AWS SQS、またはRabbitMQ)を介してモデルと通信し、MLOpsダッシュボードにモデル統計を送り返します。 これらには、スコアリングされたレコードの数、特徴量の数、スコアリング時間、データドリフトなどを含めることができます。 エージェントをDockerイメージに組み込み、それをKubernetesクラスターにデプロイして、スケーラビリティと堅牢性を確保できます。
前提条件¶
メイン設定を作成する前に、次の手順を完了する必要があります。
-
お使いのオペレーティングシステムに固有のGoogle Cloud SDKをインストールします。
-
コマンドプロンプトで次のコマンドを実行します。
gcloud init
既存のプロジェクトを選択するか、新しいプロジェクトを作成し、コンピューティングゾーンも選択するよう求められます。
-
Kubernetesコマンドラインツールをインストールします。
gcloud components install kubectl
-
Google Cloudサービスアカウントの資格情報を取得して、Google Cloud APIを呼び出します。 デフォルトのサービスアカウントをお持ちでない場合は、この手順に従って作成できます。
-
資格情報が配置されたら、それらを含むJSONファイルをダウンロードします。 後で、Google Cloud APIを呼び出すアプリケーションに資格情報を渡すときは、次のいずれかの方法を使用できます。
手順¶
次のセクションでは、プロセスの各手順で、Pub/Subを使用してMLOpsエージェントをGKEにデプロイする手順について説明します。
外部デプロイの作成¶
まず、外部デプロイを作成します。 結果のモデルIDとデプロイIDを使用して、エージェントとの通信を設定します(Dockerをローカルで実行するの手順で説明されています)。
Pub/Subトピックとサブスクリプションの作成¶
次に、Pub/Subトピックとサブスクリプションを作成します。
-
Google CloudコンソールのPub/Subサービスに移動し、トピック(パブリッシャーがメッセージを送信できる名前付きリソース)を作成します。
-
サブスクリプションを作成します。サブスクリプションは、1つの特定のトピックからのメッセージストリームを表す名前付きリソースで、サブスクライブしているアプリケーションに配信されます。 前の手順のPub/Subトピックを使用して、配信タイプをPullに設定します。 これにより、サブスクリプションIDが提供されます。
さらに、メッセージの保持期間やその他のパラメーターを設定できます。
MLOpsエージェントをDockerに埋め込む¶
エージェントを埋め込むDockerイメージを作成するには:
-
マシン上に作業ディレクトリを作成し、必要なファイルを準備します。
-
confという名前のディレクトリを作成します。
-
MLOpsエージェントを含むtarballファイルを開発者ツールからダウンロードし、解凍します。
-
mlops.log4j2.properties
ファイルを<unzipped directory>/conf
から<working directory/conf>
にコピーします。 -
ファイル
mlops.agent.conf.yaml
を作業ディレクトリにコピーします。 次のパラメーターを指定します(この例では、他のすべてのパラメーターにデフォルトを使用しています)。パラメーター 定義 mlopsUrl
セルフマネージドAIプラットフォームのインストールURL。マネージドAIプラットフォームでは app.datarobot.com
apiToken
DataRobot key projectId
GCP ProjectId topicName
Pub/Subセクションで作成済み 例:
mlopsUrl: "MLOPS-URL" apiToken: "YOUR-DR-API-TOKEN" channelConfigs: - type: "PUBSUB_SPOOL" details: {name: "pubsub", projectId: "YOUR-GOOGLE-PROJECT-ID", topicName: "YOUR-PUBSUB-TOPIC-ID-DEFINED-AT-STEP-2"}
-
<unzipped directory>/lib/mlops-agent-X.X.X.jar
ファイルを作業ディレクトリにコピーします。 -
作業ディレクトリで、次の内容を使用してDockerfileを作成します。
FROM openjdk:8 ENV AGENT_BASE_LOC=/opt/datarobot/ma ENV AGENT_LOG_PROPERTIES=mlops.log4j2.properties ENV AGENT_CONF_LOC=$AGENT_BASE_LOC/conf/mlops.agent.conf.yaml COPY mlops-agent-*.jar ${AGENT_BASE_LOC}/mlops-agent.jar COPY conf $AGENT_BASE_LOC/conf COPY entrypoint.sh / RUN chmod +x /entrypoint.sh ENTRYPOINT ["./entrypoint.sh"]
-
次の内容で
entrypoint.sh
を作成します。#!/bin/sh echo "######## STARTING MLOPS-AGENT ########" echo exec java -Dlog.file=$AGENT_BASE_LOC/logs/mlops.agent.log -Dlog4j.configurationFile=file:$AGENT_BASE_LOC/conf/$AGENT_LOG_PROPERTIES -cp $AGENT_BASE_LOC/mlops-agent.jar com.datarobot.mlops.agent.Agent --config $ AGENT_CONF_LOC
-
Dockerビルドコマンドの最後に必ずピリオド(
.
)を含めて、Dockerイメージを作成します。export PROJECT_ID=ai-XXXXXXX-111111 docker build -t gcr.io/${PROJECT_ID}/monitoring-agents:v1 .
-
docker images
コマンドを実行して、ビルドが成功したことを確認します。
Dockerをローカルで実行する¶
備考
厳密に言えばオプションの手順ですが、ベストプラクティスでは、時間とネットワーク帯域幅を節約するために、常にローカルでイメージをテストすることをお勧めします。
監視エージェントのtarballには、カスタムPythonモデルからMLOpsに統計情報を送信するために必要なライブラリ(JavaおよびRライブラリを含む)が含まれています。 ライブラリはlib
ディレクトリにあります。
ローカルで実行するには:
-
Python用
DataRobot_MLOps
ライブラリをインストールします。pip install datarobot_mlops_package-<VERSION>/lib/datarobot_mlops-<VERSION>-py2.py3-none-any.whl
-
Dockerコンテナイメージを実行します。
備考
前提条件(Google Cloudアカウントの資格情報のダウンロードについて説明する手順)でダウンロードした資格情報を含むJSONファイルが必要になります。
docker run -it --rm --name ma -v /path-to-you-directory/mlops.agent.conf.yaml:/ opt/datarobot/ma/conf/mlops.agent.conf.yaml -v /path-to-your-directory/your-google-application-credentials.json:/opt/datarobot/ma/conf/gac.json -e GOOGLE_APPLICATION_CREDENTIALS="/opt/datarobot/ma/conf/gac.json" gcr.io/${PROJECT_ID}/monitoring-agents:v1
以下は、モデルがスコアリングされるPythonコードの例です(この例ではすべてのパッケージのimport文が省略されています)。
from datarobot_mlops.mlops import MLOps DEPLOYMENT_ID = "EXTERNAL-DEPLOYMENT-ID-DEFINED-AT-STEP-1" MODEL_ID = "EXTERNAL-MODEL-ID-DEFINED-AT-STEP-1" PROJECT_ID = "YOUR-GOOGLE-PROJECT-ID" TOPIC_ID = "YOUR-PUBSUB-TOPIC-ID-DEFINED-AT-STEP-2" # MLOPS: initialize the MLOps instance mlops = MLOps() \ .set_deployment_id(DEPLOYMENT_ID) \ .set_model_id(MODEL_ID) \ .set_pubsub_spooler(PROJECT_ID, TOPIC_ID) \ .init() # Read your custom model pickle file (model has been trained outside DataRobot) model = pd.read_pickle('custom_model.pickle') # Read scoring data features_df_scoring = pd.read_csv('features.csv') # Get predictions start_time = time.time() predictions = model.predict_proba(features_df_scoring) predictions = predictions.tolist() num_predictions = len(predictions) end_time = time.time() # MLOPS: report the number of predictions in the request and the execution time mlops.report_deployment_stats(num_predictions, end_time - start_time) # MLOPS: report the features and predictions mlops.report_predictions_data(features_df=features_df_scoring, predictions=predictions) # MLOPS: release MLOps resources when finished mlops.shutdown()
-
GOOGLE_APPLICATION_CREDENTIALS
環境変数を設定します。export GOOGLE_APPLICATION_CREDENTIALS="<your-google-application-credentials.json>"
-
モデルが期待どおりに機能するかどうかをテストするために、ローカルでデータをスコアリングします。 その後、監視エージェントログに新しいレコードが表示されます。
python score-your-model.py
MLOpsダッシュボードの統計も更新されます。
DockerイメージをContainer Registryにプッシュする¶
コンテナイメージをローカルでテストして検証したら、それをレジストリにアップロードして、Google Kubernetes Engine(GKE)クラスターをダウンロードして実行できるようにします。
-
Container Registryに対して認証するようにDockerコマンドラインツールを設定します。
gcloud auth configure-docker
-
ビルドしたDockerイメージをContainer Registryにプッシュします。
docker push gcr.io/${PROJECT_ID}/monitoring-agents:v1
GKEクラスターの作成¶
DockerイメージをContainer Registryに保存したら、次のようにGKEクラスターを作成します。
-
gcloud
ツールのプロジェクトIDとCompute Engineゾーンオプションを設定します。gcloud config set project $PROJECT_ID
gcloud config set compute/zone europe-west1-b
-
クラスターを作成します。
備考
この例では、わかりやすくするために、パブリックエンドポイントへのアクセスが無制限のプライベートクラスターを作成します。 セキュリティ上、本番環境のコントロールプレーンへのアクセスを必ず制限してください。 さまざまなGKE限定公開クラスターの設定に関する詳細については、こちらをご覧ください。
gcloud container clusters create monitoring-agents-cluster \ --network default \ --create-subnetwork name=my-subnet-0 \ --no-enable-master-authorized-networks \ --enable-ip-alias \ --enable-private-nodes \ --master-ipv4-cidr 172.16.0.32/28 \ --no-enable-basic-auth \ --no-issue-client-certificate
各パラメーターについて説明します。
パラメーター 結果 --create-subnetwork name=my-subnet-0
GKEは、 my-subnet-0
という名前のサブネットを自動的に作成します。--no-enable-master-authorized-networks
クラスターの承認済みネットワークを無効にします。 --enable-ip-alias
クラスターをVPCネイティブにします。 --enable-private-nodes
クラスターのノードに外部IPアドレスがないことを示します。 --master-ipv4-cidr 172.16.0.32/28
コントロールプレーンの内部アドレス範囲を指定します。 この設定は、このクラスターに対して永続的です。 --no-enable-basic-auth
クラスターの基本認証を無効にします。 --no-issue-client-certificate
クライアント証明書の発行を無効にします。 -
次のコマンドを実行してクラスターワーカーインスタンスを表示します。
gcloud compute instances list
クラウドルーターの作成¶
GKEプライベートクラスターで実行されているMLOpsエージェントは、DataRobot MLOpsサービスにアクセスする必要があります。 これを行うには、プライベートノードにインターネットへのアウトバウンドアクセスを許可する必要があります。これは、NATクラウドルーターを使用して実現できます(Googleのドキュメントはこちら)。
-
クラウドルーターの作成:
gcloud compute routers create nat-router \ --network default \ --region europe-west1
-
ルーターに設定を追加します。
gcloud compute routers nats create nat-config \ --router-region europe-west1 \ --router nat-router \ --nat-all-subnet-ip-ranges \ --auto-allocate-nat-external-ips
K8s ConfigMapの作成¶
クラウドルーターを設定したら、K8s ConfigMapを作成して、MLOpsエージェント設定とGoogle資格情報を含めることができます。 前提条件の段階で作成した、ダウンロード済みJSON資格情報ファイルが必要になります。
備考
K8s Secretsを使用して、本番環境で使用する設定ファイルを保存します。
次のコードを使用してConfigMapを作成します。
kubectl create configmap ma-configmap --from-file=mlops.agent.conf.yaml=your-path/mlops.agent.conf.yaml
kubectl create configmap gac-configmap --from-file=gac.json=your-google-application-credentials.json
K8sデプロイの作成¶
デプロイを作成するには、次の内容でma-deployment.yaml
ファイルを作成します。
備考
この例では、3つの常時実行レプリカを使用しています。自動スケーリングの場合、kubectl autoscale deployment
を使用します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ma-deployment
labels:
app: ma
spec:
replicas: 3
selector:
matchLabels:
app: ma
template:
metadata:
labels:
app: ma
spec:
containers:
- name: ma
image: gcr.io/${PROJECT_ID}/monitoring-agents:v1
volumeMounts:
- name: agent-conf-volume
mountPath: /opt/datarobot/ma/conf/mlops.agent.conf.yaml
subPath: mlops.agent.conf.yaml
- name: gac-conf-volume
mountPath: /opt/datarobot/ma/conf/gac.json
subPath: gac.json
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /opt/datarobot/ma/conf/gac.json
ports:
- containerPort: 80
volumes:
- name: agent-conf-volume
configMap:
items:
- key: mlops.agent.conf.yaml
path: mlops.agent.conf.yaml
name: ma-configmap
- name: gac-conf-volume
configMap:
items:
- key: gac.json
path: gac.json
name: gac-configmap
次に、以下のコマンドでデプロイを作成します。
kubectl apply -f ma-deployment.yaml
最後に、実行中のポッドを確認します。
kubectl get pods
モデルのスコアリング¶
ローカルモデルをスコアリングし、出力を確認します。
-
ローカルモデルをスコアリングします。
python score-your-model.py
-
GKE Podのログを確認します。1つのレコードがDataRobotに送信されたことを示しています。
-
Pub/Subログを確認します。
-
DataRobot MLOpsダッシュボードを確認します。
削除¶
-
ルーターのNATを削除します。
gcloud compute routers nats delete nat-config --router=nat-router --router-region=europe-west1
-
クラウドルーターを削除します。
gcloud compute routers delete nat-router --region=europe-west1
-
クラスターを削除します。
gcloud container clusters delete monitoring-agents-cluster