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

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

注册模型版本

你可以注册亚马逊 SageMaker 通过创建模型版本来指定模型组所属的模型组。模型版本必须同时包含模型工件(模型的训练权重)和模型的推理代码。

网络 ACL 和安全组都允许 (因此可到达您的实例) 的发起 ping 的推理管道是 SageMaker 模型由两到十五个容器的线性序列组成,用于处理推理请求。您可以通过指定容器和关联的环境变量来注册推理管道。有关推理管道的更多信息,请参阅。主机模型以及预处理逻辑作为一个端点后面的串行推理管道.

您可以通过指定容器和关联的环境变量,使用推理管道注册模型。要创建带推理管道的模型版本,请使用Amazon SDK for Python (Boto3)或者通过在 SageMaker 使用模型构建管道,请使用以下步骤。

注册模型版本(SageMaker 管道)

使用注册模型版本 SageMaker 模型构建管道,创建RegisterModel走进你的管道。有关创建RegisterModel作为管道的一部分,请参阅步骤 8:定义 RegisterModel 创建模型 Package 的步骤.

注册模型版本 (Boto3)

要使用 Boto3 注册模型版本,请调用create_model_package方法。

首先,设置参数字典以传递给create_model_package方法。

# Specify the model source model_url = "s3://your-bucket-name/model.tar.gz" modelpackage_inference_specification = { "InferenceSpecification": { "Containers": [ { "Image": '257758044811.dkr.ecr.us-east-2.amazonaws.com/sagemaker-xgboost:1.2-1', "ModelDataUrl": model_url } ], "SupportedContentTypes": [ "text/csv" ], "SupportedResponseMIMETypes": [ "text/csv" ], } } # Alternatively, you can specify the model source like this: # modelpackage_inference_specification["InferenceSpecification"]["Containers"][0]["ModelDataUrl"]=model_url create_model_package_input_dict = { "ModelPackageGroupName" : model_package_group_name, "ModelPackageDescription" : "Model to detect 3 different types of irises (Setosa, Versicolour, and Virginica)", "ModelApprovalStatus" : "PendingManualApproval" } create_model_package_input_dict.update(modelpackage_inference_specification)

然后,调用create_model_package方法,传入刚刚设置的参数字典。

create_model_package_response = sm_client.create_model_package(**create_model_package_input_dict) model_package_arn = create_model_package_response["ModelPackageArn"] print('ModelPackage Version ARN : {}'.format(model_package_arn))

从另一账户注册模型版本

将模型版本注册到由不同的模型包组创建的模型包组Amazon账户,你必须添加跨账户Amazon Identity and Access Management资源策略以启用该帐户。例如,一个Amazon组织中的帐户负责培训模型,另一个帐户负责管理、部署和更新模型。您可以创建 IAM 资源策略并将策略应用于要为此案例授予访问权限的特定账户资源。有关跨账户资源策略的更多信息,请参阅Amazon,请参阅跨账户策略评估逻辑中的Amazon Identity and Access Management用户指南.

注意

您还必须使用 KMS 密钥加密输出数据配置跨账户模型部署期间的操作。

要在 SageMaker 中启用跨账户模型注册表,您必须为包含模型版本的模型组提供跨账户资源策略。以下示例为模型包组创建跨账户策略并将这些策略应用于该特定资源。

必须在源账户中设置以下配置,该账户将模型跨账户注册到模型包组中。在此示例中,源账户是模型培训账户,它将训练模型交叉账户,然后将模型交叉账户注册到模型注册表账户的模型注册表中。

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

  • sm_client-A SageMaker Boto3 客户端。

  • model_package_group_name-您要授予访问权限的模型组。

  • model_package_group_arn-您希望授予跨账户访问权限的模型组 ARN。

  • bucket-存储模型训练构件的 S3 存储桶。

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

必需的 IAM 资源策略

下图描述了允许跨账户模型注册所需的策略。如图所示,这些策略需要在模型训练期间处于活动状态,才能将模型正确注册到模型注册表账户中。

亚马逊 ECR、Amazon S3 和Amazon KMS以下代码示例演示了策略。

示例 Amazon ECR 策略

{ 'Version': '2012-10-17', 'Statement': [ { 'Sid': 'AddPerm', 'Effect': 'Allow', 'Principal': { 'AWS': 'arn:aws:iam::{model_registry_account}:root' }, 'Action': [ 'ecr:BatchGetImage', 'ecr:Describe*' ] } ] }

示例 Amazon S3 策略

