使用 ONNX Runtime 优化 AWS IoT Greengrass 中的图像分类 官方博客中
在 AWS IoT Greengrass 上使用 ONNX Runtime 优化图像分类
关键要点
随着物联网 (IoT) 的普及,边缘设备上基于云训练的模型进行机器学习推理变得越来越流行,优势在于低延迟、可伸缩性和成本节省。本文介绍如何在 AWS IoT Greengrass 上使用 ONNX Runtime 来优化边缘设备的图像分类过程。读取和训练可以导出为 ONNX 格式的图像分类模型,利用 ONNX Runtime 来加速推理解耦,以便在边缘设备上部署。引言
在边缘设备上执行机器学习推理,使用在云中训练的模型已成为物联网 (IoT) 中一种流行的用例。这种方法能够带来低延迟、可扩展性和成本节约的优势。然而,开发者在将模型部署到计算和内存有限的边缘设备时,必须手动调整模型以达到所需的性能。在这篇博客中,我将讨论如何在 AWS IoT Greengrass 上使用 ONNX Runtime 来优化边缘设备的图像分类工作流程。
ONNX 是一种开放格式,旨在表示任何类型的机器学习或深度学习模型,同时简化硬件优化的接入。它为不同的机器学习框架之间提供了标准的互操作性格式。用户可以使用自己喜欢的框架如 TensorFlow、 PyTorch 和 MxNet 等来训练图像分类模型,然后将其导出为 ONNX 格式。为最大化性能,可以使用 ONNX Runtime 这样的优化推理框架。ONNX Runtime 是一个开源项目,旨在加速在各种框架、操作系统和硬件平台上的机器学习推理,并提供统一的 API。虽然本文专注于图像分类的例子,但 ONNX 也适用于广泛的用例,如目标检测、图像分割、语音和音频处理、机器理解和翻译等。
AWS IoT Greengrass 是一个开源物联网边缘运行时和云服务,帮助您构建、部署和管理设备上的 IoT 应用程序。您可以使用 AWS IoT Greengrass 通过称为 组件 的软件模块构建边缘应用程序,这些模块可以使您的边缘设备连接到 AWS 或第三方服务。有多个 AWS 提供的机器学习组件 可用于在远程设备上对本地生成的数据执行推理,使用在云中训练的模型。您还可以构建 自定义机器学习组件,这些组件可分为两类:用于在边缘上部署和更新机器学习模型与运行时的组件,以及包含执行机器学习推理所需逻辑的组件。
解决方案概述
在此示例中,您将学习如何在 AWS IoT Greengrass 上为图像分类构建并部署自定义组件。以下架构和步骤展示了此解决方案可能的实现方式。
使用您选择的框架训练模型并导出为 ONNX 格式,或者使用预训练的 ONNX 模型。您可以使用 Amazon SageMaker Studio 和 Amazon SageMaker Pipelines 自动化此过程。在本博客中,我们将使用来自 ONNX 模型库 的预训练 ResNet50 模型的 ONNX 格式进行图像分类。ResNet50 是一种 50 层的卷积神经网络,预训练版本的模型可以将图像分类为一千个物体类别,例如键盘、鼠标、铅笔和许多动物。
构建并发布必要的 AWS IoT Greengrass 组件:
一个包含运行 ONNX 模型所需库的 ONNX Runtime 组件。
一个用于推理的组件,包含必要的代码、ResNet50 的 ONNX 格式模型、一些标签和用于分类的示例图像。该组件将依赖于 ONNX Runtime 组件。
在目标设备上部署组件。组件运行后,它将对示例图像进行分类并将结果发布回 AWS IoT Core 的 demo/onnx 主题。AWS IoT Core 是一种托管的 AWS 服务,允许您连接数十亿的 IoT 设备并将数万亿的信息路由到 AWS 服务,而无需管理基础架构。
前提条件
要顺利完成本博文中的步骤,您需要:
具备基本的 AWS IoT Core 和 AWS IoT Greengrass 知识。对机器学习的基本概念有所了解。一个 AWS 账户。如果您还没有 AWS 账户,请 按照说明 创建一个。安装 AWS 命令行界面 (AWS CLI) 和 Git。一个具备所需权限的 AWS 身份和访问管理 (IAM) 用户,以创建和管理 AWS 资源。实施步骤
初始设置
在环境的初始设置中,您需要配置多个资源。所有资源都需在同一地区配置。此指南使用的是 eucentral1 地区。请按照以下步骤开始:
飞鱼加速npv组件的工件将存储在 Amazon 简单存储服务 (Amazon S3) 存储桶中。要创建 Amazon S3 存储桶,请按照 用户指南 中的说明进行操作。为了模拟一个将部署组件的设备,您将使用 AWS Cloud9 环境,并安装 AWS IoT Greengrass 客户端软件。请遵循 AWS IoT Greengrass v2 实习 的说明,包括第 2 和第 31 节。在 AWS Cloud9 环境中,确保已安装 Python 369 及 npm 版本 230 或更高。构建并发布 ONNX Runtime 和推理组件
在下一部分,您将使用 AWS CLI 构建和发布自定义组件,可以在本地计算机的终端或在 AWS Cloud9 环境中进行操作。
要将工件上传到初始设置创建的 Amazon S3 存储桶,请按照以下步骤操作:
克隆包含组件工件和配方的 Git 仓库:bash git clone https//githubcom/awssamples/awsiotggonnxruntimegit
进入工件文件夹并将文件压缩:bash cd awsiotggonnxruntime/artifacts/comdemoonnximageclassification/100 zip r greengrassonnxzip
将 zip 文件上传到您在初始设置中创建的 Amazon S3 存储桶:
bash aws s3 cp greengrassonnxzip s3//{YOURS3BUCKET}/greengrassonnxzip
要发布组件,请执行以下步骤:
在文本编辑器中打开配方文件 awsiotggonnxruntime/recipes/comdemoonnximageclassification100json。下面是进入配方目录的命令:bash cd awsiotggonnxruntime/recipes/
将工件 URI 中的 Amazon S3 存储桶名称替换为上面定义的您的存储桶名称:json Artifacts [ { URI s3//{YOURS3BUCKET}/greengrassonnxzip Unarchive ZIP } ]
在发布组件之前,确保使用初始设置中创建资源的相同区域。您可以使用以下命令设置默认区域:bash aws configure set defaultregion eucentral1
发布 ONNX Runtime 组件:bash aws greengrassv2 createcomponentversion inlinerecipe fileb//comdemoonnxruntime100json
发布用于图像分类的组件,并依赖于 ONNX Runtime:bash aws greengrassv2 createcomponentversion inlinerecipe fileb//comdemoonnximageclassification100json
为验证组件是否成功发布,请导航到 AWS IoT 控制台,转到 Greengrass 设备 gtgt 组件。在 我的组件 选项卡中,您应能看到刚发布的两个组件:将组件部署到目标设备
要将组件部署到目标设备,确保您已配置 AWS Cloud9 环境并安装了 AWS IoT Greengrass 客户端软件。设置 Greengrass 设备的所需权限,确保与 Greengrass 设备关联的 服务角色 具备从您之前创建的 Amazon S3 存储桶中检索对象的权限,以及发布到 AWS IoT 主题 demo/onnx 的权限。要将组件部署到目标设备,请访问 AWS IoT 控制台,导航到 Greengrass 设备 gtgt 部署 并选择 创建。填写部署名称和要部署的核心设备的名称。 在 选择组件 部分,选择组件comdemoonnximageclassification。保持其他选项默认设置,继续选择 下一步 直到到达 审查 部分,然后选择 部署。要监控组件部署的日志和进度,您可以在 AWS Cloud9 环境中使用以下命令打开 Greengrass 核心设备的日志文件:bash sudo tail f /greengrass/v2/logs/greengrasslog
请注意,由于我们选择的图像分类组件依赖于 ONNX Runtime 组件,comdemoonnxruntime,因此它将自动安装。测试 ONNX 图像分类组件的部署
当图像分类组件处于运行状态时,它会循环检测图像文件夹中的文件并进行分类。结果将发布到 AWS IoT Core 的 demo/onnx 主题上。
要了解这个过程,让我们来看一些来自图像分类组件的代码片段:1 要检查示例图像,以便稍后将其与预测标签进行比较,请打开位于 awsiotggonnxruntime/artifacts/comdemoonnximageclassification/100/images 文件夹中的图像。2 以下的 predict 函数使用 ONNX Runtime 和 ResNet50 神经网络ONNX 格式开始推理会话。
python def predict(modelPath labelsPath image) labels = loadlabels(labelsPath) # 在后端运行模型 session = onnxruntimeInferenceSession(modelPath None)
图像首先被预处理,然后作为输入参数传递给推理会话。请注意,ResNet50 模型使用的是 224 x 224 像素的图像。python imagedata = nparray(image)transpose(2 0 1) inputdata = preprocess(imagedata) start = timetime() rawresult = sessionrun([] {inputname inputdata}) end = timetime()
从推理结果中提取图像的标签,并计算推理时间单位:毫秒。python inferencetime = npround((end start) 1000 2) idx = npargmax(postprocess(rawresult)) inferenceResult = { label labels[idx] inferencetime inferencetime }
图像分类组件循环遍历图像文件夹中的文件,并调用 predict 函数。每 5 秒将结果发布到 AWS IoT Core 的 demo/onnx 主题。python for img in oslistdir(imagesPath) request = PublishToIoTCoreRequest() requesttopicname = topic image = Imageopen(imagesPath / img) pred = predict(modelPath labelsPath image) requestpayload = predencode() requestqos = qos operation = ipcclientnewpublishtoiotcore() operationactivate(request) futureresponse = operationgetresponse()result(timeout=5) print(成功发布消息 futureresponse) timesleep(5)
要测试结果是否成功发布到主题,请访问 AWS IoT 控制台,导航到 MQTT 客户端 部分并订阅主题 demo/onnx。您应能看到推理结果,如下截图所示:
清理
删除不再使用的资源是一种最佳实践。为了避免在 AWS 账户上产生额外费用,请执行以下步骤:1 删除安装了 AWS IoT Greengrass 软件的 AWS Cloud9 环境:
bash aws cloud9 deleteenvironment environmentid ltyour environment idgt
删除 Greengrass 核心设备:bash aws greengrassv2 deletecoredevice coredevicethingname ltthingnamegt
删除存储工件的 Amazon S3 存储桶:bash aws s3 rb s3//{YOURS3BUCKET} force
结论
在这篇博文中,我展示了如何在 AWS IoT Greengrass 上构建和部署一个自定义组件,该组件使用 ONNX Runtime 对图像进行分类。您可以通过添加更多图像或使用不同的 ONNX 格式模型进行预测来定制此组件。
如果想深入了解 AWS IoT Greengrass,包括如何构建自定义组件,请查看 AWS IoT Greengrass Workshop v2。您还可以阅读开发者指南,以获取有关如何 定制机器学习组件 的更多信息。
关于作者
Costin Bdici 是亚马逊网络服务 (AWS) 的解决方案架构师,驻扎在罗马尼亚布加勒斯特,帮助企业客户优化他们的 AWS 部署,遵循最佳实践,并快速利用 AWS 服务进行创新。他对物联网和机器学习充满热情,并为多个行业的客户设计