

支援終止通知：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)。

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

# 如何使用 設定機器學習推論 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)