

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