亚马逊AWS官方博客

使用 Jetson nano 结合 AWS 机器学习和 IoT 实现边缘智能—上篇

一、一些概念

在正式开启AWS边缘智能之前,我们先了解一些基础概念:

1.1 边缘智能(Edge Intelligence,EI)是指在“终端侧”部署人工智能。为什么只在云端做推理不行?众所周知,人工智能(AI)正在成为改变各行各业的通用技术。此前绝大部分AI是依赖云端实现的,因为云端有更丰富的算力、GPU资源、机器学习平台等。随着AI芯片和边缘算力的不断发展,EI已成为未来的趋势。

1.2 边缘计算定义:OpenStack基金会对外发布的白皮书《边缘计算 – 跨越传统数据中心》对“边缘计算”这一概念进行了清晰的阐述,边缘计算是为应用开发者和服务提供商在网络的边缘侧提供云服务和 IT 环境服务,“边缘”指的是位于管理域的边缘,尽可能地靠近数据源或用户。其目标是在靠近数据输入或用户的地方提供计算、存储和网络带宽。但不同的行业对应边缘计算的定义可能不同。基于物联网技术的行业更多的边缘侧旨在设备端。

1.3 Jetson Nano是NVIDIA推出边缘AI的开发板,GPU使用NVIDIA Maxwell 架构,配备 128 个 NVIDIA CUDA® 核心,开发者们可以基于Jetson Nano开发很多EI的应用。

Jetson Nano Developer Kit

1.4 边缘计算与IoT云平台,边缘计算与云计算平台将是共生互补。边缘计算并不会取代云计算,而是通过边缘侧的算力,让传统的云计算框架进一步去中心化,在边缘侧完成部分计算工作,然后将结果汇聚到云端进行统一处理。云端也可以通过OTA,模型的训练后的下放与边缘端集成到一起。云端仍旧可以处理时间不敏感的应用场景,通过数据的汇聚以及云端的大数据分析进一步为业务的决策提供数据支撑。

 

二、场景描述:

在本篇博客中,我们将通过AWS Greengrass和Jetson Nano实现图片的分类,AWS Greengrass通过Lambda处理图像分类的消息与调用本地的SageMaker 训练好的Neo模型,然后通过Topic把图像分类的结果发送至AWS IoT Core。其中边缘推理部分使用了Greengrass ML inference。本篇博客以乐高恐龙图像分类作为开启EI亦或AIoT应用的开端。

恐龙图片分类素材

 

三、技术架构:

AWS EI image classification

AWS IoT Greengrass 可将 AWS 无缝扩展至边缘设备,因此可以在本地操作其生成的数据,同时仍可将云用于管理、分析和持久存储。借助 AWS IoT Greengrass,边缘设备可以运行 AWS Lambda 函数、Docker 容器,基于机器学习模型执行预测、使设备数据保持同步以及与其他设备安全通信 – 甚至在没有连接 Internet 的情况下也可实现这些功能。

Amazon SageMaker 是一种完全托管的机器学习服务。借助 Amazon SageMaker,数据科学家和开发人员可以快速轻松地构建和训练机器学习模型,然后直接将模型部署到托管的生产就绪环境中。它提供了一个集成 Jupyter Notebook 的实例,供您轻松访问数据源以便进行探索和分析,因此您无需管理服务器。

Amazon SageMaker Ground Truth 是数据标注的服务,为机器学习模型构建高品质的训练数据集。

Amazon SageMaker Neo使机器学习模型训练一次即可在云和边缘站点中的任何环境运行。Neo 可自动优化 TensorFlow、Apache MXNet、PyTorch、ONNX 和 XGBoost 模型以部署在 ARM、Intel 和 Nvidia 处理器上,减少移植所需的时间和工作。但需要注意一点的是,Neo当前支持的是从 TensorFlow、MXNet 或 PyTorch 导出的图像分类模型,以及 XGBoost 模型。

 

本篇具体实现的流程如下图,在最后的参考链接会附有源代码和对应的库:

AWS EI Demo流程图

四、AWS EI 实验步骤:

4.1 图片标注(SageMaker GroundTruth)

在这次试验中,我们将使用SageMaker GroundTruth的服务来标注由乐高恐龙组成的图像训练集。

步骤如下:

  1. 将未标注的数据集上传到S3上
  2. 在Sagemaker GroundTruth中创建一个私有的Labeling workforce
  3. 创建一个GroundTruth Labeling job
  4. 使用GroundTruth平台来标注图片
  5. 分析结果

4.1.1下载未标注的数据集:
在这一步中,我们将未标注的数据集下载到本地,然后upload到刚刚创建的存储桶中作为SageMaker GroundTruth的数据输入。这个数据集中包含388个文件,其中包含6大分类(Brachiosaurus, Dilophosaurus, Spinosaurus, Stegosaurus, Triceratops and Unknown)。
数据集下载地址:

https://ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/lego_dinosaurs_dataset.zip

或者

https://sagemaker-nvidia-webinar.s3.amazonaws.com/lego_dinosaurs_dataset.zip

将未标注的数据集上传到S3上:

