Amazon Web Services ブログ

Amazon SageMaker Operators を使用して Kubernetes の機械学習推論を簡素化する



Amazon SageMaker Operators for Kubernetes を使用すると、既存の Kubernetes クラスターを SageMaker がホストするエンドポイントで増加できます。

機械学習推論には、信頼できる効率的なサービスを作成するための投資が必要です。XGBoost モデルの場合、開発者は、Flask などを使用してモデルをロードし、エンドポイントを実行するアプリケーションを作成する必要があります。開発者は、キュー管理、障害のないデプロイ、新しくトレーニングされたモデルのリロードについて考える必要があります。次に、提供するコンテナを Docker リポジトリにプッシュする必要があります。ここで、Kubernetes をクラスターからプルおよびデプロイするように構成できます。これらの手順では、データサイエンティストがモデル精度の向上と関係のないタスクに取り組む必要があります。開発運用エンジニアを導入すると、開発スケジュールが増えるため、反復に時間がかかります。

SageMaker Operators を使用すると、開発者は S3 に保存されたモデルの保存場所を指定する yaml ファイルを作成するだけで充分です。これにより、安全なエンドポイントからライブ予測が利用可能になります。エンドポイントの再構成は、yaml ファイルの更新と同じくらい簡単です。使いやすさに加えて、このサービスは次の機能も備えています。

  • マルチモデルエンドポイント – 数十以上のモデルをホストするには構成が難しいため、低い使用率で動作する多くのマシンにつながる可能性があります。マルチモデルエンドポイントは、提供するモデルアーティファクトのオンザフライロードで 1 つのインスタンスを設定します。
  • Elastic Inference – 低コストでデプロイできるスプリット GPU で小さなワークロードを実行します。
  • 高使用率と動的 Auto Scaling – エンドポイントは 100% の使用率で実行でき、1 秒あたりの呼び出しなど、定義したカスタムメトリックに基づいてレプリカを追加できます。または、クライアントパフォーマンスの事前定義済みメトリックで Auto Scaling を構成できます。
  • アベイラビリティーゾーンの転送 – 停止される場合、Amazon SageMaker はエンドポイントを VPC 内の別のアベイラビリティーゾーンに自動的に移動します。
  • A/B テスト – 複数のモデルをセットアップし、単一のエンドポイントに設定した量に比例してトラフィックを転送します。
  • セキュリティ – エンドポイントは HTTPS で作成されます。プライベート VPC (インターネット出力なし) で実行されるように設定でき、AWS PrivateLink を介してアクセスできます。
  • コンプライアンス対応 – Amazon SageMaker は、HIPAA、PCI DSS、および SOC (1、2、3) の規則および規制に準拠していると認定されています。

Kubernetes でパッケージ化された SageMaker Operators を介して利用可能な機能は、モデルの提供を開始する時間を短縮し、本番インフラストラクチャをセットアップして維持するための開発リソースを削減します。EKS または EC2 単独よりも総所有コストが 90% 低下する可能性があります。

この記事では、Amazon SageMaker Operators for Kubernetes をセットアップして、事前にトレーニングされた XGBoost モデルのエンドポイントを kubectl から完全に作成および更新する方法を示します。このソリューションの手順は次の通りです。

  • IAM Amazon SageMaker ロールを作成します。これにより、モデルの提供に必要な Amazon SageMaker の権限が付与されます。
  • モデルを Amazon SageMaker にデプロイする YAML ファイルを準備する
  • Amazon SageMaker にモデルをデプロイする
  • エンドポイントをクエリして予測を取得する
  • デプロイされたモデルに対して、結果整合性のある更新を実行する

前提条件

この記事では、次の前提条件があることを仮定しています。

  • Kubernetes クラスター
  • クラスターにインストールされた Amazon SageMaker Operators
  • デプロイできる XGBoost モデル

