

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

# 使用 Package 和 Edge Manager 代理部署建模 AWS IoT Greengrass
<a name="edge-greengrass"></a>

SageMaker Edge Manager 集成了第 2 AWS IoT Greengrass 版，可简化对边缘管理器代理和模型的访问、维护和部署到您的设备。如果没有 AWS IoT Greengrass V2，要将设备和队列设置为使用 SageMaker Edge Manager，则需要您手动从 Amazon S3 发布存储桶中复制 Edge Manager 代理。您可以使用代理对加载到边缘设备上的模型进行预测。通过集成 AWS IoT Greengrass V2 和 SageMaker Edge Manager，您可以使用 AWS IoT Greengrass V2 组件。组件是预先构建的软件模块，可通过 AWS IoT Greengrass这些模块将您的边缘设备连接到 AWS 服务或第三方服务。

如果要使用 AWS IoT Greengrass V2 部署 Edge Manager 代理和您的模型，则必须将 C AWS IoT Greengrass ore 软件安装到您的设备上。有关设备要求和如何设置设备的更多信息，请参阅 AWS IoT Greengrass 文档中的[设置 AWS IoT Greengrass 核心设备](https://docs.aws.amazon.com/greengrass/v2/developerguide/setting-up.html)。

您可以使用以下三个组件来部署 Edge Manager 代理：
+ *预先构建的公共组件*： SageMaker AI 维护公共边缘管理器组件。
+ *自动生成的私有组件*：如果您将机器学习模型与 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html) API 打包并在 Edge Manager API `PresetDeploymentType` 字段中指定 `GreengrassV2Component`，即会自动生成私有组件。
+ *自定义组件*：这是推理应用程序，负责在您的设备上进行预处理和推理。您必须创建此组件。有关如何[创建自定义 AWS IoT Greengrass 组件[创建 Hello World 自定义组件](edge-greengrass-custom-component.md#edge-greengrass-create-custom-component-how)](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html)的更多信息，请参阅 SageMaker Edge Manager AWS IoT Greengrass 文档或文档中的创建自定义组件。

# 完成部署 Edge Manager 座席的先决条件
<a name="edge-greengrass-prerequisites"></a>

SageMaker Edge Manager 使用 AWS IoT Greengrass V2 简化了使用组件将 Edge Manager 代理、机器学习模型和推理应用程序部署到设备上的过程。为了更轻松地维护您 AWS 的 IAM 角色，Edge Manager 允许您重复使用现有的 AWS IoT 角色别名。如果您还没有，Edge Manager 会在 Edge Manager 打包作业中生成角色别名。您不再需要将从 SageMaker Edge Manager 打包作业生成的角色别名与您的 AWS IoT 角色相关联。

在开始之前，您必须满足以下先决条件：

1. 安装 AWS IoT Greengrass 核心软件。有关详细信息，请参阅[安装 AWS IoT Greengrass 核心软件](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html#install-greengrass-v2)。

1. 设置 AWS IoT Greengrass V2。有关更多信息，请参阅[使用手动资源配置来安装 AWS IoT Greengrass Core 软件](https://docs.aws.amazon.com/greengrass/v2/developerguide/manual-installation.html)。
**注意**  
确保 AWS IoT 事物名称全部为小写且不包含除破折号（可选）之外的字符（可选）。`‐`
IAM 角色必须以 `SageMaker*` 开头

1. 将以下权限和内联策略附加到 AWS IoT Greengrass V2 设置期间创建的 IAM 角色。
   + 导航到 IAM 控制台[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。
   + 通过在**搜索**字段中键入角色名称来搜索您创建的角色。
   + 选择您的角色。
   + 接下来选择**附加策略**。
   + 搜索 **AmazonSageMakerEdgeDeviceFleetPolicy**。
   + 选择 **AmazonSageMakerFullAccess**（这是一个可选步骤，可让您更轻松地在模型编译和打包中重复使用此 IAM 角色）。
   + 向角色的权限策略添加所需权限，请不要向 IAM 用户附加内联策略。

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Statement":[
           {
             "Sid":"GreengrassComponentAccess",
             "Effect":"Allow",
             "Action":[
                 "greengrass:CreateComponentVersion",
                 "greengrass:DescribeComponent"
             ],
             "Resource":"*"
            }
         ]
     }
     ```

------
   + 选择**附加策略**。
   + 选择**信任关系**。
   + 选择**编辑信任关系**。
   + 将其内容替换为以下内容。

------
#### [ JSON ]

****  

     ```
     {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "Service": "credentials.iot.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
         },
         {
           "Effect": "Allow",
           "Principal": {
             "Service": "sagemaker.amazonaws.com"
           },
           "Action": "sts:AssumeRole"
         }
       ]
     }
     ```

------

1. 创建 Edge Manager 设备队列。有关如何创建队列的信息，请参阅[在 SageMaker Edge Manager 中为设备和队列进行设置](edge-device-fleet.md)。

1. 使用与 AWS IoT Greengrass V2 设置期间创建 AWS IoT 的事物名称相同的名称注册您的设备。

1. 至少创建一个自定义私有 AWS IoT Greengrass 组件。此组件是在设备上运行推理的应用程序。有关更多信息，请参阅 [创建 Hello World 自定义组件](edge-greengrass-custom-component.md#edge-greengrass-create-custom-component-how)。

**注意**  
边 SageMaker 缘管理器和 AWS IoT Greengrass 集成仅适用于 AWS IoT Greengrass v2。
您的 AWS IoT 事物名称和 Edge Manager 设备名称必须相同。
SageMaker Edge Manager 不会加载本地 AWS IoT 证书，也不会直接调用 AWS IoT 凭据提供程序端点。取而代之的是， SageMaker Edge Manager 使用 AWS IoT Greengrass v2 TokenExchangeService ，它从 TES 端点获取临时证书。

# 创建 AWS IoT Greengrass V2 组件
<a name="edge-greengrass-custom-component"></a>

AWS IoT Greengrass 使用*组件*，即部署到核心设备并在 AWS IoT Greengrass 核心设备上运行的软件模块。您需要（至少）三个组件：

1. *一个公共边缘管理器代理 AWS IoT Greengrass 组件，用于*部署边缘管理器代理二进制文件。

1. *一种模型组件*，在您将机器学习模型与 适用于 Python (Boto3) 的 AWS SDK API 或 SageMaker AI 控制台打包时自动生成。有关信息，请参阅 [创建自动生成的组件](#edge-greengrass-autogenerate-component-how)。

1. *一个私有自定义组件*，用于实施 Edge Manager 代理客户端应用程序，并对推理结果进行任何预处理和后处理。有关如何创建自定义组件的更多信息，请参阅[创建自动生成的组件](#edge-greengrass-autogenerate-component-how)或[创建自定义 AWS IoT Greengrass 组件](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html)。

## 创建自动生成的组件
<a name="edge-greengrass-autogenerate-component-how"></a>

使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgePackagingJob.html)API 生成模型组件，并在 SageMaker Edge Manager 打包作业 API 字段中指定`GreengrassV2Component``PresetDeploymentType`。当你调用 `CreateEdgePackagingJob` API 时，Edge Manager 会在 Amazon S3 中使用你的 A SageMaker I NEO 编译模型并创建一个模型组件。此模型组件会自动存储在您的账户中。您可以通过导航到 AWS IoT 控制台[https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/)来查看您的任何组件。选择 **Greengrass**，然后选择**核心**设备。该页面列出了与您的账户关联的 AWS IoT Greengrass 核心设备。如果未在 `PresetDeploymentConfig` 中指定模型组件名称，则会生成默认名称，其中包含 `"SagemakerEdgeManager"` 和您的 Edge Manager 代理打包作业的名称。以下示例演示如何指定 Edge Manager 以使用 `CreateEdgePackagingJob` API 创建 AWS IoT Greengrass V2 组件。

```
import sagemaker
import boto3

# Create a SageMaker client object to make it easier to interact with other AWS services.
sagemaker_client = boto3.client('sagemaker', region=<YOUR_REGION>)

# Replace with your IAM Role ARN
sagemaker_role_arn = "arn:aws:iam::<account>:role/*"

# Replace string with the name of your already created S3 bucket.
bucket = 'amzn-s3-demo-bucket-edge-manager'

# Specify a name for your edge packaging job.
edge_packaging_name = "edge_packag_job_demo" 

# Replace the following string with the name you used for the SageMaker Neo compilation job.
compilation_job_name = "getting-started-demo" 

# The name of the model and the model version.
model_name = "sample-model" 
model_version = "1.1"

# Output directory in S3 where you want to store the packaged model.
packaging_output_dir = 'packaged_models' 
packaging_s3_output = 's3://{}/{}'.format(bucket, packaging_output_dir)

# The name you want your Greengrass component to have.
component_name = "SagemakerEdgeManager" + edge_packaging_name

sagemaker_client.create_edge_packaging_job(
                    EdgePackagingJobName=edge_packaging_name,
                    CompilationJobName=compilation_job_name,
                    RoleArn=sagemaker_role_arn,
                    ModelName=model_name,
                    ModelVersion=model_version,
                    OutputConfig={
                        "S3OutputLocation": packaging_s3_output,
                        "PresetDeploymentType":"GreengrassV2Component",
                        "PresetDeploymentConfig":"{\"ComponentName\":\"sample-component-name\", \"ComponentVersion\":\"1.0.2\"}"
                        }
                    )
```

您也可以使用 A SageMaker I 控制台创建自动生成的组件。按照 [Package a Model（亚马逊 SageMaker AI 控制台）](edge-packaging-job-console.md) 中的步骤 1 到 6 进行操作。

输入您希望用来存储打包作业的输出的 Amazon S3 存储桶 URI 和可选的加密密钥。

完成以下操作以创建模型组件：

1. 选择**预设部署**。

1. 在**组件名称**字段中指定组件的名称。

1. （可选）分别在**组件描述**、**组件版本**、**平台 OS** 和**平台架构**中提供组件、组件版本、平台 OS 和平台架构的描述。

1. 选择**提交**。

## 创建 Hello World 自定义组件
<a name="edge-greengrass-create-custom-component-how"></a>

自定义应用程序组件用于在边缘设备上执行推理。该组件负责将模型加载到 SageMaker Edge Manager，调用 Edge Manager 代理进行推理，并在组件关闭时卸载模型。在创建组件之前，请确保代理和应用程序可以与 Edge Manager 进行通信。为此，请配置 [gRPC](https://grpc.io/)。Edge Manager 代理使用 Protobuf 缓冲区和 gRPC 服务器中定义的方法来与边缘设备和云端的客户端应用程序建立通信。

要使用 gRPC，您必须：

1. 使用从 Amazon S3 发布存储桶下载 Edge Manager 代理时提供的 .proto 文件创建 gRPC 存根。

1. 用您喜欢的语言编写客户端代码。

不需要在 .proto 文件中定义服务。当您从 Amazon S3 发布存储桶下载 Edge Manager 代理发布二进制文件时，服务 .proto 文件将包含在压缩的 TAR 文件中。

在主机上安装 gRPC 和其他必要的工具，并使用 Python 创建 gRPC 存根 `agent_pb2_grpc.py` 和 `agent_pb2.py`。确保您的本地目录中有 `agent.proto`。

```
%%bash
pip install grpcio
pip install grpcio-tools
python3 -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=. agent.proto
```

前面的代码根据 .proto 服务定义生成 gRPC 客户端和服务器接口。换句话说，它使用 Python 创建 gRPC 模型。API 目录包含用于与代理进行通信的 Protobuf 规范。

接下来，使用 gRPC API 为您的服务 (2) 编写客户端和服务器。以下示例脚本 `edge_manager_python_example.py` 使用 Python 将 `yolov3` 模型加载、列出和卸载到边缘设备。

```
import grpc
from PIL import Image
import agent_pb2
import agent_pb2_grpc
import os


model_path = '<PATH-TO-SagemakerEdgeManager-COMPONENT>' 
                    
agent_socket = 'unix:///tmp/aws.greengrass.SageMakerEdgeManager.sock'

agent_channel = grpc.insecure_channel(agent_socket, options=(('grpc.enable_http_proxy', 0),))

agent_client = agent_pb2_grpc.AgentStub(agent_channel)


def list_models():
    return agent_client.ListModels(agent_pb2.ListModelsRequest())


def list_model_tensors(models):
    return {
        model.name: {
            'inputs': model.input_tensor_metadatas,
            'outputs': model.output_tensor_metadatas
        }
        for model in list_models().models
    }


def load_model(model_name, model_path):
    load_request = agent_pb2.LoadModelRequest()
    load_request.url = model_path
    load_request.name = model_name
    return agent_client.LoadModel(load_request)


def unload_model(name):
    unload_request = agent_pb2.UnLoadModelRequest()
    unload_request.name = name
    return agent_client.UnLoadModel(unload_request)


def predict_image(model_name, image_path):
    image_tensor = agent_pb2.Tensor()
    image_tensor.byte_data = Image.open(image_path).tobytes()
    image_tensor_metadata = list_model_tensors(list_models())[model_name]['inputs'][0]
    image_tensor.tensor_metadata.name = image_tensor_metadata.name
    image_tensor.tensor_metadata.data_type = image_tensor_metadata.data_type
    for shape in image_tensor_metadata.shape:
        image_tensor.tensor_metadata.shape.append(shape)
    predict_request = agent_pb2.PredictRequest()
    predict_request.name = model_name
    predict_request.tensors.append(image_tensor)
    predict_response = agent_client.Predict(predict_request)
    return predict_response

def main():
    try:
        unload_model('your-model')
    except:
        pass
  
    print('LoadModel...', end='')
    try:
        load_model('your-model', model_path)
        print('done.')
    except Exception as e:
        print()
        print(e)
        print('Model already loaded!')
        
    print('ListModels...', end='')
    try:
        print(list_models())
        print('done.')
        
    except Exception as e:
        print()
        print(e)
        print('List model failed!')
       
    print('Unload model...', end='')
    try:
        unload_model('your-model')
        print('done.')
    except Exception as e:
        print()
        print(e)
        print('unload model failed!')

if __name__ == '__main__':
    main()
```

如果您使用相同的客户端代码示例，请确保`model_path`指向包含模型的 AWS IoT Greengrass 组件的名称。

生成了 gRPC 存根并准备好了 Hello World 代码后，你就可以创建 AWS IoT Greengrass V2 Hello World 组件了。为此，请执行以下操作：
+ 将您的 `edge_manager_python_example.py`、`agent_pb2_grpc.py` 和 `agent_pb2.py` 上传到您的 Amazon S3 存储桶，并记下它们的 Amazon S3 路径。
+ 在 AWS IoT Greengrass V2 控制台中创建私有组件并为您的组件定义配方。在以下配方中为您的 Hello World 应用程序和 gRPC 存根指定 Amazon S3 URI。

  ```
  ---
  RecipeFormatVersion: 2020-01-25
  ComponentName: com.sagemaker.edgePythonExample
  ComponentVersion: 1.0.0
  ComponentDescription: Sagemaker Edge Manager Python example
  ComponentPublisher: Amazon Web Services, Inc.
  ComponentDependencies:
    aws.greengrass.SageMakerEdgeManager:
      VersionRequirement: '>=1.0.0'
      DependencyType: HARD
  Manifests:
    - Platform:
        os: linux
        architecture: "/amd64|x86/"
      Lifecycle:
        install: |-
          apt-get install python3-pip
          pip3 install grpcio
          pip3 install grpcio-tools
          pip3 install protobuf
          pip3 install Pillow
        run:
          script: |- 
            python3 {artifacts:path}/edge_manager_python_example.py
      Artifacts:
        - URI: <code-s3-path>
        - URI: <pb2-s3-path>
        - URI: <pb2-grpc-s3-path>
  ```

有关创建 Hello World 配方的详细信息，请参阅 AWS IoT Greengrass 文档[中的创建第一个组件](https://docs.aws.amazon.com/greengrass/v2/developerguide/getting-started.html#create-first-component)。

# 将组件部署到设备
<a name="edge-greengrass-deploy-components"></a>

使用 AWS IoT 控制台或使用部署组件 AWS CLI。

## 部署组件（控制台）
<a name="collapsible-section-gg-deploy-console"></a>

使用 AWS IoT 控制台部署 AWS IoT Greengrass 组件。

1. 在 AWS IoT Greengrass 控制台的[https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/)导航菜单中，选择**部署**。

1. 在**组件**页面的**公有组件**选项卡上，选择 `aws.greengrass.SageMakerEdgeManager`。

1. 在 `aws.greengrass.SageMakerEdgeManager` 页面上，选择**部署**。

1. 在 `Add to deployment` 中选择以下选项之一：

   1. 要将此组件合并到目标设备上的现有部署，请选择**添加到现有部署**，然后选择要修改的部署。

   1. 要在目标设备上创建新部署，请选择**创建新部署**。如果您的设备上已有部署，选择此步骤将替换现有部署。

1. 在**指定目标**页面中，执行以下操作：

   1. 在**部署信息**下，输入或修改部署的友好名称。

   1. 在**部署目标**下，选择部署目标，然后选择**下一步**。如果您正在修改现有部署，则无法更改部署目标。

1. 在**选择组件**页面的**我的组件**下，选择：
   + com。 *<CUSTOM-COMPONENT-NAME>*
   + `aws.greengrass.SageMakerEdgeManager`
   + SagemakerEdgeManager.*<YOUR-PACKAGING-JOB>*

1. 在 “**配置组件**” 页面上，选择 **com.greengrass。 SageMakerEdgeManager**，然后执行以下操作。

   1. 选择**配置组件**。

   1. 在**配置更新**下的**要合并的配置**中，输入以下配置。

      ```
      {
          "DeviceFleetName": "device-fleet-name",
          "BucketName": "bucket-name"
      }
      ```

      将 *`device-fleet-name`* 替换为您创建的边缘设备队列的名称，并将 *`bucket-name`* 替换为与您的设备队列关联的 Amazon S3 存储桶的名称。

   1. 选择**确认**，然后选择**下一步**。

1. 在**配置高级设置**页面上，保留默认配置设置，然后选择**下一步**。

1. 在 **检查** 页上，选择 **部署**。

## 部署组件 (AWS CLI)
<a name="collapsible-section-gg-deploy-cli"></a>

1. 创建一个` deployment.json`文件来定义 SageMaker Edge Manager 组件的部署配置。此文件应类似于以下示例。

   ```
   {
     "targetArn":"targetArn",
     "components": {
       "aws.greengrass.SageMakerEdgeManager": {
         "componentVersion": 1.0.0,
         "configurationUpdate": {
           "merge": {
             "DeviceFleetName": "device-fleet-name",
             "BucketName": "bucket-name"
           }
         }
       },
       "com.greengrass.SageMakerEdgeManager.ImageClassification": {
         "componentVersion": 1.0.0,
         "configurationUpdate": {
         }
       }, 
       "com.greengrass.SageMakerEdgeManager.ImageClassification.Model": {
         "componentVersion": 1.0.0,
         "configurationUpdate": {
         }
       }, 
     }
   }
   ```
   + 在 `targetArn` 字段中，按以下格式将 *`targetArn`* 替换为部署目标的事物或事物组的 Amazon 资源名称（ARN）：
     + 事物：`arn:aws:iot:region:account-id:thing/thingName`
     + 事物组：`arn:aws:iot:region:account-id:thinggroup/thingGroupName`
   + 在 `merge` 字段中，将 *`device-fleet-name`* 替换为您创建的边缘设备队列的名称，并将 *`bucket-name`* 替换为与您的设备队列关联的 Amazon S3 存储桶的名称。
   + 将每个组件的组件版本替换为最新的可用版本。

1. 运行以下命令以在设备上部署组件：

   ```
   aws greengrassv2 create-deployment \
       --cli-input-json file://path/to/deployment.json
   ```

完成部署可能需要数分钟。在下一步中，检查组件日志，以验证部署是否成功完成并查看推理结果。

有关将组件部署到单个设备或设备组的更多信息，请参阅[将 AWS IoT Greengrass 组件部署到设备](https://docs.aws.amazon.com/greengrass/v2/developerguide/manage-deployments.html)。