

支援終止通知：2026 年 10 月 7 日 AWS 將停止 的支援 AWS IoT Greengrass Version 1。2026 年 10 月 7 日之後，您將無法再存取 AWS IoT Greengrass V1 資源。如需詳細資訊，請造訪[從 遷移 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

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

# 執行機器學習推論
<a name="ml-inference"></a>

此功能適用於 AWS IoT Greengrass Core v1.6 或更新版本。

透過 AWS IoT Greengrass，您可以使用雲端訓練模型，在本機產生的資料上執行邊緣機器學習 (ML) 推論。您可以從低延遲時間和節省執行本機推論成本中獲益，但仍同時充分利用雲端運算能力進行訓練模型和處理複雜地處理。

若要取得已執行的本機推論，請參閱 [如何使用 設定機器學習推論 AWS 管理主控台](ml-console.md)。

## AWS IoT Greengrass ML 推論的運作方式
<a name="how-ml-inference-works"></a>

您可以在任何地方訓練推論模型，將它們部署為 Greengrass 群組中的*機器學習資源*，然後從 Greengrass Lambda 函數存取它們。例如，您可以在 [SageMaker AI](https://console.aws.amazon.com/sagemaker) 中建置和訓練深度學習模型，並將其部署到您的 Greengrass 核心。然後，您的 Lambda 函數可以使用本機模型在連線裝置上執行推論，並將新的訓練資料傳回雲端。

下圖顯示 AWS IoT Greengrass ML 推論工作流程。

![\[機器學習工作流程的元件，以及核心裝置、 AWS IoT Greengrass 服務和雲端訓練模型之間的資訊流程。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-inference/diagram-ml-overview.png)


AWS IoT Greengrass ML 推論可簡化 ML 工作流程的每個步驟，包括：
+ 建立和部署 Machine Learning 架構的原型。
+ 存取雲端訓練模型和將其部署到 Greengrass 核心裝置。
+ 建立可以存取硬體 Accelerator (例如 GPU 和 FPGA) 做為[本機資源](access-local-resources.md)的推論應用程式。

## 機器學習資源
<a name="ml-resources"></a>

機器學習資源代表部署到 AWS IoT Greengrass 核心的雲端訓練推論模型。若要部署機器學習資源，請先將資源新增至 Greengrass 群組，然後定義群組中的 Lambda 函數如何存取這些資源。在群組部署期間， 從雲端 AWS IoT Greengrass 擷取來源模型套件，並將其擷取至 Lambda 執行時間命名空間內的目錄。然後，Greengrass Lambda 函數會使用本機部署的模型來執行推論。

若要更新本機部署模型，首先，請更新對應到 machine learning 資源的來源模型 (在雲端中)，然後部署群組。在部署期間， AWS IoT Greengrass 會檢查來源是否有變更。如果偵測到變更，則 會 AWS IoT Greengrass 更新本機模型。

### 支援的模型來源
<a name="supported-model-sources"></a>

AWS IoT Greengrass 支援機器學習資源的 SageMaker AI 和 Amazon S3 模型來源。

以下要求適用於模型來源：
+ 存放 SageMaker AI 和 Amazon S3 模型來源的 S3 儲存貯體不得使用 SSE-C 加密。 Amazon S3 對於使用伺服器端加密的儲存貯體， AWS IoT Greengrass ML 推論目前僅支援 SSE-S3 或 SSE-KMS 加密選項。如需伺服器端加密選項的詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[使用伺服器端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html)。
+ 存放 SageMaker AI 和 Amazon S3 模型來源的 S3 儲存貯體名稱不得包含句點 (`.`)。 Amazon S3 如需詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的使用虛擬託管式儲存貯體搭配 SSL [的 儲存貯體命名規則](https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html#bucketnamingrules)。
+ 服務層級 AWS 區域 支援必須同時適用於 [AWS IoT Greengrass](https://docs.aws.amazon.com/general/latest/gr/greengrass.html)和 [SageMaker AI](https://docs.aws.amazon.com/general/latest/gr/sagemaker.html)。目前， AWS IoT Greengrass 在下列區域中支援 SageMaker AI 模型：
  + 美國東部 (俄亥俄)
  + 美國東部 (維吉尼亞北部)
  + 美國西部 (奧勒岡)
  + 亞太區域 (孟買)
  + 亞太區域 (首爾)
  + 亞太區域 (新加坡)
  + 亞太地區 (雪梨)
  + 亞太地區 (東京)
  + 歐洲 (法蘭克福)
  + 歐洲 (愛爾蘭)
  + 歐洲 (倫敦)
+ AWS IoT Greengrass 必須具有模型來源的`read`許可，如以下各節所述。

**SageMaker AI**  
AWS IoT Greengrass 支援儲存為 SageMaker AI 訓練任務的模型。SageMaker AI 是一項全受管 ML 服務，可讓您使用內建或自訂演算法來建置和訓練模型。如需詳細資訊，請參閱《[SageMaker AI 開發人員指南》中的什麼是](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) *SageMaker AI*？。  
如果您透過[建立名稱包含 的儲存貯](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-config-permissions.html)體來設定 SageMaker AI 環境`sagemaker`，則 AWS IoT Greengrass 具有足夠的許可來存取 SageMaker AI 訓練任務。由政策受管的 `AWSGreengrassResourceAccessRolePolicy` 允許存取名稱含有 `sagemaker` 字串的儲存貯體。此政策附屬於 [Greengrass 服務角色](service-role.md)。  
否則，您必須將許可授予 AWS IoT Greengrass `read`存放訓練任務的 儲存貯體。若要這樣做，請在服務角色中內嵌下列政策。您可以列出多個儲存貯體 ARN。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        }
    ]
}
```

**Amazon S3**  
AWS IoT Greengrass 支援以 `tar.gz`或 `.zip` 檔案儲存在 Amazon S3 中的模型。  
若要讓 AWS IoT Greengrass 存取存放在 Amazon S3 儲存貯體中的模型，您必須執行下列**其中一項**動作，授予存取儲存貯體的 AWS IoT Greengrass `read`許可：  
+ 存放模型於名稱含有 `greengrass` 的儲存貯體中。

  由政策受管的 `AWSGreengrassResourceAccessRolePolicy` 允許存取名稱含有 `greengrass` 字串的儲存貯體。此政策附屬於 [Greengrass 服務角色](service-role.md)。

   
+ 在 Greengrass 服務角色中內嵌政策。

  如果您的儲存貯體名稱不包含 `greengrass`，請將以下內嵌政策新增到服務角色中。您可以列出多個儲存貯體 ARN。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:GetObject"
              ],
              "Resource": [
                  "arn:aws:s3:::amzn-s3-demo-bucket"
              ]
          }
      ]
  }
  ```

------

  如需詳細資訊，請參閱《*IAM 使用者指南*》中的[內嵌內嵌政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#embed-inline-policy-console)。

## 要求
<a name="ml-requirements"></a>

以下要求適用於建立和使用 machine learning 資源：
+ 您必須使用 AWS IoT Greengrass Core v1.6 或更新版本。
+ 使用者定義的 Lambda 函數可以對資源執行 `read`或 `read and write`操作。不提供其他操作的權限。附屬 Lambda 函數的容器化模式會決定您如何設定存取許可。如需詳細資訊，請參閱[從 Lambda 函數存取機器學習資源](access-ml-resources.md)。
+ 在 Greengrass 核心裝置的作業系統中，您必須提供完整的資源路徑。
+ 資源名稱或 ID 字元達最大限制 128 個字元時，必須使用模式 `[a-zA-Z0-9:_-]+`。

## 適用於 ML 推論的執行時間和程式庫
<a name="ml-libraries"></a>

您可以使用下列 ML 執行時間和程式庫 AWS IoT Greengrass。
+  [Amazon SageMaker Neo 深度學習執行時間](#dlc-optimize-info) 
+ Apache MXNet
+ TensorFlow

這些執行時間和程式庫可以安裝在 NVIDIA Jetson TX2、Intel Atom 和 Raspberry Pi 平台上。如需下載資訊，請參閱 [支援的 Machine Learning 執行時間和程式庫](what-is-gg.md#ml-runtimes-libs)。您可以將其直接安裝在核心裝置上。

請務必閱讀以下相容性和限制的內容。

### SageMaker AI Neo 深度學習執行期
<a name="dlc-optimize-info"></a>

 您可以使用 SageMaker AI Neo 深度學習執行期，在 AWS IoT Greengrass 裝置上透過最佳化的機器學習模型執行推論。這些模型使用 SageMaker AI Neo 深度學習編譯器進行最佳化，以改善機器學習推論預測速度。如需 SageMaker AI 中模型最佳化的詳細資訊，請參閱 [SageMaker AI Neo 文件](https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html)。

**注意**  
 目前，您只能在特定 Amazon Web Services 區域中使用 Neo 深度學習編譯器來最佳化機器學習模型。不過，您可以在支援 AWS 區域 AWS IoT Greengrass 核心的每個 中使用 Neo 深度學習執行期與最佳化模型。如需詳細資訊，請參閱[如何設定最佳化的機器學習推論](ml-dlc-console.md)。

### MXNet 版本控制
<a name="mxnet-version-compatibility"></a>

Apache MXNet 目前不保證支援正向相容性，因此您使用較新的架構版本訓練模型時，可能會比使用舊版不順。為了避免模型訓練與模型服務階段兩者間的衝突，以及提供一致的端對端體驗，請在這兩者階段使用相同的 MXNet 架構版本。

### 在 Raspberry Pi 中的 MXNet
<a name="mxnet-engine-rpi"></a>

存取本機 MXNet 模型的 Greengrass Lambda 函數必須設定下列環境變數：

```
MXNET_ENGINE_TYPE=NativeEngine
```

您可以在函數程式碼中設定環境變數，或將其新增至特定群組函數的組態中。如需將其新增為組態設定的範例，請參閱[步驟](ml-console.md#ml-console-config-lambda)。

**注意**  
對於一般使用 MXNet 架構來說，如執行第三方程式碼範例，其環境變數必須設定在 Raspberry Pi 中。

### 在 Raspberry Pi 上的 TensorFlow 模型服務限制
<a name="tensorflow-limitations"></a>

以下是根據我們在 Raspberry Pi 平台上測試 TensorFlow 32 位元 Arm 程式庫所得結果而推論出來的改善建議。這些建議僅供進階使用者參考，不具任何保證。
+ 使用 [檢查點](https://www.tensorflow.org/guide/checkpoint)格式訓練的模型應在服務之前「凍結」為協定緩衝區格式。如需範例，請參閱 [TensorFlow-Slim 映像分類模型程式庫](https://github.com/tensorflow/models/tree/master/research/slim)。
+ 請勿在訓練或推論程式碼中使用 TF-Estimator 和 TF-Slim 程式庫。反之，請使用 `.pb` 檔案模型載入模式，如下列範例所示。

  ```
  graph = tf.Graph() 
  graph_def = tf.GraphDef()
  graph_def.ParseFromString(pb_file.read()) 
  with graph.as_default():
    tf.import_graph_def(graph_def)
  ```

**注意**  
如需 TensorFlow 支援平台的詳細資訊，請參閱 TensorFlow 文件中的[安裝 TensorFlow](https://www.tensorflow.org/install/#installing_from_sources)。

# 從 Lambda 函數存取機器學習資源
<a name="access-ml-resources"></a>

使用者定義的 Lambda 函數可以存取機器學習資源，以在 AWS IoT Greengrass 核心上執行本機推論。機器學習資源包含培訓過的模型，以及下載至核心裝置的其他成品。

若要允許 Lambda 函數存取核心上的機器學習資源，您必須將資源連接至 Lambda 函數並定義存取許可。附屬 （或*連接的*) Lambda 函數的[容器化模式](lambda-group-config.md#lambda-function-containerization)會決定您的執行方式。

## 機器學習資源的存取權限
<a name="ml-resource-permissions"></a>

從 AWS IoT Greengrass Core v1.10.0 開始，您可以定義機器學習資源的資源擁有者。資源擁有者代表 AWS IoT Greengrass 用來下載資源成品的作業系統群組和許可。如果未定義資源擁有者，則僅限根存取的下載資源成品。
+ 如果非容器化 Lambda 函數存取機器學習資源，您必須定義資源擁有者，因為容器沒有許可控制。非容器化 Lambda 函數可以繼承資源擁有者許可，並使用它們來存取資源。

   
+ 如果只有容器化 Lambda 函數存取資源，建議您使用函數層級許可，而不是定義資源擁有者。

   

### 資源擁有者屬性
<a name="ml-resource-owner"></a>

資源擁有者指定群組擁有者和群組擁有者權限。

  
**群組擁有者**。核心裝置上現有 Linux 作業系統群組的 ID (GID)。群組許可會新增至 Lambda 程序。具體而言，GID 會新增至 Lambda 函數的補充群組 IDs。  
如果 Greengrass 群組中的 Lambda 函數設定為[執行為](lambda-group-config.md#lambda-access-identity)與機器學習資源的資源擁有者相同的作業系統群組，則該資源必須連接到 Lambda 函數。否則，部署會失敗，因為此組態會提供 Lambda 函數可在 AWS IoT Greengrass 未經授權的情況下用來存取資源的隱含許可。如果 Lambda 函數以根 (UID=0) 執行，則會略過部署驗證檢查。  
我們建議您使用其他資源、Lambda 函數或 Greengrass 核心上的檔案未使用的作業系統群組。使用共用作業系統群組可讓連接的 Lambda 函數獲得比所需更多的存取許可。如果您使用共用作業系統群組，則連接的 Lambda 函數也必須連接至使用共用作業系統群組的所有機器學習資源。否則，部署會失敗。

  
**群組擁有者權限**。新增至 Lambda 程序的唯讀或讀取和寫入許可。  
非容器化 Lambda 函數必須繼承資源的這些存取許可。容器化 Lambda 函數可以繼承這些資源層級許可或定義函數層級許可。如果他們定義了函數層級權限，則權限必須與資源層級權限相同或更加嚴格。

下表顯示支援的存取權限組態。

------
#### [ GGC v1.10 or later ]


| 屬性 | 如果只有容器化 Lambda 函數存取資源 | 如果任何非容器化 Lambda 函數存取資源 | 
| --- |--- |--- |
| **函數層級屬性** | 
| --- |
| 權限 (讀取/寫入) |  除非資源定義資源擁有者，否則為必要項目。如果已定義資源擁有者，則函數層級權限必須與資源擁有者權限相同或更加嚴格。 如果只有容器化 Lambda 函數存取資源，建議您不要定義資源擁有者。  |  **非容器化 Lambda 函數：** 不支援。非容器化 Lambda 函數必須繼承資源層級許可。 **容器化 Lambda 函數：** 可選，但必須與資源層級權限相同或更加嚴格。 | 
| **資源層級屬性** | 
| --- |
| 資源擁有者 | 可選 (不建議使用)。 | 必要. | 
| 權限 (讀取/寫入) | 可選 (不建議使用)。 | 必要. | 

------
#### [ GGC v1.9 or earlier ]


| 屬性 | 如果只有容器化 Lambda 函數存取資源 | 如果任何非容器化 Lambda 函數存取資源 | 
| --- |--- |--- |
| **函數層級屬性** | 
| --- |
| 權限 (讀取/寫入) |  必要.  | 不支援。 | 
| **資源層級屬性** | 
| --- |
| 資源擁有者 | 不支援。 | 不支援。 | 
| 權限 (讀取/寫入) | 不支援。 | 不支援。 | 

------

**注意**  
當您使用 AWS IoT Greengrass API 設定 Lambda 函數和資源時，也需要函數層級`ResourceId`屬性。`ResourceId` 屬性會將機器學習資源連接至 Lambda 函數。

## 定義 Lambda 函數的存取許可 （主控台）
<a name="ml-resource-permissions-console"></a>

在 AWS IoT 主控台中，您可以在設定機器學習資源或將機器學習資源附加至 Lambda 函數時定義存取許可。

**容器化 Lambda 函數**  
如果只有容器化 Lambda 函數連接到機器學習資源：  
+ 選擇**無系統群組**做為機器學習資源的資源擁有者。當只有容器化 Lambda 函數存取機器學習資源時，建議使用此設定。否則，您可以為連接的 Lambda 函數提供更多的存取許可。

   
 

**非容器化 Lambda 函數** （需要 GGC 1.10 版或更新版本）  
如果任何非容器化 Lambda 函數連接至機器學習資源：  
+ 指定**系統群組 ID (GID)** 做為機器學習資源的資源擁有者。選擇**指定系統群組和許可**，然後輸入 GID。您可以在核心裝置上使用 `getent group`命令來查詢系統群組的 ID。

   
+ 選擇**系統群組許可**的**唯讀存取權**或**讀取和寫入存取權**。

## 定義 Lambda 函數 (API) 的存取許可
<a name="ml-resource-permissions-api"></a>

在 AWS IoT Greengrass API 中，您可以在 Lambda 函數的 `ResourceAccessPolicy` 屬性或資源的 `OwnerSetting` 屬性中定義機器學習資源的許可。

**容器化 Lambda 函數**  
如果只有容器化 Lambda 函數連接到機器學習資源：  
+ 對於容器化 Lambda 函數，請在 `ResourceAccessPolicies` 屬性的 `Permission` 屬性中定義存取許可。例如：

  ```
  "Functions": [
      {
          "Id": "my-containerized-function",
          "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", 
          "FunctionConfiguration": {
              "Environment": {
                  "ResourceAccessPolicies": [
                      { 
                          "ResourceId": "my-resource-id",
                          "Permission": "ro-or-rw"
                      }
                  ]
              }, 
              "MemorySize": 512, 
              "Pinned": true, 
              "Timeout": 5
          }
      }
  ]
  ```
+ 對於機器學習資源，請省略 `OwnerSetting` 屬性。例如：

  ```
  "Resources": [
      {
          "Id": "my-resource-id",
          "Name": "my-resource-name",
          "ResourceDataContainer": {
              "S3MachineLearningModelResourceData": {
                  "DestinationPath": "/local-destination-path",
                  "S3Uri": "s3://uri-to-resource-package"
              }
          }
      }
  ]
  ```

  當只有容器化 Lambda 函數存取機器學習資源時，建議使用此組態。否則，您可以為連接的 Lambda 函數提供更多的存取許可。
 

**非容器化 Lambda 函數** （需要 GGC 1.10 版或更新版本）  
如果任何非容器化 Lambda 函數連接至機器學習資源：  
+ 對於非容器化 Lambda 函數，請省略 中的 `Permission` 屬性`ResourceAccessPolicies`。此設定是必要的，並允許函數繼承資源層級權限。例如：

  ```
  "Functions": [
      {
          "Id": "my-non-containerized-function",
          "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", 
          "FunctionConfiguration": {
              "Environment": {
                  "Execution": {
                      "IsolationMode": "NoContainer",
                  },            
                  "ResourceAccessPolicies": [
                      { 
                          "ResourceId": "my-resource-id"
                      }
                  ]
              }, 
              "Pinned": true, 
              "Timeout": 5
          }
      }
  ]
  ```
+ 對於也存取機器學習資源的容器化 Lambda 函數，請省略 中的 `Permission` 屬性，`ResourceAccessPolicies`或定義與資源層級許可相同或更嚴格的許可。例如：

  ```
  "Functions": [
      {
          "Id": "my-containerized-function",
          "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", 
          "FunctionConfiguration": {
              "Environment": {
                  "ResourceAccessPolicies": [
                      { 
                          "ResourceId": "my-resource-id",
                          "Permission": "ro-or-rw" // Optional, but cannot exceed the GroupPermission defined for the resource.
                      }
                  ]
              }, 
              "MemorySize": 512, 
              "Pinned": true, 
              "Timeout": 5
          }
      }
  ]
  ```
+ 對於機器學習資源，定義 `OwnerSetting` 屬性，包括子項 `GroupOwner` 和 `GroupPermission` 屬性。例如：

  ```
  "Resources": [
      {
          "Id": "my-resource-id",
          "Name": "my-resource-name",
          "ResourceDataContainer": {
              "S3MachineLearningModelResourceData": {
                  "DestinationPath": "/local-destination-path",
                  "S3Uri": "s3://uri-to-resource-package",
                  "OwnerSetting": { 
                      "GroupOwner": "os-group-id",
                      "GroupPermission": "ro-or-rw"
                  }
              }
          }
      }
  ]
  ```

## 從 Lambda 函數程式碼存取機器學習資源
<a name="access-resource-function-code"></a>

使用者定義的 Lambda 函數使用平台特定的作業系統介面來存取核心裝置上的機器學習資源。

------
#### [ GGC v1.10 or later ]

對於容器化 Lambda 函數，資源會掛載在 Greengrass 容器內，並可在為資源定義的本機目的地路徑中使用。對於非容器化 Lambda 函數，資源會符號連結到 Lambda 特定的工作目錄，並在 Lambda 程序中傳遞至`AWS_GG_RESOURCE_PREFIX`環境變數。

為了取得機器學習資源下載成品的路徑，Lambda 函數會將`AWS_GG_RESOURCE_PREFIX`環境變數附加至為資源定義的本機目的地路徑。對於容器化 Lambda 函數，傳回的值是單一正斜線 (`/`)。

```
resourcePath = os.getenv("AWS_GG_RESOURCE_PREFIX") + "/destination-path"
with open(resourcePath, 'r') as f:
    # load_model(f)
```

------
#### [ GGC v1.9 or earlier ]

機器學習資源的下載成品位於為資源定義的本機目的地路徑中。只有容器化 Lambda 函數可以存取 Core v1.9 和更早版本的 AWS IoT Greengrass 機器學習資源。

```
resourcePath = "/local-destination-path"
with open(resourcePath, 'r') as f:
    # load_model(f)
```

------

模型載入實作取決於您的 ML 程式庫。

## 疑難排解
<a name="access-ml-resources-troubleshooting"></a>

使用下列資訊，協助疑難排解存取機器學習資源的問題。

**Topics**
+ [InvalidMLModelOwner - GroupOwnerSetting 在 ML 模型資源中提供，但是 GroupOwner 或 GroupPermission 不存在](#nocontainer-lambda-invalid-ml-model-owner)
+ [附加 Machine Learning 資源時，NoContainer 函數無法設定權限。<function-arn> 係指在資源存取政策中，具有權限 <ro/rw> 的 Machine Learning 資源 <resource-id>。](#nocontainer-lambda-invalid-resource-access-policy)
+ [函數 <function-arn> 係指在資源 <resource-id> ResourceAccessPolicy 和資源 OwnerSetting 中具有遺失權限的 Machine Learning 資源。](#nocontainer-lambda-missing-access-permission)
+ [函數 <function-arn> 係指具有 \$1"rw\$1" 權限的 Machine Learning 資源 <resource-id>，而資源擁有者設定 GroupPermission 只允許 \$1"ro\$1"。](#container-lambda-invalid-rw-permissions)
+ [NoContainer 函數 <function-arn> 係指巢狀目的地路徑的資源。](#nocontainer-lambda-nested-destination-path)
+ [Lambda <function-arn> 透過共用相同群組擁有者 ID 來獲得資源 <resource-id> 的存取權](#lambda-runas-and-resource-owner)

### InvalidMLModelOwner - GroupOwnerSetting 在 ML 模型資源中提供，但是 GroupOwner 或 GroupPermission 不存在
<a name="nocontainer-lambda-invalid-ml-model-owner"></a>

**解決方案：**如果機器學習資源包含 [ResourceDownloadOwnerSetting](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-resourcedownloadownersetting.html) 物件，但未定義必要的 `GroupOwner` 或 `GroupPermission` 屬性，便會收到此錯誤訊息。若要解決此問題，請定義遺失的屬性。

 

### 附加 Machine Learning 資源時，NoContainer 函數無法設定權限。<function-arn> 係指在資源存取政策中，具有權限 <ro/rw> 的 Machine Learning 資源 <resource-id>。
<a name="nocontainer-lambda-invalid-resource-access-policy"></a>

**解決方案：**如果非容器化 Lambda 函數指定機器學習資源的函數層級許可，您會收到此錯誤。非容器化函數必須從機器學習資源上定義的資源擁有者權限繼承權限。若要解決此問題，請選擇[繼承資源擁有者許可](#non-container-config-console) （主控台）[，或從 Lambda 函數的資源存取政策 (API) 移除許可](#non-container-config-api)。

 

### 函數 <function-arn> 係指在資源 <resource-id> ResourceAccessPolicy 和資源 OwnerSetting 中具有遺失權限的 Machine Learning 資源。
<a name="nocontainer-lambda-missing-access-permission"></a>

**解決方案：**如果未針對連接的 Lambda 函數或資源設定機器學習資源的許可，您會收到此錯誤。若要解決此問題，請在 Lambda 函數的 [ResourceAccessPolicy](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-resourceaccesspolicy.html) 屬性或資源的 [OwnerSetting](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-ownersetting.html) 屬性中設定許可。

 

### 函數 <function-arn> 係指具有 \$1"rw\$1" 權限的 Machine Learning 資源 <resource-id>，而資源擁有者設定 GroupPermission 只允許 \$1"ro\$1"。
<a name="container-lambda-invalid-rw-permissions"></a>

**解決方案：**如果為連接的 Lambda 函數定義的存取許可超過為機器學習資源定義的資源擁有者許可，您會收到此錯誤。若要解決此問題，請為 Lambda 函數設定更嚴格的許可，或為資源擁有者設定較不嚴格的許可。

 

### NoContainer 函數 <function-arn> 係指巢狀目的地路徑的資源。
<a name="nocontainer-lambda-nested-destination-path"></a>

**解決方案：**如果連接到非容器化 Lambda 函數的多個機器學習資源使用相同的目的地路徑或巢狀目的地路徑，則會收到此錯誤。若要解決此問題，請為資源指定個別目的地路徑。

 

### Lambda <function-arn> 透過共用相同群組擁有者 ID 來獲得資源 <resource-id> 的存取權
<a name="lambda-runas-and-resource-owner"></a>

**解決方案：**`runtime.log`如果將相同的作業系統群組指定為 Lambda 函數的 [Run as](lambda-group-config.md#lambda-access-identity) identity 和機器學習[資源的資源擁有者](#ml-resource-owner)，但資源未連接至 Lambda 函數，您會在 中收到此錯誤。此組態提供 Lambda 函數隱含許可，其可在未經授權的情況下用來存取資源 AWS IoT Greengrass 。

若要解決此問題，請針對其中一個屬性使用不同的作業系統群組，或將機器學習資源連接至 Lambda 函數。

## 另請參閱
<a name="access-ml-resources-see-also"></a>
+ [執行機器學習推論](ml-inference.md)
+ [如何使用 設定機器學習推論 AWS 管理主控台](ml-console.md)
+ [如何使用 設定最佳化機器學習推論 AWS 管理主控台](ml-dlc-console.md)
+ [AWS IoT Greengrass Version 1 API 參考](https://docs.aws.amazon.com/greengrass/v1/apireference/api-doc.html)

# 如何使用 設定機器學習推論 AWS 管理主控台
<a name="ml-console"></a>

若要遵循本教學課程中的步驟，您需要 AWS IoT Greengrass Core v1.10 或更新版本。

您可以在 Greengrass 核心裝置本機上使用本機產生的資料來執行機器學習 (ML) 推論。如需要求和限制的詳細資訊，請參閱 [執行機器學習推論](ml-inference.md)。

本教學課程說明如何使用 AWS 管理主控台 來設定 Greengrass 群組，以執行 Lambda 推論應用程式，在本機辨識攝影機的影像，而無需將資料傳送至雲端。推論應用程式在 Raspberry Pi 存取攝影機模組，並使用開放來源 [SqueezeNet](https://github.com/DeepScale/SqueezeNet) 模型推論。

本教學課程所述以下高階執行步驟：

1. [設定 Raspberry Pi](#config-raspberry-pi)

1. [安裝 MXNet 架構](#install-mxnet)

1. [建立模型套件](#package-ml-model)

1. [建立和發佈 Lambda 函數](#ml-console-create-lambda)

1. [將 Lambda 函數新增至群組](#ml-console-config-lambda)

1. [新增資源到群組](#ml-console-add-resources)

1. [新增訂閱到群組](#ml-console-add-subscription)

1. [部署群組](#ml-console-deploy-group)

1. [測試應用程式](#ml-console-test-app)

## 先決條件
<a name="ml-inference-prerequisites"></a>

為完成此教學課程您需要：
+ Raspberry Pi 4 模型 B 或 Raspberry Pi 3 模型 B/B\$1，設定與 搭配使用 AWS IoT Greengrass。若要使用 設定 Raspberry Pi AWS IoT Greengrass，請執行 [Greengrass 裝置設定](quick-start.md)指令碼，或確認您已完成 的[單元 1](https://docs.aws.amazon.com/greengrass/latest/developerguide/module1.html) 和[單元 2](https://docs.aws.amazon.com/greengrass/latest/developerguide/module2.html)[入門 AWS IoT Greengrass](gg-gs.md)。
**注意**  
Raspberry Pi 可能需要 2.5A [電源供應器](https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/)來執行通常用於影像分類的深度學習架構。額定值較低的電源供應器可能會導致裝置重新啟動。
+ [Raspberry Pi 攝影機模組 V2 - 8 百萬像素、1080p](https://www.amazon.com/Raspberry-Pi-Camera-Module-Megapixel/dp/B01ER2SKFS)。如需如何設定攝影機的資訊，請參閱 Raspberry Pi 文件中的[連接攝影機](https://www.raspberrypi.org/documentation/usage/camera/)。
+ Greengrass 群組和 Greengrass 核心。如需如何建立 Greengrass 群組或核心的詳細資訊，請參閱 [入門 AWS IoT Greengrass](gg-gs.md)。

**注意**  
本教學課程使用 Raspberry Pi，但 AWS IoT Greengrass 支援其他平台，例如 [Intel Atom](#atom-lambda-config) 和 [NVIDIA Jetson TX2](#jetson-lambda-config)。在 Jetson TX2 的範例中，您可以使用靜態影像，而非相機的串流影像。如果使用 Jetson TX2 範例，您可能需要安裝 Python 3.6 而不是 Python 3.7。如需有關設定裝置以便您可以安裝 AWS IoT Greengrass 核心軟體的資訊，請參閱 [設定其他裝置](setup-filter.other.md)。  
對於 AWS IoT Greengrass 不支援 的第三方平台，您必須在非容器化模式下執行 Lambda 函數。若要在非容器化模式下執行，您必須以根身分執行 Lambda 函數。如需詳細資訊，請參閱[選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)及[為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。

## 步驟一：設定 Raspberry Pi
<a name="config-raspberry-pi"></a>

在此步驟中，請安裝 Raspbian 作業系統的更新、安裝相機模組軟體和 Python 相依性，以及啟用相機界面。

在您的 Raspberry Pi 終端機執行以下命令。

1. 安裝 Raspbian 的更新。

   ```
   sudo apt-get update
   sudo apt-get dist-upgrade
   ```

1. <a name="install-picamera-step"></a>安裝攝影機模組的 `picamera` 界面和本單元其他所需的 Python 程式庫。

   ```
   sudo apt-get install -y python3-dev python3-setuptools python3-pip python3-picamera
   ```

   驗證安裝：
   + 確保您的 Python 3.7 安裝包含 pip。

     ```
     python3 -m pip
     ```

     如果未安裝 pip，請從 [pip 網站](https://pip.pypa.io/en/stable/installing/)下載它，然後執行以下命令。

     ```
     python3 get-pip.py
     ```
   + 請確保您的 Python 版本是 3.7 或更高版本。

     ```
     python3 --version
     ```

     如果輸出中列出較早的版本，請執行下列命令。

     ```
     sudo apt-get install -y python3.7-dev
     ```
   + 請確定 Setuptools 和 Picamera 已安裝成功。

     ```
     sudo -u ggc_user bash -c 'python3 -c "import setuptools"'
     sudo -u ggc_user bash -c 'python3 -c "import picamera"'
     ```

     如果輸出中未包含錯誤，則表示驗證成功。
**注意**  
如果裝置上安裝的 Python 可執行檔是 `python3.7`，請針對本教學課程中的命令使用 `python3.7` 而不是 `python3`。確保您的 pip 安裝對應到正確的 `python3.7` 或 `python3` 版本，以避免相依性錯誤。

1. 重新啟動 Raspberry Pi。

   ```
   sudo reboot
   ```

1. 請開啟 Raspberry Pi 組態工具。

   ```
   sudo raspi-config
   ```

1. 請使用箭頭鍵開啟 **Interfacing Options (連接選項)** 並啟用攝影機界面。如果出現提示，請允許重新啟動裝置。

1. 請使用以下命令測試攝影機建立。

   ```
   raspistill -v -o test.jpg
   ```

   這會在 Raspberry Pi 上開啟預覽視窗、將名為 `test.jpg` 的圖片儲存至現行目錄，並在 Raspberry Pi 終端機中顯示相機的相關資訊。

## 步驟 2：安裝 MXNet 架構
<a name="install-mxnet"></a>

在此步驟中，請於 Raspberry Pi 上安裝 MXNet 程式庫。

1. <a name="ssh-rpi-step"></a>遠端登入到 Raspberry Pi。

   ```
   ssh pi@your-device-ip-address
   ```

1. 開啟 MXNet 文件、開啟[安裝 MXNet](https://mxnet.apache.org/get_started/?)，然後依照指示在裝置上安裝 MXNet。
**注意**  
我們建議您安裝 1.5.0 版，並從本教學課程的來源建置 MXNet，以避免裝置衝突。

1. 安裝 MXNet 之後，請驗證下列組態：
   + 確定 `ggc_user` 系統帳戶可以使用 MXNet 架構。

     ```
     sudo -u ggc_user bash -c 'python3 -c "import mxnet"'
     ```
   + 確保已安裝 NumPy。

     ```
     sudo -u ggc_user bash -c 'python3 -c "import numpy"'
     ```

## 步驟 3：建立 MXNet 模型套件
<a name="package-ml-model"></a>

在此步驟中，建立模型套件，其中包含要上傳至 Amazon Simple Storage Service (Amazon S3) 的範例預先訓練 MXNet 模型。 AWS IoT Greengrass 可以使用來自 Amazon S3 的模型套件，前提是您使用 tar.gz 或 zip 格式。

1. 在您的電腦上，從 [機器學習範例](what-is-gg.md#gg-ml-samples) 下載 Raspberry Pi 的 MXNet 範例。

1.  解壓縮所下載的 `mxnet-py3-armv7l.tar.gz` 檔案。

1. 導覽至 `squeezenet` 目錄。

   ```
   cd path-to-downloaded-sample/mxnet-py3-armv7l/models/squeezenet
   ```

   此目錄中的 `squeezenet.zip` 檔案是您的模型套件。其包含影像分類模型的 SqueezeNet 開放原始碼模型成品。稍後，您將此模型套件上傳到 Amazon S3。

## 步驟 4：建立和發佈 Lambda 函數
<a name="ml-console-create-lambda"></a>

在此步驟中，建立 Lambda 函數部署套件和 Lambda 函數。然後，發佈函數版本和建立別名。

首先，建立 Lambda 函數部署套件。

1. 在您的電腦上，瀏覽至您在 [步驟 3：建立 MXNet 模型套件](#package-ml-model) 中解壓縮的範例套件內的 `examples` 目錄。

   ```
   cd path-to-downloaded-sample/mxnet-py3-armv7l/examples
   ```

   `examples` 目錄包含函數程式碼和相依性。
   + `greengrassObjectClassification.py` 是本教學課程中使用的推論程式碼。您可以使用此程式碼作為範本來建立您自己的推論函數。
   + <a name="ml-samples-ggc-sdk"></a>`greengrasssdk` 是適用於 Python 的核心 AWS IoT Greengrass SDK 的 1.5.0 版。
**注意**  <a name="ml-samples-ggc-sdk-upgrade"></a>
如果有新版本可用，您可以下載並升級部署套件中的 SDK 版本。如需詳細資訊，請參閱 GitHub 上的[AWS IoT Greengrass 適用於 Python 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-python/)。

1.  將 `examples` 目錄的內容壓縮成名為 `greengrassObjectClassification.zip` 的檔案。這是您的部署套件。

   ```
   zip -r greengrassObjectClassification.zip .
   ```
**注意**  <a name="ml-samples-function-zip"></a>
 確保 `.py` 檔案和相依性皆位於目錄的根中。

    

   接著，建立 Lambda 函數。

1. 從 AWS IoT 主控台中，選擇**函數**和**建立函數**。

1. 選擇**從頭開始撰寫**，並使用下列值來建立函數：
   + 針對**函數名稱**，請輸入 **greengrassObjectClassification**。
   + 針對**執行期**，選擇 **Python 3.7**。

   對於**許可**，請保留預設設定。這會建立授予基本 Lambda 許可的執行角色。不會使用此角色 AWS IoT Greengrass。

1. 選擇**建立函數**。

    

   現在，上傳您的 Lambda 函數部署套件並註冊處理常式。

1. 選擇您的 Lambda 函數並上傳 Lambda 函數部署套件。

   1. <a name="lambda-console-upload"></a>在**程式碼**索引標籤的**程式碼來源**下，選擇**上傳來源**。從下拉式清單中，選擇 **.zip 檔案**。  
![\[從下拉式清單上傳，並反白顯示 .zip 檔案。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. 選擇**上傳**，然後選擇您的`greengrassObjectClassification.zip`部署套件。然後選擇 **Save (儲存)**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函數的**程式碼**索引標籤的**執行時間設定**下，選擇**編輯**，然後輸入下列值。
      + 針對**執行期**，選擇 **Python 3.7**。
      + 對於 **Handler (處理常式)**，輸入 **greengrassObjectClassification.function\$1handler**。

      選擇**儲存**。

   接著，發佈 Lambda 函數的第一個版本。然後，建立[版本的別名](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)。
**注意**  
Greengrass 群組可以依別名 （建議） 或版本參考 Lambda 函數。使用別名可讓您更輕鬆地管理程式碼更新，因為您不必在更新函數程式碼時變更訂閱資料表或群組定義。反之，您只需將別名指向新的函數版本。

1. 請從**操作**功能表中選擇**發行新版本**。  
![\[從功能表中選擇發行新版本的選項\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-inference/lambda-publish-version.png)

1. 針對 **Version description (版本描述)**，輸入 **First version**，然後選擇 **Publish (發佈)**。

1. 於 **greengrassObjectClassification: 1** 組態頁面，從**操作**功能表中選擇**建立別名**。  
![\[從操作功能表中選擇建立別名的選項。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-inference/lambda-create-alias.png)

1. 在**建立警示**頁面上使用下列值：
   + 對於**名稱**，輸入 **mlTest**。
   + 針對 **Version (版本)** 輸入 **1**。
**注意**  
AWS IoT Greengrass 不支援 **\$1LATEST** 版本的 Lambda 別名。

1. 選擇**儲存**。

    

   現在，將 Lambda 函數新增至 Greengrass 群組。

## 步驟 5：將 Lambda 函數新增至 Greengrass 群組
<a name="ml-console-config-lambda"></a>

在此步驟中，將 Lambda 函數新增至 群組，然後設定其生命週期和環境變數。

首先，將 Lambda 函數新增至 Greengrass 群組。

1. 在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. 從群組組態頁面，選擇 **Lambda 函數**索引標籤。

1. 在**我的 Lambda 函數**區段下，選擇**新增**。

1. 針對 **Lambda 函數**，選擇 **greengrassObjectClassification**。

1. 針對 **Lambda 函數版本**，選擇 **Alias：mlTest**。

    

   接著，設定 Lambda 函數的生命週期和環境變數。

1. 在 **Lambda 函數組態**區段中，進行下列更新。
**注意**  
建議您在沒有容器化的情況下執行 Lambda 函數，除非您的業務案例需要。這有助於啟用裝置 GPU 和攝影機的存取，而無需設定裝置資源。如果您在沒有容器化的情況下執行 ，您還必須授予 AWS IoT Greengrass Lambda 函數的根存取權。

   1. **若要在沒有容器化的情況下執行 ：**
      + 針對**系統使用者和群組**，選擇 **Another user ID/group ID**。針對**系統使用者 ID**，輸入 **0**。針對**系統群組 ID**，輸入 **0**。

        這可讓您的 Lambda 函數以根執行。如需以根身分執行的詳細資訊，請參閱 [為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。
**提示**  
您也必須更新 `config.json` 檔案，以授予 Lambda 函數的根存取權。如需此程序，請參閱 [執行 Lambda 函數做為根](lambda-group-config.md#lambda-running-as-root)。
      + 針對 **Lambda 函數容器化**，選擇**無容器**。

        如需在沒有容器化的情況下執行 的詳細資訊，請參閱 [選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)。
      + 針對 **Timeout (逾時)**，輸入 **10 seconds**。
      + 針對**固定**，選擇 **True**。

        如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。

   1.  **改為在容器化模式下執行：**
**注意**  
除非您的商業案例需要，否則我們不建議在容器化模式下執行。
      + 針對**系統使用者和群組**，選擇**使用群組預設值**。
      + 針對 **Lambda 函數容器化**，選擇**使用群組預設值**。
      + 針對 **Memory limit (記憶體限制)**，輸入 **96 MB**。
      + 針對 **Timeout (逾時)**，輸入 **10 seconds**。
      + 針對**固定**，選擇 **True**。

        如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。

1. 在 **Environment variables (環境變數)** 下，建立索引鍵值對。與 Raspberry Pi 上 MXNet 模型互動的函數需要索引鍵/值組。

   對於該索引鍵，請使用 MXNET\$1ENGINE\$1TYPE。對於此值，請使用 NaiveEngine。
**注意**  
在您自己的使用者定義 Lambda 函數中，您可以選擇在函數程式碼中設定環境變數。

1. 保留所有其他屬性的預設值，然後選擇**新增 Lambda 函數**。

## 步驟 6：新增資源到 Greengrass 群組
<a name="ml-console-add-resources"></a>

在此步驟中，為攝影機模組和 ML 推論模型建立資源，並將資源與 Lambda 函數建立關聯。這可讓 Lambda 函數存取核心裝置上的資源。

**注意**  
如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取您的裝置 GPU 和攝影機，而無需設定這些裝置資源。

首先，為攝影機資源建立兩個本機裝置：一個使用共用記憶體，另一個使用裝置界面。如需本機資源存取的詳細資訊，請參閱[使用 Lambda 函數和連接器存取本機資源](access-local-resources.md)。

1. 在群組組態頁面上，選擇**資源**索引標籤。

1. 在**本機資源**區段中，選擇**新增本機資源**。

1. 在**新增本機資源**頁面上，使用下列值：
   + 針對**資源名稱**，輸入 **videoCoreSharedMemory**。
   + 於**資源類型**選擇**裝置**。
   + 針對**本機裝置路徑**，輸入 **/dev/vcsm**。

     裝置路徑為裝置資源的本機絕對路徑。此路徑只能參閱 `/dev` 底下的字元裝置或區塊型儲存設備。
   + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

     **系統群組擁有者和檔案存取許可**選項可讓您將其他檔案存取許可授予 Lambda 程序。如需詳細資訊，請參閱[群組擁有者檔案存取許可](access-local-resources.md#lra-group-owner)。

1. 接著，請您新增本機裝置資源給攝影機界面的資源。

1. 選擇**新增本機資源**。

1. 在**新增本機資源**頁面上，使用下列值：
   + 針對**資源名稱**，輸入 **videoCoreInterface**。
   + 於**資源類型**選擇**裝置**。
   + 針對**本機裝置路徑**，輸入 **/dev/vchiq**。
   + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

1. 在頁面底部，選擇**新增資源**。

 

現在，請將推論模型做為機器學習資源。此步驟包含將`squeezenet.zip`模型套件上傳至 Amazon S3。

1. 在群組**的資源**索引標籤的**Machine Learning**區段下，選擇**新增機器學習資源**。

1. 在**新增機器學習資源**頁面上，針對**資源名稱**輸入 **squeezenet\$1model**。

1. 針對**模型來源**，選擇**使用存放在 S3 中的模型，例如透過深度學習編譯器最佳化的模型**。

1. 針對 **S3 URI**，輸入儲存 S3 儲存貯體的路徑。

1.  選擇 **Browse S3** (瀏覽 S3)。這會開啟 Amazon S3 主控台的新標籤。

1.  在 Amazon S3 主控台索引標籤上，將`squeezenet.zip`檔案上傳至 S3 儲存貯體。如需詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[如何將檔案和資料夾上傳至 S3 儲存貯體？](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)。
**注意**  
若要存取 S3 儲存貯體，您的儲存貯體名稱必須包含 字串，**greengrass**且儲存貯體必須位於您使用的相同區域 AWS IoT Greengrass。選擇唯一名稱 (例如 **greengrass-bucket-*user-id*-*epoch-time***)。請勿在儲存貯體名稱中使用句號 (`.`)。

1. 在 AWS IoT Greengrass 主控台索引標籤上，尋找並選擇您的 S3 儲存貯體。尋找您已上傳的 `squeezenet.zip` 檔案，然後選擇 **Select (選取)**。您可能需要選擇 **Refresh (重新整理)** 以更新可用儲存貯體和檔案的清單。

1. 針對 **Destination path (目的地路徑)**，輸入 **/greengrass-machine-learning/mxnet/squeezenet**。

   這是 Lambda 執行時間命名空間中本機模型的目的地。部署群組時， 會 AWS IoT Greengrass 擷取來源模型套件，然後將內容擷取至指定的目錄。此教學課程的範例 Lambda 函數已設定為使用此路徑 （在 `model_path`變數中）。

1. 在**系統群組擁有者和檔案存取許可**下，選擇**無系統群組**。

1. 選擇 **Add resource (新增資源)**。

### 使用 SageMaker AI 訓練的模型
<a name="sm-models"></a>

本教學課程使用存放在 Amazon S3 中的模型，但您也可以輕鬆使用 SageMaker AI 模型。 AWS IoT Greengrass 主控台具有內建的 SageMaker AI 整合，因此您不需要手動將這些模型上傳至 Amazon S3。如需使用 SageMaker AI 模型的要求和限制，請參閱[支援的模型來源](ml-inference.md#supported-model-sources)。

若要使用 SageMaker AI 模型：
+ 針對**模型來源**，選擇**使用在 SageMaker AI 中 AWS 訓練的模型**，然後選擇模型訓練任務的名稱。
+ 針對**目的地路徑**，輸入 Lambda 函數尋找模型的目錄路徑。

## 步驟 7：新增訂閱到 Greengrass 群組
<a name="ml-console-add-subscription"></a>

在此步驟中，新增訂閱到群組。此訂閱可讓 Lambda 函數 AWS IoT 透過發佈至 MQTT 主題，將預測結果傳送至 。

1. 在群組組態頁面上，選擇**訂閱**索引標籤，然後選擇**新增訂閱**。

1. 在**訂閱詳細資訊**頁面上，設定來源和目標，如下所示：

   1. 在**來源類型**中，選擇 **Lambda 函數**，然後選擇 **greengrassObjectClassification**。

   1. 在**目標類型**中，選擇**服務**，然後選擇 **IoT 雲端**。

1. 在**主題篩選條件**中，輸入 **hello/world**，然後選擇**建立訂閱**。

## 步驟 8：部署 Greengrass 群組
<a name="ml-console-deploy-group"></a>

在此步驟中，將群組定義的目前版本部署到 Greengrass 核心裝置。定義包含您新增的 Lambda 函數、資源和訂閱組態。

1. 確定 AWS IoT Greengrass 核心正在執行。如果需要，請在您的 Raspberry Pi 終端機執行以下命令。

   1. 檢查精靈是否有在運作：

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      若輸出的 `root` 含有 `/greengrass/ggc/packages/1.11.6/bin/daemon` 項目，則精靈有在運作。
**注意**  
路徑中的版本取決於核心裝置上安裝的核心 AWS IoT Greengrass 軟體版本。

   1. 若要啟動協助程式：

      ```
      cd /greengrass/ggc/core/
      sudo ./greengrassd start
      ```

1. 在群組組態頁面上，選擇**部署**。  
![\[此群組頁面反白顯示 [Deployment (部署)] 和 [Deploy (部署)]。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/console-group-deployments-deploy.png)

1. 在 **Lambda 函數**索引標籤**的系統 Lambda 函數**區段下，選取 **IP 偵測器**，然後選擇**編輯**。

1. 在**編輯 IP 偵測器設定**對話方塊中，選取**自動偵測和覆寫 MQTT 代理程式端點**。

1. 選擇**儲存**。

   這可讓裝置自動取得核心的連接資訊，例如 IP 位址、DNS、連接埠編號。建議自動偵測，但 AWS IoT Greengrass 也支援手動指定的端點。只會在第一次部署群組時收到復原方法的提示。
**注意**  
如果出現提示，請授予許可來建立 [Greengrass 服務角色](service-role.md)，並將其與目前 AWS 帳戶 中的 建立關聯 AWS 區域。此角色允許 AWS IoT Greengrass 存取 AWS 服務中的資源。

   此**部署**頁面會顯示部署時間戳記、版本 ID 和狀態。完成後，部署顯示的狀態應為**已完成**。

   如需有關部署的詳細資訊，請參閱 [將 AWS IoT Greengrass 群組部署至 AWS IoT Greengrass 核心](deployments.md)。如需故障診斷協助，請參閱[故障診斷 AWS IoT Greengrass](gg-troubleshooting.md)。

## 步驟 9：測試推論應用程式
<a name="ml-console-test-app"></a>

現在您可以驗證部署是否已正確設定。若要測試，您可以訂閱`hello/world`主題，並檢視 Lambda 函數發佈的預測結果。

**注意**  
如果 Raspberry Pi 附加監控功能，即時攝影機反饋會顯示在預覽視窗中。

1. 在 AWS IoT 主控台的測試下****，選擇 **MQTT 測試用戶端**。

1. 於**訂閱**使用以下值：
   + 對於訂閱主題，請使用 hello/world。
   + **在其他組態**下，針對 **MQTT 承載顯示**，選擇將**承載顯示為字串**。

1. 選擇 **Subscribe (訂閱)**。

   如果測試成功，來自 Lambda 函數的訊息會出現在頁面底部。每個訊息含有搜尋映像的前 5 個預測結果，使用格式：成功率、預估類別 ID，和對應的類別名稱。  
![\[訂閱頁面顯示測試結果的訊息資料。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-inference/prediction-results.png)

### 針對 AWS IoT Greengrass ML 推論進行故障診斷
<a name="ml-inference-troubleshooting"></a>

如果測試不成功，您可以嘗試以下故障診斷的步驟。請在您的 Raspberry Pi 終端機執行此命令。

#### 檢查錯誤日誌
<a name="troubleshooting-check-logs"></a>

1. <a name="root-access-logs"></a>切換到根使用者和導覽至 `log` 目錄。存取 AWS IoT Greengrass 日誌需要根許可。

   ```
   sudo su
   cd /greengrass/ggc/var/log
   ```

1. 在 `system` 目錄中，勾選 `runtime.log` 或 `python_runtime.log`。

   在 `user/region/account-id` 目錄中，勾選 `greengrassObjectClassification.log`。

   如需詳細資訊，請參閱[日誌故障診斷](gg-troubleshooting.md#troubleshooting-logs)。

##### Runtime.log 中的「解壓縮」錯誤
<a name="troubleshooting-targz-unpacking"></a>

若 `runtime.log` 包含類似以下的錯誤，請確認您的 `tar.gz` 來源模型套件有一個父目錄。

```
Greengrass deployment error: unable to download the artifact model-arn: Error while processing. 
Error while unpacking the file from /tmp/greengrass/artifacts/model-arn/path to /greengrass/ggc/deployment/path/model-arn,
error: open /greengrass/ggc/deployment/path/model-arn/squeezenet/squeezenet_v1.1-0000.params: no such file or directory
```

如果您的套件沒有含有模型檔案的主目錄，請使用以下命令重新封裝模型：

```
tar -zcvf model.tar.gz ./model
```

例如：

```
─$ tar -zcvf test.tar.gz ./test
./test
./test/some.file
./test/some.file2
./test/some.file3
```

**注意**  
此命令結尾請勿含有 `/*`。

 

#### 確認 Lambda 函數已成功部署
<a name="troubleshooting-check-lambda"></a>

1. 在 `/lambda`目錄中列出已部署 Lambda 的內容。先執行命令，再取代預留位置值。

   ```
   cd /greengrass/ggc/deployment/lambda/arn:aws:lambda:region:account:function:function-name:function-version
   ls -la
   ```

1. 驗證目錄是否包含與您在 中上傳的`greengrassObjectClassification.zip`部署套件相同的內容[步驟 4：建立和發佈 Lambda 函數](#ml-console-create-lambda)。

   確保 `.py` 檔案和相依性皆位於目錄的根中。

 

#### 驗證推論模型已成功部署
<a name="troubleshooting-check-model"></a>

1. 尋找 Lambda 執行時間程序的程序識別號碼 (PID)：

   ```
   ps aux | grep 'lambda-function-name*'
   ```

   在輸出中，PID 會出現在 Lambda 執行時間程序行的第二欄。

1. 輸入 Lambda 執行時間命名空間。執行命令前，務必先取代預留位置 *pid* 值。
**注意**  
此目錄及其內容位於 Lambda 執行時間命名空間中，因此不會在一般 Linux 命名空間中顯示。

   ```
   sudo nsenter -t pid -m /bin/bash
   ```

1. 列出您為機器學習資源所指定的本機目錄內容。

   ```
   cd /greengrass-machine-learning/mxnet/squeezenet/
   ls -ls
   ```

   您會看到以下檔案：

   ```
   32 -rw-r--r-- 1 ggc_user ggc_group   31675 Nov 18 15:19 synset.txt
   32 -rw-r--r-- 1 ggc_user ggc_group   28707 Nov 18 15:19 squeezenet_v1.1-symbol.json
   4832 -rw-r--r-- 1 ggc_user ggc_group 4945062 Nov 18 15:19 squeezenet_v1.1-0000.params
   ```

## 後續步驟
<a name="next-steps"></a>

接下來，探索其他推論應用程式。 AWS IoT Greengrass 提供可用於嘗試本機推論的其他 Lambda 函數。您可以在 [步驟 2：安裝 MXNet 架構](#install-mxnet) 的預先編譯程式庫資料中夾找到範例套件。

## 設定 Intel Atom
<a name="atom-lambda-config"></a>

 若要在 Intel Atom 裝置上執行此教學課程，您必須提供來源映像、設定 Lambda 函數，以及新增另一個本機裝置資源。若要使用 GPU 進行推論，請確定裝置上已安裝下列軟體：
+ OpenCL 1.0 版或更高版本
+ Python 3.7 和 pip
**注意**  
如果您的裝置是用 Python 3.6 預先建置的，則可以改為建立 Python 3.7 的符號連結。如需詳細資訊，請參閱[Step 2](#python-symlink)。
+ [NumPy](https://pypi.org/project/numpy/)
+ [OpenCV on Wheels](https://pypi.org/project/opencv-python/)

1. 下載 Lambda 函數的靜態 PNG 或 JPG 影像，以用於影像分類。此範例最適合與小型映像檔案一同運作。

   儲存含有 `greengrassObjectClassification.py` 檔案 (或於該目錄的子目錄中)目錄中的映像檔案。這是您在 中上傳的 Lambda 函數部署套件。 [步驟 4：建立和發佈 Lambda 函數](#ml-console-create-lambda)
**注意**  
 如果您使用的是 AWS DeepLens，則可以使用內建攝影機或掛載自己的攝影機，在擷取的影像上執行推論，而不是靜態影像。不過，強烈建議您先從靜態影像開始。  
如果您使用攝影機，請確定 `awscam` APT 套件已安裝並保持最新狀態。如需詳細資訊，請參閱《 *AWS DeepLens 開發人員指南*》中的[更新 AWS DeepLens 裝置](https://docs.aws.amazon.com/deeplens/latest/dg/deeplens-manual-updates.html)。

1. <a name="python-symlink"></a>如果您不是使用 Python 3.7，請務必建立從 Python 3.x 到 Python 3.7 的符號連結。這會將您的裝置設定為搭配 Python 3 使用 AWS IoT Greengrass。執行以下命令來找到您的 Python 安裝：

   ```
   which python3
   ```

   執行以下命令來建立符號連結：

   ```
   sudo ln -s path-to-python-3.x/python3.x path-to-python-3.7/python3.7
   ```

   重新啟動裝置。

1. 編輯 Lambda 函數的組態。請遵循 [步驟 5：將 Lambda 函數新增至 Greengrass 群組](#ml-console-config-lambda) 中的程序。
**注意**  
 建議您在沒有容器化的情況下執行 Lambda 函數，除非您的業務案例需要。這有助於啟用裝置 GPU 和攝影機的存取，而無需設定裝置資源。如果您在沒有容器化的情況下執行 ，您還必須授予 AWS IoT Greengrass Lambda 函數的根存取權。

   1. **若要在沒有容器化的情況下執行 ：**
      + 針對**系統使用者和群組**，選擇 **Another user ID/group ID**。針對**系統使用者 ID**，輸入 **0**。針對**系統群組 ID**，輸入 **0**。

        這可讓您的 Lambda 函數以根執行。如需以根身分執行的詳細資訊，請參閱 [為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。
**提示**  
您也必須更新 `config.json` 檔案，以授予 Lambda 函數的根存取權。如需程序 ，請參閱 [執行 Lambda 函數做為根](lambda-group-config.md#lambda-running-as-root)。
      + 針對 **Lambda 函數容器化**，選擇**無容器**。

        如需在沒有容器化的情況下執行 的詳細資訊，請參閱 [選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)。
      + 將 **Timeout (逾時)** 值更新為 5 秒鐘。這可確保請求不會太旱逾時。設定完成後，執行推論需要幾分鐘的時間。
      + 在**固定下**，選擇 **True**。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。
      +  針對 **Lambda lifecycle (Lambda 生命週期)**，選擇 **Make this function long-lived and keep it running indefinitely (將此函數設定為長時間存留且無限期持續執行)**。

   1.  **改為在容器化模式下執行：**
**注意**  
除非您的商業案例需要，否則我們不建議在容器化模式下執行。
      + 將 **Timeout (逾時)** 值更新為 5 秒鐘。這可確保請求不會太旱逾時。設定完成後，執行推論需要幾分鐘的時間。
      +  針對**固定**，選擇 **True**。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

1. **如果以容器化模式執行**，請新增必要的本機裝置資源，以授予裝置 GPU 的存取權。
**注意**  
如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取裝置 GPU，而無需設定裝置資源。

   1. 在群組組態頁面上，選擇**資源**索引標籤。

   1. 選擇**新增本機資源**。

   1. 定義資源：
      + 針對**資源名稱**，輸入 **renderD128**。
      + 針對**資源類型**，選擇**本機裝置**。
      + 針對 **Device path (裝置路徑)**，輸入 **/dev/dri/renderD128**。
      + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。
      + 對於 **Lambda 函數關聯**，授予 Lambda 函數的**讀取和寫入存取權**。

## 設定 NVIDIA Jetson TX2
<a name="jetson-lambda-config"></a>

若要在 NVIDIA Jetson TX2 上執行此教學課程，請提供來源映像並設定 Lambda 函數。如果您使用的是 GPU，請您還必須新增本機裝置。

1.  請確定您的 Jetson 裝置已設定好，以便您可以安裝 AWS IoT Greengrass 核心軟體。如需如何設定裝置的詳細資訊，請參閱[設定其他裝置](setup-filter.other.md)。

1. 開啟 MXNet 文件、移至[在 Jetson 上安裝 MXNet](https://mxnet.apache.org/get_started/jetson_setup)，然後依照指示在 Jetson 裝置上安裝 MXNet。
**注意**  
 如果您想從來源建置 MXNet，請按照指示建置共用程式庫。編輯 `config.mk` 檔案中的下列設定，以便與 Jetson TX2 裝置搭配使用：  
新增 `-gencode arch=compute-62, code=sm_62` 至 `CUDA_ARCH` 設定。
開啟 CUDA。  

     ```
     USE_CUDA = 1
     ```

1. 下載 Lambda 函數的靜態 PNG 或 JPG 影像，以用於影像分類。該應用程式最適合與小型映像檔案一同運作。或者，您可以在 Jetson 電路板檢測攝影機來擷取來源映像。

   在含有 `greengrassObjectClassification.py` 檔案的目錄中儲存您的映像檔案。您也可以將它們儲存在此目錄的子目錄中。此目錄位於您在 中上傳的 Lambda 函數部署套件中[步驟 4：建立和發佈 Lambda 函數](#ml-console-create-lambda)。

1. 建立從 Python 3.7 到 Python 3.6 的符號連結，以搭配 Python 3 使用 AWS IoT Greengrass。執行以下命令來找到您的 Python 安裝：

   ```
   which python3
   ```

   執行以下命令來建立符號連結：

   ```
   sudo ln -s path-to-python-3.6/python3.6 path-to-python-3.7/python3.7
   ```

   重新啟動裝置。

1. 確定 `ggc_user` 系統帳戶可以使用 MXNet 架構：

   ```
   “sudo -u ggc_user bash -c 'python3 -c "import mxnet"'
   ```

1. 編輯 Lambda 函數的組態。請遵循 [步驟 5：將 Lambda 函數新增至 Greengrass 群組](#ml-console-config-lambda) 中的程序。
**注意**  
 建議您在沒有容器化的情況下執行 Lambda 函數，除非您的業務案例需要。這有助於啟用裝置 GPU 和攝影機的存取，而無需設定裝置資源。如果您在沒有容器化的情況下執行 ，您還必須授予 AWS IoT Greengrass Lambda 函數的根存取權。

   1. **若要在沒有容器化的情況下執行 ：**
      + 針對**系統使用者和群組**，選擇 **Another user ID/group ID**。針對**系統使用者 ID**，輸入 **0**。針對**系統群組 ID**，輸入 **0**。

        這可讓您的 Lambda 函數以根執行。如需以根身分執行的詳細資訊，請參閱 [為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。
**提示**  
您也必須更新 `config.json` 檔案，以授予 Lambda 函數的根存取權。如需此程序，請參閱 [執行 Lambda 函數做為根](lambda-group-config.md#lambda-running-as-root)。
      + 針對 **Lambda 函數容器化**，選擇**無容器**。

        如需在沒有容器化的情況下執行 的詳細資訊，請參閱 [選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。
      +  在**環境變數**下，將下列鍵值對新增至 Lambda 函數。這 AWS IoT Greengrass 會將 設定為使用 MXNet 架構。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/ml-console.html)

   1.  **改為在容器化模式下執行：**
**注意**  
除非您的商業案例需要，否則我們不建議在容器化模式下執行。
      + 增加 **Memory limit (記憶體限制)** 值。請使用 500 MB 的 CPU 或至少 2000 MB 的 GPU。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。
      +  在**環境變數**下，將下列鍵值對新增至 Lambda 函數。這 AWS IoT Greengrass 會將 設定為使用 MXNet 架構。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/ml-console.html)

1. **如果在容器化模式下執行**，請新增下列本機裝置資源，以授予裝置 GPU 的存取權。請遵循 [步驟 6：新增資源到 Greengrass 群組](#ml-console-add-resources) 中的程序。
**注意**  
 如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取裝置 GPU，而無需設定裝置資源。

   對於每個資源：
   + 於**資源類型**選擇**裝置**。
   + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

          
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/ml-console.html)

1. **如果以容器化模式執行**，請新增下列本機磁碟區資源，以授予裝置攝影機的存取權。請遵循 [步驟 6：新增資源到 Greengrass 群組](#ml-console-add-resources) 中的程序。
**注意**  
 如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取您的裝置攝影機，而無需設定磁碟區資源。
   + 針對 **Resource type (資源類型)**，選擇 **Volume (磁碟區)**。
   + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

          
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/ml-console.html)

# 如何使用 設定最佳化機器學習推論 AWS 管理主控台
<a name="ml-dlc-console"></a>

若要遵循本教學課程中的步驟，您必須使用 AWS IoT Greengrass Core v1.10 或更新版本。

您可以使用 SageMaker AI Neo 深度學習編譯器，在 Tensorflow、Apache MXNet、PyTorch、ONNX 和 XGBoost 架構中最佳化原生機器學習推論模型的預測效率，以獲得更小的足跡和更快的效能。然後，您可以下載最佳化模型並安裝 SageMaker AI Neo 深度學習執行期，然後將它們部署到 AWS IoT Greengrass 您的裝置，以加快推論速度。

本教學課程說明如何使用 AWS 管理主控台 來設定 Greengrass 群組，以執行 Lambda 推論範例，在本機辨識攝影機的影像，而無需將資料傳送至雲端。推論範例會存取 Raspberry Pi 上的相機模組。在本教學課程中，您會下載由 Resnet-50 訓練並在 Neo 深度學習編譯器中最佳化的預先封裝模型。然後，您可以使用模型在 AWS IoT Greengrass 裝置上執行本機映像分類。

本教學課程所述以下高階執行步驟：

1. [設定 Raspberry Pi](#config-raspberry-pi-dlc)

1. [安裝 Neo 深度學習執行時間](#install-dlr)

1. [建立推論 Lambda 函數](#ml-console-dlc-create-lambda)

1. [將 Lambda 函數新增至群組](#ml-console-dlc-config-lambda)

1. [將 Neo 最佳化模型資源新增至群組](#ml-console-dlc-add-resources)

1. [將您的相機裝置資源新增至群組](#ml-console-dlc-add-cam-resource)

1. [新增訂閱到群組](#ml-console-dlc-add-subscription)

1. [部署群組](#ml-console-dlc-deploy-group)

1. [測試範例](#ml-console-dlc-test-app)

## 先決條件
<a name="ml-inference-prerequisites"></a>

 為完成此教學課程您需要：
+  Raspberry Pi 4 模型 B 或 Raspberry Pi 3 模型 B/B\$1，設定與 搭配使用 AWS IoT Greengrass。若要使用 設定 Raspberry Pi AWS IoT Greengrass，請執行 [Greengrass 裝置設定](quick-start.md)指令碼，或確認您已完成 的[單元 1](https://docs.aws.amazon.com/greengrass/latest/developerguide/module1.html) 和[單元 2](https://docs.aws.amazon.com/greengrass/latest/developerguide/module2.html)[入門 AWS IoT Greengrass](gg-gs.md)。
**注意**  
Raspberry Pi 可能需要 2.5A [電源供應器](https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/)來執行通常用於影像分類的深度學習架構。額定值較低的電源供應器可能會導致裝置重新啟動。
+  [Raspberry Pi 攝影機模組 V2 - 8 百萬像素、1080p](https://www.amazon.com/Raspberry-Pi-Camera-Module-Megapixel/dp/B01ER2SKFS)。若要了解如何設定相機，請參閱 Raspberry Pi 文件中的[連接相機](https://www.raspberrypi.org/documentation/usage/camera/)。
+  Greengrass 群組和 Greengrass 核心。若要了解如何建立 Greengrass 群組或是 Greengrass 核心，請參閱 [入門 AWS IoT Greengrass](gg-gs.md)。

**注意**  
 本教學課程使用 Raspberry Pi，但 AWS IoT Greengrass 支援其他平台，例如 [Intel Atom](#atom-lambda-dlc-config) 和 [NVIDIA Jetson TX2](#jetson-lambda-dlc-config)。如果使用 Intel Atom 範例，您可能需要安裝 Python 3.6 而不是 Python 3.7。如需設定裝置以便安裝 AWS IoT Greengrass 核心軟體的詳細資訊，請參閱 [設定其他裝置](setup-filter.other.md)。  
對於 AWS IoT Greengrass 不支援 的第三方平台，您必須在非容器化模式下執行 Lambda 函數。若要在非容器化模式下執行，您必須以根身分執行 Lambda 函數。如需詳細資訊，請參閱[選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)及[為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。

## 步驟一：設定 Raspberry Pi
<a name="config-raspberry-pi-dlc"></a>

 在此步驟中，請安裝 Raspbian 作業系統的更新、安裝相機模組軟體和 Python 相依性，以及啟用相機界面。

在您的 Raspberry Pi 終端機執行以下命令。

1. 安裝 Raspbian 的更新。

   ```
   sudo apt-get update
   sudo apt-get dist-upgrade
   ```

1. <a name="install-picamera-step"></a>安裝攝影機模組的 `picamera` 界面和本單元其他所需的 Python 程式庫。

   ```
   sudo apt-get install -y python3-dev python3-setuptools python3-pip python3-picamera
   ```

   驗證安裝：
   + 確保您的 Python 3.7 安裝包含 pip。

     ```
     python3 -m pip
     ```

     如果未安裝 pip，請從 [pip 網站](https://pip.pypa.io/en/stable/installing/)下載它，然後執行以下命令。

     ```
     python3 get-pip.py
     ```
   + 請確保您的 Python 版本是 3.7 或更高版本。

     ```
     python3 --version
     ```

     如果輸出中列出較早的版本，請執行下列命令。

     ```
     sudo apt-get install -y python3.7-dev
     ```
   + 請確定 Setuptools 和 Picamera 已安裝成功。

     ```
     sudo -u ggc_user bash -c 'python3 -c "import setuptools"'
     sudo -u ggc_user bash -c 'python3 -c "import picamera"'
     ```

     如果輸出中未包含錯誤，則表示驗證成功。
**注意**  
如果裝置上安裝的 Python 可執行檔是 `python3.7`，請針對本教學課程中的命令使用 `python3.7` 而不是 `python3`。確保您的 pip 安裝對應到正確的 `python3.7` 或 `python3` 版本，以避免相依性錯誤。

1. 重新啟動 Raspberry Pi。

   ```
   sudo reboot
   ```

1. 請開啟 Raspberry Pi 組態工具。

   ```
   sudo raspi-config
   ```

1. 請使用箭頭鍵開啟 **Interfacing Options (連接選項)** 並啟用攝影機界面。如果出現提示，請允許重新啟動裝置。

1. 請使用以下命令測試攝影機建立。

   ```
   raspistill -v -o test.jpg
   ```

   這會在 Raspberry Pi 上開啟預覽視窗、將名為 `test.jpg` 的圖片儲存至現行目錄，並在 Raspberry Pi 終端機中顯示相機的相關資訊。

## 步驟 2：安裝 Amazon SageMaker Neo 深度學習執行時間
<a name="install-dlr"></a>

 在此步驟中，在 Raspberry Pi 上安裝 Neo 深度學習執行期 (DLR)。

**注意**  
針對本教學課程，建議您安裝 1.1.0 版。

1. <a name="ssh-rpi-step"></a>遠端登入到 Raspberry Pi。

   ```
   ssh pi@your-device-ip-address
   ```

1.  開啟 DLR 文件、開啟[安裝 DLR](https://neo-ai-dlr.readthedocs.io/en/latest/install.html)，然後找到 Raspberry Pi 裝置的 wheel URL。然後，依照指示在裝置上安裝 DLR。例如，你可以使用 pip：

   ```
   pip3 install rasp3b-wheel-url
   ```

1. 安裝 DLR 之後，請驗證下列組態：
   + 確定 `ggc_user` 系統帳戶可以使用 DLR 程式庫。

     ```
     sudo -u ggc_user bash -c 'python3 -c "import dlr"'
     ```
   + 確保已安裝 NumPy。

     ```
     sudo -u ggc_user bash -c 'python3 -c "import numpy"'
     ```

## 步驟 3：建立推論 Lambda 函數
<a name="ml-console-dlc-create-lambda"></a>

 在此步驟中，建立 Lambda 函數部署套件和 Lambda 函數。然後，發佈函數版本和建立別名。

1. 在您的電腦上，從 [機器學習範例](what-is-gg.md#gg-ml-samples) 下載 Raspberry Pi 的 DLR 範例。

1.  解壓縮所下載的 `dlr-py3-armv7l.tar.gz` 檔案。

   ```
   cd path-to-downloaded-sample
   tar -xvzf dlr-py3-armv7l.tar.gz
   ```

   解壓縮的範例套件中的 `examples` 目錄內包含函數程式碼和相依性。
   + `inference.py` 是本教學課程中使用的推論程式碼。您可以使用此程式碼作為範本來建立您自己的推論函數。
   + <a name="ml-samples-ggc-sdk"></a>`greengrasssdk` 是適用於 Python 的核心 AWS IoT Greengrass SDK 的 1.5.0 版。
**注意**  <a name="ml-samples-ggc-sdk-upgrade"></a>
如果有新版本可用，您可以下載並升級部署套件中的 SDK 版本。如需詳細資訊，請參閱 GitHub 上的[AWS IoT Greengrass 適用於 Python 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-python/)。

1.  將 `examples` 目錄的內容壓縮成名為 `optimizedImageClassification.zip` 的檔案。這是您的部署套件。

   ```
   cd path-to-downloaded-sample/dlr-py3-armv7l/examples
   zip -r optimizedImageClassification.zip .
   ```

    部署套件包含函數程式碼和相依性。這包括叫用 Neo 深度學習執行時間 Python APIs以使用 Neo 深度學習編譯器模型執行推論的程式碼。
**注意**  <a name="ml-samples-function-zip"></a>
 確保 `.py` 檔案和相依性皆位於目錄的根中。

1.  現在，將 Lambda 函數新增至 Greengrass 群組。

   從 Lambda 主控台頁面，選擇**函數**，然後選擇**建立函數**。

1. 選擇**從頭開始撰寫**，並使用下列值來建立函數：
   + 針對**函數名稱**，請輸入 **optimizedImageClassification**。
   + 針對**執行期**，選擇 **Python 3.7**。

   對於**許可**，請保留預設設定。這會建立授予基本 Lambda 許可的執行角色。不會使用此角色 AWS IoT Greengrass。  
![\[Create function (建立函數) 頁面的 Basic information (基本資訊) 區段。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-dlc-inference/gg-dlr-lambda-creation.png)

1. 選擇**建立函數**。

 

現在，上傳您的 Lambda 函數部署套件並註冊處理常式。

1. <a name="lambda-console-upload"></a>在**程式碼**索引標籤的**程式碼來源**下，選擇**上傳來源**。從下拉式清單中，選擇 **.zip 檔案**。  
![\[從下拉式清單上傳，並反白顯示 .zip 檔案。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

1. 選擇您的`optimizedImageClassification.zip`部署套件，然後選擇**儲存**。

1. <a name="lambda-console-runtime-settings-para"></a>在函數的**程式碼**索引標籤的**執行時間設定**下，選擇**編輯**，然後輸入下列值。
   + 針對**執行期**，選擇 **Python 3.7**。
   + 對於 **Handler (處理常式)**，輸入 **inference.handler**。

   選擇**儲存**。  
![\[已反白顯示上傳的執行時間設定區段。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-dlc-inference/gg-ml2-lambda-upload.png)

 

接著，發佈 Lambda 函數的第一個版本。然後，建立[版本的別名](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)。

**注意**  
Greengrass 群組可以依別名 （建議） 或版本參考 Lambda 函數。使用別名可讓您更輕鬆地管理程式碼更新，因為您不必在更新函數程式碼時變更訂閱資料表或群組定義。反之，您只需將別名指向新的函數版本。

1. 請從**操作**功能表中選擇**發行新版本**。  
![\[從功能表中選擇發行新版本的選項\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-dlc-inference/gg-ml2-publish-new.png)

1. 針對 **Version description (版本描述)**，輸入 **First version**，然後選擇 **Publish (發佈)**。

1. 在 **optimizedImageClassification: 1** 組態頁面上，從 **Actions (動作)** 功能表中選擇 **Create alias (建立別名)**。  
![\[從操作功能表中選擇建立別名的選項。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-dlc-inference/gg-ml2-create-alias.png)

1. 在**建立警示**頁面上使用下列值：
   + 對於**名稱**，輸入 **mlTestOpt**。
   + 針對 **Version (版本)** 輸入 **1**。
**注意**  
AWS IoT Greengrass 不支援 **\$1LATEST** 版本的 Lambda 別名。

1. 選擇**建立**。

   現在，將 Lambda 函數新增至 Greengrass 群組。

## 步驟 4：將 Lambda 函數新增至 Greengrass 群組
<a name="ml-console-dlc-config-lambda"></a>

在此步驟中，將 Lambda 函數新增至 群組，然後設定其生命週期。

首先，將 Lambda 函數新增至 Greengrass 群組。

1. 在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. 在群組組態頁面上，選擇 **Lambda 函數**索引標籤，然後選擇**新增**。

1.  選擇 **Lambda 函數**，然後選取 **optimizedImageClassification**。

1. 在 **Lambda 函數版本**上，選擇您發佈的版本別名。

 

接著，設定 Lambda 函數的生命週期。

1. 在 **Lambda 函數組態**區段中，進行下列更新。
**注意**  
 建議您在沒有容器化的情況下執行 Lambda 函數，除非您的業務案例需要。這有助於啟用裝置 GPU 和攝影機的存取，而無需設定裝置資源。如果您在沒有容器化的情況下執行 ，您還必須授予 AWS IoT Greengrass Lambda 函數的根存取權。

   1. **若要在沒有容器化的情況下執行 ：**
      + 針對**系統使用者和群組**，選擇 **Another user ID/group ID**。針對**系統使用者 ID**，輸入 **0**。針對**系統群組 ID**，輸入 **0**。

        這可讓您的 Lambda 函數以根執行。如需以根身分執行的詳細資訊，請參閱 [為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。
**提示**  
您也必須更新 `config.json` 檔案，以授予 Lambda 函數的根存取權。如需此程序，請參閱 [執行 Lambda 函數做為根](lambda-group-config.md#lambda-running-as-root)。
      + 針對 **Lambda 函數容器化**，選擇**無容器**。

        如需在沒有容器化的情況下執行 的詳細資訊，請參閱 [選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)。
      + 針對 **Timeout (逾時)**，輸入 **10 seconds**。
      + 針對**固定**，選擇 **True**。

        如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

   1.  **改為在容器化模式下執行：**
**注意**  
除非您的商業案例需要，否則我們不建議在容器化模式下執行。
      + 針對**系統使用者和群組**，選擇**使用群組預設值**。
      + 針對 **Lambda 函數容器化**，選擇**使用群組預設值**。
      + 針對 **Memory limit (記憶體限制)**，輸入 **1024 MB**。
      + 針對 **Timeout (逾時)**，輸入 **10 seconds**。
      + 針對**固定**，選擇 **True**。

        如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

1.  選擇**新增 Lambda 函數**。

## 步驟 5：將 SageMaker AI Neo 最佳化模型資源新增至 Greengrass 群組
<a name="ml-console-dlc-add-resources"></a>

 在此步驟中，建立最佳化 ML 推論模型的資源，並將其上傳至 Amazon S3 儲存貯體。然後，在 AWS IoT Greengrass 主控台中找到 Amazon S3 上傳的模型，並將新建立的資源與 Lambda 函數建立關聯。這使得函數可在核心裝置上存取其資源。

1.  在您的電腦上，瀏覽至您在 [步驟 3：建立推論 Lambda 函數](#ml-console-dlc-create-lambda) 中解壓縮的範例套件內的 `resnet50` 目錄。
**注意**  
如果使用 NVIDIA Jetson 範例，則需要改用範例套件中的 `resnet18` 目錄。如需詳細資訊，請參閱[設定 NVIDIA Jetson TX2](#jetson-lambda-dlc-config)。

   ```
   cd path-to-downloaded-sample/dlr-py3-armv7l/models/resnet50
   ```

    此目錄中包含預先編譯的模型成品，其適用於利用 Resnet-50 訓練的映像分類模型。

1. 將 `resnet50` 目錄內的檔案壓縮成名為 `resnet50.zip` 的檔案。

   ```
   zip -r resnet50.zip .
   ```

1.  在群組的 AWS IoT Greengrass 群組組態頁面上，選擇**資源**索引標籤。導覽至 **Machine Learning (機器學習)**區段，然後選擇 **Add machine learning resource (新增機器學習資源)**。在 **Create a machine learning resource (建立機器學習資源)** 頁面上，於 **Resource name (資源名稱)** 輸入 **resnet50\$1model**。

1. 針對**模型來源**，選擇**使用存放在 S3 中的模型，例如透過深度學習編譯器最佳化的模型**。

1.  在 **S3 URI** 下，選擇**瀏覽 S3**。
**注意**  
 目前，最佳化的 SageMaker AI 模型會自動儲存在 Amazon S3 中。您可以使用此選項在 Amazon S3 儲存貯體中找到最佳化的模型。如需 SageMaker AI 中模型最佳化的詳細資訊，請參閱 [SageMaker AI Neo 文件](https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html)。

1.  選擇 **Upload a model (上傳模型)**。

1.  在 Amazon S3 主控台索引標籤上，將您的 zip 檔案上傳至 Amazon S3 儲存貯體。如需詳細資訊，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[如何將檔案和資料夾上傳至 S3 儲存貯體？](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)。
**注意**  
 您的儲存貯體名稱必須包含字串 **greengrass**。選擇唯一名稱 (例如 **greengrass-dlr-bucket-*user-id*-*epoch-time***)。請勿在儲存貯體名稱中使用句號 (`.`)。

1.  在 AWS IoT Greengrass 主控台索引標籤中，尋找並選擇您的 Amazon S3 儲存貯體。尋找您已上傳的 `resnet50.zip` 檔案，然後選擇 **Select (選取)**。您可能需要重新整理頁面來更新可用儲存貯體和檔案的清單。

1.  在**目的地路徑**中，輸入 **/ml\$1model**。  
![\[更新的目的地路徑。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/ml-dlc-inference/local-path.png)

    這是 Lambda 執行時間命名空間中本機模型的目的地。部署群組時， 會 AWS IoT Greengrass 擷取來源模型套件，然後將內容擷取至指定的目錄。
**注意**  
 我們強烈建議您使用針對本機路徑提供的確切路徑。在此步驟中使用不同的本機模型目的地路徑，會導致此教學課程中提供的一些故障診斷命令不精確。如果使用不同的路徑，請設定 `MODEL_PATH` 環境變數，其必須使用這裡提供的確切路徑。如需環境變數的相關資訊，請參閱 [AWS Lambda 環境變數](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html)。

1. **如果以容器化模式執行： **

   1. 在**系統群組擁有者和檔案存取許可**下，選擇**指定系統群組和許可**。

   1. 選擇**唯讀存取**，然後選擇**新增資源**。

## 步驟 6：將您的相機裝置資源新增至 Greengrass 群組
<a name="ml-console-dlc-add-cam-resource"></a>

 在此步驟中，為攝影機模組建立資源，並將其與 Lambda 函數建立關聯。這可讓 Lambda 函數存取核心裝置上的資源。

**注意**  
如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取您的裝置 GPU 和攝影機，而無需設定此裝置資源。

1. 在群組組態頁面上，選擇**資源**索引標籤。

1. 在**本機資源**索引標籤上，選擇**新增本機資源**。

1. 在**新增本機資源**頁面上，使用下列值：
   + 針對**資源名稱**，輸入 **videoCoreSharedMemory**。
   + 於**資源類型**選擇**裝置**。
   + 針對**本機裝置路徑**，輸入 **/dev/vcsm**。

     裝置路徑為裝置資源的本機絕對路徑。此路徑只能參考 `/dev` 底下的字元裝置或區塊型儲存設備。
   + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

     **Group owner file access permission (群組擁有者檔案存取許可)** 選項讓您授與其他檔案可存取 Lambda 的許可。如需詳細資訊，請參閱[群組擁有者檔案存取許可](access-local-resources.md#lra-group-owner)。

1. 在頁面底部，選擇**新增資源**。

1. 從**資源**索引標籤中，選擇**新增**並使用下列值來建立另一個本機資源：
   + 針對**資源名稱**，輸入 **videoCoreInterface**。
   + 於**資源類型**選擇**裝置**。
   + 針對**本機裝置路徑**，輸入 **/dev/vchiq**。
   + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

1. 選擇 **Add resource (新增資源)**。

## 步驟 7：將訂閱新增到 Greengrass 群組
<a name="ml-console-dlc-add-subscription"></a>

在此步驟中，將訂閱新增至群組。這些訂閱可讓 Lambda 函數 AWS IoT 透過發佈至 MQTT 主題，將預測結果傳送至 。

1. 在群組組態頁面上，選擇**訂閱**索引標籤，然後選擇**新增訂閱**。

1. 在**建立訂閱**頁面上，設定來源和目標，如下所示：

   1. 在**來源類型**中，選擇 **Lambda 函數**，然後選擇 **optimizedImageClassification**。

   1. 在**目標類型**中，選擇**服務**，然後選擇 **IoT 雲端**。

   1. 在**主題篩選條件**中，輸入 **/resnet-50/predictions**，然後選擇**建立訂閱**。

1. 新增第二個訂閱。選擇**訂閱**索引標籤，選擇**新增訂閱**，並設定來源和目標，如下所示：

   1. 在**來源類型**中，選擇**服務**，然後選擇 **IoT Cloud**。

   1. 在**目標類型**中，選擇 **Lambda 函數**，然後選擇 **optimizedImageClassification**。

   1. 在**主題篩選條件**中，輸入 **/resnet-50/test**，然後選擇**建立訂閱**。

## 步驟 8：部署 Greengrass 群組
<a name="ml-console-dlc-deploy-group"></a>

在此步驟中，將群組定義的目前版本部署到 Greengrass 核心裝置。定義包含您新增的 Lambda 函數、資源和訂閱組態。

1. 確定 AWS IoT Greengrass 核心正在執行。如果需要，請在您的 Raspberry Pi 終端機執行以下命令。

   1. 檢查精靈是否有在運作：

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      若輸出的 `root` 含有 `/greengrass/ggc/packages/latest-core-version/bin/daemon` 項目，則精靈有在運作。

   1. 若要啟動協助程式：

      ```
      cd /greengrass/ggc/core/
      sudo ./greengrassd start
      ```

1. 在群組組態頁面上，選擇**部署**。

1. 在 **Lambda 函數**索引標籤上，選取 **IP 偵測器**，然後選擇**編輯**。

1. 從**編輯 IP 偵測器設定**對話方塊中，選取**自動偵測和覆寫 MQTT 代理程式端點**，然後選擇**儲存**。

   這可讓裝置自動取得核心的連接資訊，例如 IP 位址、DNS、連接埠編號。建議自動偵測，但 AWS IoT Greengrass 也支援手動指定的端點。只會在第一次部署群組時收到復原方法的提示。
**注意**  
如果出現提示，請授予許可來建立 [Greengrass 服務角色](service-role.md)，並將其與目前 AWS 帳戶 中的 建立關聯 AWS 區域。此角色允許 AWS IoT Greengrass 存取 AWS 服務中的資源。

    此**部署**頁面會顯示部署時間戳記、版本 ID 和狀態。完成後，部署顯示的狀態應為**已完成**。

   如需有關部署的詳細資訊，請參閱 [將 AWS IoT Greengrass 群組部署至 AWS IoT Greengrass 核心](deployments.md)。如需故障診斷協助，請參閱[故障診斷 AWS IoT Greengrass](gg-troubleshooting.md)。

## 測試推論範例
<a name="ml-console-dlc-test-app"></a>

現在您可以驗證部署是否已正確設定。若要測試，請訂閱 `/resnet-50/predictions` 主題，並將任何訊息發佈到 `/resnet-50/test` 主題。這會觸發 Lambda 函數使用您的 Raspberry Pi 拍攝相片，並在其擷取的影像上執行推論。

**注意**  
如果使用 NVIDIA Jetson 範例，請務必改用 `resnet-18/predictions` 和 `resnet-18/test` 主題。

**注意**  
如果 Raspberry Pi 附加監控功能，即時攝影機反饋會顯示在預覽視窗中。

1. 在 AWS IoT 主控台首頁**的測試**下，選擇 **MQTT 測試用戶端**。

1. 針對**訂閱**，選擇**訂閱主題**。使用下列數值。將剩餘選項保留為其預設值。
   + 針對 **Subscription topic (訂閱主題)**，輸入 **/resnet-50/predictions**。
   + **在其他組態**下，針對 **MQTT 承載顯示**，選擇將**承載顯示為字串**。

1. 選擇 **Subscribe (訂閱)**。

1. 選擇**發佈至主題**，輸入 **/resnet-50/test**做為**主題名稱**，然後選擇**發佈**。

1.  如果測試成功，已發佈的訊息會導致 Raspberry Pi 相機擷取映像。頁面底部會顯示來自 Lambda 函數的訊息。此訊息包含映像的預測結果，其使用的格式為：預測的類別名稱、機率，以及尖峰記憶體使用量。

## 設定 Intel Atom
<a name="atom-lambda-dlc-config"></a>

 若要在 Intel Atom 裝置上執行此教學課程，您必須提供來源映像、設定 Lambda 函數，以及新增另一個本機裝置資源。若要使用 GPU 進行推論，請確定裝置上已安裝下列軟體：
+ OpenCL 1.0 版或更高版本
+ Python 3.7 和 pip
+ [NumPy](https://pypi.org/project/numpy/)
+ [OpenCV on Wheels](https://pypi.org/project/opencv-python/)

1. 下載 Lambda 函數的靜態 PNG 或 JPG 影像，以用於影像分類。此範例最適合與小型映像檔案一同運作。

   儲存含有 `inference.py` 檔案 (或於該目錄的子目錄中)目錄中的映像檔案。這是您在 中上傳的 Lambda 函數部署套件。 [步驟 3：建立推論 Lambda 函數](#ml-console-dlc-create-lambda)
**注意**  
 如果您使用的是 AWS DeepLens，則可以使用內建攝影機或掛載自己的攝影機，在擷取的影像上執行推論，而不是靜態影像。不過，強烈建議您先從靜態影像開始。  
如果您使用攝影機，請確定 `awscam` APT 套件已安裝並保持最新狀態。如需詳細資訊，請參閱《 *AWS DeepLens 開發人員指南*》中的[更新 AWS DeepLens 裝置](https://docs.aws.amazon.com/deeplens/latest/dg/deeplens-manual-updates.html)。

1. 編輯 Lambda 函數的組態。請遵循 [步驟 4：將 Lambda 函數新增至 Greengrass 群組](#ml-console-dlc-config-lambda) 中的程序。
**注意**  
 建議您在沒有容器化的情況下執行 Lambda 函數，除非您的業務案例需要。這有助於啟用裝置 GPU 和攝影機的存取，而無需設定裝置資源。如果您在沒有容器化的情況下執行 ，您還必須授予 AWS IoT Greengrass Lambda 函數的根存取權。

   1. **若要在沒有容器化的情況下執行 ：**
      + 針對**系統使用者和群組**，選擇 **Another user ID/group ID**。針對**系統使用者 ID**，輸入 **0**。針對**系統群組 ID**，輸入 **0**。

        這可讓您的 Lambda 函數以根執行。如需以根身分執行的詳細資訊，請參閱 [為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。
**提示**  
您也必須更新 `config.json` 檔案，以授予 Lambda 函數的根存取權。如需此程序，請參閱 [執行 Lambda 函數做為根](lambda-group-config.md#lambda-running-as-root)。
      + 針對 **Lambda 函數容器化**，選擇**無容器**。

        如需在沒有容器化的情況下執行 的詳細資訊，請參閱 [選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)。
      + 將 **Timeout (逾時)** 值增加到 2 分鐘。這可確保請求不會太旱逾時。設定完成後，執行推論需要幾分鐘的時間。
      +  針對**固定**，選擇 **True**。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

   1.  **改為在容器化模式下執行：**
**注意**  
除非您的商業案例需要，否則我們不建議在容器化模式下執行。
      +  將 **Memory limit (記憶體限制)** 值增加到 3000 MB。
      + 將 **Timeout (逾時)** 值增加到 2 分鐘。這可確保請求不會太旱逾時。設定完成後，執行推論需要幾分鐘的時間。
      +  針對**固定**，選擇 **True**。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

1.  將 Neo 最佳化模型資源新增至群組。上傳您在 [步驟 3：建立推論 Lambda 函數](#ml-console-dlc-create-lambda) 中解壓縮的範例套件 `resnet50` 目錄中的模型資源。此目錄中包含預先編譯的模型成品，其適用於利用 Resnet-50 訓練的映像分類模型。遵循[步驟 5：將 SageMaker AI Neo 最佳化模型資源新增至 Greengrass 群組](#ml-console-dlc-add-resources)中的程序，但有下列更新。
   + 將 `resnet50` 目錄內的檔案壓縮成名為 `resnet50.zip` 的檔案。
   + 在 **Create a machine learning resource (建立機器學習資源)** 頁面上，於 **Resource name (資源名稱)** 輸入 **resnet50\$1model**。
   + 上傳 `resnet50.zip` 檔案。

1. **如果以容器化模式執行**，請新增必要的本機裝置資源，以授予裝置 GPU 的存取權。
**注意**  
 如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取裝置 GPU，而無需設定裝置資源。

   1. 在群組組態頁面上，選擇**資源**索引標籤。

   1. 在**本機資源**區段中，選擇**新增本機資源**。

   1. 定義資源：
      + 針對**資源名稱**，輸入 **renderD128**。
      + 於**資源類型**選擇**裝置**。
      + 針對**本機裝置路徑**，輸入 **/dev/dri/renderD128**。
      + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

## 設定 NVIDIA Jetson TX2
<a name="jetson-lambda-dlc-config"></a>

 若要在 NVIDIA Jetson TX2 上執行此教學課程，請提供來源映像、設定 Lambda 函數，以及新增更多本機裝置資源。

1. 請確定您的 Jetson 裝置已設定好，以便您可以安裝 AWS IoT Greengrass 核心軟體並使用 GPU 進行推論。如需如何設定裝置的詳細資訊，請參閱[設定其他裝置](setup-filter.other.md)。若要在 NVIDIA Jetson TX2 上使用 GPU 進行推論，當您使用 Jetpack 4.3 為電路板建立映像時，必須在裝置上安裝 CUDA 10.0 和 cuDNN 7.0。

1. 下載 Lambda 函數的靜態 PNG 或 JPG 影像，以用於影像分類。此範例最適合與小型映像檔案一同運作。

   在含有 `inference.py` 檔案的目錄中儲存您的映像檔案。您也可以將它們儲存在此目錄的子目錄中。此目錄位於您在 中上傳的 Lambda 函數部署套件中[步驟 3：建立推論 Lambda 函數](#ml-console-dlc-create-lambda)。
**注意**  
 您可以改為選擇在 Jetson 電路板檢測攝影機來擷取來源影像。不過，強烈建議您先從靜態影像開始。

1. 編輯 Lambda 函數的組態。請遵循 [步驟 4：將 Lambda 函數新增至 Greengrass 群組](#ml-console-dlc-config-lambda) 中的程序。
**注意**  
 建議您在沒有容器化的情況下執行 Lambda 函數，除非您的業務案例需要。這有助於啟用裝置 GPU 和攝影機的存取，而無需設定裝置資源。如果您在沒有容器化的情況下執行 ，您還必須授予 AWS IoT Greengrass Lambda 函數的根存取權。

   1. **若要在沒有容器化的情況下執行 ：**
      + 針對**執行身分**，選擇 **Another user ID/group ID**。針對 **UID**，輸入 **0**。針對 **GUID**，輸入 **0**。

        這可讓您的 Lambda 函數以根執行。如需以根身分執行的詳細資訊，請參閱 [為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。
**提示**  
您也必須更新 `config.json` 檔案，以授予 Lambda 函數的根存取權。如需此程序，請參閱 [執行 Lambda 函數做為根](lambda-group-config.md#lambda-running-as-root)。
      + 針對 **Lambda 函數容器化**，選擇**無容器**。

        如需在沒有容器化的情況下執行 的詳細資訊，請參閱 [選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)。
      + 將 **Timeout (逾時)** 值增加到 5 分鐘。這可確保請求不會太旱逾時。設定完成後，執行推論需要幾分鐘的時間。
      +  針對**固定**，選擇 **True**。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

   1.  **改為在容器化模式下執行：**
**注意**  
除非您的商業案例需要，否則我們不建議在容器化模式下執行。
      +  增加 **Memory limit (記憶體限制)** 值。若要在 GPU 模式下使用提供的模型，請至少使用 2000 MB。
      + 將 **Timeout (逾時)** 值增加到 5 分鐘。這可確保請求不會太旱逾時。設定完成後，執行推論需要幾分鐘的時間。
      +  針對**固定**，選擇 **True**。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

1.  將 Neo 最佳化模型資源新增至群組。上傳您在 [步驟 3：建立推論 Lambda 函數](#ml-console-dlc-create-lambda) 中解壓縮的範例套件 `resnet18` 目錄中的模型資源。此目錄中包含預先編譯的模型成品，其適用於利用 Resnet-18 訓練的映像分類模型。遵循[步驟 5：將 SageMaker AI Neo 最佳化模型資源新增至 Greengrass 群組](#ml-console-dlc-add-resources)中的程序，但有下列更新。
   + 將 `resnet18` 目錄內的檔案壓縮成名為 `resnet18.zip` 的檔案。
   + 在 **Create a machine learning resource (建立機器學習資源)** 頁面上，於 **Resource name (資源名稱)** 輸入 **resnet18\$1model**。
   + 上傳 `resnet18.zip` 檔案。

1. **如果以容器化模式執行**，請新增必要的本機裝置資源，以授予裝置 GPU 的存取權。
**注意**  
 如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取裝置 GPU，而無需設定裝置資源。

   1. 在群組組態頁面上，選擇**資源**索引標籤。

   1. 在**本機資源**區段中，選擇**新增本機資源**。

   1. 定義每個資源：
      + 針對 **Resource name (資源名稱)** 和 **Device path (裝置路徑)**，請使用下表中的值。為表格中的每一列建立一個裝置資源。
      + 於**資源類型**選擇**裝置**。
      + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

             
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/ml-dlc-console.html)

1. **如果以容器化模式執行**，請新增下列本機磁碟區資源，以授予裝置攝影機的存取權。請遵循 [步驟 5：將 SageMaker AI Neo 最佳化模型資源新增至 Greengrass 群組](#ml-console-dlc-add-resources) 中的程序。
**注意**  
 如果您在非容器化模式下執行 ， AWS IoT Greengrass 可以存取您的裝置攝影機，而無需設定裝置資源。
   + 針對 **Resource type (資源類型)**，選擇 **Volume (磁碟區)**。
   + 針對**系統群組擁有者和檔案存取許可**，選擇**自動新增擁有資源之系統群組的檔案系統許可**。

          
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/ml-dlc-console.html)

1.  更新您的群組訂閱以使用正確的目錄。遵循[步驟 7：將訂閱新增到 Greengrass 群組](#ml-console-dlc-add-subscription)中的程序，但有下列更新。
   + 對於您的第一個主題篩選，請輸入 **/resnet-18/predictions**。
   + 對於您的第二個主題篩選，請輸入 **/resnet-18/test**。

1.  更新您的測試訂閱以使用正確的目錄。遵循[測試推論範例](#ml-console-dlc-test-app)中的程序，但有下列更新。
   +  針對**訂閱**，選擇**訂閱主題**。針對 **Subscription topic (訂閱主題)**，輸入 **/resnet-18/predictions**。
   +  在 `/resnet-18/predictions` 頁面上，指定要發佈至其中的 `/resnet-18/test` 主題。

## 針對 AWS IoT Greengrass ML 推論進行故障診斷
<a name="ml-inference-troubleshooting"></a>

如果測試不成功，您可以嘗試以下故障診斷的步驟。請在您的 Raspberry Pi 終端機執行此命令。

### 檢查錯誤日誌
<a name="troubleshooting-check-logs"></a>

1. <a name="root-access-logs"></a>切換到根使用者和導覽至 `log` 目錄。存取 AWS IoT Greengrass 日誌需要根許可。

   ```
   sudo su
   cd /greengrass/ggc/var/log
   ```

1. 檢查`runtime.log`是否有任何錯誤。

   ```
   cat system/runtime.log | grep 'ERROR'
   ```

   您也可以在使用者定義的 Lambda 函數日誌中查看是否有任何錯誤：

   ```
   cat user/your-region/your-account-id/lambda-function-name.log | grep 'ERROR'
   ```

   如需詳細資訊，請參閱[日誌故障診斷](gg-troubleshooting.md#troubleshooting-logs)。

 

### 確認 Lambda 函數已成功部署
<a name="troubleshooting-check-lambda"></a>

1.  在 `/lambda`目錄中列出已部署 Lambda 的內容。先執行命令，再取代預留位置值。

   ```
   cd /greengrass/ggc/deployment/lambda/arn:aws:lambda:region:account:function:function-name:function-version
   ls -la
   ```

1.  驗證目錄是否包含與您在 中上傳的`optimizedImageClassification.zip`部署套件相同的內容[步驟 3：建立推論 Lambda 函數](#ml-console-dlc-create-lambda)。

    確保 `.py` 檔案和相依性皆位於目錄的根中。

 

### 驗證是否已成功部署推論模型
<a name="troubleshooting-check-model"></a>

1. 尋找 Lambda 執行時間程序的程序識別號碼 (PID)：

   ```
   ps aux | grep lambda-function-name
   ```

   在輸出中，PID 會出現在 Lambda 執行時間程序行的第二欄。

1.  輸入 Lambda 執行時間命名空間。執行命令前，務必先取代預留位置 *pid* 值。
**注意**  
此目錄及其內容位於 Lambda 執行時間命名空間中，因此不會在一般 Linux 命名空間中顯示。

   ```
   sudo nsenter -t pid -m /bin/bash
   ```

1. 列出您為機器學習資源所指定的本機目錄內容。
**注意**  
 如果您的 ML 資源路徑是 `ml_model` 以外的路徑,，則您必須在這裡取代該路徑。

   ```
   cd /ml_model
   ls -ls
   ```

   您會看到以下檔案：

   ```
       56 -rw-r--r-- 1 ggc_user ggc_group     56703 Oct 29 20:07 model.json
   196152 -rw-r--r-- 1 ggc_user ggc_group 200855043 Oct 29 20:08 model.params
      256 -rw-r--r-- 1 ggc_user ggc_group    261848 Oct 29 20:07 model.so
       32 -rw-r--r-- 1 ggc_user ggc_group     30564 Oct 29 20:08 synset.txt
   ```

 

### Lambda 函數找不到`/dev/dri/renderD128`
<a name="troubleshooting-atom-config"></a>

 如果 OpenCL 無法連接線到所需的 GPU 裝置，可能會發生這種情況。您必須為 Lambda 函數的必要裝置建立裝置資源。

## 後續步驟
<a name="next-dlc-steps"></a>

 接著，探索其他最佳化的模型。如需詳細資訊，請參閱 [SageMaker AI Neo 文件](https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html)。