「Amazon SageMaker Pipelines、GitHub、およびGitHub Actionsを使用して、エンドツーエンドのMLOpsパイプラインを構築する」

「Amazon SageMaker Pipelines、GitHub、およびGitHub Actionsを活用した、魅力的なエンドツーエンドのMLOpsパイプラインの構築方法」

機械学習(ML)モデルは単独では機能しません。価値を提供するためには、既存の製品システムやインフラストラクチャに統合する必要があります。そのためには、設計や開発の際にMLライフサイクル全体を考慮する必要があります。MLオペレーション、通称MLOpsは、MLモデルのライフサイクル全体でスムーズ化、自動化、監視を行います。信頼性と効率性を確保するためには、堅牢なMLOpsパイプラインの構築が必要です。データサイエンティスト、MLエンジニア、ITスタッフ、DevOpsチームが、研究から展開、保守までモデルを運用するために協力して作業する必要があります。適切なプロセスとツールを備えることで、MLOpsは組織がチーム全体でMLを確実かつ効率的に採用することを可能にします。

継続的インテグレーションおよび継続的デリバリー(CI/CD)パイプラインの要件は、それぞれの組織のニーズに合わせる必要がありますが、チーム全体でMLOpsプラクティスを拡大することは、管理されたオーケストレーションや開発プロセスを加速し、同じ作業を繰り返すことなく簡素化するツールを使用することで容易になります。

Amazon SageMaker MLOpsは、Amazon SageMaker Projects(CI/CD)、Amazon SageMaker Pipelines、およびAmazon SageMaker Model Registryを含む機能の組み合わせです。

SageMaker Pipelinesは、MLワークフローの簡単な作成と管理を可能にし、ワークフローのステップのためのストレージと再利用機能も提供しています。 SageMaker Model Registryは、モデルのトラッキングを一元化し、モデルの展開を簡素化します。 SageMaker Projectsは、環境のパリティ、バージョン管理、テスト、自動化など、MLにCI/CDのプラクティスを導入します。これにより、ML環境でのCI/CDの迅速な確立が可能となり、企業全体のスケーラビリティを促進します。

Amazon SageMakerが提供する組み込みのプロジェクトテンプレートは、ジェンキンスやGitHubなどのサードパーティツールとの統合に対応しており、いくつかはAWS CodeCommitAWS CodePipelineAWS CodeBuildなどのAWSネイティブのCI/CDツールを利用しています。ただし、多くの場合、お客様はSageMaker Pipelinesを他の既存のCI/CDツールと統合し、独自のプロジェクトテンプレートを作成することを希望します。

この記事では、以下の手順を実施し、次のことを達成する方法を紹介します。

  • GitHubやGitHub Actionsと統合するカスタムSageMaker MLOpsプロジェクトテンプレートの作成
  • データサイエンスチームがAmazon SageMaker Studioでクリックひとつで利用可能なカスタムプロジェクトテンプレートの提供

ソリューションの概要

この記事では、以下のアーキテクチャを作成します。データの準備、モデルのトレーニング、モデルの評価、およびトレーニング済みモデルのSageMaker Model Registryへの登録手順を含む自動モデルビルドパイプラインを作成します。最終的なトレーニング済みMLモデルは、マニュアル承認に基づいてSageMaker Model Registryからステージング環境および本番環境に展開されます。

ソリューションの概要

このアーキテクチャの要素を詳しく調べて、完全な設定を理解しましょう。

GitHub と GitHub Actions

GitHub は、Git を使用したバージョン管理とソースコード管理を提供する Web ベースのプラットフォームです。チームはソフトウェア開発プロジェクトで共同作業を行い、変更を追跡し、コードリポジトリを管理することができます。GitHub は ML コードベースを保存し、バージョン管理し、チームメンバーがアクセスできるようにするための一元的な場所となります。

