一、回顾
上一章我们通过 Amazon SageMaker 完成了边缘智能中的图像标注,模型训练和优化,最终将图像分类的 SageMaker Neo 模型导出到 S3 存储桶中。也就是我们完成了下图右下角阴影部分的内容。
本章重点分为两大部分:
AWS EI image classification
二、Jetson Nano 的镜像烧录
使用官方推荐的 Etcher 烧录镜像,不同的操作系统对应不同的操作方法,所以不再详细介绍,可以参考https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write,烧写成功后是如下图所示的基于 aarch64-linux。
另外在使用 CSI 接口的摄像头时排线不要插反,并测试摄像头。
Java
$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
复制代码
可以顺利打开摄像头。代码的含义是使用 GStreamer 打开一个 3820 像素宽、2464 像素高的相机 stream,并在一个 960 像素宽、616 像素高的窗口中显示它。
CSI 排线
三、使用 AWS IoT Greengrass 部署模型到 Jetson Nano
这个步骤我们做如下的事情:
3.1 安装 SageMaker Neo runtime
3.2 安装 AWS IoT Greengrass
3.3 配置和部署 AWS Lambda
3.4 设置机器学习模型部署环境
3.5 部署机器学习模型 Sagemaker Neo 到边缘
3.6 启动模型并测试
3.1 安装 SageMaker Neo runtime
下载 .whl 文件并安装,其中包含 SageMaker Neo 的一些依赖库来运行 model。可以通过以下链接下载:
https://ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/dlr-1.0-py2.py3-none-any.whl
如果是 Jetson Nano 以外的设备也可以通过 SageMaker Neo git https://neo-ai-dlr.readthedocs.io/en/latest/install.html 找到对应 Device Name 进行下载。
下载完成后,SSH 到设备中,然后安装.whl 文件:
Java
sudo apt-get install python3-pip
sudo pip install dlr-1.0-py2.py3-none-any.whl
复制代码
也要安装 AWS Python SDK boto3
Java
3.2 安装 AWS IoT Greengrass
在 Jetson Nano 的系统中运行如下命令创建 Greengrass user 和 group
Java
$ sudo adduser --system ggc_user
$ sudo addgroup --system ggc_group
复制代码
在 AWS 控制台上(北京 cn-north-1)通过以下链接来创建证书资源并 SCP 给 Jetson Nano:https://docs.amazonaws.cn/greengrass/latest/developerguide/gg-config.html。
在 Jetson Nano 中下载 AWS IoT Greengrass Core Software(v1.10)的 aarch64 版本(注意版本,只有对应最新的大版本才能部署成功)。https://ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/greengrass-linux-aarch64-1.10.0.tar.gz
解压缩 Greengrass core 和刚刚我们下载的证书资源文件:
Java
$ sudo tar -xzvf greengrass-linux-aarch64-1.10.0.tar.gz -C /
$ sudo tar -xzvf <hash>-setup.tar.gz -C /greengrass # these are the security keys downloaded above
复制代码
$ cd /greengrass/certs/
$ sudo wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
```
启动Greengrass Core在我们的Jetson Nano上:
Java
```
$ cd /greengrass/ggc/core/$ sudo ./greengrassd start
```
执行完成后我们终端会返回一个:
Java
```
Greengrass successfully started with PID: XXXX
```
3.3 使用AWS Lambda配置推理代码
登陆回控制台(北京 cn-north-1),创建Lambda函数。先将github中的aws-samples/aws-greengrass-samples中的hello-world-python下载下来并部署到AWS Lambda中,链接如下:
https://github.com/aws-samples/aws-greengrass-samples/tree/master/hello-world-python
然后替换hello-world-python的默认代码如下面的链接,但该代码需要引入一些模块入numpy、jetbot、cv2等,请确认Jetson Nano环境包含这些依赖。
https://github.com/mahendrabairagi/AWS_ML_At_Edge_With_NVIDIA_Jetson_Nano/blob/master/inference-lambda.py
Java
```
import time
import datetime
import numpy as np
import cv2
import boto3
from jetbot import Camera
from dlr import DLRModel
import greengrasssdk
```
3.4 设置机器学习模型部署环境
* 登陆AWS管理控制台(cn-north-1),进入Greengrass。
* 选择并进入我们在2步骤中所创建的group
* 选择我们在3步骤中创建的Lambda函数
* 然后使此函数长时间运行(Make this function long-lived and keep it running indefinitely)并分配内存为1000MB参考链接如下: https://docs.aws.amazon.com/greengrass/latest/developerguide/long-lived.html 如下图:
长时间生存(long-lived)的 Lambda 函数在 AWS IoT Greengrass 启动后函数会自动在自己的容器中保持运行。这与按需 Lambda 函数相反,后者在调用时启动,并在没有要执行的任务时停止。有关更多信息,请参考[](https://docs.aws.amazon.com/zh_cn/greengrass/latest/developerguide/lambda-functions.html#lambda-lifecycle)。
#### [](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-25.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-25.jpg)Keep Lambda long-lived
* 在资源中添加Machine Learning模型,添加机器学习资源如下图,在模型源中选择我们上传过的Sagemaker Neo的模型。本地路径设置为/ml_model
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-26.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-26.jpg)
* 添加本地资源, 这里要注意的是回到Jetson Nano中查看/dev/下的文件是否与下面列出的路径对应,如果没有请创建并分配目录拥有者为ggc_user和ggc_group。例如:
Java
```
/dev$ cd /
$ sudo mkdir /nvmap
$ sudo chown ggc_user:ggc_group *
```
#### [](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-27.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-27.jpg)Local Resource
* 在部署模型之前,需要安装openjdk-8。这是GGC v1.10新功能,用于本地处理数据流并自动将其导出到 AWS 云的流管理器。此功能需要 Greengrass 核心设备上的 Java 8。
Java
```
sudo apt install openjdk-8-jdk
```
如果没有安装会报错如下图:
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-28.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-28.jpg)
* 配置Greengrass role,我们回到Greengrass Group中选择设置(Settings),选择Greengrass service role,然后跳转到AWS IAM console中添加Greengrass的角色所需要的权限,”AmazonS3fullAccess”, “CloudWatchFullAccess” and “AWSGreengrassResourceAccessRolePolicy” “AWSIoTFullAccess”..
#### [](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-29.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-29.jpg)Greengrass Service Role
* 3.5 部署SageMaker Neo训练的模型到边缘
最后,我们需要把在终端图像分类后的消息。 通过MQTT方式上报给云端的AWS IoT Core,所以还需要添加订阅操作,并进行部署。回到Greengrass Group中,左侧的工具栏中选择订阅(subscription),然后选择源(source)选择我们在步骤3.3中部署好的Lambda,目标我们选择IoT Cloud,然后定义一个Topic如”dino-detect”。
当配置完成之后,单击右上角的操作(Actions),选择部署。部署成功后如下图,如果部署失败请查找失败原因:
[](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-210.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-210.jpg)
* 3.6 启动模型并测试
所有步骤都配置成功后,我们就可以测试乐高恐龙的分类器了。在 AWS IoT 控制台中,选择测试,并订阅主题dino-detect或#,然后启用Jeston Nano的摄像头捕获并对图像进行分类,最后将结果发送回 AWS IoT 控制台。
## 总结:
再次回顾一下我们的Demo流程图:
#### [](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-211.png)](https://s3.cn-north-1.amazonaws.com.cn/awschinablog/using-jetson-nano-with-aws-machine-learning-and-Iot-for-edge-intelligence-part-211.jpg)AWS EI Demo流程图
我们共同完成了边缘智能应用的所有步骤。AIoT或EI随着AI芯片低功耗和低成本使得越来越多的企业关注智联网这个领域。边缘智能正在促成人工智能(AI)与物联网(IoT)的混合,AI与IoT相辅相成:如果没有AI,IoT只是收集数据的sensor,如果没有IoT,AI也不会应用到边缘。AIoT项目确实比其他单纯的一个软件或硬件的研发更加复杂,它是多学科或技术栈的融合。比如,数据的采集、分析、展现可能需要大数据的技术,边缘逻辑的推理、判断需要机器学习的模型,对数据加工后又要与大数据结合去ETL。云端的逻辑编写、OTA升级、安全、设备管理也要与终端集成。另外,如果是视频流交互还涉及到编解码、媒体等技术。正是因为它的复杂性,我们可以利用云计算提供的服务和接口来快速原型和开发。
参考链接:
1. Nvidia Jetson Nano介绍:
https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#intro
2. Nvidia Jetson Nano 镜像烧录:
https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write
3. AWS IoT Greengrass:
https://docs.aws.amazon.com/zh_cn/greengrass/latest/developerguide/what-is-gg.html
4. NVIDIA Jetson Nano with AWS ML@Edge:
https://github.com/mahendrabairagi/AWS_ML_At_Edge_With_NVIDIA_Jetson_Nano
5. 《智联网·未来的未来》电子工业出版社 2018,6 彭昭
6. Amazon Sagemaker Neo模型下载:
https://ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/model-jetson_nano.tar.gz
**作者介绍:**李强,AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在物联网和微软的技术栈有着广泛的设计和实践经验。在加入AWS之前,曾在东芝中国负责系统开发和运维工作,在微软中国负责中小企业的技术咨询和方案设计工作。
**本文转载自AWS技术博客。**
**原文链接:**https://amazonaws-china.com/cn/blogs/china/using-jetson-nano-with-aws-machine-learning-and-iot-for-edge-intelligence-part-2/
复制代码
评论