如何使用 Amazon Web Services Management Console配置优化的机器学习推理 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon IoT Greengrass Version 1 2023 年 6 月 30 日进入延长寿命阶段。有关更多信息,请参阅 Amazon IoT Greengrass V1 维护策略。在此日期之后,将 Amazon IoT Greengrass V1 不会发布提供功能、增强功能、错误修复或安全补丁的更新。在上面运行的设备 Amazon IoT Greengrass V1 不会中断,将继续运行并连接到云端。我们强烈建议您迁移到 Amazon IoT Greengrass Version 2,这样可以添加重要的新功能支持其他平台

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

如何使用 Amazon Web Services Management Console配置优化的机器学习推理

要按照本教程中的步骤操作,您必须使用 Amazon IoT Greengrass Core v1.10 或更高版本。

您可以使用 SageMaker Neo 深度学习编译器优化本机机器学习推理模型在 Tensorflow、Apache MXNet、PyTorch、ONNX 和 XGBoost 框架中的预测效率,以实现更少的内存占用量和更快的性能。然后可以下载优化的模型,安装 SageMaker Neo 深度学习运行时,并将其部署到您的 Amazon IoT Greengrass 设备,以实现更快的推理。

本教程介绍如何使用 Amazon Web Services Management Console 将 Greengrass 组配置为运行一个 Lambda 推理示例,该示例可在本地识别摄像机中的图像,而无需将数据发送至云。该推理示例访问 Raspberry Pi 上的摄像机模块。在本教程中,您将下载由 Resnet-50 训练并在 Neo 深度学习编译器中优化的预先打包的模型。然后使用该模型在您的 Amazon IoT Greengrass 设备上执行本地图像分类。

本教程包含以下概括步骤:

先决条件

要完成此教程,需要:

注意

本教程使用的是 Raspberry Pi,但 Amazon IoT Greengrass 支持其他平台,例如 Intel AtomNVIDIA Jetson TX2。如果使用的是 Intel Atom 示例,您可能需要安装 Python 3.6 而不是 Python 3.7。有关配置设备以便安装 Amazon IoT Greengrass Core 软件的信息,请参阅设置其他设备

对于 Amazon IoT Greengrass 不支持的第三方平台,您必须在非容器化模式下运行 Lambda 函数。要在非容器化模式下运行,必须以 root 用户身份运行 Lambda 函数。有关更多信息,请参阅 选择 Lambda 函数容器化时的注意事项为组中的 Lambda 函数设置默认访问身份

步骤 1:配置 Raspberry Pi

在该步骤中,将安装 Raspbian 操作系统的更新,安装摄像机模块软件和 Python 依赖项,以及启用摄像机接口。

在您的 Raspberry Pi 终端中运行以下命令。

  1. 安装 Raspbian 的更新。

    sudo apt-get update sudo apt-get dist-upgrade
  2. 安装适用于摄像机模块的 picamera 接口以及本教程所需的其他 Python 库。

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

    验证安装:

    • 确保您的 Python 3.7 安装包含 pip。

      python3 -m pip

      如果未安装 pip,请从 pip 网站 下载它,然后运行以下命令。

      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.7python3 版本以避免依赖项错误。

  3. 重启 Raspberry Pi。

    sudo reboot
  4. 打开 Raspberry Pi 配置工具。

    sudo raspi-config
  5. 使用箭头键打开接口选项并启用摄像机接口。如果出现提示,请允许设备重新启动。

  6. 使用以下命令测试摄像机设置。

    raspistill -v -o test.jpg

    这将在 Raspberry Pi 上打开一个预览窗口,将名为 test.jpg 的图片保存到您的当前目录,并在 Raspberry Pi 终端中显示有关摄像机的信息。

步骤 2:安装 Amazon SageMaker Neo 深度学习运行时

在该步骤中,在 Raspberry Pi 上安装 Neo 深度学习运行时 (DLR)。

注意

对于本教程,我们建议安装 1.1.0 版。

  1. 远程登录您的 Raspberry Pi。

    ssh pi@your-device-ip-address
  2. 打开 DLR 文档,打开安装 DLR,然后找到 Raspberry Pi 设备的 wheel URL。然后,按照说明执行操作,在您的设备上安装 DLR。例如,您可以使用 pip:

    pip3 install rasp3b-wheel-url
  3. 安装 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 函数

