Amazon Web Services ブログ
Kubeflow Pipelines 用 Amazon SageMaker コンポーネントの紹介
本日、Kubeflow Pipelines 用の Amazon SageMaker コンポーネントを発表しました。今回の記事では、Kubeflow Pipelines SDK を使用しながら、Amazon SageMaker コンポーネントにより最初の Kubeflow パイプラインを構築する方法をご説明します。
Kubeflow は、カスタム ML パイプラインを構築しようとする Kubernetes ユーザーに良く使用されている、オープンソースの機械学習 (ML) ツールキットです。 Kubeflow Pipelines は Kubeflow のアドオン機能であり、ポータブルかつスケーラブルなエンドツーエンドの ML ワークフローのために、構築およびデプロイの手段をユーザーに提供します。しかしながら、この Kubeflow Pipelines をデータサイエンティストが使用する際には、データラベリングのワークフローやモデルチューニングなど、生産性向上のためのツールを、ご自身で追加で実装する必要があります。
さらに、Kubeflow Pipelines を使用する ML Ops チームには、CPU や GPU インスタンスを含む Kubernetes クラスターの管理が必要であり、投資から得る収益を最大化するために、それらの利用率を常に高く維持することも求められます。データサイエンスチーム全体でクラスターの利用率を最大化することは簡単ではなく、ML Ops チームに余計な運用経費を負担させることになります。たとえば、GPU インスタンスの利用は深層学習トレーニングや推論といったような要求の厳しいタスクに制限し、CPU インスタンスには、データの前処理や Kubeflow Pipelines のコントロールプレーンなど要求レベルの低いタスクを受け持たせる、といったことが必要です。
その代替手段である Kubeflow Pipelines 向けの Amazon SageMaker コンポーネントにより、ユーザーはパワフルな Amazon SageMaker の機能を活用できるようになります。それらには、データラベリング、大規模なハイパーパラメータチューニングと分散型トレーニングのジョブ、ワンクリックによるセキュアなスケーラブルモデルのデプロイ、さらに、Amazon Elastic Compute Cloud (Amazon EC2) スポットインスタンスによるコスト効率の高いトレーニングなどの、完全マネージド型サービスが含まれます。
Kubeflow Pipelines 用 Amazon SageMaker コンポーネント
SageMaker コンポーネントのユーザーは、実際にそれがどう機能しているかを気にする必要はなく、Kubeflow Pipelines から ML ワークフローのステップを実行する SageMaker ジョブを呼び出すことができます。データサイエンティストもしくは ML 開発者であれば、ポータブルでスケーラブルなパイプラインでの ML 実験の構築と実行に、集中できる訳です。パイプラインコンポーネントのコンテナ化されたアプリケーションには、再利用可能なコードが含まれており、それを共有することで生産性を向上できます。
たとえば、Amazon SageMaker でのハイパーパラメータチューニングを活用したい場合を考えてみましょう。これには、ハイパーパラメータ最適化コンポーネントが用意されており、パイプラインジョブを実行する際には、ハイパーパラメータのチューニングステップは Amazon SageMaker の完全マネージド型インフラストラクチャ上で実行されます。これらがどう機能するのかは、次のセクションでご説明しまが、このセクションでは、Amazon SageMaker コンポーネントの動作について見ることにしましょう。
一般的な Kubeflow パイプラインでは、ロジックは各コンポーネントによりコンテナイメージとしてカプセル化されます。開発者あるいはデータサイエンティストが用意するトレーニング、データの前処理、モデルの保持、あるいは他のロジックなどは、Kubeflow Pipelines ContainerOp 関数の中に包含され、この関数が新しいコンテナとしてコードを構築します。また他の方法として、カスタムコンテナイメージに自分でコードを挿入し、Amazon Elastic Container Registry (Amazon ECR) のようなコンテナレジストリにプッシュすることも可能です。パイプラインが実行すると、Kubeflow を実行している Kubernetes クラスターにあるワーカーノードの 1 つにコンポーネントのコンテナがインスタンス化され、そのロジックが実行されます。パイプライン上にある各コンポーネントは、手前のコンポーネントからの出力を読み込み、それにより作成される出力は次のコンポーネントで使用されます。次の図は、このパイプラインワークフローを示しています。
カスタムコンテナにロジックをカプセル化しなくても、Kubeflow パイプラインで Amazon SageMaker コンポーネントを使用すれば、単にコンポーネントを読み込み、Kubeflow Pipelines SDK を使用しながらパイプラインを記述するだけですみます。パイプラインが実行する際、ユーザー指定の命令が、Amazon SageMaker ジョブもしくはデプロイの中に変換されます。そしてこのワークロードは、Amazon SageMaker の完全マネージド型インフラストラクチャ上で実行されます。さらに、マネージド型スポットトレーニング、エンドポイントの自動スケーリング、その他を含む、Amazon SageMaker が提供する一般的な機能を活用することも可能です。次の図に、この強化されたパイプラインを示します。
今回のリリース時点で、次のような Amazon SageMaker の機能がサポートされています。
AWS では、今後もさらなる機能追加に務めてまります。Kubeflow Pipelines の GitHub レポジトリ内にある、Amazon SageMaker の公式ディレクトリをブックマークされることをお勧めします。
Kubeflow Pipelines 用 Amazon SageMaker コンポーネントの開始方法
Kubeflow 内で Amazon SageMaker コンポーネントを使用する方法を確認するため、まず、次の図に示すような手順により小さなパイプラインを構築してみます。
現実的なパイプラインでは、通常これより高機能になり、データの取り込みと前処理、そして変換などのステップが追加されます。
YouTube の動画ガイド、「Scaling Machine Learning on Kubernetes and Kubeflow with SageMaker (SageMaker を使う Kubernetes と Kubeflow における機械学習のスケーリング)」も合わせてご覧ください。
それでは、パイプラインの各ステップについて詳しく見てみましょう。
コンポーネント 1: ハイパーパラメータチューニングジョブ
最初のコンポーネントは、Amazon SageMaker のハイパーパラメータチューニングジョブを実行し、次のようなハイパーパラメータを最適化します。
- learning-rate – [0.0001、0.1] 対数スケール
- optimizer – [sgd、adam]
- batch-size – [32、128、256]
- model-type – [resnet、custom model]
入力: N/A
出力: 最良のハイパーパラメータ
コンポーネント 2: 最適なハイパーパラメータの選択
前のステップで行ったハイパーパラメータの探索において、良好なパフォーマンスを発揮するハイパーパラメータを決定するために、モデルは 10 個のエポックのみについてトレーニングされます。この第 2 ステップでは、それら最良のハイパーパラメータを取得し、次のステップでさらに高い精度を発揮できるようにするため、これらのエポックを 80 にまで増やします。
入力: 最良のハイパーパラメータ
出力: エポックが 80 個に更新された最適なハイパーパラメータ
コンポーネント 3: 最適なハイパーパラメータによるトレーニングジョブ
3 つ目のコンポーネントは、与えられた最適なハイパーパラメータとより多くのエポックを使用して、Amazon SageMaker のトレーニングジョブを実行します。
入力: エポックが 80 個に更新された最適なハイパーパラメータ
出力: トレーニングジョブ名
コンポーネント 4: デプロイ用のモデルの作成
4 つ目のコンポーネントでは、Amazon SageMaker のモデルアーティファクトを作成します。
入力: トレーニングジョブ名
出力: モデルアーティファクト名
コンポーネント 5: 推論エンドポイントのデプロイ
この最後のコンポーネントは、Amazon SageMaker のデプロイ機能によりモデルのデプロイを行います。
入力: モデルアーティファクト名
出力: N/A
前提条件
ここでのユースケースの実行には、次に示すような要件があります。
- Kubernetes クラスター – クラスターは既存のものを使用することも、新規に作成することもできます。これを取得して実行するための最速の方法は、eksctl を使用して Amazon Elastic Kubernetes Service (Amazon EKS) クラスターを起動することです。手順については「eksctl の開始方法」をご参照ください。このサンプルでは、2 つの CPU ノードがあるシンプルなクラスターを2 c5.xlarge で作成、実行およびテストしています。ノードリソースは、Amazon SageMaker コンポーネントのコンテナと Kubeflow を実行するのに必要な程度で十分です。トレーニングとデプロイは、Amazon SageMaker が管理するインフラストラクチャ上で実行されます。
- Kubeflow Pipelines – Kubeflow Pipelines はクラスターにインストールします。手順については「Deploying Kubeflow Pipelines」のステップ 1 をご参照ください。使用する Kubeflow Pipelines のバージョンは 0.5.0 以上が必要です。あるいは、すべての Kubeflow をインストールすることもでき、これにより、Kubeflow Pipelines もインストールされます。
- Amazon SageMaker コンポーネントの前提条件 – AWS Identity and Access Management (IAM) ロールとアクセス許可の設定手順については、「Amazon SageMaker Components for Kubeflow Pipelines」をご参照ください。次の事項を行うためには、2 つの IAM ロールが必要になります。
- Kubeflow パイプラインポッドによる、Amazon SageMaker へのアクセスと、ジョブの起動およびデプロイ。
- Amazon SageMaker による、Amazon Simple Storage Service (Amazon S3) や Amazon ECR など、他の AWS リソースへのアクセス。
Amazon EKS クラスター起動のためのゲートウェイインスタンスの選択
Amazon EKS クラスターは、ラップトップおよびデスクトップ、EC2 インスタンス、あるいは Amazon SageMaker ノートブックインスタンスから、状況に合わせ選択しての起動が可能です。このためのインスタンスは、特にゲートウェイインスタンスと呼ばれています。Amazon EKS は、完全マネージド型のコントロールプレーンを提供しているため、ゲートウェイインスタンスは、Kubernetes API とワーカーノードを操作するためだけに使用されます。今回のサンプルのテストでは、ゲートウェイインスタンスとして c5.xlarge の EC2 インスタンスを使用しました。
この投稿で使用されているコード、設定ファイル、Jupyter ノートブック、および Dockerfiles は GitHub で入手できます。主要なコンセプトを以下のガイドで解説します。これらのステップからコードをコピーすることも可能ですが、GitHub に用意された Jupyter ノートブックを実行することを推奨します。
ステップ 1: サンプルリポジトリの複製
Amazon EKS クラスターの作成に使用した Amazon EC2 ゲートウェイインスタンスに対し、ターミナルと SSH を開きます。ログイン後、サンプルレポジトリを複製し、サンプルの Jupyter ノートブックにアクセスします。次にコードを示します。
ステップ 2: ゲートウェイインスタンスでサンプルの Jupyter ノートブックを開く
次の手順に従い、ゲートウェイインスタンスで Jupyter ノートブックを開きます。
- 次に示すコードにより、ゲートウェイインスタンスで Jupyterlab を起動し、ローカルマシンからアクセスします。
EC2 インスタンスで Jupyterlab サーバーを実行中であれば、EC2 インスタンスへのトンネルを設定します。これにより、ローカルのラップトップやデスクトップから、Jupyterlab にアクセスできるようになります。次にコードを示します。
Ubuntu ではなく Amazon Linux をお使いのお客様は、ユーザー名として ec2-user を使用する必要があります。EC2 インスタンスの IP アドレスを更新し、適切なキーペアを使用してください。
これで、http://localhost:8888 にある Jupyter ラボを、ローカルマシンからアクセスできるようになりました。
- ゲートウェイインスタンスで次を実行し、Kubeflow ダッシュボードにアクセスします。
これで、http://localhost:8081 にある Kubeflow ダッシュボードにアクセスできるようになりました。
- サンプルの Jupyter ノートブックを開きます。
Amazon SageMaker では、トレーニングジョブ用に 2 つのモードをサポートしています (GitHub レポジトリでは、それぞれのアプローチに対し 1 つの Jupyter ノートブックが用意されています) 。
-
- 独自の Docker コンテナイメージを使用する – このモードでは、トレーニングに、ユーザーが独自のDocker コンテナイメージを使用します。トレーニングスクリプトを含めた独自コンテナを構築した上で、コンテナレポジトリである Amazon ECR にそれをプッシュします。Amazon SageMaker がそのコンテナイメージをプルしインスタンス化した上で、トレーニングを実行します。このアプローチは、
kfp-sagemaker-custom-container.ipynb
Jupyter ノートブックに実装されています。 - 独自のトレーニングスクリプトを使用する (スクリプトモード) – このモードでは、Docker コンテナを使用する必要はありません。TensorFlow、PyTorch、MXNet、XGBoost などの一般的なフレームワークを使い、ML トレーニングのスクリプトを単に記述した上で、Amazon S3 にアップロードします。Amazon SageMaker が、適切なコンテナのプル、トレーニングスクリプトのダウンロード、および実行を自動的に行います。Docker コンテナの使用を希望しない場合は、このモードが非常に便利です。このアプローチは、
kfp-sagemaker-script-mode.ipynb
Jupyter ノートブックに実装されています。
- 独自の Docker コンテナイメージを使用する – このモードでは、トレーニングに、ユーザーが独自のDocker コンテナイメージを使用します。トレーニングスクリプトを含めた独自コンテナを構築した上で、コンテナレポジトリである Amazon ECR にそれをプッシュします。Amazon SageMaker がそのコンテナイメージをプルしインスタンス化した上で、トレーニングを実行します。このアプローチは、
次に示すサンプルでは、1 つめの (独自の Docker コンテナイメージを使用する) アプローチの詳細が示されています。これらすべての重要なステップは、kfp-sagemaker-custom-container.ipynb
Jupyter ノートブックで確認できますので、それを開いておくと、この解説を追うのに便利です。
次のスクリーンショットに、kfp-sagemaker-custom-container.ipynb
ノートブックを示します。
ステップ 3: Kubeflow Pipelines SDK をインストールし Amazon SageMaker パイプラインコンポーネントをロードする
SDK のインストールとパイプラインコンポーネントのロードは、次の手順で実行します。
- 次のコードにより、Kubeflow Pipelines SDK をインストールします。
- 次のコードにより、Python の Kubeflow Pipeline パッケージをインポートします。
- 次のコードにより、Python の Amazon SageMaker コンポーネントをロードします。
実稼働ワークロードでは、上記での master
を使うのではなく、特定のコミットにコンポーネントを固定することを推奨します。そうすることで、将来的に互換性を損なう変更があった場合でも、実稼働パイプラインへの影響が防げます。
たとえば、特定のコミットバージョンを使用するには、各ロードコンポーネントにおいて、master
の部分を次に示すようなコミットハッシュに置き換えます。
ステップ 4: トレーニングデータセットの準備と Amazon S3 へのアップロード
次のコードを使用し、データセットの準備とアップロードを行います。
上記のコードでは、最初にSagemaker
と boto3
パッケージをインポートし、その時点のマシンでの IAM ロールとデフォルトの S3 バケットに対するアクセス権を取得しています。この Python スクリプト generate_cifar10_tfrecords.py
では、データのダウンロードと TFRecord 形式への変換、および Amazon S3 へのアップロードのために、TensorFlow を使用しています。
ステップ 5: Docker コンテナの構築と Amazon ECR へのプッシュ
コンテナを構築し Amazon ECR にプッシュするためのすべての手順は、build_docker_push_to_ecr.ipynb
Jupyter ノートブックで提供しています。
また、Dockerfile、Python によるトレーニングと推論スクリプト、それらの依存関係などは、Docker ディレクトリにある要件ファイルに記述されています。次のスクリーンショットに、Docker フォルダーのコンテンツや、Dockerfile、および build_docker_push_to_ecr.ipynb
Jupyter ノートブックを示します。
Amazon SageMaker でカスタムコンテナを実行する方法の詳細については、「Amazon SageMaker で独自のアルゴリズムやモデルを使用する」をご参照ください。
独自コンテナを構築したくない場合には、Amazon SageMaker による自動的な管理機能がいつでも利用できます。このアプローチでは、kfp-sagemaker-script-mode.ipynb
が示すとおりに、トレーニングスクリプトを Amazon S3 にアップロードするだけです。
ステップ 6: Amazon SageMaker コンポーネントによる Kubeflow パイプラインの作成
次のコードや kfp-sagemaker-custom-container.ipynb
で示す通り、Kubeflow パイプラインは @dsl.pipeline
で修飾された関数として表現されます。詳細については「Overview of Kubeflow Pipeline」をご参照ください。
このコード例では、cifar10_hpo_training_deploy()
という名前の関数を新たに作成し、パイプライン内のすべてのステップで共通の引数を定義しています。次に同じ関数内で、5 つのパイプラインコンポーネントを定義しています。
コンポーネント 1: Amazon SageMaker ハイパーパラメータチューニングジョブ
このコンポーネントには、ハイパーパラメータチューニングジョブのオプションが記述されています。次にコードを示します。
これらのオプションには、チューニング戦略 (ベイジアン) 、最適化するメトリクス (検証精度) 、継続的ハイパーパラメータ (学習率) 、ハイパーパラメータの分類 (オプティマイザー、バッチサイズ、モデルタイプ) 、変化しない静的なハイパーパラメータ (例: epochs = 10) などが含まれています。
また、ジョブ数 (16 個) も指定しています。Amazon SageMaker では、ハイパーパラメータチューニングジョブのために、16 個の GPU インスタンスを利用可能です。
コンポーネント 2: エポック数を更新するカスタムコンポーネント
最初 のコンポーネントからの出力は、hpo 変数によりキャプチャされます。このコンポーネントでは、最良のハイパーパラメータを取り出しエポック数を更新しています。次にコードを示します。
前のコンポーネントからの出力は、ここで定義するカスタム関数で取得され、そのエポック数が 80 に変更されます。これにより、次に続くトレーニングジョブが、最適なハイパーパラメータの組合せで、より長く実行できるようになります。次にコードを示します。
コンポーネント 3: Amazon SageMaker トレーニングジョブ
このコンポーネントでは、前のステップから得た最適なハイパーパラメータと更新されたエポック数を使う、Amazon SageMaker のトレーニングジョブを記述しています。次にコードを示します。
コンポーネント 4: Amazon SageMaker によるモデル作成
推論エンドポイントとしてデプロイおよびホスティングするための、Amazon SageMaker モデルアーティファクトが、このコンポーネントにより作成されます。次にコードを示します。
コンポーネント 5: Amazon SageMaker によるモデルのデプロイ
モデルは、最終的にこのコンポーネントによりデプロイされます。次にコードを示します。
パイプラインのコンパイルと実行
Kubeflow パイプラインコンパイラを使用すると、パイプラインのコンパイル、実験の作成、そしてパイプラインの実行ができます。次にコードを示します。
ステップ 7: 結果
Kubeflow パイプラインの処理完了後の表示を、次のスクリーンショットに示します。「Custom function to update epochs」以外のすべてのステップは、Kubeflow パイプラインに Amazon SageMaker が提供した機能を示しています。
各ステップの進行状況は、Amazon SageMaker コンソールからモニタリングすることができます。次のスクリーンショットに、前出のパイプラインにおけるハイパーパラメータチューニングジョブの第 1 ステップを表示している、Amazon SageMaker コンソールを示します。
エンドポイントのテスト
パイプライン全体の実行が完了したら、次のスクリーンショットに示すように、モデルを推論エンドポイントとしてホスティングします。
エンドポイントのテストには、そのエンドポイント名をコピーした上で、boto3 SDK を使用して推論結果を取得します。
犬の画像についての結果として、次のような出力が表示されるはずです。
まとめ
この記事では、Kubeflow Pipelines において、Amazon SageMaker を使用しながら ML ジョブを実行するための設定方法を解説しました。Kubeflow Pipelines は、Kubernetes でのカスタム ML ワークフローを構築および管理しようとする開発者の間で良く使用されている、オープンソースの ML オーケストレーションプラットフォームです。しかし、多くの開発者や ML Ops チームでは、Kubeflow Pipelines の運用には困難を抱えています。これは、ML に最適化された Kubernetes クラスターの管理が必須なためであり、投資の総利益に影響を与え、総所有コストを増大させています。
Kubeflow Pipelines 用の SageMaker コンポーネントを使用することで、Kubeflow Pipelines でのパイプライン管理を継続しながら、Amazon SageMaker が ML パイプラインでのタスク向けに用意しているマネージド型の機能を利用できるようになります。また、データサイエンティストや ML 開発者は、Amazon SageMaker における最新のイノベーションも活用できます。これらには、完全マネージド型のハイパーパラメータチューニング、分散型トレーニング、マネージド型スポットトレーニング、自動スケーリング、その他が含まれます。今回は、Amazon SageMaker コンポーネントを使用ながらの Kubeflow パイプラインの作成と実行に関する、エンドツーエンドのデモもご紹介しています。これに関する完全なサンプルは、GitHub から入手していただけます。
動画による学習をお望みの方は、YouTube で「 Scaling Machine Learning on Kubernetes and Kubeflow with SageMaker (SageMaker を使う Kubernetes と Kubeflow における機械学習のスケーリング)」をご覧ください。Kubeflow Pipelines 用 Amazon SageMaker コンポーネントの概要、および、本記事で解説したユースケースに関するチュートリアルをご提供しています。
Amazon SageMaker コンポーネントもしくは本投稿内容に関する疑問やご提案は、コメント欄にご記入いただくか、Kubeflow Pipelines の GitHub レポジトリでディスカッションを作成してください。
著者について
Shashank Prasanna 氏は、アマゾン ウェブ サービス (AWS) の AI および Machine Learning テクニカルエバンジェリストです。機械学習に関する難題を解決するエンジニア、開発者、データサイエンティストのサポートに注力しています。AWS に入社する前は、NVIDIA、MathWorks (MATLAB および Simulink のメーカー)、Oracle などでプロダクトマーケティング、プロダクトマネジメント、ソフトウェア開発に携わっていました。
Alex Chung は、AWS Deep Learning のシニアプロダクトマネージャーです。彼の仕事は、AWS Deep Learning 製品をよりアクセスしやすく、より多くのユーザーに提供することです。彼は社会的影響とテクノロジーに情熱を傾け、ジムで定期的に運動し、健康食を料理します。