

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 搭配 的模型套件和 Edge Manager 代理程式部署 AWS IoT Greengrass
<a name="edge-greengrass"></a>

SageMaker Edge Manager 整合第 2 AWS IoT Greengrass 版，以簡化存取、維護和部署 Edge Manager 代理程式和模型至您的裝置。如果沒有 AWS IoT Greengrass V2，將裝置和機群設定為使用 SageMaker Edge Manager，您需要從 Amazon S3 發行儲存貯體手動複製 Edge Manager 代理程式。您可以使用代理程式對載入 Edge 裝置的模型進行預測。透過 AWS IoT Greengrass V2 和 SageMaker Edge Manager 整合，您可以使用 AWS IoT Greengrass V2 元件。元件是預先建置的軟體模組，可透過 將邊緣裝置連線至 AWS 服務或第三方服務 AWS IoT Greengrass。

如果您想要使用 AWS IoT Greengrass V2 部署 Edge Manager 代理程式和模型，則必須在裝置上安裝 AWS IoT Greengrass Core 軟體 (Core)。如需裝置需求以及如何設定裝置的詳細資訊，請參閱 AWS IoT Greengrass 文件中的[設定 AWS IoT Greengrass 核心裝置](https://docs.aws.amazon.com/greengrass/v2/developerguide/setting-up.html)。

您可以使用下列三個元件來部署 Edge Manager 代理程式：
+ *預先建立的公有元件*：SageMaker AI 會維護公有 Edge Manager 元件。
+ *自動產生的私有元件*：當您使用 [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 元件](https://docs.aws.amazon.com/greengrass/v2/developerguide/create-components.html)的詳細資訊[建立一個 Hello World 自訂元件](edge-greengrass-custom-component.md#edge-greengrass-create-custom-component-how)，請參閱 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. 設定 up AWS IoT Greengrass V2。如需詳細資訊，請參閱[使用手動資源佈建安裝 AWS IoT Greengrass 核心軟體](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":"*"
            }
         ]
     }
     ```

------
   + 選擇**連接政策**。
   + 選擇 **Trust relationship (信任關係)**。
   + 選擇**編輯信任關係**。
   + 將內容用以下內容取代。

------
#### [ 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 Edge Manager 和 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. *部署 Edge Manager 代理程式二進位的公有 Edge Manager 代理程式 AWS IoT Greengrass 元件*。

1. *當您使用 API 或 SageMaker AI 主控台封裝機器學習模型時自動產生的模型元件*。 適用於 Python (Boto3) 的 AWS SDK SageMaker 如需相關資訊，請參閱[建立自動產生的元件](#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 欄位 `PresetDeploymentType` 指定 `GreengrassV2Component`。當您呼叫 `CreateEdgePackagingJob` API 時，Edge Manager 會在 Amazon S3 中取得 SageMaker AI Neo 編譯的模型，並建立模型元件。模型元件會自動儲存在您的帳戶中。您可以透過導覽至 AWS IoT 主控台 https：//[https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/) 來檢視任何元件。**選取**綠色，然後選取核**心裝置。**此頁面具有與您的帳戶相關聯的 AWS IoT Greengrass 核心裝置清單。如果未在 `PresetDeploymentConfig` 中指定模型元件名稱，則產生的預設名稱由 `"SagemakerEdgeManager"` 和 Edge Manager 代理程式封裝任務的名稱組成。下列範例示範如何向 Edge Manager 指定 ，以使用 `CreateEdgePackagingJob` API 建立 a 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\"}"
                        }
                    )
```

您也可以使用 SageMaker AI 主控台建立自動產生的元件。依照[Package 模型 (Amazon SageMaker AI 主控台)](edge-packaging-job-console.md)中的步驟 1-6 執行

輸入您要儲存封包任務輸出的 Amazon S3 儲存貯體 URI 和選用的加密金鑰。

完成下列步驟以建立模型元件：

1. 選擇**預設部署**。

1. 在**元件名稱**欄位中指定元件的名稱。

1. 選擇性地分別提供元件、元件版本、平台作業系統或**元件說明**、**元件版本**、**平台作業系統**和**平台架構**的描述。

1. 選擇**提交**。

## 建立一個 Hello World 自訂元件
<a name="edge-greengrass-create-custom-component-how"></a>

自訂應用程式元件可用來在 Edge 裝置上執行推論。元件負責將模型載入到 SageMaker Edge Manager、調用 Edge Manager 代理程式進行推論，以及在關閉元件時卸載模型。在建立元件之前，請確保代理程式和應用程式可以與 Edge Manager 通訊。若要這麼做，請設定 [gRPC](https://grpc.io/)。Edge Manager 代理程式會使用 Protobuf 緩衝區和 gRPC 伺服器中定義的方法，以與 Edge 裝置和雲端上的用戶端應用程式建立通訊。

若要使用 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 目錄包含用於與代理程式通訊的原始規格。

接下來，使用 gRPC API 為您的服務編寫客戶端和服務器 (2)。下列範例指令碼 `edge_manager_python_example.py`，使用 Python 將 `yolov3` 模型載入、列出和卸載至 Edge 裝置。

```
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 主控台中建立私有元件，並定義元件的配方。在下列方法中，將 Amazon S3 URI 指定到您的 Hello World 應用程式和 GrPC 虛設常式。

  ```
  ---
  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. 在 https：//[https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/greengrass/) 導覽選單的 AWS IoT 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"
      }
      ```

      以您建立的 Edge 裝置機群名稱取代 *`device-fleet-name`*，並以與裝置機群關聯的 Amazon S3 儲存貯體名稱取代 *`bucket-name`*。

   1. 選擇**確認**，然後選擇**下一步**。

1. 在**設定進階設定**頁面上，保留預設組態設定，然後選擇 **下一步**。

1. 在 **Review (檢閱)** 頁面，選擇 **Deploy (部署)**。

## 若要部署您的元件 (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 Resource Name (ARN) 取代為目標部署：
     + 物件：`arn:aws:iot:region:account-id:thing/thingName`
     + 物件群組：`arn:aws:iot:region:account-id:thinggroup/thingGroupName`
   + 在 `merge` 欄位中，以您建立的 Edge 裝置機群名稱取代 *`device-fleet-name`*，並以與裝置機群關聯的 Amazon S3 儲存貯體名稱取代 *`bucket-name`*。
   + 以最新的可用版本取代每個元件的元件版本。

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)。