

终止支持通知：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 酷睿 v1.10 或更高版本。

您可以使用 SageMaker AI Neo 深度学习编译器来优化 Tensorflow、Apache、ONNX 和 XGBoost 框架中的原生机器学习推理模型的预测效率 MXNet PyTorch，从而缩小占用空间并提高性能。然后，您可以下载经过优化的模型并安装 SageMaker AI Neo 深度学习运行时并将其部署到您的 AWS IoT Greengrass 设备上，以便更快地进行推理。

本教程介绍如何使用配置 Greengrass 群组 AWS 管理控制台 以运行 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 Model B 或 Raspberry Pi 3 Model B/B\$1，已设置并配置为与一起使用。 AWS IoT Greengrass要使用 AWS IoT Greengrass设置 Raspberry Pi，请运行 [Greengrass 设备安装](quick-start.md)脚本，或确保您已完成 [入门 AWS IoT Greengrass](gg-gs.md) 的[模块 1](https://docs.aws.amazon.com/greengrass/latest/developerguide/module1.html) 和[模块 2](https://docs.aws.amazon.com/greengrass/latest/developerguide/module2.html)。
**注意**  
Raspberry Pi 可能需要一个 2.5A 的[电源](https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/)来运行通常用于图像分类的深度学习框架。额定值不足的电源可能会导致设备重新启动。
+  [Raspberry Pi 摄像机模块 V2 - 800 万像素，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 支持其他平台，例如[英特尔凌动](#atom-lambda-dlc-config)和 [NVIDIA Jetson TX2](#jetson-lambda-dlc-config)。如果使用的是 Intel Atom 示例，您可能需要安装 Python 3.6 而不是 Python 3.7。有关配置设备以便安装 AWS IoT Greengrass Core 软件的信息，请参阅[设置其他设备](setup-filter.other.md)。  
对于 AWS IoT Greengrass 不支持的第三方平台，您必须在非容器化模式下运行 Lambda 函数。要在非容器化模式下运行，必须以 root 用户身份运行 Lambda 函数。有关更多信息，请参阅[选择 Lambda 函数容器化时的注意事项](lambda-group-config.md#lambda-containerization-considerations)和[为组中的 Lambda 函数设置默认访问身份](lambda-group-config.md#lambda-access-identity-groupsettings)。

## 步骤 1：配置 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. 使用箭头键打开**接口选项**并启用摄像机接口。如果出现提示，请允许设备重新启动。

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>
如果提供了新版本，您可以下载该版本并升级部署程序包中的开发工具包版本。有关更多信息，请参阅适用于 [Python 的AWS IoT Greengrass 核心开发工具包](https://github.com/aws/aws-greengrass-core-sdk-python/) GitHub。

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_cn/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_cn/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**。
   + 对于**处理程序**，输入 **inference.handler**。

   选择**保存**。  
![\[突出显示了“上传”的“运行时设置”部分。\]](http://docs.aws.amazon.com/zh_cn/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. 在**操作**菜单上，选择**发布新版本**。  
![\[“Actions (操作)”菜单中的“Publish new version (发布新版本)”选项。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/ml-dlc-inference/gg-ml2-publish-new.png)

1. 对于**版本描述**，输入 **First version**，然后选择**发布**。

1. 在**optimizedImageClassification:1** 配置页面上，从 “**操作**” 菜单中选择 “**创建别名**”。  
![\[“Actions (操作)”菜单中的“Create alia (创建别名)”选项。\]](http://docs.aws.amazon.com/zh_cn/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 和摄像头。如果您在没有容器化的情况下运行，则还必须授予对 Lambda 函数 AWS IoT Greengrass 的根访问权限。

   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)。
      + 对于**超时**，输入 **10 seconds**。
      + 对于**已固定**，选择 **True**。

        有关更多信息，请参阅 [Greengrass Lambda 函数的生命周期配置](lambda-functions.md#lambda-lifecycle)。
      + 在**其他参数**下，在**对 sys 目录的只读权限**中选择**启用**。

   1.  **改为在容器化模式下运行：**
**注意**  
我们不建议以容器化模式运行，除非您的业务案例需要这样做。
      + 对于**系统用户和组**，选择**使用组默认值**。
      + 对于 **Lambda 函数容器化**，选择**使用组默认值**。
      + 对于**内存限制**，输入 **1024 MB**。
      + 对于**超时**，输入 **10 seconds**。
      + 对于**已固定**，选择 **True**。

        有关更多信息，请参阅 [Greengrass Lambda 函数的生命周期配置](lambda-functions.md#lambda-lifecycle)。
      + 在**其他参数**下，在**对 sys 目录的只读权限**中选择**启用**。

1.  选择**添加 Lambda 函数**。

## 第 5 步：将 SageMaker 人工智能新优化的模型资源添加到 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 的人工智能模型会自动存储在 Amazon S3 中。您可以使用此选项在 Amazon S3 存储桶中找到您的优化模型。有关 SageMaker AI 中模型优化的更多信息，请参阅 A [SageMaker I Neo 文档](https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html)。

1.  选择**上传模型**。

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_cn/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**。
   + 对于 **Resource type (资源类型)**，选择 **Device (设备)**。
   + 对于 **本地设备路径**，输入 **/dev/vcsm**。

     设备路径是设备资源的本地绝对路径。该路径只能引用 `/dev` 下的字符设备或块储存设备。
   + 在 **系统组所有者和文件访问权限** 下，选择 **自动添加拥有资源的系统组的文件系统权限**。

     **组所有者文件访问权限**选项可让您授予对 Lambda 进程的额外的文件访问权限。有关更多信息，请参阅 [组所有者文件访问权限](access-local-resources.md#lra-group-owner)。

1. 在页面底部，选择**添加资源**。

1. 在**资源**选项卡中，选择**添加**并使用以下值创建另一个本地资源：
   + 对于**资源名称**，输入 **videoCoreInterface**。
   + 对于 **Resource type (资源类型)**，选择 **Device (设备)**。
   + 对于 **本地设备路径**，输入 **/dev/vchiq**。
   + 在 **系统组所有者和文件访问权限** 下，选择 **自动添加拥有资源的系统组的文件系统权限**。

1. 选择**添加资源**。

## 步骤 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 云**。

   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. 选择**订阅**。

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/)
+ [基于 Wheel 的 OpenCV](https://pypi.org/project/opencv-python/)

1. 下载 Lambda 函数的静态 PNG 或 JPG 图像以用于图像分类。该示例最适合小型图像文件。

   将图像文件保存在包含 `inference.py` 文件的目录中（或保存在此目录的子目录中）。此目录位于您在 [步骤 3：创建推理 Lambda 函数](#ml-console-dlc-create-lambda) 中上传的 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 和摄像头。如果您在没有容器化的情况下运行，则还必须授予对 Lambda 函数 AWS IoT Greengrass 的根访问权限。

   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)。
      + 将**超时**值增加到 2 分钟。这可确保请求不会过早超时。设置后，需要几分钟以运行推理。
      +  对于**已固定**，选择 **True**。
      + 在**其他参数**下，在**对 sys 目录的只读权限**中选择**启用**。

   1.  **改为在容器化模式下运行：**
**注意**  
我们不建议以容器化模式运行，除非您的业务案例需要这样做。
      +  将**内存限制**值提高到 3000 MB。
      + 将**超时**值增加到 2 分钟。这可确保请求不会过早超时。设置后，需要几分钟以运行推理。
      +  对于**已固定**，选择 **True**。
      + 在**其他参数**下，在**对 sys 目录的只读权限**中选择**启用**。

1.  将 Neo 优化的模型资源添加到组中。上传您在[步骤 3：创建推理 Lambda 函数](#ml-console-dlc-create-lambda)中提取的示例程序包的 `resnet50` 目录中的模型资源。该目录包含使用 Resnet-50 训练的图像分类模型的预编译模型项目。按照[第 5 步：将 SageMaker 人工智能新优化的模型资源添加到 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**。
      + 对于 **Resource type (资源类型)**，选择 **Device (设备)**。
      + 对于 **本地设备路径**，输入 **/dev/dri/renderD128**。
      + 在 **系统组所有者和文件访问权限** 下，选择 **自动添加拥有资源的系统组的文件系统权限**。

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

 要在 NVIDIA Jetson 上运行本教程 TX2，请提供源图像、配置 Lambda 函数并添加更多本地设备资源。

1. 确保您的 Jetson 设备已配置，以便您可以安装 AWS IoT Greengrass Core 软件并使用 GPU 进行推理。有关配置设备的更多信息，请参阅[设置其他设备](setup-filter.other.md)。要在 NVIDIA Jetson 上使用 GPU 进行推理 TX2，当你使用 Jetpack 4.3 对主板进行成像时，你必须在设备上安装 CUDA 10.0 和 cuDNN 7.0。

1. 下载 Lambda 函数的静态 PNG 或 JPG 图像以用于图像分类。该示例最适合小型图像文件。

   将图像文件保存在包含 `inference.py` 文件的目录中。您也可以将这些文件保存在此目录的子目录中。此目录位于您在 [步骤 3：创建推理 Lambda 函数](#ml-console-dlc-create-lambda) 中上传的 Lambda 函数部署程序包中。
**注意**  
 或者，您也可以在 Jetson 板上安装摄像头来捕获源图像。但是，我们强烈建议您先用静态图像开始。

1. 编辑 Lambda 函数的配置。按照[步骤 4：将 Lambda 函数添加到 Greengrass 组](#ml-console-dlc-config-lambda)中的程序操作。
**注意**  
 我们建议您在不进行容器化的情况下运行 Lambda 函数，除非您的业务案例需要这样做。这有助于您在无需配置设备资源的前提下访问您的设备 GPU 和摄像头。如果您在没有容器化的情况下运行，则还必须授予对 Lambda 函数 AWS IoT Greengrass 的根访问权限。

   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)。
      + 将**超时**值增加到 5 分钟。这可确保请求不会过早超时。设置后，需要几分钟以运行推理。
      +  对于**已固定**，选择 **True**。
      + 在**其他参数**下，在**对 sys 目录的只读权限**中选择**启用**。

   1.  **改为在容器化模式下运行：**
**注意**  
我们不建议以容器化模式运行，除非您的业务案例需要这样做。
      +  提高**内存限制**值。要在 GPU 模式下使用提供的模型，请使用至少 2000 MB。
      + 将**超时**值增加到 5 分钟。这可确保请求不会过早超时。设置后，需要几分钟以运行推理。
      +  对于**已固定**，选择 **True**。
      + 在**其他参数**下，在**对 sys 目录的只读权限**中选择**启用**。

1.  将 Neo 优化的模型资源添加到组中。上传您在[步骤 3：创建推理 Lambda 函数](#ml-console-dlc-create-lambda)中提取的示例程序包的 `resnet18` 目录中的模型资源。该目录包含使用 Resnet-18 训练的图像分类模型的预编译模型构件。按照[第 5 步：将 SageMaker 人工智能新优化的模型资源添加到 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 type (资源类型)**，选择 **Device (设备)**。
      + 在 **系统组所有者和文件访问权限** 下，选择 **自动添加拥有资源的系统组的文件系统权限**。

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

1. **如果在容器化模式下运行**，请添加以下本地卷资源以授予对设备摄像头的访问权限。按照[第 5 步：将 SageMaker 人工智能新优化的模型资源添加到 Greengrass 群组](#ml-console-dlc-add-resources)中的程序操作。
**注意**  
 如果您在非容器化模式下运行，则无需配置设备资源 AWS IoT Greengrass 即可访问您的设备摄像头。
   + 对于**资源类型**，选择**卷**。
   + 在 **系统组所有者和文件访问权限** 下，选择 **自动添加拥有资源的系统组的文件系统权限**。

          
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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 日志需要 root 权限。

   ```
   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.  验证该目录是否包含与您在 [步骤 3：创建推理 Lambda 函数](#ml-console-dlc-create-lambda) 中上传的 `optimizedImageClassification.zip` 部署程序包相同的内容。

    确保 `.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 资源路径不是 `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)。