Amazon Web Services ブログ

Amazon SageMaker Operators for Kubernetes のご紹介

AWS より、Amazon SageMaker Operators for Kubernetes をご紹介いたします。この新機能を使用すると、開発者およびデータサイエンティストは、Amazon SageMaker における 機械学習 (ML) モデルのトレーニング、チューニング、デプロイを、Kubernetes を介して簡単に行うことができます。Kubernetes クラスターに Amazon SageMaker Operators をインストールすると、Kubernetes API や “kubectl” といったコマンドラインの Kubernetes ツールをネイティブに使用して Amazon SageMaker ジョブを作成することが可能です。

多くの AWS のお客様が、Amazon Elastic Kubernetes Service (EKS) といったマネージドサービスがよく使用されるコンテナ化アプリケーションをデプロイおよび管理するために、オープンソースの汎用コンテナオーケストレーションシステムである Kubernetes を使用しています。これにより、データサイエンティストおよび開発者は、反復可能な ML パイプラインのセットアップ、トレーニングや推論のワークロードに対する制御能力の向上などが可能です。しかし ML ワークロードをサポートするには、カスタムコードの記述による基盤となる ML インフラストラクチャの最適化、高可用性と高信頼性の確保、データサイエンスに対する生産性向上ツールの提供、しかるべきセキュリティ要件および規制要件への準拠が依然必要です。例えば、Kubernetes ユーザーがトレーニングや推論に GPU を使用する際、Kubernetes による GPU ワークロードのスケジューリングとスケーリングの設定を変更して、使用率、スループット、可用性を向上させる必要が出てくるケースが多々あります。また、Kubernetes ユーザーはトレーニング済みモデルを本番環境にデプロイして推論を実行する際に、複数のアベイラビリティーゾーンに存在する Auto Scaling クラスターのセットアップおよび最適化に余計な時間を取られてしまいます。

Amazon SageMaker Operators for Kubernetes はこれを補い、Amazon SageMaker と Kubernetes ワークフローの統合におけるこうした困難な作業の一切から解放されます。本日より、Kubernetes をお使いのお客様は、大規模な機械学習 (ML) モデルを簡単に構築、トレーニング、デプロイできるモジュラー式のフルマネージドサービスである Amazon SageMaker を、シンプルに呼び出せるようになりました。Amazon SageMaker のワークフローを使用するコンピューティングリソースは、事前設定済みかつ最適化済みで、要求した場合のみプロビジョンされ、必要に応じてスケールし、ジョブが完了すれば自動的にシャットダウンするうえ、ほぼ 100% の使用率を提供します。Amazon SageMaker Operators for Kubernetes により、Kubernetes と EKS の利点である移植性と標準性を引き続き活用しながら、新たに Amazon SageMaker が持つすぐに使える多くの利点を統合できるようになりました。しかも、カスタムコードは必要ありません。

Amazon SageMaker と Kubernetes

機械学習は、ただモデルを構築すればよいわけではありません。ML ワークフローには、データのソーシングと準備、機械学習モデルの構築、構築したモデルのトレーニングと評価、その本番環境へのデプロイ、本稼働後の継続的なモニタリングというプロセスが含まれます。モジュラー式のフルマネージドサービスである Amazon SageMaker を利用すると、データサイエンティストおよび開発者は、より迅速にモデルの構築、トレーニング、デプロイ、メンテナンスといったタスクを完了することができます。

しかし、モデルの構築にかかわるワークフローはほとんどの場合、包括的なアプリケーションをサポートする複数のエンジニアリングチームやサービスが関係する、より大きなパイプラインの一部にすぎません。Amazon EKS のお客様を含む Kubernetes ユーザーが設定ファイルを記述してワークロードをデプロイすると、Kubernetes は Kubernetes クラスターの利用可能なコンピューティングリソースをその設定ファイルに合わせて管理します。Kubernetes により制御能力と移植性が得られるものの、Kubernetes クラスターにおける ML ワークロードの実行には独特の課題が伴います。例えば、基盤となるインフラストラクチャには、使用率向上、コスト削減、パフォーマンス改善を目的とした最適化のほか、しかるべきセキュリティ要件および規制要件への準拠や、高可用性および高信頼性の確保といったさらなる管理が必要となります。こうした差別化につながらない困難な作業は、貴重な時間とリソースを奪い、新たな ML アプリケーションの市場投入を遠のかせてしまいます。Kubernetes ユーザーは、基盤となる ML インフラストラクチャやクラスター内のサービスを管理することなく、オーケストレーションとパイプラインの制御を望んでいます。