在此步骤中,创建 Lambda 函数部署程序包和 Lambda 函数。接下来,发布函数版本并创建别名。

  1. 在您的计算机上,从机器学习示例下载 Raspberry Pi 的 DLR 示例。

  2. 不要解压下载的 dlr-py3-armv7l.tar.gz 文件。

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

    提取的示例程序包中的 examples 目录包含函数代码和依赖项。

    • inference.py 是本教程中使用的推理代码。可以将此代码用作模板来创建您自己的推理函数。

    • greengrasssdk 是适用于 Python 的 Amazon IoT Greengrass 核心 SDK 的 1.5.0 版本。

      注意

      如果提供了新版本,您可以下载该版本并升级部署程序包中的开发工具包版本。有关更多信息,请参阅 GitHub 上的适用于 Python 的 Amazon IoT Greengrass Core 软件开发工具包

  3. examples 目录的内容压缩到一个名为 optimizedImageClassification.zip 的文件中。这就是您的部署程序包。

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

    部署程序包包含您的函数代码和依赖项。其中包括的代码将调用 Neo 深度学习运行时 Python API 以使用 Neo 深度学习编译器模型执行推理。

    注意

    确保 .py 文件和依赖项位于该目录的根目录中。

  4. 现在,将 Lambda 函数添加到 Greengrass 组。

    从 Lambda 控制台页面,选择函数,然后选择创建函数

  5. 选择从头开始创作并使用以下值创建您的函数:

    • 对于 Function name(函数名称),请输入 optimizedImageClassification

    • 对于 Runtime (运行时),选择 Python 3.7

    对于权限,请保留默认设置。这将创建一个授予基本 Lambda 权限的执行角色。此角色未由 Amazon IoT Greengrass 使用。

    
            “Create function (创建函数)”页面的“Basic information (基本信息)”部分。
  6. 选择 Create function(创建函数)。

 

现在,上传您的 Lambda 函数部署程序包并注册处理程序。

  1. 代码选项卡上的代码源下,选择上传自。从下拉列表中选择 .zip 文件

    
                “上传自”下拉列表中突出显示了.zip 文件。
  2. 选择您的 optimizedImageClassification.zip 部署包,然后选择保存

  3. 在函数的代码选项卡中,在运行时设置下选择编辑,然后输入以下值。

    • 对于 Runtime (运行时),选择 Python 3.7

    • 对于处理程序,输入 inference.handler

    选择 Save(保存)。

    
            突出显示了“上传”的“运行时设置”部分。

 

接下来,发布您的 Lambda 函数的第一个版本。然后,创建版本的别名

注意

Greengrass 组可以按别名(推荐)或版本引用 Lambda 函数。使用别名,您可以更轻松地管理代码更新,因为您在更新函数代码时,不必更改订阅表或组定义。相反,您只需将别名指向新的函数版本。

  1. Actions 菜单上,选择 Publish new version

    
            “Actions (操作)”菜单中的“Publish new version (发布新版本)”选项。
  2. 对于 Version description (版本描述),输入 First version,然后选择 Publish (发布)

  3. optimizedImageClassification: 1 配置页面上,从 Actions (操作) 菜单中选择 Create alias (创建别名)

    
            “Actions (操作)”菜单中的“Create alia (创建别名)”选项。
  4. 创建新别名页面上,使用以下值:

    • 对于 Name(名称),请输入 mlTestOpt

    • 对于 Version (版本),输入 1

    注意

    Amazon IoT Greengrass 不支持 $LATEST 版本的 Lambda 别名。

  5. 选择 Create(创建)。

    现在,将 Lambda 函数添加到 Greengrass 组。

步骤 4:将 Lambda 函数添加到 Greengrass 组

在此步骤中,将 Lambda 函数添加到该组,然后配置其生命周期。

首先,将 Lambda 函数添加到 Greengrass 组。

  1. 在 Amazon IoT 控制台导航窗格的管理下,展开 Greengrass 设备,然后选择组 (V1)

  2. 在组配置页面上,选择 Lambda 函数选项卡,然后选择添加

  3. 选择 Lambda 函数 并选择 optimizedImageClassification

  4. Lambda 函数版本上,请选择您所发布的版本的别名。

 