GitHub Actions は、GitHub 生態系内の強力な自動化ツールです。ビルド、テスト、コードのデプロイなど、ソフトウェア開発ライフサイクルプロセスを自動化するカスタムワークフローを作成できます。リポジトリにコードがプッシュされるか、プルリクエストが作成されたときなど、特定のイベントによってトリガされるイベント駆動のワークフローを作成できます。MLOps を実装する際には、以下のような ML パイプラインのさまざまなステージを自動化するために GitHub Actions を使用できます:

  • データの検証と前処理
  • モデルのトレーニングと評価
  • モデルのデプロイと監視
  • ML モデルの CI/CD

GitHub Actions を使用すると、ML ワークフローを効率的かつ信頼性の高いものにし、モデルの一貫した構築、テスト、デプロイが行われるようにできます。

次のセクションでは、このアーキテクチャの一部として使用するコンポーネントに関連する前提条件の設定から始めます:

  • AWS CloudFormationAWS CloudFormation は、モデルのデプロイを開始し、トレーニング済みモデルの承認によって SageMaker エンドポイントを確立します。
  • AWS CodeStar 接続AWS CodeStar を使用して、GitHub リポジトリとのリンクを確立し、SageMaker Studio などの AWS リソースとのコードリポジトリ統合を利用します。
  • Amazon EventBridgeAmazon EventBridge は、モデルレジストリへのすべての変更を追跡します。モデルパッケージのバージョンのステータスが PendingManualApproval から Approved に変更されたときに、Lambda 関数がモデルパイプラインのデプロイを促すルールも保持しています。
  • AWS LambdaAWS Lambda 関数を使用して、SageMaker モデルレジストリに新しいモデルが登録された後、GitHub Actions のワークフローでモデルのデプロイワークフローを開始します。
  • Amazon SageMaker – 次の SageMaker コンポーネントを構成します:
    • パイプライン – このコンポーネントは、データの準備、モデルのトレーニング、モデルの評価の各ステージのための自動化された ML ワークフローを構築する有向非循環グラフ (DAG) で構成されます。モデルレジストリには、モデルのバージョン、関連するアーティファクト、ラインナップ、メタデータなどの記録が保持されます。関連するモデルバージョンがすべて格納されるモデルパッケージグループが作成されます。モデルレジストリは、次のデプロイのためのモデルバージョンの承認ステータスも管理します。
    • エンドポイント – このコンポーネントは、推論用の HTTPS リアルタイムエンドポイントを2つ設定します。ホスティング構成は、バッチ変換や非同期推論などに応じて調整することができます。ステージングエンドポイントは、SageMaker モデルレジストリのトレーニング済みモデルの承認によってモデルデプロイワークフローがアクティブ化されたときに生成されます。このエンドポイントは、デプロイされたモデルが要求された精度基準を満たす予測を提供することを確認するために使用されます。モデルが本番デプロイの準備ができた場合、GitHub Actions のワークフロー内のマニュアル承認ステージによって本番エンドポイントが展開されます。
    • コードリポジトリ – これは、SageMaker アカウントにリソースとして Git リポジトリを作成します。SageMaker プロジェクトの作成中に入力した GitHub コードリポジトリの既存のデータを使用して、同じリポジトリとの関連を SageMaker で確立します。これにより、SageMaker 内の GitHub リポジトリとの対話型アクション (プル/プッシュ) が可能になります。
    • モデルレジストリ – このコンポーネントは、モデルのさまざまなバージョンとそれに対応するアーティファクト (ラインナップ、メタデータを含む) の監視を行います。モデルの関連バージョンが格納されるモデルパッケージグループという集合が作成されます。さらに、モデルレジストリは、モデルバージョンの承認ステータスも管理し、次のデプロイの準備ができているかどうかを確認します。
  • AWS Secrets Manager – GitHub のパーソナルアクセストークンを安全に保持するために、AWS Secrets Manager 内にシークレットを確立し、その中にアクセストークンを格納する必要があります。
  • AWS Service CatalogAWS Service Catalog を使用して、SageMaker プロジェクトの実装に使用します。これには、SageMaker コードリポジトリ、Lambda 関数、EventBridge ルール、アーティファクト S3 バケットなどのコンポーネントが含まれます。これにより、組織はプロジェクトテンプレートを繰り返し使用し、各ユーザーにプロジェクトを割り当て、操作を効率化することができます。
  • Amazon S3Amazon Simple Storage Service (Amazon S3) バケットを使用して、パイプラインで生成されたモデルアーティファクトを保持します。

