

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

# Edge Manager 代理程式
<a name="edge-device-fleet-about"></a>

Edge Manager 代理程式是 Edge 裝置的推論引擎。使用代理程式對載入 Edge 裝置的模型進行預測。代理程式也會收集模型指標，並以特定間隔擷取資料。範例資料會存放在您的 Amazon S3 儲存貯體中。

有兩種方法可以將 Edge Manager 代理程式安裝並部署到 Edge 裝置上：

1. 從 Amazon S3 發行儲存貯體以二進位檔案形式下載代理程式。如需詳細資訊，請參閱[手動下載並設定 Edge Manager 代理程式](edge-device-fleet-manual.md)。

1. 使用 AWS IoT Greengrass V2 主控台或 AWS CLI 部署 `aws.greengrass.SageMakerEdgeManager`。請參閱 [建立 AWS IoT Greengrass V2 元件](edge-greengrass-custom-component.md)。

# 手動下載並設定 Edge Manager 代理程式
<a name="edge-device-fleet-manual"></a>

根據您的作業系統、架構和 AWS 區域，下載 Edge Manager 代理程式。代理程式會定期更新，因此您可以根據發行日期和版本選擇您的代理程式。取得代理程式之後，請建立 JSON 設定檔。指定裝置 IoT 物件名稱、機群名稱、裝置憑證及其他鍵值對。如[執行 Edge Manager 代理程式](#edge-device-fleet-running-agent)需必須在組態檔案中指定的完整金鑰清單，請參閱。您可以將代理程式當做可執行二進位檔執行，或以動態共享物件 (DSO) 的形式連結來執行代理程式。

## 代理程式的運作方式
<a name="edge-device-fleet-how-agent-works"></a>

代理程式會在裝置的 CPU 上執行。代理程式會在您的編譯任務期間指定目標裝置的架構和硬體上執行推論。例如，如果您為 Jetson Nano 編譯模型，則代理程式會在提供的[深度學習執行期](https://github.com/neo-ai/neo-ai-dlr) (DLR) 中支援 GPU。

代理程式會以二進位格式發行，以支援作業系統。請檢查您的作業系統是否受支援，並符合下表中的最低作業系統需求：

------
#### [ Linux ]

**版本：**Ubuntu 18.04

**支援的二進位格式：**x86-64 位元 (ELF 二進位) 和 ARMv8 64 位元 (ELF 二進位)

------
#### [ Windows ]

**版本:**視窗 10 1909 版

**支援的二進位格式：**x86-32 位元 (DLL) 和 x86-64 位元 (DLL)

------

## 安裝 Edge Manager 代理程式
<a name="edge-device-fleet-installation"></a>

若要使用 Edge Manager 代理程式，您必須先取得發行成品和根憑證。發行成品儲存在 `us-west-2` 區域內的 Amazon S3 儲存貯體中。若要下載成品，請指定您的作業系統 (`<OS>`) 和 `<VERSION>`。

根據您的作業系統，取代 `<OS>` 為下列其中一項：


| Windows 32 位元 | Windows 64 位元 | Linux x86-64 | Linux ARMv8 | 
| --- | --- | --- | --- | 
| windows-x86 | windows-x64 | linux-x64 | 亞麻 8 | 

`VERSION` 分為三個組成部分：`<MAJOR_VERSION>.<YYYY-MM-DD>-<SHA-7>`，其中：
+ `<MAJOR_VERSION>`：發行版本。目前設定給 `1` 的發行版本。
+ `<YYYY-MM-DD>`：成品發行的時間戳記。
+ `<SHA-7>`：從中構建發行版本的儲存庫提交 ID。

您必須以 `YYYY-MM-DD` 格式提供 `<MAJOR_VERSION>` 和時間戳記。我們建議您使用最新的成品發佈時間戳記。

在命令列中執行以下命令以獲取最新的時間戳記。將 `<OS>` 取代為您的作業系統：

```
aws s3 ls s3://sagemaker-edge-release-store-us-west-2-<OS>/Releases/ | sort -r
```

例如，如果您使用的是 Windows 32 位元作業系統，請執行：

```
aws s3 ls s3://sagemaker-edge-release-store-us-west-2-windows-x86/Releases/ | sort -r
```

將傳回 。

```
2020-12-01 23:33:36 0 

                    PRE 1.20201218.81f481f/
                    PRE 1.20201207.02d0e97/
```

此範例中的傳回輸出會顯示兩個發行成品。初次發行成品檔案會注意到發行版本具有 `1` 的主要發行版本、`20201218` 的時間戳記 (採用 YYYY-MM-DD 格式)，以及 `81f481f` SHA-7 遞交 ID。

**注意**  
上述命令假設您已經配置了 AWS Command Line Interface。如需如何設定 AWS CLI 用於互動的設定的詳細資訊 AWS，請參閱[設定 AWS CLI](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-configure.html)。

根據您的作業系統，使用下列命令來安裝成品：

------
#### [ Windows 32-bit ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x86/Releases/<VERSION>/<VERSION>.zip .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x86/Releases/<VERSION>/sha256_hex.shasum .
```

------
#### [ Windows 64-bit ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x64/Releases/<VERSION>/<VERSION>.zip .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-windows-x64/Releases/<VERSION>/sha256_hex.shasum .
```

------
#### [ Linux x86-64 ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-x64/Releases/<VERSION>/<VERSION>.tgz .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-x64/Releases/<VERSION>/sha256_hex.shasum .
```

------
#### [ Linux ARMv8 ]

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-armv8/Releases/<VERSION>/<VERSION>.tgz .
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-linux-armv8/Releases/<VERSION>/sha256_hex.shasum .
```

------

您也必須下載根憑證。此憑證會先驗證 簽署的模型成品， AWS 再將其載入您的邊緣裝置。

將 `<OS>` 取代為支援的操作系統清單中與您的平台相對應者，並將 `<REGION>` 取代為您的 AWS 區域。

```
aws s3 cp s3://sagemaker-edge-release-store-us-west-2-<OS>/Certificates/<REGION>/<REGION>.pem .
```

## 執行 Edge Manager 代理程式
<a name="edge-device-fleet-running-agent"></a>

SageMaker AI Edge Manager 代理程式可以使用可執行和可連結格式 (ELF) 可執行二進位檔的形式，做為獨立處理程序執行，或您可以將其做為動態共用物件 (.dll) 連結。Linux 支援將其做為獨立的可執行二進位文件執行，並且為偏好模式。視窗支援將其作為共享物件 (.dll) 執行。

在 Linux 上，我們建議您透過初始化 (`init`) 系統一部分的服務來執行二進位檔。如果您希望直接執行二進位檔案，您可以在終端機中這麼做，如以下範例所示。如果您有現代化的作業系統，則在執行代理程式之前不需要其他安裝，因為所有需求都是以靜態方式建置在可執行檔中。這使您可以靈活地在終端機上，作為服務或在容器中執行代理程式。

若要執行代理程式，請先建立 JSON 設定檔。指定下列鍵值對：
+ `sagemaker_edge_core_device_name`：裝置的名稱。此裝置名稱必須與 SageMaker Edge Manager 主控台中的裝置機群一起註冊。
+ `sagemaker_edge_core_device_fleet_name`：裝置所屬機群的名稱。
+ `sagemaker_edge_core_region`：與裝置、機群和 Amazon S3 儲存貯體相關聯的 AWS 區域。這對應於註冊裝置的所在區域，以及建立 Amazon S3 儲存貯體的區域 (預期為相同位置)。這些模型本身可以用 SageMaker Neo 在不同的區域中進行編譯，這種組態與模型編譯的區域無關。
+ `sagemaker_edge_core_root_certs_path`：根憑證的絕對資料夾路徑。這用於使用相關 AWS 帳戶來驗證裝置。
+ `sagemaker_edge_provider_aws_ca_cert_file`：Amazon 根 CA 憑證的絕對路徑 (AmazonRootCA1.pem) 這用於使用相關 AWS 帳戶驗證裝置。 `AmazonCA` 是 擁有的憑證 AWS。
+ `sagemaker_edge_provider_aws_cert_file`： AWS IoT 簽署根憑證的絕對路徑 (`*.pem.crt`)。
+ `sagemaker_edge_provider_aws_cert_pk_file`： AWS IoT 私有金鑰的絕對路徑。 (`*.pem.key`)。
+ `sagemaker_edge_provider_aws_iot_cred_endpoint`： AWS IoT 登入資料端點 (*identifier*.iot.*region*.amazonaws.com)。此端點用於認證驗證。請參閱[將裝置連線至 AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-connect-devices.html) 以取得更多資訊。
+ `sagemaker_edge_provider_provider`：這表示正在使用的提供者介面的實作。提供者介面會與終端網路服務通訊，以進行上傳、活動訊號和註冊驗證。根據預設，這會設定為 `"Aws"`。我們允許提供者介面的自訂實作。若無提供者，可以設定為 `None`，而提供相關共用物件路徑的自訂實作則設定為 `Custom`。
+ `sagemaker_edge_provider_provider_path`：提供提供者實作共用物件的絕對路徑。(.so 或 .dll 檔案)。`"Aws"` 提供者 .dll 或 .so 檔案隨代理程式版本一起提供。此欄位是必要的。
+ `sagemaker_edge_provider_s3_bucket_name`：Amazon S3 儲存貯體的名稱 (非 Amazon S3 儲存貯體 URI)。值區的名稱中必須有一個 `sagemaker` 字串。
+ `sagemaker_edge_log_verbose` (布林值)：選用。這會設定偵錯記錄檔。擇一選取 `True` 或者 `False`。
+ `sagemaker_edge_telemetry_libsystemd_path`：僅針對 Linux，`systemd` 實作代理程式損毀計數器量度。設定 libsystemd 的絕對路徑，以開啟當機計數器量度。您可以透過在裝備終端機中執行 `whereis libsystemd` 來尋找預設的 libsystemd 路徑。
+ `sagemaker_edge_core_capture_data_destination`：上傳擷取資料的目的地。選擇 `"Cloud"` 或 `"Disk"`。預設設定為 `"Disk"`。將其設定為 `"Disk"` 將輸入和輸出張量和輔助資料寫入您偏好位置的本機檔案系統。寫入 `"Cloud"` 時，請使用 `sagemaker_edge_provider_s3_bucket_name` 組態中提供的 Amazon S3 儲存貯體名稱。
+ `sagemaker_edge_core_capture_data_disk_path`：在本地檔案系統中設置絕對路徑，當目的地是 `"Disk"` 時，將擷取資 料檔案寫入該路徑。指定為目的地時，`"Cloud"` 不會使用此欄位。
+ `sagemaker_edge_core_folder_prefix`：Amazon S3 中的父項首碼，當您指定 `"Cloud"` 為擷取資料目的地時，會存放擷取的資料 (`sagemaker_edge_core_capture_data_disk_path)`。如果 `"Disk"` 設定為資料目標，擷取的資料會儲存在 `sagemaker_edge_core_capture_data_disk_path` 下的子資料夾中。
+ `sagemaker_edge_core_capture_data_buffer_size` (整數值)：擷取資料的循環緩衝區大小。它表示儲存在緩衝區中的請求的最大數量。
+ `sagemaker_edge_core_capture_data_batch_size`(整數值)：擷取資料批次大小。它指示從緩衝區處理的一批請求的大小。此值必須等於或小於 `sagemaker_edge_core_capture_data_buffer_size`。對於批次大小，建議使用緩衝區大小的最大一半。
+ `sagemaker_edge_core_capture_data_push_period_seconds`(整數值)：擷取資料推送期間 (以秒為單位)。當緩衝區中有批次大小要求，或在此時段已完成 (以先到者為準) 時，就會處理緩衝區中的一批要求。此配置設置該時間段。
+ `sagemaker_edge_core_capture_data_base64_embed_limit`：上傳擷取資料的限制 (以位元組為單位)。整數值。

您的組態檔案看起來如下列範例 (指定了您的特定數值)。此範例使用預設的 AWS provider(`"Aws"`)，不會指定定期上傳。

```
{
    "sagemaker_edge_core_device_name": "device-name",
    "sagemaker_edge_core_device_fleet_name": "fleet-name",
    "sagemaker_edge_core_region": "region",
    "sagemaker_edge_core_root_certs_path": "<Absolute path to root certificates>",
    "sagemaker_edge_provider_provider": "Aws",
    "sagemaker_edge_provider_provider_path" : "/path/to/libprovider_aws.so",
    "sagemaker_edge_provider_aws_ca_cert_file": "<Absolute path to Amazon Root CA certificate>/AmazonRootCA1.pem",
    "sagemaker_edge_provider_aws_cert_file": "<Absolute path to AWS IoT signing root certificate>/device.pem.crt",
    "sagemaker_edge_provider_aws_cert_pk_file": "<Absolute path to AWS IoT private key.>/private.pem.key",
    "sagemaker_edge_provider_aws_iot_cred_endpoint": "https://<AWS IoT Endpoint Address>",
    "sagemaker_edge_core_capture_data_destination": "Cloud",
    "sagemaker_edge_provider_s3_bucket_name": "sagemaker-bucket-name",
    "sagemaker_edge_core_folder_prefix": "Amazon S3 folder prefix",
    "sagemaker_edge_core_capture_data_buffer_size": 30,
    "sagemaker_edge_core_capture_data_batch_size": 10,
    "sagemaker_edge_core_capture_data_push_period_seconds": 4000,
    "sagemaker_edge_core_capture_data_base64_embed_limit": 2,
    "sagemaker_edge_log_verbose": false
}
```

發行成品包含在 `/bin` 目錄中名為 `sagemaker_edge_agent_binary` 的二進位執行檔。若要執行二進位檔案，請使用 `-a` 旗標在您選擇的目錄中建立通訊端檔案描述項 (.sock)，並指定您使用 `-c` 旗標建立的代理程式 JSON 組態檔的路徑。

```
./sagemaker_edge_agent_binary -a <ADDRESS_TO_SOCKET> -c <PATH_TO_CONFIG_FILE>
```

下列範例會顯示具有指定目錄和檔案路徑的程式碼片段：

```
./sagemaker_edge_agent_binary -a /tmp/sagemaker_edge_agent_example.sock -c sagemaker_edge_config.json
```

在此範例中，會在 `/tmp` 目錄中建立名為 `sagemaker_edge_agent_example.sock` 的通訊端檔案描述項，並指向與名為 `sagemaker_edge_config.json` 代理程式位於相同工作目錄中的組態檔案。

# 搭配 的模型套件和 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)。

# 使用 SageMaker Edge Manager 部署 API 直接部署模型套件
<a name="edge-deployment-plan-api"></a>

SageMaker Edge Manager 提供了一個部署 API，您可以使用該 API 將模型部署到裝置目標，而無需 AWS IoT Greengrass。在您想要獨立於韌體更新或應用程式部署機制之外更新模型的情況下，此功能非常有用。您可以使用 API 將邊緣部署整合到 CI/CD 工作流程中，以在您驗證模型準確性後自動部署模型。此 API 還提供方便的復原和分階段推出選項，以確保模型在更廣泛推出之前在特定環境中正常運作。

若要使用 Edge Manager 部署 API，請先編譯並封裝您的模型。如需有關如何編譯和封裝模型的資訊，請參閱[準備您的模型以進行部署](edge-getting-started-step2.md)。本指南的以下各節說明如何在編譯和封裝模型之後，使用 SageMaker API 建立邊緣部署。

**Topics**
+ [建立邊緣部署計劃](#create-edge-deployment-plan)
+ [啟動邊緣部署。](#start-edge-deployment-stage)
+ [檢查部署狀態](#describe-edge-deployment-status)

## 建立邊緣部署計劃
<a name="create-edge-deployment-plan"></a>

您可以使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgeDeploymentPlan.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgeDeploymentPlan.html) API 建立邊緣部署計劃。部署計劃可以有多個階段。您可以設定每個階段，以將部署推出 Edge 裝置子集 (按百分比或依裝置名稱)。您也可以設定在每個階段如何處理部署失敗。

下列程式碼片段顯示如何建立具有 1 個階段的邊緣部署計劃，以將編譯和封裝模型部署至 2 個特定 Edge 裝置：

```
import boto3

client = boto3.client("sagemaker")

client.create_edge_deployment_plan(
    EdgeDeploymentPlanName="edge-deployment-plan-name",
    DeviceFleetName="device-fleet-name",
    ModelConfigs=[
        {
            "EdgePackagingJobName": "edge-packaging-job-name",
            "ModelHandle": "model-handle"
        }
    ],
    Stages=[
        {
            "StageName": "stage-name",
            "DeviceSelectionConfig": {
                "DeviceSubsetType": "SELECTION",
                "DeviceNames": ["device-name-1", "device-name-2"]
            },
            "DeploymentConfig": {
                "FailureHandlingPolicy": "ROLLBACK_ON_FAILURE"
            }
        }
    ]
)
```

如果您想要將模型部署到機群中一定比例的裝置，而不是特定裝置，則將 `DeviceSubsetType` 值設為 `"PERCENTAGE"` 並以上述範例中的 `"Percentage": desired-percentage` 取代 `"DeviceNames": ["device-name-1", "device-name-2"]`。

如果您想要在驗證測試推出成功之後開始推出新階段，則可以在使用 [CreateEdgeDeploymentStage](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateEdgeDeploymentStage.html) API 建立部署計劃之後新增階段。如需有關部署階段的詳細資訊，請參閱 [DeploymentStage](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DeploymentStage.html)。

## 啟動邊緣部署。
<a name="start-edge-deployment-stage"></a>

建立部署計劃和部署階段之後，您可以使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StartEdgeDeploymentStage.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StartEdgeDeploymentStage.html) API 開始部署。

```
client.start_edge_deployment_stage(
    EdgeDeploymentPlanName="edge-deployment-plan-name",
    StageName="stage-name"
)
```

## 檢查部署狀態
<a name="describe-edge-deployment-status"></a>

您可以使用 [DescribeEdgeDeploymentPlan](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DescribeEdgeDeploymentPlan.html) API 檢查邊緣部署的狀態。

```
client.describe_edge_deployment_plan(
    EdgeDeploymentPlanName="edge-deployment-plan-name"
)
```