如何使用 AWS 管理控制台配置优化的机器学习推理 - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

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

您可以使用 SageMaker Neo 深度学习编译器 优化Tensorflow、Apache MXNet, PyTorch、ONNX和 XGBoost 框架,实现更小的占用空间和更快的性能。然后可以下载优化的模型,安装 SageMaker Neo 深度学习运行时,并将其部署到 AWS IoT Greengrass 设备,以实现更快的推理。

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

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

Prerequisites

要完成此教程,需要:

注意

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

对于第三方平台, AWS 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 新深度学习运行时

在此步骤中,在 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 版的适用于 Python 的 AWS IoT Greengrass Core 开发工具包。

      注意

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

  3. 压缩 examples 目录导入名为的文件 optimizedImageClassification.zip。这是您的部署包。

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

    部署程序包包含您的函数代码和依赖项。这包括调用 Neo 深度学习运行时 蟒蛇纹 APIs 进行推理 Neo 深度学习编译器 型号。

    注意

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

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

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

    
            中的导航窗格 AWS IoT 控制台 突出显示组。
  5. 选择要在其中添加 Lambda 函数的 Greengrass 组。

  6. 在组配置页面上,选择 朗格斯,然后选择 Add Lambda.

    
            突出显示“Lambdas”和“Add Lambda (添加 Lambda)”的组页面。
  7. 将Lambda添加到您的Greengrass组 页面,选择 Create new Lambda。这会打开 AWS Lambda 控制台。

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

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

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

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

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

 

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

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

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

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

    • 对于 Handler (处理程序),请输入 inference.handler

  2. 选择 Upload.

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

  4. 选择 Save (保存)

 

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

注意

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

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

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

  3. optimizedImageClassification:1人 配置页面,从 操作 菜单,选择 创建别名.

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

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

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

    注意

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

  5. 选择创建

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

第4步: 添加 Lambda 到Greengrass组

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

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

  1. 将Lambda添加到您的Greengrass组 页面,选择 Use existing Lambda.

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

  3. 选择Lambda版本 页面,选择 别名:mlTestOpti,然后选择 Finish.

 

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

  1. 朗格斯 选择 optimizedImageClassification Lambda 功能。

    
            Lambdas页面 optimizedImageClassification Lambda 功能突出显示。
  2. optimizedImageClassification 配置页面,请选择 编辑.

  3. 组特定Lambda配置 ,请进行以下更新。

    注意

    我们建议您运行 Lambda 功能,无需容器化,除非您的业务案例需要。这有助于在不配置设备资源的情况下启用对设备GPU和相机的访问。如果您在运行时没有容器化,则还必须授予根访问权限 AWS IoT Greengrass Lambda 功能。

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

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

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

        提示

        您还必须更新 config.json 文件,以授予根访问您的 Lambda 功能。有关该程序,请参阅 以根用户身份运行 Lambda 函数.

      • 对于 集装箱化,选择 无容器.

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

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

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

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

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

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

      注意

      我们建议不要在容器化模式下运行,除非您的业务案例需要它。

      • 对于 运行方式,选择 使用组默认值.

      • 对于 集装箱化,选择 使用组默认值.

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

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

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

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

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

  4. 选择 Update (更新)

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

在此步骤中,将为优化的 ML 推理模型创建一个资源并将其上传到 Amazon S3 存储桶。然后,在 AWS 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. 在您的 AWS IoT Greengrass 组的组配置页面上,选择 Resources (资源)。导航到 Machine Learning (机器学习) 部分,然后选择 Add machine learning resource (添加机器学习资源)。在 Create a machine learning resource (创建机器学习资源) 页面上,对于 Resource name (资源名称),输入 resnet50_model

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

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

    注意

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

  6. 选择上传模型

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

    注意

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

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

  9. Local path (本地路径) 中,输入 /ml_model

    
            更新的本地路径。

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

    注意

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

  10. Identify resource owner and set access permissions (标识资源所有者并设置访问权限) 下,选择 No OS group (无操作系统组)

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

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

    2. 选择 optimizedImageClassification,选择 只读访问,然后选择 已完成.

  12. 选择 Save (保存)

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

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

注意

如果以非集装箱模式运行, AWS IoT Greengrass 可以在不配置此设备资源的情况下访问您的设备GPU和摄像头。

  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. 选择 optimizedImageClassification,选择 读写权限,然后选择 已完成.

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

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

  6. 在页面底部,选择添加其他资源

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

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

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

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

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

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

  9. 选择 optimizedImageClassification,选择 读写权限,然后选择 已完成.

  10. 选择 Save (保存)

第7步: 添加订阅到Greengrass组

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

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

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

    1. 英寸 选择来源,选择 朗格斯,然后选择 optimizedImageClassification.

    2. 英寸 选择一个目标,选择 服务,然后选择 IoT 云.

    3. 选择 Next.

      
                突出显示“Next (下一步)”的“Select your source and target (选择您的源和目标)”页面。
  3. 使用主题筛选数据 页面,在 可选主题过滤器,输入 /resnet-50/predictions,然后选择 Next.

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

  5. 添加另一个订阅。在选择您的源和目标页面,配置源和目标,如下所示:

    1. 英寸 选择来源,选择 服务,然后选择 IoT 云.

    2. 英寸 选择一个目标,选择 朗格斯,然后选择 optimizedImageClassification.

    3. 选择 Next.

  6. 使用主题筛选数据 页面,在 可选主题过滤器,输入 /resnet-50/test,然后选择 Next.

  7. 选择 Finish.