前提条件

以下の前提条件を満たしている必要があります:

このソリューションを実装する前に、追加のセットアップ手順を完了する必要があります。

AWS CodeStar接続のセットアップ

AWS CodeStarへのGitHubアカウントへの接続がまだ存在しない場合は、指示に従ってGitHubへの接続の作成を参照して作成してください。AWS CodeStar接続ARNは次のようになります:

arn:aws:codestar-connections:us-west-2:account_id:connection/aEXAMPLE-8aad-4d5d-8878-dfcab0bc441f

この例では、aEXAMPLE-8aad-4d5d-8878-dfcab0bc441fはこの接続の一意のIDです。このIDは、後ほどこの例でSageMakerプロジェクトを作成する際に使用します。

GitHubトークンのシークレットアクセスキーのセットアップ

GitHubパーソナルアクセストークンを安全に保存するには、Secrets Managerでシークレットを作成する必要があります。GitHubのパーソナルアクセストークンを持っていない場合は、指示に従ってパーソナルアクセストークンの管理を参照して作成してください。

クラシックまたはファイングレインドのアクセストークンのいずれかを作成できます。ただし、トークンがリポジトリのコンテンツとアクション(ワークフロー、実行、アーティファクト)にアクセスできるようにしてください。

以下の手順を完了して、トークンをSecrets Managerに保存します:

  1. Secrets Managerコンソールで、新しいシークレットを保存を選択します。
  2. Choose secret typeOther type of secretを選択します。
  3. Keyフィールドにシークレットの名前を入力し、対応するValueフィールドにパーソナルアクセストークンを追加します。
  4. Nextを選択し、シークレットの名前を入力し、再度Nextを選択します。
  5. Storeを選択してシークレットを保存します。

GitHubパーソナルアクセストークンをSecrets Managerに保存することで、機密性を確保しながらMLOpsパイプライン内で安全にアクセスできます。

GitHub Actions用のIAMユーザーの作成

GitHub ActionsがAWS環境でSageMakerエンドポイントをデプロイできるようにするには、AWS Identity and Access Management (IAM)ユーザーを作成し、必要な権限を付与する必要があります。手順については、AWSアカウントでIAMユーザーを作成するを参照してください。このユーザーにエンドポイントをデプロイするための十分な権限を提供するために、iam/GithubActionsMLOpsExecutionPolicy.jsonファイル(コードサンプルで提供)を使用します。

IAMユーザーを作成した後、アクセスキーを生成します。このアクセスキーは、アクセスキーIDとシークレットアクセスキーの両方から構成され、後続の手順でGitHubシークレットを設定する際に使用します。

GitHubアカウントをセットアップする

この例を実行するためには、GitHubアカウントを準備するための手順が以下に示されています。

GitHubリポジトリをクローンする

この例では既存のGitHubリポジトリを再利用することもできますが、新しいリポジトリを作成する方が簡単です。このリポジトリには、SageMakerパイプラインのビルドとデプロイのためのすべてのソースコードが含まれます。

シードコードディレクトリの内容をGitHubリポジトリのルートにコピーします。たとえば、.githubディレクトリはGitHubリポジトリのルートの下にある必要があります。

IAMユーザーのアクセスキーを含むGitHubシークレットを作成する

このステップでは、新しく作成したユーザーのアクセスキーの詳細をGitHubシークレットに保存します。

  1. GitHubのウェブサイトで、リポジトリに移動し、Settingsを選択します。
  2. セキュリティセクションで、Secrets and Variablesを選択し、Actionsを選択します。
  3. New Repository Secretを選択します。
  4. NameAWS_ACCESS_KEY_IDと入力します
  5. Secretに、以前に作成したIAMユーザーに関連付けられたアクセスキーIDを入力します。
  6. Add Secretを選択します。
  7. AWS_SECRET_ACCESS_KEYについても同じ手順を繰り返します

GitHub環境を構成する