{ 'Version': '2012-10-17', 'Statement': [ { 'Sid': 'AddPerm', 'Effect': 'Allow', 'Principal': { 'AWS': 'arn:aws:iam::{model_registry_account}:root' }, 'Action': [ 's3:GetObject', 's3:GetBucketAcl', 's3:GetObjectAcl' ], 'Resource': 'arn:aws:s3:::{bucket}/*' } ] }

示例Amazon KMS政策

{ 'Version': '2012-10-17', 'Statement': [ { 'Sid': 'AddPerm', 'Effect': 'Allow', 'Principal': { 'AWS': 'arn:aws:iam::{model_registry_account}:root' }, 'Action': [ 'kms:Decrypt', 'kms:GenerateDataKey*' ], 'Resource': '*' } ] }

将资源策略应用于账户

以下策略配置适用上一节中讨论的策略,必须放入模型培训账户中。

import json # The model registry account id of the model package group model_registry_account = '111111111111' # The model training account id where training happens model_training_account = '222222222222' # 1. Create a policy for access to the ECR repository # in the model training account for the model registry account model package group ecr_repository_policy = {'Version': '2012-10-17', 'Statement': [{'Sid': 'AddPerm', 'Effect': 'Allow', 'Principal': { 'AWS': f'arn:aws:iam::{model_registry_account}:root' }, 'Action': [ 'ecr:BatchGetImage', 'ecr:Describe*' ] }] } # 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 = model_training_account, repositoryName = 'decision-trees-sample', policyText = ecr_repository_policy ) # 2. Create a policy in the model training account for access to the S3 bucket # where the model is present in the model registry account model package group bucket_policy = {'Version': '2012-10-17', 'Statement': [{'Sid': 'AddPerm', 'Effect': 'Allow', 'Principal': {'AWS': f'arn:aws:iam::{model_registry_account}:root' }, 'Action': [ 's3:GetObject', 's3:GetBucketAcl', 's3:GetObjectAcl' ], 'Resource': 'arn:aws:s3:::{bucket}/*' }] } # Convert the S3 policy from JSON dict to string bucket_policy = json.dumps(bucket_policy) # Set the new bucket policy s3 = boto3.client('s3') response = s3.put_bucket_policy( Bucket = bucket, Policy = bucket_policy) # 3. Create the KMS grant for the key used during training for encryption # in the model training account to the model registry account model package group client = boto3.client('kms') response = client.create_grant( GranteePrincipal=model_registry_account, KeyId=kms_key_id Operations=[ 'Decrypt', 'GenerateDataKey', ], )

需要将以下配置放在模型包组所在的模型注册表帐户中。

# The model registry account id of the model package group model_registry_account = '111111111111' # 1. Create policy to allow the model training account to access the ModelPackageGroup model_package_group_policy = {'Version': '2012-10-17', 'Statement': [ { 'Sid': 'AddPermModelPackageVersion', 'Effect': 'Allow', 'Principal': {'AWS': f'arn:aws:iam::{model_training_account}:root' 'Action': ["sagemaker:CreateModelPackage"], 'Resource': f'arn:aws:sagemaker:{region}:{model_registry_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 new policy response = sm_client.put_model_package_group_policy( ModelPackageGroupName = model_package_group_name, ResourcePolicy = model_package_group_policy)

最后,使用create_model_package来自模型培训账户的操作,以便在交叉账户中注册模型包。

# Specify the model source model_url = "s3://{bucket}/model.tar.gz" #Set up the parameter dictionary to pass to the create_model_package method modelpackage_inference_specification = { "InferenceSpecification": { "Containers": [ { "Image": f'{model_training_account}.dkr.ecr.us-east-2.amazonaws.com/decision-trees-sample:latest', "ModelDataUrl": model_url } ], "SupportedContentTypes": [ "text/csv" ], "SupportedResponseMIMETypes": [ "text/csv" ], } } # Alternatively, you can specify the model source like this: # modelpackage_inference_specification["InferenceSpecification"]["Containers"][0]["ModelDataUrl"]=model_url create_model_package_input_dict = { "ModelPackageGroupName" : model_package_group_arn, "ModelPackageDescription" : "Model to detect 3 different types of irises (Setosa, Versicolour, and Virginica)", "ModelApprovalStatus" : "PendingManualApproval" } create_model_package_input_dict.update(modelpackage_inference_specification) # Create the model package in the model registry account create_model_package_response = sm_client.create_model_package(**create_model_package_input_dict) model_package_arn = create_model_package_response["ModelPackageArn"] print('ModelPackage Version ARN : {}'.format(model_package_arn))