第8步: 部署Greengrass组

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

  1. 确保 AWS IoT Greengrass Core正在运行。根据需要在您的 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. 在组配置页面上,选择部署,然后从操作菜单中,选择部署

    
            突出显示“Deployments (部署)”和“Deploy (部署)”的组页面。
  3. 配置设备如何发现您的核心 页面,选择 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 (成功完成)

    
            突出显示成功部署状态的“Deployments”(部署) 页面。

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

测试推理示例

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

注意

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

注意

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

  1. 在 AWS IoT 控制台主页上,选择 Test (测试)

    
            中的导航窗格 AWS IoT 控制台 其中Test(测试)突出显示。
  2. 对于 订阅,选择 Subscribe to a Topic。使用以下值。将剩余选项保留为默认值。

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

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

  3. 选择 Subscribe to topic.

  4. /resnet-50/predictions 页面上,指定要发布到的 /resnet-50/test 主题。选择 Publish to topic.

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

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

配置 Intel Atom

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

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

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

    注意

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

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

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

    注意

    我们建议您运行 Lambda 功能,无需容器化,除非您的业务案例需要。这有助于在不配置设备资源的情况下启用对设备GPU和相机的访问。如果您在运行时没有容器化,则还必须授予根访问权限 AWS IoT Greengrass Lambda 功能。

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

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

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

        提示

        您还必须更新 config.json 文件,以授予根访问您的 Lambda 功能。有关该程序,请参阅 以根用户身份运行 Lambda 函数.

      • 对于 集装箱化,选择 无容器.

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

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

      • 对于 读取对/sys目录的访问,选择 Enable.

      • 对于 Lambda生命周期,选择 Make this function long-lived and keep it running indefinitely.

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

      注意

      我们建议不要在容器化模式下运行,除非您的业务案例需要它。

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

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

      • 对于 读取对/sys目录的访问,选择 Enable.

      • 对于 Lambda生命周期,选择 Make this function long-lived and keep it running indefinitely.

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

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

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

    • 上传 resnet18.zip 文件。

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

    注意

    如果以非集装箱模式运行, AWS IoT Greengrass 可以在不配置设备资源的情况下访问您的设备GPU。

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

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

    3. 定义资源:

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

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

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

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

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

配置 NVIDIA Jetson TX2

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

  1. 确保已配置您的 Jetson 设备,以便安装 AWS IoT Greengrass Core 软件并使用 GPU 进行推理。有关配置设备的更多信息,请参阅设置其他设备。要使用GPU在NVIDIAJetsonTX2上推断,您必须安装CUDA 10.0 和 cuDNN 使用Jetpack4.3对主板进行成像时,您的设备上将显示7.0。

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

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

    注意

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

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

    注意

    我们建议您运行 Lambda 功能,无需容器化,除非您的业务案例需要。这有助于在不配置设备资源的情况下启用对设备GPU和相机的访问。如果您在运行时没有容器化,则还必须授予根访问权限 AWS IoT Greengrass Lambda 功能。

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

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

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

        提示

        您还必须更新 config.json 文件,以授予根访问您的 Lambda 功能。有关该程序,请参阅 以根用户身份运行 Lambda 函数.

      • 对于 集装箱化,选择 无容器.

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

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

      • 对于 Lambda生命周期,选择 Make this function long-lived and keep it running indefinitely.

      • 对于 读取对/sys目录的访问,选择 Enable.

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

      注意

      我们建议不要在容器化模式下运行,除非您的业务案例需要它。

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

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

      • 对于 Lambda生命周期,选择 Make this function long-lived and keep it running indefinitely.

      • 对于 读取对/sys目录的访问,选择 Enable.

  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的访问。

    注意

    如果以非集装箱模式运行, AWS IoT Greengrass 可以在不配置设备资源的情况下访问您的设备GPU。

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

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

    3. 定义每个资源:

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

      • 对于 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

        nvhost-vic

        /dev/nvhost-vic

        tegra_dc_ctrl

        /dev/tegra_dc_ctrl

  6. 如果在容器化模式下运行,请添加以下本地音量资源,以授予设备摄像头的访问权限。按照第5步: 添加 SageMaker 给Greengrass集团的新优化模型资源中过程操作。

    注意

    如果以非集装箱模式运行, AWS IoT Greengrass 可以在不配置设备资源的情况下访问您的设备摄像头。

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

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

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

       

      姓名

      源路径

      目的地路径

      shm

      /dev/shm

      /dev/shm

      tmp

      /tmp

      /tmp

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

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

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

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

    • 对于 订阅,选择 Subscribe to a Topic。对于 订阅主题,输入 /resnet-18/predictions.

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

AWS IoT Greengrass ML 推理问题排查

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

检查错误日志

  1. 切换到根用户并导航到 log 目录。访问 AWS 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-cn: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 文档