デプロイパイプラインで手動承認ステップを作成するために、GitHub環境を使用します。以下の手順を完了してください。

  1. GitHubリポジトリのSettingsEnvironmentsメニューに移動し、新しい環境(productionと呼ぶなど)を作成します。
  2. Environment protection rulesRequired reviewersを選択します。
  3. 希望するGitHubユーザー名をレビュアーとして追加します。この例では、自分自身のユーザー名を選択できます。

環境の機能は一部のGitHubプランでは利用できません。詳細については、デプロイのための環境の使用を参照してください。

Lambda関数をデプロイする

以下の手順では、lambda_function.pyを.zipファイルに圧縮し、それをS3バケットにアップロードします。

このコードのサンプルは、以下のGitHubリポジトリから見つけることができます。具体的には、lambda_function.pylambda_functions/lambda_github_workflow_triggerディレクトリにあります。

コードのサンプルをフォークしてクローンすることをおすすめします。これにより、コードを変更し、サンプルのさまざまな側面を試す自由が得られます。

  1. コードのコピーを入手した後、適切なディレクトリに移動し、zipコマンドを使用してlambda_function.pyを圧縮します。WindowsとmacOSのユーザーは、それぞれネイティブのファイル管理システムであるエクスプローラーやFinderを使用して、.zipファイルを生成することができます。
cd lambda_functions/lambda_github_workflow_triggerzip lambda-github-workflow-trigger.zip lambda_function.py
  1. lambda-github-workflow-trigger.zipをS3バケットにアップロードします。

このバケットは後のステップでService Catalogからアクセスされます。Service Catalogが後続のステップでデータを取得できるように、アクセスできる任意のバケットを選択できます。

このステップ以降では、AWS CLI v2がインストールおよび設定されていることが必要です。AWS CloudShellを利用することもできます。これには必要なツールがすべて事前にインストールされており、追加の設定は不要です。

  1. S3バケットにファイルをアップロードするには、次のコマンドを使用してください:
aws s3 cp lambda-github-workflow-trigger.zip s3://your-bucket/

今、私たちは新たにアップロードしたlambda_functionに関連する依存関係のためのLambdaレイヤーを構築します。

  1. Python仮想環境をセットアップし、依存関係をインストールします:
mkdir lambda_layercd lambda_layerpython3 -m venv .envsource .env/bin/activatepip install pygithubdeactivate
  1. 次のコマンドで.zipファイルを生成します:
mv .env/lib/python3.9/site-packages/ pythonzip -r layer.zip python
  1. レイヤーをAWSに公開します:
aws lambda publish-layer-version --layer-name python39-github-arm64 \   --description "Python3.9 pygithub" \   --license-info "MIT" \   --zip-file fileb://layer.zip \   --compatible-runtimes python3.9 \   --compatible-architectures "arm64"

この公開されたレイヤーにより、すべてのLambda関数は依存関係を満たすためにこれを参照することができます。Lambdaレイヤーの詳細な理解については、Lambdaレイヤーの使用を参照してください。

SageMakerでカスタムプロジェクトテンプレートを作成する

上記の手順をすべて完了したら、CI/CDパイプラインのリソースとコンポーネントがすべて揃いました。次は、これらのリソースを、ワンクリック展開でアクセスできるSageMaker Studio内のカスタムプロジェクトとして利用できるようにする方法を示します。

前述のように、SageMakerが提供するテンプレートが要件に適合しない場合(たとえば、CodePipelineで複数のステージやカスタム承認手順を持つより複雑なオーケストレーションが必要な場合、またはこの記事でデモンストレーションされているようにGitHubやGitHub Actionsなどのサードパーティツールと統合したい場合には)、独自のテンプレートを作成することができます。テンプレートの作成は、SageMakerが提供するテンプレートから始めることをおすすめします。それに基づいてコードとリソースを整理し、それをさらに発展させる方法を理解するためです。詳細については、カスタムプロジェクトテンプレートの作成を参照してください。

このステップも自動化することができます。代わりに、CloudFormationを使用してサービスカタログポートフォリオとプロダクトをコードでデプロイすることもできます。しかし、この記事では学習の体験を向上させるために、コンソールデプロイメントをご紹介します。