Amazon SageMaker Operators for Kubernetes では、Amazon SageMaker と Kubernetes の統合によってこのニーズに応えます。データサイエンティストおよび開発者は、ML ワークフロー専用に設計および最適化されたフルマネージドサービスを、Kubernetes から利用することができます。インフラストラクチャおよびプラットフォームチームは、基盤となる ML インフラストラクチャおよびサービスを管理することなく、Kubernetes でワークロードをオーケストレーションして制御能力と移植性を保持することが可能です。Kubernetes に新しい機能を追加するには、開発者はアプリケーション固有またはドメイン固有のロジックとコンポーネントを含んだカスタムリソースを作成して Kubernetes API を拡張することができます。ユーザーは、Kubernetes の “オペレーター” により、そうしたカスタムリソースのネイティブな呼び出しや、関連するワークフローの自動化を行えます。Kubernetes クラスターに SageMaker Operators for Kubernetes をインストールすることで、Kubernetes に “カスタムリソース” として Amazon SageMaker を追加できるようになりました。これで、以下の Amazon SageMaker Operators を使用できるようになります。

  • Train – ML モデルを Amazon SageMaker でトレーニングします。トレーニングコストを最大 90% 削減できる Managed Spot Training や、複数の GPU ノードにスケールしてトレーニング時間を短縮する分散トレーニングにも対応しています。料金はジョブにかかった時間に対して請求されます。使用率はほぼ 100% です。
  • Tune – Amazon SageMaker でモデルのハイパーパラメータをチューニングします。コストを最大 90% 削減する Amazon EC2 スポットインスタンスにも対応しています。Amazon SageMaker 自動モデルチューニングは、ハイパーパラメータ最適化を実行しハイパーパラメータの範囲を検索することでモデルの精度を高めます。これにより、モデル精度の向上にかかる時間は数日または数週間単位で短縮されます。
  • Inference – Amazon SageMaker のトレーニング済みモデルをフルマネージド型の自動スケーリングクラスターにデプロイし、複数のアベイラビリティーゾーンに分散して、リアルタイム予測やバッチ予測に高いパフォーマンスと高可用性をもたらします。

各 Amazon SageMaker Operator for Kubernetes では、Kubernetes API または kubectl などの Kubernetes コマンドラインユーティリティを介してジョブを作成および操作するネイティブな Kubernetes エクスペリエンスを提供します。エンジニアリングチームは、これらの Operator を使用して、オートメーション、ツール、カスタムインターフェイスを、Kubernetes でデータサイエンティストに提供することができます。ML インフラストラクチャの構築、メンテナンス、最適化は一切必要ありません。Kubernetes を使い慣れたデータサイエンティストおよび開発者は、Amazon SageMaker におけるジョブのネイティブなトレーニング、チューニング、推論の構成および操作が可能です。こうした作業は、ローカルでの Kubernetes ジョブの実行と同じように行えます。Amazon SageMaker ジョブのログは Kubernetes にストリーミングされるため、モデルのトレーニングジョブ、チューニングジョブ、予測ジョブのログを、コマンドラインでネイティブに確認することができます。

Amazon SageMaker Operators for Kubernetes と TensorFlow の併用

本記事ではここから、Modified National Institute of Standards and Technology (MNIST) データセットを使用したシンプルな畳み込みニューラルネットワークモデルのトレーニングにおいて、Amazon SageMaker Training Operators for Kubernetes を利用する方法を解説していきます。ML でよく用いられている MNIST データセットの中身は、0~9 の数字が手書きされた画像です。MNIST データセットには、60,000 のトレーニング画像と 10,000 のテスト画像が含まれています。

本記事では以下のステップを実行していきます。

  • Kubernetes クラスターに Amazon SageMaker Operators for Kubernetes をインストールします
  • トレーニング用の YAML 設定ファイルを作成します
  • Amazon SageMaker Operator を使用してモデルをトレーニングします

前提条件

