Python を使用してレジストリからモデルをデプロイする - Amazon SageMaker AI

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Python を使用してレジストリからモデルをデプロイする

モデルバージョンを登録してデプロイを承認したら、リアルタイム推論のためにそれを SageMaker AI エンドポイントにデプロイします。SageMaker AI SDK または を使用してモデルをデプロイできます AWS SDK for Python (Boto3)。

機械学習オペレーション (MLOps) プロジェクトを作成して、モデルのデプロイを含む MLOps プロジェクトテンプレートを選択すると、Model Registry 内の承認済みのモデルバージョンが自動的に本番環境にデプロイされます。SageMaker AI MLOps プロジェクトの使用については、「」を参照してくださいSageMaker プロジェクトを使用した MLOps の自動化

また、クロス AWS アカウントリソースポリシーを追加することで、別のアカウントで作成されたモデルバージョンをデプロイするようにアカウントを有効にすることもできます。例えば、組織のあるチームがモデルのトレーニングを担当し、別のチームがモデルのデプロイと更新を担当する場合があります。

レジストリからモデルをデプロイする (SageMaker AI SDK)

Amazon SageMaker Python SDK を使用してモデルバージョンをデプロイするには、次のコードスニペットを使います。

from sagemaker import ModelPackage from time import gmtime, strftime model_package_arn = 'arn:aws:sagemaker:us-east-2:12345678901:model-package/modeltest/1' model = ModelPackage(role=role, model_package_arn=model_package_arn, sagemaker_session=sagemaker_session) model.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')

レジストリからモデルをデプロイする (Boto3)

を使用してモデルバージョンをデプロイするには AWS SDK for Python (Boto3)、次の手順を実行します。

  1. 次のコードスニペットは、SageMaker AI Boto3 クライアントsm_clientと、ARN が変数 に保存されているモデルバージョンを既に作成していることを前提としていますmodel_version_arn

    create_model API オペレーションを呼び出して、モデルバージョンからモデルオブジェクトを作成します。モデルバージョンの Amazon リソースネーム (ARN) をモデルオブジェクトの Containers の一部として渡します。

    model_name = 'DEMO-modelregistry-model-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime()) print("Model name : {}".format(model_name)) container_list = [{'ModelPackageName': model_version_arn}] create_model_response = sm_client.create_model( ModelName = model_name, ExecutionRoleArn = role, Containers = container_list ) print("Model arn : {}".format(create_model_response["ModelArn"]))
  2. create_endpoint_config を呼び出して、エンドポイント設定を作成します。このエンドポイント設定は、エンドポイントに使用する Amazon EC2 インスタンスの数とタイプを指定します。

    endpoint_config_name = 'DEMO-modelregistry-EndpointConfig-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime()) print(endpoint_config_name) create_endpoint_config_response = sm_client.create_endpoint_config( EndpointConfigName = endpoint_config_name, ProductionVariants=[{ 'InstanceType':'ml.m4.xlarge', 'InitialVariantWeight':1, 'InitialInstanceCount':1, 'ModelName':model_name, 'VariantName':'AllTraffic'}])
  3. create_endpoint を呼び出してエンドポイントを作成します。

    endpoint_name = 'DEMO-modelregistry-endpoint-' + strftime("%Y-%m-%d-%H-%M-%S", gmtime()) print("EndpointName={}".format(endpoint_name)) create_endpoint_response = sm_client.create_endpoint( EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name) print(create_endpoint_response['EndpointArn'])

別のアカウントからモデルバージョンをデプロイする

クロス AWS アカウントリソースポリシーを追加することで、アカウントが別のアカウントで作成されたモデルバージョンをデプロイすることを許可できます。例えば、組織のあるチームがモデルのトレーニングを担当し、別のチームがモデルのデプロイと更新を担当する場合があります。このようなリソースポリシーを作成するときは、アクセスを許可する特定のリソースにポリシーを適用します。のクロスアカウントリソースポリシーの詳細については AWS、「 AWS Identity and Access Management ユーザーガイド」の「クロスアカウントポリシーの評価ロジック」を参照してください。

注記

アカウントをまたいだモデルデプロイメントのトレーニング中には、KMS キーを使用して出力データ設定アクションを暗号化する必要があります。

