从注册表部署模型 - Amazon SageMaker

从注册表部署模型

注册模型版本并批准其部署后,将其部署到 SageMaker 端点以进行实时推理。

当您创建 MLOps 项目并选择包含模型部署的 MLOps 项目模板时,模型注册表中已批准的模型版本将自动部署到生产环境中。有关使用 SageMaker MLOps 项目的信息,请参阅使用 SageMaker 项目自动执行 MLOps

您还可以通过添加跨账户资源策略,使 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. 通过调用 create_model 方法从模型版本创建模型对象。将模型版本的 Amazon 资源名称 (ARN) 作为模型对象 Containers 的一部分传递。

    以下代码片段假设您已创建 SageMaker Boto3 客户端 sm_client,并且您已使用存储在名为的 model_version_arn 变量中的 ARN 创建了模型版本。

    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 存储桶提供跨账户资源策略。

为了能够部署已在其他账户中创建的模型,您必须拥有有权访问 SageMaker 操作的角色,例如具有 AmazonSageMakerFullAccess 托管策略的角色。有关 SageMaker 托管策略的信息,请参阅适用于 Amazon SageMaker 的 AWS 托管式策略

以下示例为所有这三种资源创建了跨账户策略,并将这些策略应用到资源。

该示例假设您之前定义了以下变量:

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