Skip to content

アプリケーション内で をクリックすると、お使いのDataRobotバージョンに関する全プラットフォームドキュメントにアクセスできます。

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ソリューションを実現できます。

前提条件

メイン設定を作成する前に、次の手順を完了する必要があります。

  1. ご使用のオペレーティングシステムに適したGoogle Cloud SDKをインストールします(Googleのドキュメントを参照)。

  2. コマンドプロンプトで次のコマンドを実行します。

    gcloud init

    既存のプロジェクトを選択するか、新しいプロジェクトを作成し、コンピューティングゾーンも選択するよう求められます。 例:

  3. Kubernetesコマンドラインツールをインストールします。

    gcloud components install kubectl

    出力は以下のようになります。

手順

以下のセクションでは、プロセスの各手順で、PPSを介してGCPプラットフォームに、DataRobotモデルをデプロイおよび監視する手順について説明します。 Kaggleの住宅価格データセットを例に使用します。

モデルパッケージのダウンロード

住宅価格データセットを使用してモデルを構築します。 オートパイロットが終了したら、MLOpsモデルパッケージを作成してダウンロードできます。 これを行うには、モデルタブでモデルを選択して予測 > デプロイをクリックします。 [MLOpsパッケージ]セクションで、生成してダウンロードを選択します。

DataRobotは、モデルに関する必要なすべての情報を含むモデルパッケージ(.mlpkgファイル)を生成します。

Dockerコンテナイメージの作成

MLOpsパッケージを使用してDockerコンテナイメージを作成するには:

  1. モデルパッケージのダウンロード(前の手順で開始)が完了したら、PPSベースイメージをダウンロードします。

  2. PPSベースイメージを取得したら、次のDockerfileを使用して、DataRobotモデルパッケージを含むイメージを生成します。

    備考

    .mlpkgファイルをDockerイメージにコピーするには、Dockerfileと.mlpkgファイルが同じフォルダーにあることを確認してください。

    FROM datarobot/datarobot-portable-prediction-api:<TAG>
    
    COPY <MLPKG_FILE_NAME>.mlpkg /opt/ml/model 
    
  3. PROJECT_ID環境変数をGoogle CloudプロジェクトID(Google Cloud SDKのインストール時に定義したプロジェクトID)に設定します。 PROJECT_IDは、コンテナイメージをプロジェクトのContainer Registryに関連付けます。

    export PROJECT_ID= ai-XXXXXX-XXXXXX

  4. Dockerイメージをビルドしてタグ付けします。 例:

    docker build -t gcr.io/${PROJECT_ID}/house-regression-model:v1

  5. docker imagesコマンドを実行して、ビルドが成功したことを確認します。

    生成されたイメージには、DataRobotモデルと監視エージェント(サービスとモデルの正常性指標をDataRobot MLOpsプラットフォームの転送に使用)が含まれています。

Dockerをローカルで実行する

厳密に言えばオプションの手順ですが、ベストプラクティスでは、時間とネットワーク帯域幅を節約するために、常にローカルでイメージをテストすることをお勧めします。

ローカルで実行するには:

  1. Dockerコンテナイメージを実行します。

    docker run --rm --name house-regression -p 8080:8080 -it gcr.io/${PROJECT_ID}/house-regression-model:v1

  2. モデルが期待どおりに機能するかどうかをテストするために、ローカルでデータをスコアリングします。

    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)クラスターをダウンロードして実行できるようにします。

  1. Container Registryに対して認証するようにDockerコマンドラインツールを設定します。

    gcloud auth configure-docker

  2. ビルドしたDockerイメージをContainer Registryにプッシュします。

    docker push gcr.io/${PROJECT_ID}/house-regression-model:v1

備考

Container Registryにプッシュすると、storage.buckets.create権限の問題が発生する可能性があります。 このエラーが発生した場合は、GCPアカウントの管理者にお問い合わせください。

GKEクラスターの作成