接下来,配置 Lambda 函数的生命周期。

  1. Lambda 函数配置部分中,进行以下更新。

    注意

    我们建议您在不进行容器化的情况下运行 Lambda 函数,除非您的业务案例需要这样做。这有助于您在无需配置设备资源的前提下访问您的设备 GPU 和摄像头。如果您在没有容器化的情况下运行,则还必须为 Amazon IoT Greengrass Lambda 函数授予根用户访问权限。

    1. 在不进行容器化的情况下运行:

    2. 改为在容器化模式下运行:

      注意

      我们不建议以容器化模式运行,除非您的业务案例需要这样做。

      • 对于系统用户和组,选择使用组默认值

      • 对于 Lambda 函数容器化,选择使用组默认值

      • 对于 Memory limit (内存限制),输入 1024 MB

      • 对于 Timeout (超时),输入 10 seconds

      • 对于已固定,选择 True

        有关更多信息,请参阅Greengrass Lambda 函数的生命周期配置

      • 其他参数下,在对 sys 目录的只读权限中选择启用

  2. 选择 添加 Lambda 函数

步骤 5:将 SageMaker Neo 优化的模型资源添加到 Greengrass 组中

在此步骤中,将为优化的 ML 推理模型创建一个资源并将其上传到 Amazon S3 存储桶。然后,在 Amazon IoT Greengrass 控制台中找到 Amazon S3 上传的模型,并将新创建的资源与 Lambda 函数关联。这使该函数能够访问其在核心设备上的资源。

  1. 在您的计算机上,导航到您在步骤 3:创建推理 Lambda 函数中提取的示例程序包中的 resnet50 目录。

    注意

    如果使用的是 NVIDIA Jetson 示例,则需要改用示例程序包中的 resnet18 目录。有关更多信息,请参阅配置 NVIDIA Jetson TX2

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

    该目录包含使用 Resnet-50 训练的图像分类模型的预编译模型项目。

  2. resnet50 目录中的文件压缩到一个名为 resnet50.zip 的文件中。

    zip -r resnet50.zip .
  3. 在您的 Amazon IoT Greengrass 组的组配置页面上,选择 资源选项卡。导航到 Machine Learning (机器学习) 部分,然后选择 Add machine learning resource (添加机器学习资源)。在 Create a machine learning resource (创建机器学习资源) 页面上,对于 Resource name (资源名称),输入 resnet50_model

  4. 对于模型来源,选择使用存储在 S3 中的模型,例如通过深度学习编译器优化的模型

  5. S3 URI 下,选择浏览 S3

    注意

    当前,优化的 SageMaker 模型会自动存储在 Amazon S3 中。您可以使用此选项在 Amazon S3 存储桶中找到您的优化模型。有关 SageMaker 中模型优化的更多信息,请参阅 SageMaker Neo 文档

  6. 选择上传模型

  7. 在 Amazon S3 控制台选项卡中,将 zip 文件上传到 Amazon S3 存储桶。有关信息,请参阅 Amazon Simple Storage Service 用户指南中的如何将文件和文件夹上传到 S3 存储桶?

    注意

    您的存储桶名称必须包含字符串 greengrass。请选择唯一名称(如 greengrass-dlr-bucket-user-id-epoch-time)。不要在存储桶名称中使用句点 (.)。

  8. 在 Amazon IoT Greengrass 控制台选项卡中,找到并选择 Amazon S3 存储桶。找到并上传 resnet50.zip 文件,然后选择 Select (选择)。您可能需要刷新页面以更新可用存储桶和文件的列表。

  9. 对于 目的地路径,输入 /ml_model

    
            更新的目标路径。

    这是 Lambda 运行时目标命名空间中本地模型的目标。当您部署该组时,Amazon IoT Greengrass 将检索源模型包,然后将内容提取到指定的目录。

    注意

    强烈建议使用为您的本地路径提供的准确路径。如果在该步骤中使用不同的本地模型目标路径,则会导致本教程中提供的一些问题排查命令不准确。如果使用不同的路径,则必须设置一个使用此处提供的准确路径的 MODEL_PATH 环境变量。有关环境变量的信息,请参阅 Amazon Lambda 环境变量

  10. 如果在容器化模式下运行:

    1. 系统组所有者和文件访问权限下,选择指定系统组和权限

    2. 选择 只读访问权限,然后选择 添加资源

步骤 6:将摄像机设备资源添加到 Greengrass 组