Amazon EKS クラスターへのオペレーターのインストールについては、Amazon SageMaker Operators for Kubernetes の紹介を参照してください。独自の XGBoost モデルを使用できますが、このチュートリアルでは前述の記事の既存のモデルを使用します。

Amazon SageMaker 実行ロールを作成する

Amazon SageMaker には、モデルを提供すると想定できる IAM ロールが必要です。まだお持ちでない場合は、次の bash コードで作成します。

export assume_role_policy_document='{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "Service": "sagemaker.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
  }]
}'
aws iam create-role --role-name <execution role name> \
    --assume-role-policy-document \
    "$assume_role_policy_document"
aws iam attach-role-policy --role-name <execution role name> \
    --policy-arn \
    arn:aws:iam::aws:policy/AmazonSageMakerFullAccess

<execution role name> を適切なロール名に置き換えます。これにより、Amazon SageMaker がモデルの提供時に引き受けるために使用できる IAM ロールが作成されます。

ホスティングデプロイの準備

オペレーターは、HostingDeployment という名前のカスタムリソース定義 (CRD) を提供します。HostingDeployment を使用して、Amazon SageMaker Hosting でモデルデプロイを設定します。

ホスティングデプロイを準備するには、次の内容の hosting.yaml というファイルを作成します。

apiVersion: sagemaker.aws.amazon.com/v1
kind: HostingDeployment
metadata:
  name: hosting-deployment
spec:
  region: us-east-2
  productionVariants:
    - variantName: AllTraffic
      modelName: xgboost-model
      initialInstanceCount: 1
      instanceType: ml.r5.large
      initialVariantWeight: 1
  models:
    - name: xgboost-model
      executionRoleArn: SAGEMAKER_EXECUTION_ROLE_ARN
      containers:
        - containerHostname: xgboost
          modelDataUrl: s3://BUCKET_NAME/model.tar.gz
          image: 825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest

SAGEMAKER EXECUTION_ROLE_ARN を、前の手順で作成した実行ロールの ARN に置き換えます。BUCKET_NAME をモデルを含むバケットに置き換えます。

バケットのリージョン、HostingDeployment リージョン、およびイメージ ECR リージョンがすべて同等であることを確認してください。

Amazon SageMaker にモデルをデプロイ

これで、kubectl apply -f hosting.yaml を実行してデプロイを開始できます。次のコードを参照してください。

$ kubectl apply -f hosting.yaml
hostingdeployment.sagemaker.aws.amazon.com/hosting-deployment created

kubectl get hostingdeployments を使用して、デプロイステータスを追跡できます。次のコードを参照してください。

$ kubectl get hostingdeployments
NAME                 STATUS     SAGEMAKER-ENDPOINT-NAME
hosting-deployment   Creating   hosting-deployment-38ecac47487611eaa81606fc3390e6ba

モデルエンドポイントがデプロイされるまでに最大 15 分かかる場合があります。  以下のコマンドを使用して、ステータスを表示できます。  InService ステータスを取得すると、エンドポイントはクエリの準備を整えます。

$ kubectl get hostingdeployments
NAME                 STATUS      SAGEMAKER-ENDPOINT-NAME
hosting-deployment   InService   hosting-deployment-38ecac47487611eaa81606fc3390e6ba

エンドポイントのクエリ

エンドポイントがサービス中になったら、次のサンプルコードで動作することをテストできます。

$ aws sagemaker-runtime invoke-endpoint \
  --region us-east-2 \
  --endpoint-name SAGEMAKER-ENDPOINT-NAME \
  --body $(seq 784 | xargs echo | sed 's/ /,/g') \
  >(cat) \
  --content-type text/csv > /dev/null

この bash コマンドは、AWS CLI を使用して HTTPS エンドポイントに接続します。作成したモデルは MNIST 数字データセットに基づいており、予測子は画像内の数字を読み取ります。この呼び出しを行うと、画像内のピクセルを表す CSV 形式の 784 個の機能を含む推論ペイロードが送信されます。モデルがペイロードにあると考えている予測数が表示されます。次のコードを参照してください。

