如何使用 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 Version 2,这增加了重要的新功能支持其他平台

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

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

要执行本教程中的步骤,您必须使用Amazon IoT GreengrassCore 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 函数。要在非容器化模式下运行,您必须以根用户身份,运行您的 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是 1.5.0 版的Amazon IoT Greengrass适用于 Python 的核心开发工具包

      注意

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

  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

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

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

 

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

  1. 在存储库的代码选项卡,位于源代码,选择从以下项上传. 从下拉列表中,选择。...zip 文件.

    
                带有 .zip 文件的上传自下拉列表突出显示。
  2. 选择您的optimizedImageClassification.zip部署包,然后选择Save(保存).

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

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

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

    选择Save(保存)。

    
            突出显示 “Upload (运行时)” 部分。

 

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

注意

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

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

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

  3. 在存储库的optimizedImageClassification:1配置页面,来自操作菜单中,选择创建别名.

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

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

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

    注意

    Amazon IoT Greengrass不支持将 Lambda 别名用于$LATEST版本。

  5. 选择Create(创建)。

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

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

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

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

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

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

  3. 选择Lambda 函数并选择optimizedImageClassification.

  4. 在存储库的Lambda 函数版本中,选择您发布的版本的别名。

 

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

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

    注意

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

    1. 要在没有容器化的情况下运行:

    2. 要改为在容器化模式下运行,请执行以下操作:

      注意

      建议在容器化模式下运行,除非您的业务案例需要这样,除非您的业务案例需要这样,除非您的业务案例需要这样。

      • 适用于系统用户和组,选择使用Group 默认值.

      • 适用于Lambda 函数容器化,选择使用Group 默认值.

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

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

      • 适用于Pinned,选择True.

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

      • UNDER其他参数,对于对 /sys 目录的只读访问权限,选择Enabled (已启用).

  2. 选择添加 Lambda 函数.

第 5 步:添加 SageMaker Greengrass 组的新优化的模型资源

在此步骤中,将为优化的 ML 推理模型创建一个资源并将其上传到 Amazon Simple Storage Service(Amazon S3) 然后 Amazon S3 在Amazon IoT Greengrass控制台并将新创建的资源与 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 GreengrassGroup (组),选择资源选项卡。导航到 Machine Learning (机器学习) 部分,然后选择 Add machine learning resource (添加机器学习资源)。在 Create a machine learning resource (创建机器学习资源) 页面上,对于 Resource name (资源名称),输入 resnet50_model

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

  5. UNDERS3 URI,选择浏览 S3.

    注意

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

  6. 选择上传模型

  7. 在 Amazon S3 控制台选项卡中,将 zip 文件上载到 Simple StorAmazon S3 vice 想要了解有关信息,请参阅如何将文件和文件夹上传至 S3 存储桶?中的Amazon Simple Storage S.

    注意

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

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

  9. In目的地路径,输入。/ml_model.

    
            更新的目标路径。

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

    注意

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

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

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

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

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

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

注意

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

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

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

  3. 在存储库的添加本地资源页面上,使用以下值:

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

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

    • 适用于本地设备路径,输入。/dev/vcsm.

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

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

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

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

  5. 资源选项卡上,通过选择创建另一个本地资源Add并使用以下值:

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

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

    • 适用于本地设备路径,输入。/dev/vchiq.

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

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

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

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

  1. 在组配置页面上,选择 Settors (组配置)订阅选项卡,然后选择。添加订阅.

  2. 在存储库的创建订阅页面上,配置源和目标,如下所示:

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

    2. InTarget type,选择服务,然后选择。IoT 云.

    3. 主题筛选条件,输入。/resnet-50/predictions,然后选择。创建订阅.

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

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

    2. InTarget type,选择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 代理端点然后选择Save(保存).

    这使得设备可以自动获取核心的连接信息,例如 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

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

  3. 选择 Subscribe

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

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

配置 Intel Atom

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

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

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

    注意

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

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

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

    注意

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

    1. 要在没有容器化的情况下运行:

      • 适用于系统用户和组,选择Another user ID/group ID. 适用于系统用户 ID,输入。0. 适用于系统组 ID,输入。0.

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

        提示

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

      • 适用于Lambda 函数容器化,选择无容器.

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

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

      • 适用于Pinned,选择True.

      • UNDER其他参数,对于对 /sys 目录的只读访问权限,选择Enabled (已启用).

    2. 要改为在容器化模式下运行,请执行以下操作:

      注意

      建议在容器化模式下运行,除非您的业务案例需要这样,除非您的业务案例需要这样,除非您的业务案例需要这样。

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

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

      • 适用于Pinned,选择True.

      • UNDER其他参数,对于对 /sys 目录的只读访问权限,选择Enabled (已启用).

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

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

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

    • 上传 resnet50.zip 文件。

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

    注意

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

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

    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 文件的目录中。您也可以将这些文件保存在此目录的子目录中。此目录位于您在中上传的 Lambda 函数部署程序包中第 3 步:创建推理 Lambda 函数.

    注意

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

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

    注意

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

    1. 要在没有容器化的情况下运行:

      • 适用于Run as (运行方式),选择Another user ID/group ID. 适用于UID,输入。0. 适用于GUID,输入。0.

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

        提示

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

      • 适用于Lambda 函数容器化,选择无容器.

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

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

      • 适用于Pinned,选择True.

      • UNDER其他参数,对于对 /sys 目录的只读访问权限,选择Enabled (已启用).

    2. 要改为在容器化模式下运行,请执行以下操作:

      注意

      建议在容器化模式下运行,除非您的业务案例需要这样,除非您的业务案例需要这样,除非您的业务案例需要这样。

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

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

      • 适用于Pinned,选择True.

      • UNDER其他参数,对于对 /sys 目录的只读访问权限,选择Enabled (已启用).

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

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

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

    • 上传 resnet18.zip 文件。

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

    注意

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

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

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

    3. 定义每个资源:

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

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

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

         

        名称

        设备路径

        nvhost-ctrl

        /dev/nvhost-ctrl

        nvhost-gpu

        /dev/nvhost-gpu

        nvhost-ctrl-gpu

        /devnvhost-ctrl-gpu

        nvhost-dbg-gpu

        /devnvhost-dbg-gpu

        nvhost-prof-gpu

        /devnvhost-prof-gpu

        nvmap

        /dev/nvmap

        nvhost-vic

        /dev/nvhost-vic

        tegra_dc_ctrl

        /dev/tegra_dc_ctrl

  6. 如果在容器化模式下运行中,添加以下本地卷资源以授予对设备摄像头的访问权限。按照第 5 步:添加 SageMaker 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. Checkruntime.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. 验证该目录是否包含与optimizedImageClassification.zip您在中上传的部署包第 3 步:创建推理 Lambda 函数.

    确保 .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 文档