在此步骤中,为摄像机模块创建一个资源,并将该资源与 Lambda 函数关联。这使 Lambda 函数能够访问核心设备上的资源。

注意

如果您在非容器化模式下运行,则无需配置此设备资源,Amazon IoT Greengrass 可直接访问您的设备 GPU 和摄像头。

  1. 在组配置页面上,选择资源选项卡。

  2. 本地资源选项卡上,选择添加本地资源

  3. 添加本地资源 页面上,使用以下值:

    • 对于 Resource name (资源名称),输入 videoCoreSharedMemory

    • 对于 Resource type (资源类型),选择 Device (设备)

    • 对于 本地设备路径,输入 /dev/vcsm

      设备路径是设备资源的本地绝对路径。该路径只能引用 /dev 下的字符设备或块储存设备。

    • 系统组所有者和文件访问权限 下,选择 自动添加拥有资源的系统组的文件系统权限

      组所有者文件访问权限选项可让您授予对 Lambda 进程的额外的文件访问权限。有关更多信息,请参阅组所有者文件访问权限

  4. 在页面底部,选择添加资源

  5. 资源选项卡中,选择添加并使用以下值创建另一个本地资源:

    • 对于 Resource name (资源名称),输入 videoCoreInterface

    • 对于 Resource type (资源类型),选择 Device (设备)

    • 对于 本地设备路径,输入 /dev/vchiq

    • 系统组所有者和文件访问权限 下,选择 自动添加拥有资源的系统组的文件系统权限

  6. 选择 Add resource (添加资源)

步骤 7:将订阅添加到 Greengrass 组

在该步骤中,将订阅添加到组。这些订阅使 Lambda 函数能够将预测结果发布到 MQTT 主题,从而将这些结果发送到 Amazon IoT。

  1. 在组配置页面中,选择订阅选项卡,然后选择添加订阅

  2. 创建订阅页面中,按如下所述配置源和目标:

    1. 源类型中,选择 Lambda 函数,然后选择 optimizedImageClassification

    2. 对于目标类型,选择服务,然后选择 IoT 云

    3. 主题筛选条件字段中,输入 /resnet-50/predictions,然后选择订阅

  3. 添加另一个订阅。选择订阅选项卡,选择添加订阅,然后按如下所示配置源和目标:

    1. 源类型中,选择服务,然后选择 IoT 云

    2. 目标类型中,选择 Lambda 函数,然后选择 optimizedImageClassification

    3. 主题筛选条件字段中,输入 /resnet-50/test,然后选择订阅

步骤 8:部署 Greengrass 组

在该步骤中,将最新版本的组定义部署到 Greengrass 核心设备。该定义包含您添加的 Lambda 函数、资源和订阅配置。

  1. 确保 Amazon IoT Greengrass 核心正在运行。根据需要在您的 Raspberry Pi 终端中运行以下命令。

    1. 要检查守护程序是否正在运行,请执行以下操作:

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

      如果输出包含 root/greengrass/ggc/packages/latest-core-version/bin/daemon 条目,则表示守护程序正在运行。

    2. 启动进程守护程序:

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. 在组配置页面上,选择部署

  3. Lambda 函数选项卡上,选择 IP 检测器,然后选择编辑

  4. 编辑 IP 检测器设置对话框中,选择自动检测和覆盖 MQTT 代理端点,然后选择保存

    这使得设备可以自动获取核心的连接信息,例如 IP 地址、DNS 和端口号。建议使用自动检测,不过 Amazon IoT Greengrass 也支持手动指定的终端节点。只有在首次部署组时,系统才会提示您选择发现方法。

    注意

    如果出现提示,请授予权限,以创建 Greengrass 服务角色并将其关联至当前 Amazon Web Services 区域中的 Amazon Web Services 账户。该角色将允许 Amazon IoT Greengrass 访问您的 Amazon 服务资源。

    Deployments (部署) 页面显示了部署时间戳、版本 ID 和状态。完成后,部署的状态应显示为 已完成

    有关部署的更多信息,请参阅 将 Amazon IoT Greengrass 组部署到 Amazon IoT Greengrass 核心。有关问题排查帮助,请参阅故障排除 Amazon IoT Greengrass

测试推理示例