SageMaker AI でクロスアカウントモデルデプロイを有効にするには、デプロイするモデルバージョン、モデルグループの推論イメージが存在する Amazon ECR リポジトリ、モデルバージョンが保存されている Amazon S3 バケットを含むモデルグループのクロスアカウントリソースポリシーを指定する必要があります。

別のアカウントで作成されたモデルをデプロイするには、 AmazonSageMakerFullAccess管理ポリシーを持つロールなど、SageMaker AI アクションにアクセスできるロールが必要です。SageMaker AI 管理ポリシーの詳細については、「」を参照してくださいAWS Amazon SageMaker AI の マネージドポリシー

次の例では、これらの 3 つのリソースすべてに対してクロスアカウントポリシーを作成し、そのポリシーをリソースに適用します。この例では、次の変数が既に定義済みであることも前提としています。

  • bucket – モデルバージョンが保存される Amazon S3 バケット

  • kms_key_id – トレーニング出力の暗号化に使用される KMS キー

  • sm_client – SageMaker AI Boto3 クライアント。

  • model_package_group_name – クロスアカウントアクセスを許可するモデルグループ

  • model_package_group_arn – クロスアカウントアクセスを付与するモデルグループの ARN

import json # The cross-account id to grant access to cross_account_id = "123456789012" # Create the policy for access to the ECR repository ecr_repository_policy = { 'Version': '2012-10-17', 'Statement': [{ 'Sid': 'AddPerm', 'Effect': 'Allow', 'Principal': { 'AWS': f'arn:aws:iam::{cross_account_id}:root' }, 'Action': ['ecr:*'] }] } # Convert the ECR policy from JSON dict to string ecr_repository_policy = json.dumps(ecr_repository_policy) # Set the new ECR policy ecr = boto3.client('ecr') response = ecr.set_repository_policy( registryId = account, repositoryName = 'decision-trees-sample', policyText = ecr_repository_policy ) # Create a policy for accessing the S3 bucket bucket_policy = { 'Version': '2012-10-17', 'Statement': [{ 'Sid': 'AddPerm', 'Effect': 'Allow', 'Principal': { 'AWS': f'arn:aws:iam::{cross_account_id}:root' }, 'Action': 's3:*', 'Resource': f'arn:aws:s3:::{bucket}/*' }] } # Convert the policy from JSON dict to string bucket_policy = json.dumps(bucket_policy) # Set the new policy s3 = boto3.client('s3') response = s3.put_bucket_policy( Bucket = bucket, Policy = bucket_policy) # Create the KMS grant for encryption in the source account to the # Model Registry account Model Group client = boto3.client('kms') response = client.create_grant( GranteePrincipal=cross_account_id, KeyId=kms_key_id Operations=[ 'Decrypt', 'GenerateDataKey', ], ) # 3. Create a policy for access to the Model Group. model_package_group_policy = { 'Version': '2012-10-17', 'Statement': [{ 'Sid': 'AddPermModelPackageGroup', 'Effect': 'Allow', 'Principal': { 'AWS': f'arn:aws:iam::{cross_account_id}:root' }, 'Action': ['sagemaker:DescribeModelPackageGroup'], 'Resource': f'arn:aws:sagemaker:{region}:{account}:model-package-group/{model_package_group_name}' },{ 'Sid': 'AddPermModelPackageVersion', 'Effect': 'Allow', 'Principal': { 'AWS': f'arn:aws:iam::{cross_account_id}:root' }, 'Action': ["sagemaker:DescribeModelPackage", "sagemaker:ListModelPackages", "sagemaker:UpdateModelPackage", "sagemaker:CreateModel"], 'Resource': f'arn:aws:sagemaker:{region}:{account}:model-package/{model_package_group_name}/*' }] } # Convert the policy from JSON dict to string model_package_group_policy = json.dumps(model_package_group_policy) # Set the policy to the Model Group response = sm_client.put_model_package_group_policy( ModelPackageGroupName = model_package_group_name, ResourcePolicy = model_package_group_policy) print('ModelPackageGroupArn : {}'.format(create_model_package_group_response['ModelPackageGroupArn'])) print("First Versioned ModelPackageArn: " + model_package_arn) print("Second Versioned ModelPackageArn: " + model_package_arn2) print("Success! You are all set to proceed for cross-account deployment.")