在ap-northeast-1区域中创建一个S3存储桶并给存储桶唯一的命名.(比如,ground-truth-labelling-job-initials-20200112)

  • 将download的数据集上传到刚刚创建的桶中。(因为下面的步骤我们需要做人工标注,所以建议将6大类的乐高恐龙分别选取2-3张作为需要标注的数据集即可)
  • 在设置权限这一步保持默认即可,然后完成设置。

 

4.1.2 在GroundTruth中创建一个私有的Labeling workforce

这一步骤中我们将通过Sagemaker GroundTruth创建一个图像分类任务在ap-northeast-1。

  • 打开AWS控制台 > Amazon SageMaker > 标签工作人员(Labeling workforces)
  • 选择私有(Private)的标签然后创建私有团队(Create private team)
  • 给私有标注的工作组命名
  • 填写一个有效的邮箱地址
  • 创建私有团队
创建私有团队
  • 当创建成功后,我们的邮箱会收到来自于no-reply@verificationemail.com发来的验证邮件,这个邮件包含了我们创建workforce的用户名和临时密码。
创建workforce
  • 使用log in的连接和临时密码登陆到标注控制台进行标注。
  • 此时会要求我们更改临时密码。
  • 因为我们还没有分配给worker(我们自己)标注任务,此时标注任务是空 的,下一步我们将分配给自己标注乐高恐龙的标注任务。

 

4.1.3 创建一个GroundTruth Labeling job

这一步骤就是我们创建一个标注的任务,然后分配给workforce。

  • 打开AWS控制台 > Amazon SageMaker > 标记任务(Labeling jobs)
  • Step1:指定任务详细信息中:
    —定义任务名称(记住任务名称,我们在notebook中的代码会用到)
    —创建清单文件(manifest),输入S3训练数据集的路径,注意要以/结尾。For e.g. : s3:///<prefix/foldername>/

    创建manifest

—IAM角色,在测试环境中我们可以允许它访问所有的S3 bucket,当然我们可以指定它可以访问特定S3 bucket。

—任务类型,我们选择图像分类。

任务类型
  • Step2: 选择工作人员并配置工具
    选择“私有(Private)”>“私有团队(Private teams)在下拉框中我们已经在1.2创建过的”>“取消自动标记”>“其他配置中工作人员数量为1”>“图像分类标记工具中添加6个标签:Brachiosaurus, Dilophosaurus, Spinosaurus, Stegosaurus, Triceratops and Unknown”
  • 返回标注作业的页面查看jobs的状态,此时我们的邮箱会有no-reply@verificationemail.com发来的邮件,内容是分配给我1个jobs需要完成。

 

4.1.4 用GroundTruth平台来标注图片

这一步骤就是人工标注的过程,因为前面我们已经节选出13张有代表的图像,我们下面就对这13张图像进行标注即可。如下图:

当标注完成后,我们返回到Sagemaker平台上。可以跟踪标记任务的状态以及进度。

4.1.5结果验证

我们可以用sublime text打开在output中的/manifests/output.manifest文件,它是一个json文件包含一些被标记图片的metadata.比如:

Manifests格式

4.2 模型训练与优化

这一步我们主要的目的就是通过Amazon SageMaker notebook编写训练模型的代码,通过代码来调用云计算的资源,比如机器学习类型的instance。它将执行数据训练,并将训练和优化好的模型以Amazon SageMaker Neo导出。下一步将Amazon SageMaker Neo模型部署到Jetson Nano的设备上。如果不想对模型进行训练的话可以到参考链接处下载训练好的模型。
这个notebook主要是展示端到端机器学习的工作流程

  • 使用Sagemaker GroundTruth创建的标签数据集。然后将数据集分为训练和验证。
  • 使用Sagemaker容器训练模型
  • 使用Sagemaker Neo优化模型

4.2.1 下载代码ipynb并导入到SageMaker notebook中
图像分类代码https://ml-jetson-greengrass.s3.cn-north-1.amazonaws.com.cn/sagemaker_image_classification-Copy1.ipynb

注意不要使用参考链接中的github上的代码。

创建Amazon SageMaker笔记本

4.2.2 部分代码解析

  • 在OUTPUT_MANIFEST要输入Sagemaker GroundTruth的output路径,前面的步骤已经验证过output的manifest的json格式。
代码解析-1
  • 在创建Sagemaker训练任务的时候,请根据自己数据集训练的个数来调整超参数(hyperparamerter)和训练instance的类型(InstanceType)如下:
代码解析-2
  • 在InputDataConfig替换AttributeNames为自己定义的name,比如:
    “AttributeNames”: [“source-ref”,”groundtruth-labeling-job-20191209-clone”]
  • 启动训练作业,我们可以在Sagemaker notebook中查看到结果,也可以返回到Sagemaker控制台的训练任务中看到训练的状态。训练的时间长短取决于训练实例类型、数据集大小、超参数的定义。
Sagemaker notebook的训练状态
Sagemaker console的训练状态
  • 通过使用Sagemaker Neo来优化压缩模型给终端Jetson Nano使用,导出的模型路径我们要记录一下,在下一步骤部署GreenGrass的时候会用到。
模型导出

小结:

回顾一下我们的Demo流程图,我们一起完成了第一部分:图片标注和第二部分模型训练与优化。下一章是我们的另一个重点,开始构建边缘环境与执行边缘推理。

AWS EI Demo流程图

 

参考链接:

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