现在,您可以验证是否正确配置了部署。要进行测试,您需要订阅 /resnet-50/predictions 主题,并向 /resnet-50/test 主题发布任何消息。这会触发 Lambda 函数使用您的 Raspberry Pi 拍照,并对捕获的图像执行推理。

注意

如果使用的是 NVIDIA Jetson 示例,请确保改用 resnet-18/predictionsresnet-18/test 主题。

注意

如果将一个监视器连接到 Raspberry Pi,活动摄像机源将显示在预览窗口中。

  1. 在 Amazon IoT 控制台主页的测试下,选择 MQTT 测试客户端

  2. 对于订阅,选择订阅主题。使用以下值。将剩余选项保留为默认值。

    • 对于 Subscription topic (订阅主题),输入 /resnet-50/predictions

    • 其他配置下,对于 MQTT 负载显示,请选择将负载显示为字符串

  3. 选择 Subscribe

  4. 选择发布主题,输入 /resnet-50/test 作为主题名称,然后选择发布

  5. 如果测试成功,发布的消息会触发 Raspberry Pi 摄像机捕获图像。来自 Lambda 函数的消息将显示在页面底部。该消息包含图像的预测结果,采用的格式为:预测的类名称、可能性和峰值内存使用率。

配置 Intel Atom

要在 Intel Atom 设备上运行本教程,您必须提供源图像、配置 Lambda 函数并添加其他本地设备资源。要使用 GPU 进行推理,请确保您的设备上已安装以下软件:

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

    将图像文件保存在包含 inference.py 文件的目录中(或保存在此目录的子目录中)。此目录位于您在 步骤 3:创建推理 Lambda 函数 中上传的 Lambda 函数部署程序包中。

    注意

    如果您使用的是 Amazon DeepLens,则可以使用板载摄像机或安装自己的摄像机来对捕获到的图像而非静态图像运行推理。但是,我们强烈建议您先用静态图像开始。

    如果您使用的是摄像机,请确保 awscam APT 程序包已安装并且是最新的。有关更多信息,请参阅 Amazon DeepLens 开发人员指南中的更新 Amazon DeepLens 设备

  2. 编辑 Lambda 函数的配置。按照步骤 4:将 Lambda 函数添加到 Greengrass 组中的程序进行操作。

    注意

    我们建议您在不进行容器化的情况下运行 Lambda 函数,除非您的业务案例需要这样做。这有助于您在无需配置设备资源的前提下访问您的设备 GPU 和摄像头。如果您在没有容器化的情况下运行,则还必须为 Amazon IoT Greengrass Lambda 函数授予根用户访问权限。

    1. 在不进行容器化的情况下运行:

      • 对于系统用户和群,请选择 Another user ID/group ID。在系统用户 ID 中,输入 0。在系统组 ID 中,输入 0

        这将允许您的 Lambda 函数以根用户身份运行。有关以根用户身份运行的更多信息,请参阅 为组中的 Lambda 函数设置默认访问身份

        提示

        您还必须更新 config.json 文件,从而能够为 Lambda 函数授予根用户访问权限。有关此步骤,请参阅 以根用户身份运行 Lambda 函数

      • 对于 Lambda 函数容器化,请选择无容器

        有关不进行容器化的情况下运行的更多信息,请参阅 选择 Lambda 函数容器化时的注意事项

      • 超时值增加到 2 分钟。这可确保请求不会过早超时。设置后,需要几分钟以运行推理。

      • 对于已固定,选择 True

      • 其他参数下,在对 sys 目录的只读权限中选择启用

    2. 改为在容器化模式下运行:

      注意

      我们不建议以容器化模式运行,除非您的业务案例需要这样做。

      • 内存限制值提高到 3000 MB。

      • 超时值增加到 2 分钟。这可确保请求不会过早超时。设置后,需要几分钟以运行推理。

      • 对于已固定,选择 True

      • 其他参数下,在对 sys 目录的只读权限中选择启用

  3. 将 Neo 优化的模型资源添加到组中。上传您在步骤 3:创建推理 Lambda 函数中提取的示例程序包的 resnet50 目录中的模型资源。该目录包含使用 Resnet-50 训练的图像分类模型的预编译模型项目。按照步骤 5:将 SageMaker Neo 优化的模型资源添加到 Greengrass 组中中的过程操作,并进行以下更新。

    • resnet50 目录中的文件压缩到一个名为 resnet50.zip 的文件中。

    • Create a machine learning resource (创建机器学习资源) 页面上,对于 Resource name (资源名称),输入 resnet50_model

    • 上传 resnet50.zip 文件。

  4. 如果在容器化模式下运行,请添加所需的本地设备资源以授予对设备 GPU 的访问权限。

    注意

    如果您在非容器化模式下运行,则无需配置设备资源,Amazon IoT Greengrass 可直接访问您的设备 GPU。

    1. 在组配置页面上,选择资源选项卡。

    2. 本地资源部分,选择添加本地资源

    3. 定义资源:

      • 对于 Resource name (资源名称),输入 renderD128

      • 对于 Resource type (资源类型),选择 Device (设备)

      • 对于 本地设备路径,输入 /dev/dri/renderD128

      • 系统组所有者和文件访问权限 下,选择 自动添加拥有资源的系统组的文件系统权限

