Skip to content

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

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クラスターにデプロイして、スケーラビリティと堅牢性を確保できます。

前提条件

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

  1. お使いのオペレーティングシステムに固有のGoogle Cloud SDKをインストールします。

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

    gcloud init

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

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

    gcloud components install kubectl

  4. Google Cloudサービスアカウントの資格情報を取得して、Google Cloud APIを呼び出します。 デフォルトのサービスアカウントをお持ちでない場合は、この手順に従って作成できます。

  5. 資格情報が配置されたら、それらを含むJSONファイルをダウンロードします。 後で、Google Cloud APIを呼び出すアプリケーションに資格情報を渡すときは、次のいずれかの方法を使用できます。

手順

次のセクションでは、プロセスの各手順で、Pub/Subを使用してMLOpsエージェントをGKEにデプロイする手順について説明します。

外部デプロイの作成

まず、外部デプロイを作成します。 結果のモデルIDとデプロイIDを使用して、エージェントとの通信を設定します(Dockerをローカルで実行するの手順で説明されています)。

Pub/Subトピックとサブスクリプションの作成

次に、Pub/Subトピックとサブスクリプションを作成します。

  1. Google CloudコンソールのPub/Subサービスに移動し、トピック(パブリッシャーがメッセージを送信できる名前付きリソース)を作成します。

  2. サブスクリプションを作成します。サブスクリプションは、1つの特定のトピックからのメッセージストリームを表す名前付きリソースで、サブスクライブしているアプリケーションに配信されます。 前の手順のPub/Subトピックを使用して、配信タイプPullに設定します。 これにより、サブスクリプションIDが提供されます。

    さらに、メッセージの保持期間やその他のパラメーターを設定できます。

MLOpsエージェントをDockerに埋め込む

エージェントを埋め込むDockerイメージを作成するには:

  1. マシン上に作業ディレクトリを作成し、必要なファイルを準備します。

  2. confという名前のディレクトリを作成します。

  3. MLOpsエージェントを含むtarballファイルを開発者ツールからダウンロードし、解凍します。

  4. mlops.log4j2.propertiesファイルを<unzipped directory>/confから<working directory/conf>にコピーします。

  5. ファイルmlops.agent.conf.yamlを作業ディレクトリにコピーします。 次のパラメーターを指定します(この例では、他のすべてのパラメーターにデフォルトを使用しています)。

    パラメーター 定義
    mlopsUrl セルフマネージドAIプラットフォームのインストールURL。app.datarobot.comマネージドAIプラットフォーム向け
    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"} 
    
  6. <unzipped directory>/lib/mlops-agent-X.X.X.jarファイルを作業ディレクトリにコピーします。

  7. 作業ディレクトリで、次の内容を使用して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"] 
    
  8. 次の内容で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 
    
  9. Dockerビルドコマンドの最後に必ずピリオド(.)を含めて、Dockerイメージを作成します。

    export PROJECT_ID=ai-XXXXXXX-111111
    
    docker build -t gcr.io/${PROJECT_ID}/monitoring-agents:v1 . 
    
  10. docker imagesコマンドを実行して、ビルドが成功したことを確認します。

Dockerをローカルで実行する

備考

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

監視エージェントのtarballには、カスタムPythonモデルからMLOpsに統計情報を送信するために必要なライブラリ(JavaおよびRライブラリを含む)が含まれています。 ライブラリはlibディレクトリにあります。

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

  1. Python用DataRobot_MLOpsライブラリをインストールします。

    pip install datarobot_mlops_package-<VERSION>/lib/datarobot_mlops-<VERSION>-py2.py3-none-any.whl

  2. 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() 
    
  3. GOOGLE_APPLICATION_CREDENTIALS環境変数を設定します。

    export GOOGLE_APPLICATION_CREDENTIALS="<your-google-application-credentials.json>"

  4. モデルが期待どおりに機能するかどうかをテストするために、ローカルでデータをスコアリングします。 その後、監視エージェントログに新しいレコードが表示されます。

    python score-your-model.py

    MLOpsダッシュボードの統計も更新されます。

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}/monitoring-agents:v1

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. クラスターを作成します。

    備考

    この例では、わかりやすくするために、パブリックエンドポイントへのアクセスが無制限のプライベートクラスターを作成します。 セキュリティ上、本番環境のコントロールプレーンへのアクセスを必ず制限してください。 さまざまな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 クライアント証明書の発行を無効にします。
  3. 次のコマンドを実行してクラスターワーカーインスタンスを表示します。

    gcloud compute instances list

クラウドルーターの作成

GKEプライベートクラスターで実行されているMLOpsエージェントは、DataRobot MLOpsサービスにアクセスする必要があります。 これを行うには、プライベートノードにインターネットへのアウトバウンドアクセスを許可する必要があります。これは、NATクラウドルーターを使用して実現できます(Googleのドキュメントはこちら)。

  1. クラウドルーターの作成:

    gcloud compute routers create nat-router \
        --network default \
        --region europe-west1 
    
  2. ルーターに設定を追加します。

    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

モデルのスコアリング

ローカルモデルをスコアリングし、出力を確認します。

  1. ローカルモデルをスコアリングします。

    python score-your-model.py

  2. GKE Podのログを確認します。1つのレコードがDataRobotに送信されたことを示しています。

  3. Pub/Subログを確認します。

  4. DataRobot MLOpsダッシュボードを確認します。

削除

  1. ルーターのNATを削除します。

    gcloud compute routers nats delete nat-config --router=nat-router --router-region=europe-west1

  2. クラウドルーターを削除します。

    gcloud compute routers delete nat-router --region=europe-west1

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

    gcloud container clusters delete monitoring-agents-cluster


更新しました April 2, 2024