AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如何使用 AWS 管理控制台配置机器学习推理

要执行本教程中的步骤,您必须使用 AWS IoT Greengrass 核心 v1.6 or later。

您可以使用连接的设备中的数据在 Greengrass 核心设备上本地执行机器学习 (ML) 推理。有关信息(包括要求和约束),请参阅执行机器学习推理

本教程介绍如何使用 AWS 管理控制台将 Greengrass 组配置为运行一个 Lambda 推理应用程序,该应用程序可在本地识别摄像机中的图像,而无需将数据发送至云。该推理应用程序将访问 Raspberry Pi 上的摄像机模块并使用开源 SqueezeNet 模型运行推理。

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

先决条件

要完成此教程,需要:

注意

本教程使用的是 Raspberry Pi,但 AWS IoT Greengrass 支持其他平台,如 Intel Atom 和 NVIDIA Jetson TX2。例如,Jetson TX2 可以使用静态图像,而不是从摄像机流式传输的图像。

步骤 1:配置 Raspberry Pi

在该步骤中,您将安装 Rasbian 操作系统的更新,安装摄像机模块软件和 Python 依赖项,以及启用摄像机接口。在您的 Raspberry Pi 终端中运行以下命令。

  1. 安装 Raspbian 的更新。

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

    sudo apt-get install -y python-dev python-setuptools python-pip python-picamera
  3. 重启 Raspberry Pi。

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

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

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

    raspistill -v -o test.jpg

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

步骤 2:安装 MXNet 框架

在该步骤中,您将下载 Apache MXNet 预编译库并将其安装在您的 Raspberry Pi 上。

注意

本教程使用适用于 MXNet ML 框架的库,但适用于 TensorFlow 的库也可用。有关更多信息(包括限制),请参阅ML 推理的运行时和预编译框架库

  1. AWS IoT Greengrass 机器学习运行时和预编译库 下载 页面上,找到适用于 Raspberry Pi 的 MXNet 版本 1.2.1。选择 Download (下载)

    注意

    一旦下载此软件,即表示您同意 Apache 许可证 2.0

  2. 将下载的 ggc-mxnet-v1.2.1-python-raspi.tar.gz 文件从您的计算机传输至 Raspberry Pi。

    注意

    有关在不同平台上执行该操作的方式,请参阅“入门”部分中的该步骤。例如,您可以使用以下 scp 命令:

    scp ggc-mxnet-v1.2.1-python-raspi.tar.gz pi@IP-address:/home/pi
  3. 在您的 Raspberry Pi 终端中,解压缩传输的文件。

    tar -xzf ggc-mxnet-v1.2.1-python-raspi.tar.gz
  4. 安装 MXNet 框架。

    cd ggc-mxnet-v1.2.1-python-raspi/ ./mxnet_installer.sh

    注意

    您可以在安装此框架的同时继续执行 步骤 3:创建 MXNet 模型包,但必须先等待安装完成,然后才能继续执行 步骤 4:创建并发布 Lambda 函数

    您可以选择运行单元测试来验证安装。为此,请向上一个命令添加 -u 选项。如果成功,每个测试都会在终端中记录以 ok 结尾的行。如果所有测试都成功,则最后一条日志语句包含 OK。运行单元测试会增加安装时间。

    该脚本还会创建一个名为 greengrassObjectClassification.zip 的 Lambda 函数部署程序包,其中包含函数代码和依赖项。您将在稍后上传此部署程序包。

  5. 在安装完成后,将 greengrassObjectClassification.zip 传输至您的计算机。根据您的环境,您可以使用 scp 命令或实用程序,如 WinSCP

步骤 3:创建 MXNet 模型包

在该步骤中,您将下载示例预训练 MXNet 模型的文件,然后将这些文件另存为 .zip 文件。AWS IoT Greengrass 可以使用 Amazon S3 中的模型,前提是它们使用的是 tar.gz.zip 格式。

  1. 将以下文件下载到您的计算机:

    注意

    所有 MXNet 模型包都使用这三种文件类型,但 TensorFlow 模型包的内容有所不同。

  2. 压缩这三个文件,并将压缩后的文件命名为 squeezenet.zip。您可在步骤 6:将资源添加到 Greengrass 组中将此模型包上传到 Amazon S3。

步骤 4:创建并发布 Lambda 函数