配置 NVIDIA Jetson TX2

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

  1. 确保已配置您的 Jetson 设备,以便安装 Amazon IoT Greengrass Core 软件并使用 GPU 进行推理。有关配置设备的更多信息,请参阅设置其他设备。要在 NVIDIA Jetson TX2 上使用 GPU 进行推理,在使用 Jetpack 4.3 获取板卡图像时,您必须在设备上安装 CUDA 10.0 和 cuDNN 7.0。

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

    将图像文件保存在包含 inference.py 文件的目录中。您也可以将这些文件保存在此目录的子目录中。此目录位于您在 步骤 3:创建推理 Lambda 函数 中上传的 Lambda 函数部署程序包中。

    注意

    或者,您也可以在 Jetson 板上安装摄像头来捕获源图像。但是,我们强烈建议您先用静态图像开始。

  3. 编辑 Lambda 函数的配置。按照步骤 4:将 Lambda 函数添加到 Greengrass 组中的程序进行操作。

    注意

    我们建议您在不进行容器化的情况下运行 Lambda 函数,除非您的业务案例需要这样做。这有助于您在无需配置设备资源的前提下访问您的设备 GPU 和摄像头。如果您在没有容器化的情况下运行,则还必须为 Amazon IoT Greengrass Lambda 函数授予根用户访问权限。

    1. 在不进行容器化的情况下运行:

      • 对于运行方式,选择 Another user ID/group ID。对于 UID,请输入 0。对于 GUID,请输入 0

        这将允许您的 Lambda 函数以根用户身份运行。有关以根用户身份运行的更多信息,请参阅 为组中的 Lambda 函数设置默认访问身份

        提示

        您还必须更新 config.json 文件,从而能够为 Lambda 函数授予根用户访问权限。有关此步骤,请参阅 以根用户身份运行 Lambda 函数

      • 对于 Lambda 函数容器化,请选择无容器

        有关不进行容器化的情况下运行的更多信息,请参阅 选择 Lambda 函数容器化时的注意事项

      • 超时值增加到 5 分钟。这可确保请求不会过早超时。设置后,需要几分钟以运行推理。

      • 对于已固定,选择 True

      • 其他参数下,在对 sys 目录的只读权限中选择启用

    2. 改为在容器化模式下运行:

      注意

      我们不建议以容器化模式运行,除非您的业务案例需要这样做。

      • 提高内存限制值。要在 GPU 模式下使用提供的模型,请使用至少 2000 MB。

      • 超时值增加到 5 分钟。这可确保请求不会过早超时。设置后,需要几分钟以运行推理。

      • 对于已固定,选择 True

      • 其他参数下,在对 sys 目录的只读权限中选择启用

  4. 将 Neo 优化的模型资源添加到组中。上传您在步骤 3:创建推理 Lambda 函数中提取的示例程序包的 resnet18 目录中的模型资源。该目录包含使用 Resnet-18 训练的图像分类模型的预编译模型构件。按照步骤 5:将 SageMaker Neo 优化的模型资源添加到 Greengrass 组中中的过程操作,并进行以下更新。

    • resnet18 目录中的文件压缩到一个名为 resnet18.zip 的文件中。

    • Create a machine learning resource (创建机器学习资源) 页面上,对于 Resource name (资源名称),输入 resnet18_model

    • 上传 resnet18.zip 文件。

  5. 如果在容器化模式下运行,请添加所需的本地设备资源以授予对设备 GPU 的访问权限。

    注意

    如果您在非容器化模式下运行,则无需配置设备资源,Amazon IoT Greengrass 可直接访问您的设备 GPU。

    1. 在组配置页面上,选择资源选项卡。

    2. 本地资源部分,选择添加本地资源

    3. 定义每个资源:

      • 对于资源名称设备路径,请使用下表中的值。为表中的每个行创建一个设备资源。

      • 对于 Resource type (资源类型),选择 Device (设备)

      • 系统组所有者和文件访问权限 下,选择 自动添加拥有资源的系统组的文件系统权限

         

        名称

        设备路径

        nvhost-ctrl

        /dev/nvhost-ctrl

        nvhost-gpu

        /dev/nvhost-gpu

        nvhost-ctrl-gpu

        /dev/nvhost-ctrl-gpu

        nvhost-dbg-gpu

        /dev/nvhost-dbg-gpu

        nvhost-prof-gpu

        /dev/nvhost-prof-gpu

        nvmap

        /dev/nvmap

        nvhost-vic

        /dev/nvhost-vic

        tegra_dc_ctrl

        /dev/tegra_dc_ctrl

  6. 如果在容器化模式下运行,请添加以下本地卷资源以授予对设备摄像头的访问权限。按照步骤 5:将 SageMaker Neo 优化的模型资源添加到 Greengrass 组中中的程序进行操作。

    注意

    如果您在非容器化模式下运行,则无需配置设备资源,Amazon IoT Greengrass 可直接访问您的设备 摄像头。

    • 对于 Resource type (资源类型),选择 Volume (卷)

    • 系统组所有者和文件访问权限 下,选择 自动添加拥有资源的系统组的文件系统权限

       

      名称

      源路径

      目的地路径

      shm

      /dev/shm

      /dev/shm

      tmp

      /tmp

      /tmp

  7. 更新组订阅以使用正确的目录。按照步骤 7:将订阅添加到 Greengrass 组中的过程操作,并进行以下更新。

    • 对于第一个主题筛选器,请输入 /resnet-18/predictions

    • 对于第二个主题筛选器,请输入 /resnet-18/test

  8. 更新测试订阅以使用正确的目录。按照测试推理示例中的过程操作,并进行以下更新。

    • 对于订阅,选择订阅主题。对于 Subscription topic (订阅主题),输入 /resnet-18/predictions

    • /resnet-18/predictions 页面上,指定要发布到的 /resnet-18/test 主题。

