「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の迅速な確立が可能となり、企業全体のスケーラビリティを促進します。
- 「QLoRAを使ってLlama 2を微調整し、AWS Inferentia2を使用してAmazon SageMakerに展開する」
- マイクロソフトAIがLLMLinguaを発表:大型言語モデル(LLM)の高速推論のためのユニークなクイック圧縮テクニックでプロンプトを圧縮
- Amazon BedrockとAmazon Transcribeを使用して、生成AIを使用して録音のサマリーを作成します
Amazon SageMakerが提供する組み込みのプロジェクトテンプレートは、ジェンキンスやGitHubなどのサードパーティツールとの統合に対応しており、いくつかはAWS CodeCommit、AWS CodePipeline、AWS 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 CloudFormation – AWS CloudFormation は、モデルのデプロイを開始し、トレーニング済みモデルの承認によって SageMaker エンドポイントを確立します。
- AWS CodeStar 接続 – AWS CodeStar を使用して、GitHub リポジトリとのリンクを確立し、SageMaker Studio などの AWS リソースとのコードリポジトリ統合を利用します。
- Amazon EventBridge – Amazon EventBridge は、モデルレジストリへのすべての変更を追跡します。モデルパッケージのバージョンのステータスが
PendingManualApproval
からApproved
に変更されたときに、Lambda 関数がモデルパイプラインのデプロイを促すルールも保持しています。 - AWS Lambda – AWS 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 Catalog – AWS Service Catalog を使用して、SageMaker プロジェクトの実装に使用します。これには、SageMaker コードリポジトリ、Lambda 関数、EventBridge ルール、アーティファクト S3 バケットなどのコンポーネントが含まれます。これにより、組織はプロジェクトテンプレートを繰り返し使用し、各ユーザーにプロジェクトを割り当て、操作を効率化することができます。
- Amazon S3 – Amazon Simple Storage Service (Amazon S3) バケットを使用して、パイプラインで生成されたモデルアーティファクトを保持します。
前提条件
以下の前提条件を満たしている必要があります:
- GitHubアカウント。
- AWSアカウント。
- SageMaker Studioドメイン。
- AWS Command Line Interface (AWS CLI)がインストール済みかつ設定済みであること。または、AWS CloudShellを使用します。
このソリューションを実装する前に、追加のセットアップ手順を完了する必要があります。
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に保存します:
- Secrets Managerコンソールで、新しいシークレットを保存を選択します。
- Choose secret typeでOther type of secretを選択します。
- Keyフィールドにシークレットの名前を入力し、対応するValueフィールドにパーソナルアクセストークンを追加します。
- Nextを選択し、シークレットの名前を入力し、再度Nextを選択します。
- 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シークレットに保存します。
- GitHubのウェブサイトで、リポジトリに移動し、Settingsを選択します。
- セキュリティセクションで、Secrets and Variablesを選択し、Actionsを選択します。
- New Repository Secretを選択します。
- Nameに
AWS_ACCESS_KEY_ID
と入力します - Secretに、以前に作成したIAMユーザーに関連付けられたアクセスキーIDを入力します。
- Add Secretを選択します。
AWS_SECRET_ACCESS_KEY
についても同じ手順を繰り返します
GitHub環境を構成する
デプロイパイプラインで手動承認ステップを作成するために、GitHub環境を使用します。以下の手順を完了してください。
- GitHubリポジトリのSettings、Environmentsメニューに移動し、新しい環境(productionと呼ぶなど)を作成します。
- Environment protection rulesでRequired reviewersを選択します。
- 希望するGitHubユーザー名をレビュアーとして追加します。この例では、自分自身のユーザー名を選択できます。
環境の機能は一部のGitHubプランでは利用できません。詳細については、デプロイのための環境の使用を参照してください。
Lambda関数をデプロイする
以下の手順では、lambda_function.py
を.zipファイルに圧縮し、それをS3バケットにアップロードします。
このコードのサンプルは、以下のGitHubリポジトリから見つけることができます。具体的には、lambda_function.py
はlambda_functions/lambda_github_workflow_triggerディレクトリにあります。
コードのサンプルをフォークしてクローンすることをおすすめします。これにより、コードを変更し、サンプルのさまざまな側面を試す自由が得られます。
- コードのコピーを入手した後、適切なディレクトリに移動し、
zip
コマンドを使用してlambda_function.py
を圧縮します。WindowsとmacOSのユーザーは、それぞれネイティブのファイル管理システムであるエクスプローラーやFinderを使用して、.zipファイルを生成することができます。
cd lambda_functions/lambda_github_workflow_triggerzip lambda-github-workflow-trigger.zip lambda_function.py
lambda-github-workflow-trigger.zip
をS3バケットにアップロードします。
このバケットは後のステップでService Catalogからアクセスされます。Service Catalogが後続のステップでデータを取得できるように、アクセスできる任意のバケットを選択できます。
このステップ以降では、AWS CLI v2がインストールおよび設定されていることが必要です。AWS CloudShellを利用することもできます。これには必要なツールがすべて事前にインストールされており、追加の設定は不要です。
- S3バケットにファイルをアップロードするには、次のコマンドを使用してください:
aws s3 cp lambda-github-workflow-trigger.zip s3://your-bucket/
今、私たちは新たにアップロードしたlambda_function
に関連する依存関係のためのLambdaレイヤーを構築します。
- Python仮想環境をセットアップし、依存関係をインストールします:
mkdir lambda_layercd lambda_layerpython3 -m venv .envsource .env/bin/activatepip install pygithubdeactivate
- 次のコマンドで.zipファイルを生成します:
mv .env/lib/python3.9/site-packages/ pythonzip -r layer.zip python
- レイヤーを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テンプレートに管理者アクセスを有効化した後:
- サービスカタログコンソールで、ナビゲーションパネルの管理の下にあるポートフォリオを選択します。
- 新しいポートフォリオを作成を選択します。
- ポートフォリオに「SageMaker Organization Templates」という名前を付けます。
- ダウンロードしたtemplate.ymlファイルをコンピュータに保存します。
このCloudFormationテンプレートは、設定とインフラストラクチャの一部として必要なすべてのCI/CDリソースをプロビジョニングします。このテンプレートを詳細に調べて、どのリソースがデプロイされるかを確認することができます。このテンプレートはGitHubとGitHub Actionsとの統合に合わせてカスタマイズされています。
template.yml
ファイルで、S3Bucket
の値をLambda .zipファイルをアップロードしたバケットに変更します:
GitHubWorkflowTriggerLambda: ... Code: S3Bucket: <your-bucket> S3Key: lambda-github-workflow-trigger.zip ...
- 新しいポートフォリオを選択します。
- 新しいプロダクトをアップロードを選択します。
- プロダクト名に、テンプレートの名前を入力します。ここでは
build-deploy-github
という名前を使用します。 - 説明を入力します。
- 所有者として自分の名前を入力します。
- バージョンの詳細で、メソッドとしてテンプレートファイルを使用するを選択します。
- テンプレートをアップロードを選択します。
- ダウンロードしたテンプレートをアップロードします。
- バージョンタイトルとして1.0を選択します。
- レビューを選択します。
- 設定を確認し、プロダクトを作成を選択します。
- 更新を選択して新しいプロダクトをリストします。
- 作成したプロダクトを選択します。
- タグタブで、以下のタグをプロダクトに追加します:
- Key =
sagemaker:studio-visibility
- Value =
true
- Key =
ポートフォリオの詳細に戻ると、次のスクリーンショット(異なるIDを持つ)と似たものが表示されるはずです。
- 制約タブで、制約の作成を選択します。
- 製品には、
build-deploy-github
(作成した製品)を選択します。 - 制約のタイプには、起動を選択します。
- 起動制約の下で、方法にはIAMロールの選択を選択します。
AmazonSageMakerServiceCatalogProductsLaunchRole
を選択します。- 作成を選択します。
- グループ、ロール、ユーザータブで、グループ、ロール、ユーザーの追加を選択します。
- ロールタブで、SageMaker Studioドメインを構成する際に使用したロールを選択します。これは、SageMakerドメインロールが見つかる場所です。
- アクセスの追加を選択します。
SageMaker Studioからプロジェクトをデプロイする
前のセクションで、カスタムのMLOpsプロジェクト環境を準備しました。さて、このテンプレートを使用してプロジェクトを作成しましょう。
- SageMakerコンソールで、このプロジェクトを作成するドメインに移動します。
- 起動メニューで、スタジオを選択します。
SageMakerスタジオ環境にリダイレクトされます。
- SageMakerスタジオで、配備のナビゲーションペインでプロジェクトを選択します。
- プロジェクトの作成を選択します。
- テンプレートのリストの先頭で、組織のテンプレートを選択します。
前の手順をすべて正常に実行した場合、Build-Deploy-GitHub
という新しいカスタムプロジェクトテンプレートが表示されるはずです。
- そのテンプレートを選択し、プロジェクトテンプレートの選択を選択します。
- オプションの説明を入力します。
- GitHubリポジトリの所有者名には、GitHubリポジトリの所有者を入力します。例えば、リポジトリが
https://github.com/pooyavahidi/my-repo
にある場合、所有者はpooyavahidi
になります。 - GitHubリポジトリの名前には、シードコードをコピーしたリポジトリの名前を入力します。これは、リポジトリの名前だけです。例えば、
https://github.com/pooyavahidi/my-repo
の場合、リポジトリはmy-repo
です。 - AWS CodeStar接続の一意のIDを入力します。
- GitHubトークンを保存しているSecrets Manager内のシークレットの名前を入力します。
- デプロイのためのGitHubワークフローファイルには、デプロイ手順が記載されているGitHubワークフローファイル(
.github/workflows/deploy.yml
)の名前を入力します。この例では、デフォルトのdeploy.yml
のままにしておきます。 - プロジェクトの作成を選択します。
- プロジェクトを作成したら、GitHubのワークフローファイル内の
AWS_REGION
とSAGEMAKER_PROJECT_NAME
の環境変数を適切に更新してください。ワークフローファイルはGitHubリポジトリの.github/workflows
ディレクトリ内にあります。build.yml
とdeploy.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!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 空からのパイ:ドローンスタートアップがピザ、薬物、そして興奮をお届けします
- ミストラルの最先端言語モデル、Mixtral 8x7bをご紹介しますGPT-3.5を超えるオープンアクセスAIです
- 04/12から10/12までの週のための重要なコンピュータビジョン論文トップ
- 「なぜマイクロソフトのOrca-2 AIモデルは持続可能なAIにおいて重要な進展を示すのか?」
- 確定論的 vs 確率的 – 機械学習の基礎
- ギガGPTに会ってください:CerebrasのnanoGPTの実装、Andrei Karpathyの効率的なコードでGPT-3のサイズのAIモデルを訓練するためにわずか565行のコード
- 「vLLMの解読:言語モデル推論をスーパーチャージする戦略」