亚马逊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烧录镜像,不同的操作系统对应不同的操作方法,所以不再详细介绍,可以参考https://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像素高的窗口中显示它。

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文件:

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: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和刚刚我们下载的证书资源文件:

$ 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 https://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中,链接如下:

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

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 函数相反,后者在调用时启动,并在没有要执行的任务时停止。有关更多信息,请参考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 *

Local Resource

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

    如果没有安装会报错如下图:

  • 配置Greengrass role,我们回到Greengrass Group中选择设置(Settings),选择Greengrass service role,然后跳转到AWS IAM console中添加Greengrass的角色所需要的权限,”AmazonS3fullAccess”, “CloudWatchFullAccess” and “AWSGreengrassResourceAccessRolePolicy” “AWSIoTFullAccess”..

Greengrass Service Role

 

  • 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介绍:

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之前,曾在东芝中国负责系统开发和运维工作,在微软中国负责中小企业的技术咨询和方案设计工作。