Amazon IoT Greengrass ML 推理问题排查

如果测试失败,您可以尝试以下问题排查步骤。在您的 Raspberry Pi 终端中运行以下命令。

检查错误日志

  1. 切换到根用户并导航到 log 目录。访问 Amazon IoT Greengrass 日志需要根权限。

    sudo su cd /greengrass/ggc/var/log
  2. 检查 runtime.log 是否存在任何错误。

    cat system/runtime.log | grep 'ERROR'

    您还可以在用户定义的 Lambda 函数日志中查找任何错误:

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

    有关更多信息,请参阅使用日志排查问题

 

验证 Lambda 函数是否已成功部署

  1. 列出 /lambda 目录中已部署的 Lambda 的内容。在运行命令前替换占位符值。

    cd /greengrass/ggc/deployment/lambda/arn:aws:lambda:region:account:function:function-name:function-version ls -la
  2. 验证该目录是否包含与您在 步骤 3:创建推理 Lambda 函数 中上传的 optimizedImageClassification.zip 部署程序包相同的内容。

    确保 .py 文件和依赖项位于该目录的根目录中。

 

验证推理模型是否已成功部署

  1. 查找 Lambda 运行时进程的进程标识号 (PID):

    ps aux | grep lambda-function-name

    在输出中,PID 显示在 Lambda 运行时进程的行的第二列中。

  2. 输入 Lambda 运行时命名空间。请确保在运行命令前替换占位符 pid 值。

    注意

    此目录及其内容位于 Lambda 运行时命名空间中,因此它们不会显示在常规 Linux 命名空间中。

    sudo nsenter -t pid -m /bin/bash
  3. 列出您为 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

如果 OpenCL 无法连接到需要的 GPU 设备,则可能会发生这种情况。您必须为 Lambda 函数创建必要设备的设备资源。

后续步骤

接下来,探索其他优化模型。有关信息,请参阅 SageMaker Neo 文档