【实操教程】使用 Jetson nano 结合 AWS 机器学习和 IoT 实现边缘智能—下篇
- 2020 年 7 月 7 日
- AI
边缘智能正在促成人工智能(AI)与物联网(IoT)的混合,AI与IoT相辅相成:
如果没有AI,IoT只是收集数据的 sensor,如果没有IoT,AI也不会应用到边缘。AIoT项目确实比其他单纯的一个软件或硬件的研发更加复杂,它是多学科或技术栈的融合。
版权声明:本文原作者 李强 。经 @AWS云计算 授权转载发布,仅供学习讨论。
文章原始出处:知乎文章地址 / 亚马逊AWS官方博客
上篇传送门:
【实操教程】使用 Jetson nano 结合 AWS 机器学习和 IoT 实现边缘智能—上篇
一、回顾
上一章我们通过 Amazon SageMaker 完成了边缘智能中的图像标注,模型训练和优化,最终将图像分类的 SageMaker Neo 模型导出到S3存储桶中。也就是我们完成了下图右下角阴影部分的内容。
本章重点分为两大部分:
- 设备端,主要包含:安装 Jetson nano 的镜像、SageMaker Neo runtime、Greengrass的部署、运行模型。
- 云端,主要包含:配置 IoT core与Greengrass、开发与部署 Lambda 函数、model到设备端。

二、Jetson Nano的镜像烧录
使用官方推荐的Etcher烧录镜像,不同的操作系统对应不同的操作方法,所以不再详细介绍,可以参考 //developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write ,烧写成功后是如下图所示的基于aarch64-linux。

另外在使用CSI接口的摄像头时排线不要插反,并测试摄像头。
$ 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像素高的窗口中显示它。

三、使用 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。
可以通过以下链接下载:
//ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/dlr-1.0-py2.py3-none-any.whl
如果是Jetson Nano以外的设备也可以通过SageMaker Neo git //neo-ai-dlr.readthedocs.io/en/latest/install.html 找到对应Device Name进行下载。
下载完成后,SSH到设备中,然后安装.whl文件:
sudo apt-get install python3-pip
sudo pip install dlr-1.0-py2.py3-none-any.whl
也要安装AWS Python SDK boto3
sudo pip install boto3
3.2 安装AWS IoT Greengrass
在 Jetson Nano 的系统中运行如下命令创建 Greengrass user 和 group
$ sudo adduser --system ggc_user
$ sudo addgroup --system ggc_group
在AWS控制台上(北京 cn-north-1)通过以下链接来创建证书资源并SCP给Jetson Nano:
//docs.amazonaws.cn/greengrass/latest/developerguide/gg-config.html。
在Jetson Nano中下载AWS IoT Greengrass Core Software(v1.10)的aarch64版本(注意版本,只有对应最新的大版本才能部署成功)。
//ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/greengrass-linux-aarch64-1.10.0.tar.gz
解压缩Greengrass core和刚刚我们下载的证书资源文件:
$ 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
下载AWS ATS 终端根证书(CA):
$ cd /greengrass/certs/
$ sudo wget -O root.ca.pem //www.amazontrust.com/repository/AmazonRootCA1.pem
启动Greengrass Core在我们的Jetson Nano上:
$ cd /greengrass/ggc/core/$ sudo ./greengrassd start
执行完成后我们终端会返回一个:
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中,链接如下:
//github.com/aws-samples/aws-greengrass-samples/tree/master/hello-world-python
然后替换hello-world-python的默认代码如下面的链接,但该代码需要引入一些模块入numpy、jetbot、cv2等,请确认Jetson Nano环境包含这些依赖。
//github.com/mahendrabairagi/AWS_ML_At_Edge_With_NVIDIA_Jetson_Nano/blob/master/inference-lambda.py
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参考链接如下: //docs.aws.amazon.com/greengrass/latest/developerguide/long-lived.html 如下图:
长时间生存(long-lived)的 Lambda 函数在 AWS IoT Greengrass 启动后函数会自动在自己的容器中保持运行。这与按需 Lambda 函数相反,后者在调用时启动,并在没有要执行的任务时停止。有关更多信息,请参考 Greengrass Lambda 函数的生命周期配置。

Keep Lambda long-lived
- 在资源中添加 Machine Learning 模型,添加机器学习资源如下图,在模型源中选择我们上传过的 Sagemaker Neo 的模型。本地路径设置为 /ml_model

- 添加本地资源, 这里要注意的是回到 Jetson Nano 中查看/dev/下的文件是否与下面列出的路径对应,如果没有请创建并分配目录拥有者为 ggc_user 和 ggc_group 。例如:
/dev$ cd /
$ sudo mkdir /nvmap
$ sudo chown ggc_user:ggc_group *

- 在部署模型之前,需要安装 openjdk-8 。这是 GGC v1.10 新功能,用于本地处理数据流并自动将其导出到 AWS云 的流管理器。此功能需要 Greengrass 核心设备上的 Java 8。
sudo apt install openjdk-8-jdk
如果没有安装会报错如下图:

3.5 部署SageMaker Neo训练的模型到边缘
最后,我们需要把在终端图像分类后的消息。 通过MQTT方式上报给云端的 AWS IoT Core,所以还需要添加订阅操作,并进行部署。回到Greengrass Group中,左侧的工具栏中选择订阅(subscription),然后选择源(source)选择我们在步骤3.3中部署好的Lambda,目标我们选择IoT Cloud,然后定义一个Topic如”dino-detect”。
当配置完成之后,单击右上角的操作(Actions),选择部署。部署成功后如下图,如果部署失败请查找失败原因:

3.6 启动模型并测试
所有步骤都配置成功后,我们就可以测试乐高恐龙的分类器了。在 AWS IoT 控制台中,选择测试,并订阅主题 dino-detect 或 #,然后启用 Jeston Nano 的摄像头捕获并对图像进行分类,最后将结果发送回 AWS IoT 控制台。
总结:
再次回顾一下我们的Demo流程图:

我们共同完成了边缘智能应用的所有步骤。 (๑•ᴗ•๑)
AIoT或 EI 随着 AI芯片低功耗和低成本使得越来越多的企业关注智联网这个领域。边缘智能正在促成人工智能(AI)与物联网(IoT)的混合,AI与IoT相辅相成:如果没有AI,IoT只是收集数据的sensor,如果没有IoT,AI也不会应用到边缘。AIoT项目确实比其他单纯的一个软件或硬件的研发更加复杂,它是多学科或技术栈的融合。比如,数据的采集、分析、展现可能需要大数据的技术,边缘逻辑的推理、判断需要机器学习的模型,对数据加工后又要与大数据结合去ETL。云端的逻辑编写、OTA升级、安全、设备管理也要与终端集成。另外,如果是视频流交互还涉及到编解码、媒体等技术。正是因为它的复杂性,我们可以利用云计算提供的服务和接口来快速原型和开发。
参考链接:
1. Nvidia Jetson Nano介绍:
//developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#intro
2. Nvidia Jetson Nano 镜像烧录:
//developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write
3. AWS IoT Greengrass:
//docs.aws.amazon.com/zh_cn/greengrass/latest/developerguide/what-is-gg.html
4. NVIDIA Jetson Nano with AWS ML@Edge:
//github.com/mahendrabairagi/AWS_ML_At_Edge_With_NVIDIA_Jetson_Nano
5. 《智联网·未来的未来》电子工业出版社 2018,6 彭昭
6. Amazon Sagemaker Neo模型下载:
//ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/model-jetson_nano.tar.gz
