レジストリからモデルをデプロイする - Amazon SageMaker

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

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

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

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

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

レジストリからモデルをデプロイする (SageMaker 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. 次のコードスニペットARNは、既に SageMaker Boto3 クライアントsm_clientと、 が変数 に保存されているモデルバージョンを作成済みであることを前提としています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、デプロイするモデルバージョン、モデルグループの推論イメージが存在する Amazon ECRリポジトリ、およびモデルバージョンが保存されている Amazon S3 バケットを含むモデルグループのクロスアカウントリソースポリシーを提供する必要があります。

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

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

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

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

  • sm_client – SageMaker 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.")