从注册表部署模型 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

从注册表部署模型

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

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

您还可以通过添加跨账户资源策略,使 Amazon 账户能够部署已在其他账户中创建的模型版本。例如,您组织中的一个团队可能负责训练模型,而另一个团队则负责部署和更新模型。

从注册表部署模型 (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)

要使用 Amazon 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'])

从其他账户部署模型版本

通过添加跨账户资源策略,您可以允许 Amazon 账户部署已在其他账户中创建的模型版本。例如,您组织中的一个团队可能负责训练模型,而另一个团队则负责部署和更新模型。创建这些资源策略时,可以将策略应用于要授予访问权限的特定资源。有关 Amazon 中跨账户资源策略的更多信息,请参阅《Amazon Identity and Access Management 用户指南》中的跨账户策略评估逻辑

注意

在跨账户模型部署训练期间,您必须使用 KMS 密钥对输出数据配置操作进行加密。

要在 SageMaker 中启用跨账户模型部署,您必须为包含要部署的模型版本的模型组、模型组推断映像所在的 Amazon ECR 存储库以及存储模型版本的 Amazon S3 存储桶提供跨账户资源策略。

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

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

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

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