この段階では、CloudFormationテンプレートを使用して、SageMakerでカスタムプロジェクトを作成するためのサービスカタログポートフォリオを作成します。

次の手順に従って、SageMakerテンプレートに管理者アクセスを有効化した後:

  1. サービスカタログコンソールで、ナビゲーションパネルの管理の下にあるポートフォリオを選択します。
  2. 新しいポートフォリオを作成を選択します。
  3. ポートフォリオに「SageMaker Organization Templates」という名前を付けます。
  4. ダウンロードしたtemplate.ymlファイルをコンピュータに保存します。

このCloudFormationテンプレートは、設定とインフラストラクチャの一部として必要なすべてのCI/CDリソースをプロビジョニングします。このテンプレートを詳細に調べて、どのリソースがデプロイされるかを確認することができます。このテンプレートはGitHubとGitHub Actionsとの統合に合わせてカスタマイズされています。

  1. template.ymlファイルで、S3Bucketの値をLambda .zipファイルをアップロードしたバケットに変更します:
GitHubWorkflowTriggerLambda:  ...  Code:    S3Bucket: <your-bucket>    S3Key: lambda-github-workflow-trigger.zip  ...
  1. 新しいポートフォリオを選択します。
  2. 新しいプロダクトをアップロードを選択します。
  3. プロダクト名に、テンプレートの名前を入力します。ここではbuild-deploy-githubという名前を使用します。
  4. 説明を入力します。
  5. 所有者として自分の名前を入力します。
  6. バージョンの詳細で、メソッドとしてテンプレートファイルを使用するを選択します。
  7. テンプレートをアップロードを選択します。
  8. ダウンロードしたテンプレートをアップロードします。
  9. バージョンタイトルとして1.0を選択します。
  10. レビューを選択します。
  11. 設定を確認し、プロダクトを作成を選択します。
  12. 更新を選択して新しいプロダクトをリストします。
  13. 作成したプロダクトを選択します。
  14. タグタブで、以下のタグをプロダクトに追加します:
    • Key =sagemaker:studio-visibility
    • Valuetrue

ポートフォリオの詳細に戻ると、次のスクリーンショット(異なるIDを持つ)と似たものが表示されるはずです。

サービスカタログポートフォリオ
  1. 制約タブで、制約の作成を選択します。
  2. 製品には、build-deploy-github(作成した製品)を選択します。
  3. 制約のタイプには、起動を選択します。
  4. 起動制約の下で、方法にはIAMロールの選択を選択します。
  5. AmazonSageMakerServiceCatalogProductsLaunchRoleを選択します。
  6. 作成を選択します。
  7. グループ、ロール、ユーザータブで、グループ、ロール、ユーザーの追加を選択します。
  8. ロールタブで、SageMaker Studioドメインを構成する際に使用したロールを選択します。これは、SageMakerドメインロールが見つかる場所です。
サービスカタログ起動制約
  1. アクセスの追加を選択します。

SageMaker Studioからプロジェクトをデプロイする

前のセクションで、カスタムのMLOpsプロジェクト環境を準備しました。さて、このテンプレートを使用してプロジェクトを作成しましょう。

  1. SageMakerコンソールで、このプロジェクトを作成するドメインに移動します。
  2. 起動メニューで、スタジオを選択します。

SageMakerスタジオ環境にリダイレクトされます。

  1. SageMakerスタジオで、配備のナビゲーションペインでプロジェクトを選択します。
  2. プロジェクトの作成を選択します。
  3. テンプレートのリストの先頭で、組織のテンプレートを選択します。

