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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

部署注册表中的模型

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

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

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

从注册表中部署模型(SageMaker SDK)

使用部署模型版本亚马逊 SageMaker Python 开发工具包使用以下代码片段:

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,而且您已经创建了一个模型版本,其中包含已存储在名为的变量中的 ARNmodel_version_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 托管策略的信息,请参阅。AmazonAmazon SageMaker 的托管式策略.

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

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

  • bucket-存储模型版本的 Amazon S3 存储桶。

  • kms_key_id-用于加密训练输出的 KMS 密钥。

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