GCPでのモデルのデプロイと監視¶
本機能の提供について
この手順で使用するMLOpsモデルパッケージのエクスポート機能は、デフォルトでは無効になっています。 この機能を有効にする方法については、DataRobotの担当者または管理者にお問い合わせください。
機能フラグ:MMMモデルパッケージのエクスポートを有効化
以下では、Google Kubernetes Engine(GKE)を使用して、Google Cloud Platform(GCP)にDataRobotモデルをデプロイするプロセスについて説明します。
概要¶
DataRobot MLOpsは、本番環境にある全モデルを対象としたデプロイ、監視、管理、ガバナンスのための一元化されたハブを提供します。 MLOpsでは、DataRobotクラスター内のスケーラブルな専用予測サーバーでDataRobotモデルが処理されるだけではありません。 DataRobotのモデル監視機能の利点を維持しながら、DataRobotモデルをKubernetes(K8s)クラスターにデプロイすることもできます。
このエクスポート可能なDataRobotモデルは、ポータブル予測サーバー(PPS)と呼ばれ、Dockerコンテナに似た柔軟性と移植性を実現します。 PPSはDockerコンテナをベースとし、監視エージェントが組み込まれたDataRobotモデルが含まれています。 このアプローチを使用すると、DataRobotモデルをスケーラブルなデプロイ環境を介して使用できるようになり、関連データを一元化されたDataRobot MLOpsダッシュボードで追跡し、監視とガバナンスの利点をすべて活用できます。
DataRobotモデルのDockerイメージの移植性とK8sプラットフォームのスケーラビリティを統合することで、本番環境ですぐに使用できる強力なMLソリューションを実現できます。
前提条件¶
メイン設定を作成する前に、次の手順を完了する必要があります。
-
ご使用のオペレーティングシステムに適したGoogle Cloud SDKをインストールします(Googleのドキュメントを参照)。
-
コマンドプロンプトで次のコマンドを実行します。
gcloud init
既存のプロジェクトを選択するか、新しいプロジェクトを作成し、コンピューティングゾーンも選択するよう求められます。 例:
-
Kubernetesコマンドラインツールをインストールします。
gcloud components install kubectl
出力は以下のようになります。
手順¶
以下のセクションでは、プロセスの各手順で、PPSを介してGCPプラットフォームに、DataRobotモデルをデプロイおよび監視する手順について説明します。 Kaggleの住宅価格データセットを例に使用します。
モデルパッケージのダウンロード¶
住宅価格データセットを使用してモデルを構築します。 オートパイロットが終了したら、MLOpsモデルパッケージを作成してダウンロードできます。 これを行うには、モデルタブでモデルを選択して予測 > デプロイをクリックします。 [MLOpsパッケージ]セクションで、生成してダウンロードを選択します。
DataRobotは、モデルに関する必要なすべての情報を含むモデルパッケージ(.mlpkgファイル)を生成します。
Dockerコンテナイメージの作成¶
MLOpsパッケージを使用してDockerコンテナイメージを作成するには:
-
モデルパッケージのダウンロード(前の手順で開始)が完了したら、PPSベースイメージをダウンロードします。
-
PPSベースイメージを取得したら、次のDockerfileを使用して、DataRobotモデルパッケージを含むイメージを生成します。
備考
.mlpkg
ファイルをDockerイメージにコピーするには、Dockerfileと.mlpkg
ファイルが同じフォルダーにあることを確認してください。FROM datarobot/datarobot-portable-prediction-api:<TAG> COPY <MLPKG_FILE_NAME>.mlpkg /opt/ml/model
-
PROJECT_ID
環境変数をGoogle CloudプロジェクトID(Google Cloud SDKのインストール時に定義したプロジェクトID)に設定します。PROJECT_ID
は、コンテナイメージをプロジェクトのContainer Registryに関連付けます。export PROJECT_ID= ai-XXXXXX-XXXXXX
-
Dockerイメージをビルドしてタグ付けします。 例:
docker build -t gcr.io/${PROJECT_ID}/house-regression-model:v1
-
docker images
コマンドを実行して、ビルドが成功したことを確認します。生成されたイメージには、DataRobotモデルと監視エージェント(サービスとモデルの正常性指標をDataRobot MLOpsプラットフォームの転送に使用)が含まれています。
Dockerをローカルで実行する¶
厳密に言えばオプションの手順ですが、ベストプラクティスでは、時間とネットワーク帯域幅を節約するために、常にローカルでイメージをテストすることをお勧めします。
ローカルで実行するには:
-
Dockerコンテナイメージを実行します。
docker run --rm --name house-regression -p 8080:8080 -it gcr.io/${PROJECT_ID}/house-regression-model:v1
-
モデルが期待どおりに機能するかどうかをテストするために、ローカルでデータをスコアリングします。
curl -X POST http://localhost:8080/predictions -H "Content-Type: text/csv" --data-binary @/Users/X.X/community/docker/kaggle_house_test_dataset.csv
備考
ワークステーションのローカルパスと一致するように、
kaggle_house_test_dataset.csv
データセットへのパスを更新します。
DockerイメージをContainer Registryにプッシュする¶
コンテナイメージをローカルでテストして検証したら、それをレジストリにアップロードして、Google Kubernetes Engine(GKE)クラスターをダウンロードして実行できるようにします。
-
Container Registryに対して認証するようにDockerコマンドラインツールを設定します。
gcloud auth configure-docker
-
ビルドしたDockerイメージをContainer Registryにプッシュします。
docker push gcr.io/${PROJECT_ID}/house-regression-model:v1
備考
Container Registryにプッシュすると、storage.buckets.create
権限の問題が発生する可能性があります。 このエラーが発生した場合は、GCPアカウントの管理者にお問い合わせください。
GKEクラスターの作成¶
DockerイメージをContainer Registryに保存したら、次のようにGKEクラスターを作成します。
-
gcloud
ツールのプロジェクトIDとCompute Engineゾーンオプションを設定します。gcloud config set project $PROJECT_ID
gcloud config set compute/zone europe-west1-b
-
クラスターを作成します。
gcloud container clusters create house-regression-cluster
このコマンドは次のように終了します。
-
コマンドが完了したら、次のコマンドを実行してクラスターワーカーインスタンスを表示します。
gcloud compute instances list
出力は以下のようになります。
備考
Container Registryにプッシュすると、gcloud.container.clusters.create
権限の問題が発生する可能性があります。 このエラーが発生した場合は、GCPアカウントの管理者にお問い合わせください。
DockerイメージをGKEにデプロイする¶
イメージをGKEにデプロイするには:
-
DockerイメージのKubernetesデプロイを作成します。
kubectl create deployment house-regression-app --image=gcr.io/${PROJECT_ID}/house-regression-model:v1
-
デプロイレプリカのベースライン数を3に設定します(つまり、デプロイには常に3つの実行中ポッドがあります)。
kubectl scale deployment house-regression-app --replicas=3
-
K8sは、リソースを柔軟かつ自動的に管理する機能を提供します。 たとえば、デプロイ用にHorizontalPodAutoscalerリソースを作成できます。
kubectl autoscale deployment house-regression-app --cpu-percent=80 --min=1 --max=5
-
次のコマンドを実行して、作成済みポッドがすべて動作し、実行中の状態であることを確認します(たとえば、前のオートスケーリングの手順で要求されたように、最大5つの実行中ポッドが表示される場合があります)。
kubectl get pods
出力は以下のようになります。
モデルの公開¶
GKEのデフォルトのサービスタイプはClusterIPと呼ばれ、サービスはクラスター内からのみ到達可能なIPアドレスを取得します。 クラスターの外部にKubernetesサービスを公開するには、LoadBalancer
タイプのサービスを作成する必要があります。 このタイプのサービスは、インターネット経由で到達可能な一連のポッドの外部ロードバランサーIPを生成します。
-
kubectl expose
コマンドを使用して、house-regression-appデプロイ用のKubernetesサービスを生成します。kubectl expose deployment house-regression-app --name=house-regression-app-service --type=LoadBalancer --port 80 --target-port 8080
各パラメーターについて説明します。
- --portはロードバランサーで設定されたポート番号です
-
--target-portはhouse-regression-app コンテナがリッスンしているポート番号です。
-
次のコマンドを実行して、サービスの詳細を表示します。
kubectl get service
出力は以下のようになります。
-
サービスの詳細から
EXTERNAL-IP
アドレスをコピーします。 -
EXTERNAL-IP
アドレスを使用してモデルをスコアリングします。curl -X POST http://XX.XX.XX.XX/predictions -H "Content-Type: text/csv" --data- binary @/Users/X.X/community/docker/kaggle_house_test_dataset.csv
備考
上記のIPアドレスプレースホルダーをコピーした
EXTERNAL-IP
アドレスで更新し、kaggle_house_test_dataset.csv
データセットへのパスをワークステーションのローカルパスと一致するように更新します。
備考
この時点で、すべての着信要求に対してクラスターが開かれています。 よりきめ細かいロールベースのアクセス制御(RBAC)を適用するには、Googleのドキュメントを参照してください。
外部デプロイの作成¶
MLOpsで外部デプロイを作成するには:
-
モデルレジストリ > モデルパッケージ > 新しいパッケージを追加に移動し、ドキュメントの指示に従います。
新しい外部モデルパッケージを追加をクリックします。
-
URLにあるMLOpsモデルIDをメモします。 PPSとMLopsのリンク作成時にこれを使用します。
モデルレジストリページと展開された新しいパッケージ内で、デプロイタブを選択して、デプロイを新規作成をクリックします。
作成したモデルパッケージからの情報が、事前に入力されたデプロイページに読み込まれます。
-
MLOpsデプロイIDをメモします(先にモデルIDをコピーしました)。 PPSとMLOpsのリンク作成時にこれを使用します。
K8s上のPPSをMLOpsにリンクする¶
最後に、K8sデプロイ設定をPPSおよび監視エージェント設定で更新します。 次の環境変数をK8sデプロイ設定に追加します(ここから完全な設定ファイルを参照)。
PORTABLE_PREDICTION_API_WORKERS_NUMBER=2
PORTABLE_PREDICTION_API_MONITORING_ACTIVE=True
PORTABLE_PREDICTION_API_MONITORING_SETTINGS=output_type=output_dir;path=/tmp;max_files=50;file_max_size=10240
000;model_id=<mlops_model_id>;deployment_id=<mlops_deployment_id>
MONITORING_AGENT=True
MONITORING_AGENT_DATAROBOT_APP_URL= <https://app.jp.datarobot.com/>
MONITORING_AGENT_DATAROBOT_APP_TOKEN=<your token>
備考
開発者ツールからMONITORING_AGENT_DATAROBOT_APP_TOKEN
を取得できます。
新しいDockerイメージをデプロイする(オプション)¶
デプロイされたDockerイメージをアップグレードするには、次のようにします。
-
Dockerイメージの新しいバージョンを作成します。
docker build -t gcr.io/${PROJECT_ID}/house-regression-model:v2
-
新しいイメージをContainer Registryにプッシュします。
docker push gcr.io/${PROJECT_ID}/house-regression-model:v2`
-
イメージの更新を使用して、既存のデプロイにローリングアップデートを適用します。
kubectl set image deployment/house-regression-app house-regression-model=gcr.io/${PROJECT_ID}/house-regression-model:v2
-
v1イメージを実行しているポッドが終了し、v2イメージを実行している新しいポッドがスピンアップするのを確認します。
kubectl get pods
削除¶
デプロイ用にポータブル予測サーバー(PPS)を介してGCPプラットフォームを使用して設定プロセスを完了するには、次の手順を実行します。
-
サービスを削除します。
kubectl delete service house-regression-app-service
-
クラスターを削除します。
gcloud container clusters delete house-regression-cluster
K8s設定ファイル¶
次のセクションでは、リファレンス用のデプロイおよびサービス設定ファイルを指定します。
デプロイ設定ファイル¶
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "2"
creationTimestamp: "2020-07-08T12:47:27Z"
generation: 8
labels:
app: house-regression-app
name: house-regression-app
namespace: default
resourceVersion: "14171"
selfLink: /apis/apps/v1/namespaces/default/deployments/house-regression-app
uid: 2de869fc-c119-11ea-8156-42010a840053
spec:
progressDeadlineSeconds: 600
replicas: 5
revisionHistoryLimit: 10
selector:
matchLabels:
app: house-regression-app
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: house-regression-app
spec:
containers:
- env:
- name: PORTABLE_PREDICTION_API_WORKERS_NUMBER
value: "2"
- name: PORTABLE_PREDICTION_API_MONITORING_ACTIVE
value: "True"
- name: PORTABLE_PREDICTION_API_MONITORING_SETTINGS
value: output_type=output_dir;path=/tmp;max_files=50;file_max_size=10240000;model_id=<your_mlops_model_id>;deployment_id=<your_mlops_deployment_id>
- name: MONITORING_AGENT
value: "True"
- name: MONITORING_AGENT_DATAROBOT_APP_URL
value: https://app.jp.datarobot.com/
- name: MONITORING_AGENT_DATAROBOT_APP_TOKEN
value: <your_datarobot_api_token>
image: gcr.io/${PROJECT_ID}/house-regression-model:v1
imagePullPolicy: IfNotPresent
name: house-regression-model
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 5
conditions:
- lastTransitionTime: "2020-07-08T12:47:27Z"
lastUpdateTime: "2020-07-08T13:40:47Z"
message: ReplicaSet "house-regression-app-855b44f748" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
- lastTransitionTime: "2020-07-08T13:41:39Z"
lastUpdateTime: "2020-07-08T13:41:39Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
observedGeneration: 8
readyReplicas: 5
replicas: 5
updatedReplicas: 5
サービス設定ファイル¶
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2020-07-08T12:58:13Z"
labels:
app: house-regression-app
name: house-regression-app-service
namespace: default
resourceVersion: "5055"
selfLink: /api/v1/namespaces/default/services/house-regression-app-service
uid: aeb836cd-c11a-11ea-8156-42010a840053
spec:
clusterIP: 10.31.242.132
externalTrafficPolicy: Cluster
ports:
- nodePort: 30654
port: 80
protocol: TCP
targetPort: 8080
selector:
app: house-regression-app
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: XX.XX.XXX.XXX