本記事のチュートリアルでは、EKS 内に既存の Kubernetes クラスターが必要です。Amazon EKS でクラスターを新規作成する方法の詳細については、「Amazon EKS の開始方法」を参照してください。Kubernetes クラスターを制御するために、お使いのマシン (ラップトップや EC2 インスタンスなど) で以下を使用できる必要があります。

  • Kubectl (バージョン 1.13 以降)。Kubernetes クラスターコントロールプレーンとのマイナーバージョンの相違が 1 つ以内である kubectl バージョンを使用します。例えば、kubectl 1.13 クライアントは、Kubernetes 1.13 および 1.14 のクラスターに使用できます。詳細については、「kubectl のインストール」を参照してください。
  • AWS CLI (バージョン 1.16.232 以降)。詳細については、「AWS CLI バージョン 1 のインストール」を参照してください。
  • AWS IAM Authenticator for Kubernetes。詳細については、「aws-iam-authenticator のインストール」を参照してください。
  • Operator で使用する既存の IAM アクセスキーか、またはユーザーの作成、ユーザーに対するポリシーのアタッチ、アクセスキーの作成を行うための IAM アクセス許可。

IAM ロールおよび IAM アクセス許可のセットアップ

Operator を Kubernetes クラスターにデプロイする前に、認証のために IAM ロールを OpenID Connect (OIDC) プロバイダーに関連付けます。次のコードを参照してください。

# Set the Region and cluster
export CLUSTER_NAME="<your cluster name>"
export AWS_REGION="<your region>"
eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} \
	--region ${AWS_REGION} --approve

出力は以下のようになるはずです。

    [_]  eksctl version 0.10.1
    [_]  using region us-east-1
    [_]  IAM OpenID Connect provider is associated with cluster "my-cluster" in "us-east-1"

EKS の Kubernetes クラスターに OIDC アイデンティティプロバイダーを関連付けたので、ロールを作成してそのロールにアクセス許可を付与します。次のコマンドを実行して OIDC 発行者 URL を取得します。

aws eks describe-cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} \
	--query cluster.identity.oidc.issuer --output text

上記のコマンドを実行すると以下のような URL が返ってきます。

https://oidc.eks.${AWS_REGION}.amazonaws.com/id/{Your OIDC ID}

上記のコマンドで返ってきた OIDC ID を使用してロールを作成します。次のコードブロックを実行して “trust.json” という名前のファイルを新規作成します。プレースホルダーは、ご自身の OIDC ID、AWS アカウント番号、EKS クラスターのリージョンにそれぞれ置き換えてください。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::<AWS account number>:oidc-provider/oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:aud": "sts.amazonaws.com",
              "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:sub": "system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default"
            }
          }
        }
      ]
    }

それでは新しい IAM ロールを作成します。

aws iam create-role --role-name <role name> --assume-role-policy-document file://trust.json --output=text

出力は、Kubernetes クラスターから Amazon SageMaker の安全な呼び出しを行うために Operator に渡す “ROLE ARN” を返します。

    ROLE    arn:aws:iam::123456789012:role/my-role 2019-11-22T21:46:10Z    /       ABCDEFSFODNN7EXAMPLE   my-role
    ASSUMEROLEPOLICYDOCUMENT        2012-10-17
    STATEMENT       sts:AssumeRoleWithWebIdentity   Allow
    STRINGEQUALS    sts.amazonaws.com       system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default
    PRINCIPAL       arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/

最後に、作成したロールに Amazon SageMaker へのアクセス権を付与し、AmazonSageMakerFullAccess ポリシーをアタッチします。

aws iam attach-role-policy --role-name <role name>  --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess

Kubernetes クラスターへの Operator のセットアップ

Operator をインストールするための YAML 設定ファイルをダウンロードして、GitHub リポジトリから Amazon SageMaker Operators を使用します。

wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/installer.yaml

installer.yaml ファイルの eks.amazonaws.com/role-arn を、前のステップで OIDC をベースに作成したロールの ARN で更新します。

Kubernetes クラスターに Amazon SageMaker CRD をインストールし、使用する Operator をセットアップします。

kubectl -f apply installer.yaml

Kubernetes クラスターで Amazon SageMaker Operators が使用できるかどうかを確認します。次のコードを参照してください。

$ kubectl get crd | grep sagemaker
batchtransformjobs.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
endpointconfigs.sagemaker.aws.amazon.com            2019-11-20T17:12:34Z
hostingdeployments.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
hyperparametertuningjobs.sagemaker.aws.amazon.com   2019-11-20T17:12:34Z
models.sagemaker.aws.amazon.com                     2019-11-20T17:12:34Z
trainingjobs.sagemaker.aws.amazon.com               2019-11-20T17:12:34Z

これらの Operator により、Amazon SageMaker の安全なマネージド型 ML インフラストラクチャおよびソフトウェアの大規模な最適化をすべて、カスタムリソースとして Kubernetes クラスターで利用できるようになりました。

