【实操教程】使用 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到设备端。

AWS EI image classification

二、Jetson Nano的镜像烧录

使用官方推荐的Etcher烧录镜像,不同的操作系统对应不同的操作方法,所以不再详细介绍,可以参考 developer.nvidia.com/em ,烧写成功后是如下图所示的基于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像素高的窗口中显示它。

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。

可以通过以下链接下载:

ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn

如果是Jetson Nano以外的设备也可以通过SageMaker Neo git neo-ai-dlr.readthedocs.io 找到对应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/green

在Jetson Nano中下载AWS IoT Greengrass Core Software(v1.10)的aarch64版本(注意版本,只有对应最新的大版本才能部署成功)。

ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn

解压缩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/

然后替换hello-world-python的默认代码如下面的链接,但该代码需要引入一些模块入numpy、jetbot、cv2等,请确认Jetson Nano环境包含这些依赖。

github.com/mahendrabair

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/gre 如下图:
    长时间生存(long-lived)的 Lambda 函数在 AWS IoT Greengrass 启动后函数会自动在自己的容器中保持运行。这与按需 Lambda 函数相反,后者在调用时启动,并在没有要执行的任务时停止。有关更多信息,请参考 Greengrass Lambda 函数的生命周期配置
Keep Lambda long-lived

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 *
Local Resource

  • 在部署模型之前,需要安装 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流程图:

AWS EI Demo流程图

我们共同完成了边缘智能应用的所有步骤。 (๑•ᴗ•๑)

AIoT或 EI 随着 AI芯片低功耗和低成本使得越来越多的企业关注智联网这个领域。边缘智能正在促成人工智能(AI)与物联网(IoT)的混合,AI与IoT相辅相成:如果没有AI,IoT只是收集数据的sensor,如果没有IoT,AI也不会应用到边缘。AIoT项目确实比其他单纯的一个软件或硬件的研发更加复杂,它是多学科或技术栈的融合。比如,数据的采集、分析、展现可能需要大数据的技术,边缘逻辑的推理、判断需要机器学习的模型,对数据加工后又要与大数据结合去ETL。云端的逻辑编写、OTA升级、安全、设备管理也要与终端集成。另外,如果是视频流交互还涉及到编解码、媒体等技术。正是因为它的复杂性,我们可以利用云计算提供的服务和接口来快速原型和开发。

参考链接:

1. Nvidia Jetson Nano介绍:

developer.nvidia.com/em

2. Nvidia Jetson Nano 镜像烧录:

developer.nvidia.com/em

3. AWS IoT Greengrass:

docs.aws.amazon.com/zh_

4. NVIDIA Jetson Nano with AWS ML@Edge:

github.com/mahendrabair

5. 《智联网·未来的未来》电子工业出版社 2018,6 彭昭

6. Amazon Sagemaker Neo模型下载:

ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn