

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

# 如何打包模型
<a name="edge-packaging-job"></a>

SageMaker Edge Manager 打包任务采用 Amazon SageMaker NEO 编译的模型，并进行任何必要的更改，以便使用推理引擎 Edge Manager 代理部署模型。

**Topics**
+ [满足先决条件](edge-packaging-job-prerequisites.md)
+ [Package a Model（亚马逊 SageMaker AI 控制台）](edge-packaging-job-console.md)
+ [打包模型 (Boto3)](edge-packaging-job-boto3.md)

# 满足先决条件
<a name="edge-packaging-job-prerequisites"></a>

要打包模型，您必须执行以下操作：

1. **使用 SageMaker AI Neo 编译您的机器学习模型。**

   如果您还没有这样做，请使用 SageMaker Neo 编译您的模型。有关如何编译模型的更多信息，请参阅[使用 Neo 编译和部署模型](https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html)。如果您是首次使用 SageMaker Neo，请阅读 Neo E [dge 设备入门](https://docs.aws.amazon.com/sagemaker/latest/dg/neo-getting-started-edge.html)。

1. **获取您的编译作业的名字。**

   提供您在使用 SageMaker Neo 编译模型时使用的编译任务名称的名称。打开 SageMaker AI 控制台，[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)然后选择**编译作业**，查找已提交到您的 AWS 账户的编译列表。已提交的编译作业的名称在**名称**列中。

1. **获取您的 IAM ARN。**

   您需要一个 IAM 角色的亚马逊资源名称 (ARN)，您可以使用该名称下载和上传模型并联系 SageMaker Neo。

   使用以下方法之一获取您的 IAM ARN：
   + **使用 SageMaker AI Python 软件开发工具包以编程方式使用**

     ```
     import sagemaker
     
     # Initialize SageMaker Session object so you can interact with AWS resources
     sess = sagemaker.Session()
     
     # Get the role ARN 
     role = sagemaker.get_execution_role()
     
     print(role)
     >> arn:aws:iam::<your-aws-account-id>:role/<your-role-name>
     ```

     有关使用 SageMaker Python 开发工具包的更多信息，请参阅 [SageMaker AI Python SDK API](https://sagemaker.readthedocs.io/en/stable/index.html)。
   + **使用 AWS Identity and Access Management (IAM) 控制台**

     导航到 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 控制台。在 IAM **资源**部分，选择**角色**以查看您的 AWS 账户中的角色列表。选择或创建具有 `AmazonSageMakerFullAccess`、`AWSIoTFullAccess` 和 `AmazonS3FullAccess` 的角色。

     有关 IAM 的更多信息，请参阅[什么是 IAM？](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)

1. **有 S3 存储桶 URI。**

   您至少需要一个 Amazon Simple Storage Service (Amazon S3) 存储桶 URI 来存储经过 Neo 编译的模型、Edge Manager 打包作业的输出以及设备队列中的示例数据。

   使用以下方法之一创建 Amazon S3 存储桶：
   + **使用 SageMaker AI Python 软件开发工具包以编程方式使用**

     您可以在会话期间使用默认 Amazon S3 存储桶。默认存储桶是基于以下格式创建的：`sagemaker-{region}-{aws-account-id}`。要使用 SageMaker Python 开发工具包创建默认存储桶，请使用以下内容：

     ```
     import sagemaker
     
     session=sagemaker.create_session()
     
     bucket=session.default_bucket()
     ```
   + **使用 Amazon S3 控制台**

     打开 Amazon S3 控制台 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)，参见[如何创建 S3 存储桶？](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html) 以获取 step-by-step说明。

# Package a Model（亚马逊 SageMaker AI 控制台）
<a name="edge-packaging-job-console"></a>

您可以使用 SageMaker AI 控制台创建 SageMaker Edge Manager 打包作业，网址为[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。在继续之前，请确保您已经满足[满足先决条件](edge-packaging-job-prerequisites.md)。

1. 在 SageMaker AI 控制台中，选择 **Edge Inf** erence，然后选择**创建边缘打包作业**，如下图所示。  
![\[管理控制台中创建边缘打包作业的位置。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/smith/pre-edge-packaging-button-edited.png)

1. 在**作业属性**页面中，在**边缘打包作业名称**下面输入打包作业的名称。请注意，Edge Manager 打包作业名称区分大小写。为您的模型命名并给它一个版本：分别在**模型名称**和**模型版本**下输入这些信息。

1. 接下来选择 **IAM 角色**。您可以选择一个角色或者让 AWS 为您创建一个角色。您可以选择指定**资源密钥 ARN** 和**作业标签**。

1. 选择**下一步**。  
![\[管理控制台中的作业属性部分示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/smith/create-edge-packaging-job-filled.png)

1. 在编译作业名称字段中指定使用 SageMaker Neo 编译模型时使用的**编译作业的名称**。选择**下一步**。  
![\[管理控制台中模型源部分的示例。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/smith/create-edge-packaging-job-model-source-filled.png)

1. 在**输出配置**页面中，输入要在其中存储打包作业输出的 Amazon S3 存储桶 URI。  
![\[管理控制台中的示例输出配置页面。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/smith/create-device-fleet-output-filled.png)

   **边缘打包**作业页面上的**状态**列应显示为**进行中**。打包作业完成后，状态将更新为**已完成**。

   选择打包作业会引导您进入该作业的设置。**作业设置**部分显示作业名称、ARN、状态、创建时间、上次修改时间、打包作业的持续时间和角色 ARN。

   **输入配置**部分显示模型构件的位置、数据输入配置和模型的机器学习框架。

   **输出配置**部分显示打包作业的输出位置、为其编译模型的目标设备以及您创建的任何标签。

1. 选择要重定向到设备队列详细信息的设备队列的名称。此页面显示设备队列的名称、ARN、描述（如果您提供的话）、队列的创建日期、上次修改队列的时间、Amazon S3 存储桶 URI、 AWS KMS 密钥 ID（如果提供）、 AWS IoT 别名（如果提供）和 IAM 角色。如果添加了标签，它们将在**设备队列标签**部分显示。

# 打包模型 (Boto3)
<a name="edge-packaging-job-boto3"></a>

您可以使用创建 SageMaker Edge Manager 打包作业 适用于 Python (Boto3) 的 AWS SDK。在继续之前，请确保您已经满足[满足先决条件](edge-packaging-job-prerequisites.md)。

要请求边缘打包作业，请使用 `CreateEdgePackagingJob`。您需要为边缘打包任务提供名称、 SageMaker Neo 编译任务的名称、角色的亚马逊资源名称 (ARN)、模型的名称、模型的版本以及要存储打包任务输出的 Amazon S3 存储桶 URI。请注意，Edge Manager 打包作业名称和 SageMaker Neo 编译作业名称区分大小写。

```
# Import AWS SDK for Python (Boto3)
import boto3

# Create Edge client so you can submit a packaging job
sagemaker_client = boto3.client("sagemaker", region_name='aws-region')

sagemaker_client.create_edge_packaging_job(
    EdgePackagingJobName="edge-packaging-name",
    CompilationJobName="neo-compilation-name",
    RoleArn="arn:aws:iam::99999999999:role/rolename",
    ModelName="sample-model-name",
    ModelVersion="model-version",
    OutputConfig={
        "S3OutputLocation": "s3://your-bucket/",
    }
)
```

您可以使用 `DescribeEdgePackagingJob` 并提供区分大小写的边缘打包作业名称来检查边缘打包作业的状态：

```
response = sagemaker_client.describe_edge_packaging_job(
                                    EdgePackagingJobName="edge-packaging-name")
```

这将返回一个可用于轮询打包作业状态的字典：

```
# Optional - Poll every 30 sec to check completion status
import time

while True:
    response = sagemaker_client.describe_edge_packaging_job(
                                         EdgePackagingJobName="edge-packaging-name")
    
    if response['EdgePackagingJobStatus'] == 'Completed':
        break
    elif response['EdgePackagingJobStatus'] == 'Failed':
        raise RuntimeError('Packaging job failed')
    print('Packaging model...')
    time.sleep(30)
print('Done!')
```

有关打包作业的列表，请使用 `ListEdgePackagingJobs`。您可以使用此 API 搜索特定的打包作业。提供部分名称以筛选 `NameContains` 的打包作业名称，提供 `ModelNameContains` 的部分名称以筛选模型名称中包含您提供的名称的作业。还可以指定使用 `SortBy` 对哪一列进行排序，以及使用 `SortOrder` 按哪个方向排序（`Ascending` 或 `Descending`）。

```
sagemaker_client.list_edge_packaging_jobs(
    "NameContains": "sample",
    "ModelNameContains": "sample",
    "SortBy": "column-name",
    "SortOrder": "Descending"
)
```

要停止打包作业，请使用 `StopEdgePackagingJob` 并提供边缘打包作业的名称。

```
sagemaker_client.stop_edge_packaging_job(
        EdgePackagingJobName="edge-packaging-name"
)
```

有关边缘管理器的完整列表 APIs，请参阅 [Boto3 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)。