

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

# 用 Python 从注册表部署模型
<a name="model-registry-deploy"></a>

注册模型版本并批准其部署后，将其部署到 A SageMaker I 终端节点以进行实时推理。您可以使用 SageMaker AI SDK 或. 来部署模型 适用于 Python (Boto3) 的 AWS SDK。

当您创建机器学习操作 (MLOps) 项目并选择包含模型部署的 MLOps项目模板时，模型注册表中已批准的模型版本将自动部署到生产中。有关使用 SageMaker AI MLOps 项目的信息，请参阅[MLOps SageMaker 项目自动化](sagemaker-projects.md)。

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

**Topics**
+ [

## 从注册表 (SageMaker SDK) 部署模型
](#model-registry-deploy-smsdk)
+ [

## 从注册表部署模型 (Boto3)
](#model-registry-deploy-api)
+ [

## 从其他账户部署模型版本
](#model-registry-deploy-xaccount)

## 从注册表 (SageMaker SDK) 部署模型
<a name="model-registry-deploy-smsdk"></a>

要使用 [Amaz SageMaker on Python 软件开发工具包](https://sagemaker.readthedocs.io/en/stable)部署模型版本，请使用以下代码片段：

```
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)
<a name="model-registry-deploy-api"></a>

要使用部署模型版本 适用于 Python (Boto3) 的 AWS SDK，请完成以下步骤：

1. 以下代码片段假设您已经创建了 SageMaker AI Boto3 客户端`sm_client`和一个 ARN 存储在变量中的模型版本。`model_version_arn`

   通过调用 [create\$1model](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.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"]))
   ```

1. 通过调用 `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'}])
   ```

1. 通过调用 `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'])
   ```

## 从其他账户部署模型版本
<a name="model-registry-deploy-xaccount"></a>

通过添加跨 AWS 账户资源策略，您可以允许账户部署在其他账户中创建的模型版本。例如，您组织中的一个团队可能负责训练模型，而另一个团队则负责部署和更新模型。创建这些资源策略时，可以将策略应用于要授予访问权限的特定资源。有关跨账户资源策略的更多信息 AWS，请参阅*AWS Identity and Access Management 用户*指南中的[跨账户策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html)。

**注意**  
在跨账户模型部署训练期间，您必须使用 KMS 密钥对[输出数据配置](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_OutputDataConfig.html)操作进行加密。

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

为了能够部署在其他账户中创建的模型，您必须拥有有权访问 SageMaker AI 操作的角色，例如具有`AmazonSageMakerFullAccess`托管策略的角色。有关 SageMaker AI 托管策略的信息，请参阅[AWS 亚马逊 A SageMaker I 的托管策略](security-iam-awsmanpol.md)。

以下示例为所有这三种资源创建了跨账户策略，并将这些策略应用到资源。该示例还假设您先前定义了以下变量：
+ `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.")
```