在该步骤中,您将创建一个 Lambda 函数并将其配置为使用部署程序包。接着,发布函数版本并创建别名。

Lambda 函数部署程序包被命名为 greengrassObjectClassification.zip。这是在步骤 2:安装 MXNet 框架中安装 MXNet 框架期间生成的 zip 文件。它包含一个执行常见任务的推理应用程序,如加载模型、导入 Apache MXNet 和基于预测采取措施。该应用程序包含以下关键组件:

  • 应用程序逻辑:

    • load_model.py。加载 MXNet 模型。

    • greengrassObjectClassification.py。对从摄像机流式传输的图像运行预测。

  • 附属物:

    • greengrasssdk。适用于 Python 的 AWS IoT Greengrass Core 开发工具包,由此函数用来发布 MQTT 消息。

      注意

      在 MXNet 框架安装过程中,mxnet 库安装在核心设备上。

首先,创建 Lambda 函数。

  1. 在 AWS IoT 控制台的导航窗格中,选择 Greengrass,然后选择 Groups (组)

    
            AWS IoT 控制台中的导航窗格,突出显示了“Groups (组)”。
  2. 选择要在其中添加 Lambda 函数的 Greengrass 组。

  3. 在组配置页面上,选择 Lambdas,然后选择 Add Lambda

    
            突出显示“Lambdas”和“Add Lambda (添加 Lambda)”的组页面。
  4. Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组) 页面上,选择 Create new Lambda。此操作将打开 AWS Lambda 控制台。

    
            突出显示包含“Create new Lambda (新建 Lambda)”的“Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组)”页面。
  5. 选择 Author from scratch 并使用以下值创建您的函数:

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

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

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

  6. 选择 Create function

    
            突出显示“Create function (创建函数)”的“Create function (创建函数)”页面。

     

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

  7. greengrassObjectClassification 函数的 Configuration (配置) 选项卡上,对于 Function code (函数代码),使用以下值:

    • 对于 代码输入种类,选择上传 .zip 文件

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

    • 对于 Handler (处理程序),输入 greengrassObjectClassification.function_handler

  8. 选择 Upload

    
            突出显示“Upload (上传)”的“Function code (函数代码)”部分。
  9. 选择您的 greengrassObjectClassification.zip 部署程序包。

  10. 选择 Save

     

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

    注意

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

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

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

  13. greengrassObjectClassification: 1 配置页面上,从操作菜单中选择创建别名

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

    • 对于 Name (名称),输入 mlTest

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

    注意

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

  15. 选择 Create

    
            突出显示“Create (创建)”的“Create a new alias (创建新别名)”页面。

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

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

在该步骤中,您将 Lambda 函数添加到该组,然后配置其生命周期和环境变量。

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

  1. 在 AWS IoT 控制台中,打开组配置页面。

  2. 选择 Lambda,然后选择 Add Lambda

    
            突出显示“Lambdas”和“Add Lambda (添加 Lambda)”的组页面。
  3. Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组) 页面上,选择 Use existing Lambda

    
            突出显示“Use existing Lambda (使用现有 Lambda)”的“Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组)”页面。
  4. 选择 greengrassObjectClassification,然后选择 Next

  5. Select a Lambda version (选择 Lambda 版本) 页面上,选择 Alias:mlTest,然后选择 Finish

     

    接下来,配置 Lambda 函数的生命周期和环境变量。

  6. Lambda 页面上,选择 greengrassObjectClassification Lambda 函数。

    
            突出显示包含 greengrassObjectClassification Lambda 函数的“Lambda”页面。
  7. greengrassObjectClassification 配置页面上,选择编辑

  8. Group-specific Lambda configuration (组特定的 Lambda 配置) 页面上,使用以下值:

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

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

    • 对于 Lambda lifecycle (&LAM; 生命周期),选择 Make this function long-lived and keep it running indefinitely (使此函数长时间生存,保持其无限期运行)

    • 对于 Read access to /sys directory (对 /sys 目录的只读访问权限),选择 Enable (启用)

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

    
            包含更新后的属性的 greengrassObjectClassification 页面。
  9. Environment variables (环境变量) 下,创建一个键/值对。键/值对是与 Raspberry Pi 上的 MXNet 模型进行交互的函数所必需的。

    对于键,使用 MXNET_ENGINE_TYPE。对于值,使用 NaiveEngine。

    注意

    在您自己的用户定义的 Lambda 函数中,您可以选择在函数代码中设置环境变量。

  10. 为所有其他属性保留默认值,然后选择更新