DockerイメージをContainer Registryに保存したら、次のようにGKEクラスターを作成します。

  1. gcloudツールのプロジェクトIDとCompute Engineゾーンオプションを設定します。

    gcloud config set project $PROJECT_ID

    gcloud config set compute/zone europe-west1-b

  2. クラスターを作成します。

    gcloud container clusters create house-regression-cluster

    このコマンドは次のように終了します。

  3. コマンドが完了したら、次のコマンドを実行してクラスターワーカーインスタンスを表示します。

    gcloud compute instances list

    出力は以下のようになります。

備考

Container Registryにプッシュすると、gcloud.container.clusters.create権限の問題が発生する可能性があります。 このエラーが発生した場合は、GCPアカウントの管理者にお問い合わせください。

DockerイメージをGKEにデプロイする

イメージをGKEにデプロイするには:

  1. DockerイメージのKubernetesデプロイを作成します。

    kubectl create deployment house-regression-app --image=gcr.io/${PROJECT_ID}/house-regression-model:v1

  2. デプロイレプリカのベースライン数を3に設定します(つまり、デプロイには常に3つの実行中ポッドがあります)。

    kubectl scale deployment house-regression-app --replicas=3

  3. K8sは、リソースを柔軟かつ自動的に管理する機能を提供します。 たとえば、デプロイ用にHorizontalPodAutoscalerリソースを作成できます。

    kubectl autoscale deployment house-regression-app --cpu-percent=80 --min=1 --max=5

  4. 次のコマンドを実行して、作成済みポッドがすべて動作し、実行中の状態であることを確認します(たとえば、前のオートスケーリングの手順で要求されたように、最大5つの実行中ポッドが表示される場合があります)。

    kubectl get pods

    出力は以下のようになります。

モデルの公開

GKEのデフォルトのサービスタイプはClusterIPと呼ばれ、サービスはクラスター内からのみ到達可能なIPアドレスを取得します。 クラスターの外部にKubernetesサービスを公開するには、LoadBalancerタイプのサービスを作成する必要があります。 このタイプのサービスは、インターネット経由で到達可能な一連のポッドの外部ロードバランサーIPを生成します。

  1. 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-porthouse-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で外部デプロイを作成するには:

  1. モデルレジストリ > モデルパッケージ > 新しいパッケージを追加に移動し、ドキュメントの指示に従います。

    新しい外部モデルパッケージを追加をクリックします。

  2. URLにあるMLOpsモデルIDをメモします。 PPSとMLopsのリンク作成時にこれを使用します。

    モデルレジストリページと展開された新しいパッケージ内で、デプロイタブを選択して、デプロイを新規作成をクリックします。

    作成したモデルパッケージからの情報が、事前に入力されたデプロイページに読み込まれます。

  3. MLOpsデプロイIDをメモします(先にモデルIDをコピーしました)。 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.datarobot.com/>

MONITORING_AGENT_DATAROBOT_APP_TOKEN=<your token> 

備考

開発者ツールからMONITORING_AGENT_DATAROBOT_APP_TOKENを取得できます。

新しいDockerイメージをデプロイする(オプション)

デプロイされたDockerイメージをアップグレードするには、次のようにします。

  1. Dockerイメージの新しいバージョンを作成します。

    docker build -t gcr.io/${PROJECT_ID}/house-regression-model:v2

  2. 新しいイメージをContainer Registryにプッシュします。

    docker push gcr.io/${PROJECT_ID}/house-regression-model:v2`

  3. イメージの更新を使用して、既存のデプロイにローリングアップデートを適用します。

    kubectl set image deployment/house-regression-app house-regression-model=gcr.io/${PROJECT_ID}/house-regression-model:v2

  4. v1イメージを実行しているポッドが終了し、v2イメージを実行している新しいポッドがスピンアップするのを確認します。

    kubectl get pods

削除

デプロイ用にポータブル予測サーバー(PPS)を介してGCPプラットフォームを使用して設定プロセスを完了するには、次の手順を実行します。

  1. サービスを削除します。

    kubectl delete service house-regression-app-service

  2. クラスターを削除します。

    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.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 

更新しました July 18, 2023