前の手順をすべて正常に実行した場合、Build-Deploy-GitHubという新しいカスタムプロジェクトテンプレートが表示されるはずです。

  1. そのテンプレートを選択し、プロジェクトテンプレートの選択を選択します。
  2. オプションの説明を入力します。
  3. GitHubリポジトリの所有者名には、GitHubリポジトリの所有者を入力します。例えば、リポジトリがhttps://github.com/pooyavahidi/my-repoにある場合、所有者はpooyavahidiになります。
  4. GitHubリポジトリの名前には、シードコードをコピーしたリポジトリの名前を入力します。これは、リポジトリの名前だけです。例えば、https://github.com/pooyavahidi/my-repoの場合、リポジトリはmy-repoです。
  5. AWS CodeStar接続の一意のIDを入力します。
  6. GitHubトークンを保存しているSecrets Manager内のシークレットの名前を入力します。
  7. デプロイのためのGitHubワークフローファイルには、デプロイ手順が記載されているGitHubワークフローファイル(.github/workflows/deploy.yml)の名前を入力します。この例では、デフォルトのdeploy.ymlのままにしておきます。
  8. プロジェクトの作成を選択します。
SageMakerスタジオプロジェクト
  1. プロジェクトを作成したら、GitHubのワークフローファイル内のAWS_REGIONSAGEMAKER_PROJECT_NAMEの環境変数を適切に更新してください。ワークフローファイルはGitHubリポジトリの.github/workflowsディレクトリ内にあります。build.ymldeploy.ymlの両方のファイルを更新してください。
...env:  AWS_REGION: <リージョン>     SAGEMAKER_PROJECT_NAME: <プロジェクト名>...

これで環境の準備が整いました!パイプラインを直接実行したり、変更を加えたりして、GitHubリポジトリに変更をプッシュすれば、ビルドパイプラインが自動的にトリガーされ、ビルドとデプロイのすべてのステップが自動化される様子を見ることができます。

クリーンアップ

リソースをクリーンアップするには、以下の手順を完了してください:

  • SageMakerプロジェクトとSageMakerエンドポイントに使用されたCloudFormationスタックを削除してください。
  • SageMakerドメインを削除してください。
  • Service Catalogのリソースを削除してください。
  • GitHubリポジトリとのAWS CodeStar接続リンクを削除してください。
  • GitHub Actionsのために作成したIAMユーザーを削除してください。
  • GitHubの個人用アクセス詳細を保存しているSecrets Managerのシークレットを削除してください。

サマリー

この投稿では、カスタムSageMaker MLOpsプロジェクトテンプレートを使用してCI/CDパイプラインを自動的に構築し整理するプロセスを紹介しました。このパイプラインでは、既存のCI/CDメカニズムとSageMakerのデータ操作、モデルトレーニング、モデル承認、モデルデプロイの機能が効果的に統合されます。このシナリオでは、GitHub ActionsをSageMakerプロジェクトとパイプラインに統合することに重点を置きました。具体的な実装の詳細については、GitHubリポジトリをご覧ください。自由に試してみて、質問があればコメント欄にどうぞ。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

一緒にAIを学ぶ - Towards AI コミュニティニュースレター第4号

おはようございます、AI愛好者の皆さん! 今号では、Activeloopと共同で取り組んでいる大規模な言語モデル(LLM)のパフォー...

AI研究

シリコンボレー:デザイナーがチップ支援のために生成AIを活用

今日公開された研究論文によれば、生成AIは、最も複雑なエンジニアリングプロジェクトの1つである半導体設計を支援できる方法...

機械学習

このAI論文は、概念関連伝播(CRP)を用いて、「どこ」や「何」を解き明かすための深層学習モデルの理解に新たなアプローチを提案しています

“`html 機械学習と人工知能の分野は非常に重要になっています。日々進歩している新たな技術があります。この領域はあら...

機械学習

「セマンティックカーネルへのPythonistaのイントロ」

ChatGPTのリリース以来、大規模言語モデル(LLM)は産業界とメディアの両方で非常に注目されており、これによりLLMを活用しよ...

人工知能

Taplio LinkedInの成長に最適なAIツール

Taplioは、LinkedIn上で個人ブランドを成長させるのをサポートするために設計されたAIツールです

データサイエンス

「ClimSimに出会ってください:機械学習と気候研究の物理学を結びつける画期的なマルチスケール気候シミュレーションデータセット」

数値物理シミュレーション予測は、気候変動政策の指針となる情報の主要な源です。最も高性能なスーパーコンピュータの限界に...