步骤 6:将资源添加到 Greengrass 组

在该步骤中,您将为摄像机模块和 ML 推理模型创建资源。您还会将这些资源与Lambda函数关联,从而使该函数能够访问核心设备上的资源。

首先,为摄像机创建两种本地设备资源:一种用于共享内存,另一种用于设备接口。有关本地资源访问的更多信息,请参阅使用 Lambda 函数和连接器访问本地资源

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

    
            突出显示包含“Resources (资源)”的组配置页面。
  2. 本地选项卡上,选择添加本地资源

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

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

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

    • 对于 Device path (设备路径),输入 /dev/vcsm

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

    • 对于组所有者文件访问权限,选择自动添加拥有资源的 Linux 组的操作系统组权限

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

    
            包含编辑后的资源属性的“Create a local resource (创建本地资源)”页面。
  4. Lambda 函数从属关系下,选择选择

  5. 选择 greengrassObjectClassification,选择读写访问权限,然后选择完成

    
            突出显示包含“Done (完成)”的 Lambda 函数从属关系属性。

    接下来,您将为摄像机接口添加本地设备资源。

  6. 选择添加其他资源

  7. 创建本地资源页面上,使用以下值:

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

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

    • 对于 Device path (设备路径),输入 /dev/vchiq

    • 对于组所有者文件访问权限,选择自动添加拥有资源的 Linux 组的操作系统组权限

    
            包含编辑后的资源属性的“Create a local resource (创建本地资源)”页面。
  8. Lambda 函数从属关系下,选择选择

  9. 选择 greengrassObjectClassification,选择读写访问权限,然后选择完成

  10. 在页面底部,选择保存

 

现在,将推理模型添加为机器学习资源。此步骤包含将 squeezenet.zip 模型包上传到 Amazon S3。

  1. 在组的资源页面上,选择机器学习,然后选择添加机器学习资源

  2. 创建机器学习资源页面上,对于资源名称,输入 squeezenet_model

    
            包含更新后的属性的“Add Machine Learning Model”(添加机器学习模型) 页面。
  3. 对于模型源,选择 Upload a model in S3 (在 S3 中上传模型)

  4. Model from S3 (从 S3 获取模型) 下,选择 Select (选择)

  5. 选择上传模型。这会在 Amazon S3 控制台中打开一个新选项卡。

  6. 在 Amazon S3 控制台选项卡中,将 squeezenet.zip 文件上传到 Amazon S3 存储桶。有关信息,请参阅如何将文件和文件夹上传至 S3 存储桶?

    注意

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

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

  8. 对于本地路径,输入 /greengrass-machine-learning/mxnet/squeezenet

    这是 Lambda 运行时命名空间中的本地模型的目标。当您部署该组时,AWS IoT Greengrass 将检索源模型包,然后将内容提取到指定的目录。本教程的示例 Lambda 函数已配置为使用此路径(在 model_path 变量中)。

  9. Lambda 函数从属关系下,选择选择

  10. 选择 greengrassObjectClassification,选择只读访问权限,然后选择完成

  11. 选择 Save

使用 Amazon SageMaker 训练模型

本教程使用存储在 Amazon S3 中的模型,但您也可以轻松地使用 Amazon SageMaker 模型。AWS IoT Greengrass 控制台具有内置的 Amazon SageMaker 集成,因此您无需手动将这些模型上传到 Amazon S3。有关使用 Amazon SageMaker 模型的要求和限制,请参阅支持的模型源

使用 Amazon SageMaker 模型:

  • 对于模型源,选择使用现有的 SageMaker 模型,然后选择该模型的训练任务的名称。

  • 对于本地路径,输入您的 Lambda 函数在其中查找该模型的目录的路径。

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

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

  1. 在组配置页面上,选择 Subscriptions (订阅),然后选择 Add Subscription

    
            突出显示“Subscriptions (订阅)”和“Add Subscription (添加订阅)”的组页面。
  2. 选择您的源和目标页面,配置源和目标,如下所示:

    1. 选择源中,选择 Lambda,然后选择 greengrassObjectClassification

    2. 选择目标中,选择服务,然后选择 IoT Cloud

    3. 选择 Next

      
                突出显示“Next (下一步)”的“Select your source and target (选择您的源和目标)”页面。
  3. 利用主题筛选您的数据页面上,在主题筛选条件中,输入 hello/world,然后选择下一步

    
            突出显示包含“Next (下一步)”的“Filter your data with a topic (利用主题筛选您的数据)”页面。
  4. 选择 Finish