$ aws sagemaker-runtime invoke-endpoint \
  --region us-east-2 \
  --endpoint-name hosting-deployment-38ecac47487611eaa81606fc3390e6ba \
  --body $(seq 784 | xargs echo | sed 's/ /,/g') \
  >(cat) \
  --content-type text/csv > /dev/null
8.0

これにより、エンドポイントが実行されていることが確認されます。

結果整合性のある更新

モデルをデプロイした後、Kubernetes YAML に変更を加えて、オペレーターがエンドポイントを更新できます。更新は、結果整合性のある方法で Amazon SageMaker に伝達されます。これにより、エンドポイントを断定的に構成でき、オペレーターが詳細を処理できます。

これを実証するために、モデルのインスタンスタイプを ml.r5.large から ml.c5.2xlarge に変更できます。次の手順を実行します。

  1. hosting.yaml のインスタンスタイプを ml.c5.2xlarge に変更します。次のコードを参照してください。

    apiVersion: sagemaker.aws.amazon.com/v1
    kind: HostingDeployment
    metadata:
      name: hosting-deployment
    spec:
      region: us-east-2
      productionVariants:
        - variantName: AllTraffic
          modelName: xgboost-model
          initialInstanceCount: 1
          instanceType: ml.c5.2xlarge
          initialVariantWeight: 1
      models:
        - name: xgboost-model
          executionRoleArn: SAGEMAKER_EXECUTION_ROLE_ARN
          containers:
            - containerHostname: xgboost
              modelDataUrl: s3://BUCKET_NAME/model.tar.gz
              image: 825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest
    
  2. Kubernetes クラスターに変更を適用します。次のコードを参照してください。
    $ kubectl apply -f hosting.yaml
    hostingdeployment.sagemaker.aws.amazon.com/hosting-deployment configured
  3. ホスティングデプロイのステータスを取得します。最初は Updating と表示され、準備ができたら InService に変わります。次のコードを参照してください。
    $ kubectl get hostingdeployments
    NAME                 STATUS     SAGEMAKER-ENDPOINT-NAME
    hosting-deployment   Updating   hosting-deployment-38ecac47487611eaa81606fc3390e6ba

エンドポイントは更新中もライブのままで、すべて利用可能です。詳細および追加例については、GitHub リポジトリを参照してください。

クリーンアップ

エンドポイントを削除し、追加の使用料金が発生しないようにするには、kubectl delete -f hosting.yaml を実行します。次のコードを参照してください。

$ kubectl delete -f hosting.yaml
hostingdeployment.sagemaker.aws.amazon.com "hosting-deployment" deleted

まとめ

この記事では、Amazon SageMaker Operators for Kubernetes がリアルタイム推論をサポートする方法を示しました。また、トレーニングとハイパーパラメータの調整もサポートしています。

いつでも、ご感想やご意見をお寄せください。また、YAML 設定ファイルのその他の例や運営改善についてもぜひお送りください。Amazon SageMaker の AWS フォーラムに投稿する、GitHub リポジトリの問題点を作成する、または AWS サポートの窓口を通じて送るなどの方法で、ご自身の Amazon SageMaker Operators for Kubernetes の活用方法についても共有してください。


著者について

Cade Daniel は、AWS ディープラーニングのソフトウェア開発エンジニアです。彼は、ディープラーニング/機械学習モデルのトレーニングと提供をより効率的かつ簡単にする製品を開発しています。仕事以外では、スペイン語を練習し、新しい趣味を学ぶことを楽しんでいます。

 

 

 

Alex Chung は、AWS ディープラーニングのシニアプロダクトマネージャーです。彼の役割は、AWS ディープラーニング製品をよりアクセスしやすく、より多くのユーザーに提供することです。彼は社会的影響とテクノロジーに情熱を傾け、ジムで定期的に運動し、健康食を料理します。