Amazon SageMaker のログを kubetl を使用してコマンドラインで確認するため、次のクライアントをインストールします。

export os="linux"

wget https://amazon-sagemaker-operator-for-k8s-us-east-1.s3.amazonaws.com/kubectl-smlogs-plugin/latest/${os}.amd64.tar.gz
tar xvzf ${os}.amd64.tar.gz

# Move binaries to a directory in your homedir.
mkdir ~/sagemaker-k8s-bin
cp ./kubectl-smlogs.${os}.amd64/kubectl-smlogs ~/sagemaker-k8s-bin/.

# This line will add the binaries to your PATH in your .bashrc.

echo 'export PATH=$PATH:~/sagemaker-k8s-bin' >> ~/.bashrc

# Source your .bashrc to update environment variables:
source ~/.bashrc

トレーニングジョブの準備

Amazon SageMaker トレーニングジョブ用の YAML 設定ファイルを作成する前に、tensorflow_distributed_mnist GitHub リポジトリで入手可能な Python トレーニングコードを含むコンテナを作成します。AWS Deep Learning Containers で提供されている TensorFlow GPU イメージを使用して Dockerfile を作成します。次のコードを参照してください。

# Start with AWS Deep Learning Container Image 
FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-training:1.13-gpu-py3
 
## Add Training Script
COPY train.py /opt/ml/code/train.py
 
ENV SAGEMAKER_PROGRAM train.py
ENV SM_MODEL_DIR=/opt/ml/model

本チュートリアルでは、MNIST トレーニングデータセットを S3 バケットにアップロードしました。トレーニングを開始するため、train.yaml YAML 設定ファイルを作成します。Kubernetes クラスターのカスタムリソースとなった Amazon SageMaker でモデルをトレーニングするためのカスタムリソースとして、TrainingJob を指定します。

apiVersion: sagemaker.aws.amazon.com/v1
kind: TrainingJob
metadata:
  name: tf-mnist
spec:
    algorithmSpecification:
        trainingImage: 578276202366.dkr.ecr.us-west-2.amazonaws.com/mnist-demo:latest
        trainingInputMode: File
    roleArn: {YOUR ROLE:ARN}
    region: us-west-2
    outputDataConfig:
        s3OutputPath: s3://{YOUR OUTPUT PATH}
    resourceConfig:
        instanceCount: 1
        instanceType: ml.p2.8xlarge
        volumeSizeInGB: 30
    stoppingCondition:
        maxRuntimeInSeconds: 86400
    inputDataConfig:
        - channelName: train
          dataSource:
            s3DataSource:
                s3DataType: S3Prefix
                s3Uri: s3://sagemaker-us-west-2-578276202366/data/DEMO-mnist
                s3DataDistributionType: FullyReplicated
          contentType: text/csv
          compressionType: None

モデルのトレーニング

以下のコマンドを入力してトレーニングジョブを開始することができるようになりました。

$ kubectl apply -f training.yaml
trainingjob.sagemaker.aws.amazon.com/tf-mnist created

Amazon SageMaker Operator は、train.yaml での指定に基づいて Amazon SageMaker でトレーニングジョブを作成します。Kubernetes で通常行うのと同じようにこのトレーニングジョブを操作することができます。次のコードを参照してください。

$ kubectl describe trainingjob tf-mnist
$ kubectl get trainingjob tf-mnist

$ kubectl smlogs trainingjob tf-mnist
tf-mnist-fa964bf80e4b11ea89d40e3ef2d156bc/algo-1-1574553166 1574553266153 2019-11-23 23:54:25,480 sagemaker-containers INFO     Reporting training SUCCESS

トレーニングジョブが完了すると、このトレーニングジョブのために Amazon SageMaker でプロビジョンされたコンピューティングインスタンスがすべて終了します。

これ以外のサンプルについては、GitHub リポジトリをご覧ください。

新しい Amazon SageMaker の機能が一般公開されました

本記事の執筆時点で、Amazon SageMaker Operators for Kubernetes の一般提供は、米国東部 (オハイオ)、米国東部 (バージニア北部)、米国西部 (オレゴン)、欧州 (アイルランド) AWS リージョンで開始されています。詳細およびステップバイステップのチュートリアルについては、ユーザーガイドをご覧ください。

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

 


執筆者について

Aditya Bindal は、AWS 深層学習のシニアプロダクトマネージャーです。お客様のために深層学習エンジンを使いやすくする製品に取り組んでいます。余暇には、テニスをしたり、歴史小説を読んだり、旅行を楽しんだりしています。