步骤 8:部署 Greengrass 组

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

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

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

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

      如果输出包含 /greengrass/ggc/packages/1.9.3/bin/daemonroot 条目,则表示守护程序正在运行。

      注意

      路径中的版本取决于您的核心设备上安装的 AWS IoT Greengrass 核心软件版本。

    2. 要启动守护程序,请执行以下操作:

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. 在组配置页面上,选择部署,然后从操作菜单中,选择部署

    
            突出显示“Deployments (部署)”和“Deploy (部署)”的组页面。
  3. Configure how devices discover your core (配置设备搜索您的核心的方式) 页面上,选择 Automatic detection

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

    
            突出显示“Automatic detection (自动检测)”的“Configure how devices discover your core (配置设备搜索您的核心的方式)”页面。

    注意

    在系统提示时,授予权限以创建Greengrass 服务角色,并将该角色与您在当前 AWS 区域中的 AWS 账户关联。该角色允许 AWS IoT Greengrass 访问您 AWS 服务中的资源。

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

    有关问题排查帮助,请参阅AWS IoT Greengrass 问题排查

测试推理应用程序

现在,您可以验证是否正确配置了部署。要进行测试,您应订阅 hello/world 主题并查看由 Lambda 函数发布的预测结果。

注意

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

  1. 在 AWS IoT 控制台中,选择测试

    
            AWS IoT 控制台中的导航窗格,突出显示了“Test (测试)”。
  2. 对于 Subscriptions (订阅),使用以下值:

    • 对于订阅主题,请使用 hello/world。

    • 对于 MQTT payload display (MQTT 负载显示),选择 Display payloads as strings (以字符串形式显示负载)

  3. 选择 Subscribe to topic

    如果测试成功,来自 Lambda 函数的消息将显示在页面底部。每条消息包含图像的前 5 个预测结果,这些结果使用以下格式:可能性、预测的类 ID 及对应的类名称。

    
            显示了包含消息数据的测试结果的“Subscriptions (订阅)”页面。

AWS IoT Greengrass ML 推理问题排查

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

检查错误日志

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

    sudo su cd /greengrass/ggc/var/log
  2. 检查 runtime.logpython_runtime.log

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

Runtime.log 中的“解压缩”错误

如果 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 函数是否已成功部署

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

    cd /greengrass/ggc/deployment/lambda/arn:aws:lambda:region:account:function:function-name:function-version ls -la
  2. 验证该目录是否包含与您在 步骤 4:创建并发布 Lambda 函数 中上传的 greengrassObjectClassification.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 资源指定的本地目录的内容。

    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

后续步骤

接下来,探索其他推理应用程序。AWS IoT Greengrass 提供了您可用于尝试执行本地推理的其他 Lambda 函数。您可以在您在步骤 2:安装 MXNet 框架中下载的预编译库文件夹中查找示例程序包。

配置 NVIDIA Jetson TX2

要在 NVIDIA Jetson TX2 上运行此教程,您需要提供源图像并配置 Lambda 函数。如果您使用的是 GPU,则还必须添加本地设备资源。

要了解如何配置 Jetson 以便可以安装 AWS IoT Greengrass 核心软件,请参阅设置其他设备

  1. 下载 Lambda 函数的静态 PNG 或 JPG 图像以用于图像分类。该应用最适合小型图像文件。或者,您可以分析 Jetson 板上的摄像机来捕获源图像。

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

  2. 编辑 Lambda 函数的配置以提高 Memory limit (内存限制) 值。对于 CPU 使用 500 MB,或对 GPU 使用 2048 MB。按照步骤 5:将 Lambda 函数添加到 Greengrass 组中过程操作。

  3. 仅 GPU:添加以下本地设备资源。按照步骤 6:将资源添加到 Greengrass 组中过程操作。

    对于每个资源:

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

    • 对于组所有者文件访问权限,选择自动添加拥有资源的 Linux 组的操作系统组权限

    • 对于 Lambda function affiliations (Lambda 函数从属关系),为您的 Lambda 函数授予 Read and write access (读写访问权限)

       

      名称

      设备路径

      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