亚马逊AWS官方博客
利用 AWS GreenGrass ML Inference 为你的物联网赋予智能
1. 背景介绍
想对产线做预防性维护减少停机?想在门口的智能门铃上自动判断出现的人是不是家人?想在公共区域监视谁在吸烟?你需要无处不在的人工智能!完成本文的实验,你将可以让你的摄像头读懂你的动作是鼓掌还是挥手,是在读书还是在写字,是在跑步还是在跳跃。
人工智能可以帮助我们在安防监控、交通安全、自动驾驶、绩效管理、质量管理等无数方面减少人力投入提高效率。比如,我们可以在产线上部署一些网关设备,探测机器的震动和噪音。通过预先部署的机器学习模型,可以很容易预测设备是否即将发生故障,从而实现预测性的维护,减少产线停机时间;而各种短波红外相机、线扫描相机、高分辨率相机则可以很容易快速捕捉产线的零件的图像,通过预先部署的机器学习模型可以自动判断出哪些零件属于次品。随着硬件技术的发展,越来越多的物联网设备具备足够的硬件资源来运行机器学习的推理任务,而且云计算能够提供海量的机器学习的训练能力,然而为什么今天这些事情并没有普遍发生呢?究其原因,硬件能力的提升只是实现这些“黑科技”的条件之一,制约这些“黑科技”普及的因素还包括:
- 收集和传输数据非常困难。人工智能并非天然就智能的,机器学习或深度学习的模型来自大量打好标签的原始数据的训练,而这些数据的收集、传输和打标签往往需要耗费大量的资源和开发工作。
- 处理和训练数据集需要海量的资源。数据收集到以后往往需要经过大数据的处理和清洗的阶段,之后在机器学习的平台进行训练。这两个过程需要耗费大量的计算和存储资源。而这个过程往往是间歇进行的,为了部分时间在运行的任务购置大量计算资源往往不够经济。当然,云计算的普及能够解决这一问题。
- 不断更新的模型如何有效部署到设备端。机器学习或深度学习的模型很难一步到位做到精准无比,需要不断累积数据迭代改进。这样就需要不断将新生成的模型部署到设备端用于推理。如何有效更新,如何有策略地分组更新都是需要复杂的控制逻辑。
- 用于推理的代码如何有效更新到设备端。如同模型是不断更新的,推理代码也会常有新功能的更新,需要推送到设备端。简便的部署方式在这种终端智能的场景下非常重要。
AWS在物联网场景下的边缘计算“大杀器” Greengrass 自2016年的 re-invent 大会上发布以来得到越来越多的用户青睐,它将 AWS IOT 服务能力从云端移到了设备端,即使在设备端不能正常连接互联网的情况下,仍能保持边缘计算的正常进行。在2017年的 re-invent 大会上,AWS又发布了 Greengrass ML inference 功能,它使得边缘计算同时具备了机器学习的推理能力,从而实现了云端训练à模型推送、代码推送à重新训练的动态循环的物联网人工智能的闭环。本文将向你介绍其工作原理和部署方式。
2. AWS Greengrass ML inference 的工作原理
从云端的机器学习训练到设备端的推理,它是一个完整的闭环和生态体系。机器学习使用可从现有数据中学习(该过程称为训练)的统计算法,以便对新数据做出决策(该过程称为推理)。在训练期间,将识别数据中的模式和关系,以建立决策制定模型。该模型允许系统基于之前从未遇到过的数据做出明智的决策。训练机器学习模型需要大量计算资源,因此和云是天然良配。但是,推理通常需要计算能力要少得多,并且往往在新数据可用时实时完成。因此,要确保您的 IoT 应用程序能够快速响应本地事件,则必须能够以非常低的延迟获得推理结果。整个系统的工作模式如下图所示:
在云端的工作大致包括大数据清洗转换和分析、机器学习训练两大部分的工作内容。在AWS 上,大数据清洗转换和分析有 Glue 、 EMR 和 redshift 等工具可以事先,机器学习训练则有 Sagemaker 平台,都能大大减少在编程方面的工作量,使得大数据分析和处理以及机器学习的门槛得以大大降低。如果读者感兴趣,可以参考其他博客(比如《使用 GLUE 构建无服务器架构的 ETL Pipeline》、《AWS 神器为数据科学家轻松打造机器学习全流程 –– EMR Spark + SageMaker 黄金搭档》)了解这些平台和工具的详情。
设备端的推理则需要加载云端训练好的模型以及用于推理的代码,从而不间断地采集数据进行推理。这部分功能是依赖于 AWS Greengrass 来实现的。那么什么是 Greengrass 呢?它是如何进行机器学习的推理的?
首先, AWS Greengrass 是一个软件,它被安装到你的 IOT 边缘网关设备后,允许你以安全方式运行本地计算、消息收发、数据缓存、同步和 ML Inference 功能的软件,就好比一个简化版的 AWS IOT 服务部署到了本地。借助 AWS Greengrass , IOT 网关设备可以运行 AWS Lambda 函数、同步设备数据以及与其他设备安全通信——甚至无需连接互联网。通过使用 AWS Lambda,Greengrass 可以确保您的 IoT 设备能够快速响应本地事件,使用正在 Greengrass Core 上运行的 Lambda 函数以与本地资源进行交互,执行间歇性连接,通过空中升级保持更新状态,最大限度地降低将 IoT 数据传输到云的成本。
Greengrass ML Inference 是 AWS Greengrass 的一项功能,让您可以使用在云中构建和训练的模型轻松地在 Greengrass Core 设备上本地执行机器学习推理。例如,您可以在 Amazon SageMaker 中为场景检测分析构建推理模型,然后在启用 Greengrass 的监控摄像机设备上运行该模型,该设备可在检测到家门口的访客时进行推理,发送推理结果到 AWS IOT 云端,并最终推送消息通知到主人的手机端。
Greengrass ML Inference 包括预构建的 TensorFlow、Apache mxnet 和 Chainer 软件包,适用于所有由 Intel Atom、NVIDIA Jetson TX2 和 Raspberry Pi 提供支持的设备。因此,您无需从头开始为设备构建和配置 ML 框架。除了支持 TensorFlow、Apache mxnet 和 Chainer 之外, Greengrass ML 还可以与其他热门框架(包括 Caffe2 和 Microsoft Cognitive Toolkit )配合使用。借助 Greengrass ML Inference,您还可以灵活地在 Amazon SageMaker 中构建和训练 ML 模型
已经存储在 S3 中的模型进行部署(这个模型可以来自于云端训练的结果,也可以是你自己机房里的训练集群产生的模型,上传到 S3 )。
3. 如何部署 AWS Greengrass ML Inference
3.1 环境准备
3.1.1 Ubuntu 虚拟机环境准备
AWS Greengrass Core 软件可在网络集线器、网关或其他设备上运行,能够自动与云同步和交互。运行环境为 Linux ,至少需要 1GHz 的计算频率 (ARM 或 X86)、128MB RAM 以及其他资源,才能满足所需操作系统、消息吞吐量和 AWS Lambda 执行的要求。具体详情可以参考这里。
本文将采用一个 Ubuntu 的虚拟机来模拟一个 IOT 网关设备,通过其集成的摄像头(可以把你的笔记本电脑的摄像头映射给虚拟机使用)来采集图像。通过部署 AWS Greengrass ,它可以从云端加载一个用于探测人体动作的模型以及用于推理的 lambda 代码,每秒钟生成一个推理的结果并发送到 AWS IOT 云端。
开始之前,你需要注册一个 AWS 全球区的账号,并且在你的笔记本上预先安装一个VMware workstation(Windows) 或 VMware Fusion(MacOS) 或 VirtualBox ,并安装好一个 Ubuntu 桌面版虚拟机( Ubuntu官网下载地址:http://www.ubuntu.org.cn/download/desktop ),需要至少2GB 内存,最好给虚拟机分配3GB 的内存。
安装好虚拟机以后,我们需要将笔记本的摄像头映射给虚拟机。以Virtual Box为例,在菜单中 Devices 下面选中 Webcams ,这样 Ubuntu 可以共享笔记本的摄像头,用于推理。如下图所示:
3.1.2 安装 Greengrass 软件
登录到虚拟机Ubuntu里面,打开 terminal 终端,在其中输入以下命令:
sudo apt-get update
sudo apt-get install -y wget python gcc vim
wget https://bootstrap.pypa.io/get-pip.py && sudo python get-pip.py
sudo adduser --system ggc_user
sudo groupadd --system ggc_group
cd /etc/sysctl.d
ls
结果如下图所示,你应该能看到一个名为 99-sysctl.conf 的文件。
运行命令:
sudo vim 99-sysctl.conf
为了提高设备上的安全性,请运行以下命令以在操作系统启动时启用硬链接和软链接保护。在文件末尾添加以下两行:
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
保存退出编辑。之后重启 Ubuntu 系统:
sudo reboot
重启完毕后重新打开 terminal 终端,输入:
sudo sysctl -a 2> /dev/null | grep fs.protected
你可以看到 fs.protected_hardlinks = 1 和 fs.protected_symlinks = 1,如下图所示:
在 Ubuntu 中打开浏览器,并登录 AWS console :
https://console.thinkwithwp.com/console/home?region=us-east-1
进去以后选择 Greengrass,如下图所示:
点击 “Get Started” → “Use easy creation”, 命名这个 Greengrass group 为 “Action-Detect” ,其他均采用默认配置即可,点击 “Create Group and Core” ,并下载所有生成的秘钥文件和配置文件的压缩包. 如下图所示:
将文件保存到 Ubuntu的~/Downloads 目录。
之后,回到 AWS IOT console 的页面,找到左下方的 software 选项页,我们需要下载其中的 AWS Greengrass Core software 以及 Mxnet/TensorFlow precompiled libraries。如下图所示:
Greengrass Core software 的下载选项如下图所示:
Mxnet/TensorFlow precompiled libraries 的下载选项如下图所示:
把这两个安装文件都下载到 Ubuntu 的 ~/Downloads 目录下面。打开 Terminal 终端,输入以下命令以安装 Greengrass 软件:
cd ~/Downloads
wget -c "https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem" -O root.ca.pem
sudo tar -xzf greengrass-ubuntu-x86-64-1.5.0.tar.gz -C /
tar -xvf xxxx-setup.tar.gz(此文件是在前文创建 Greengrass 组 “Action-Detect”时下载的文件)
sudo cp config/config.json /greengrass/config
sudo cp certs/* /greengrass/certs/
sudo cp root.ca.pem /greengrass/certs/
sudo /greengrass/ggc/core/greengrassd start
如果你看到 Greengrass started successfully,那么你已经成功在 Ubuntu 上运行起Greengrass。
如果你想深入了解 Greengrass 的安装配置,可以参考这个文档:http://docs.thinkwithwp.com/greengrass/latest/developerguide/gg-device-start.htmlAQZ
3.1.3 安装和更新 mxnet 环境
为了让机器学习的模型和代码能够正常运行,我们还需要安装 mxnet 相关的环境。由于AWS IOT提供的 mxnet 版本是0.11.0,而本次实验提供的模型是 1.1.0 的环境下创建的,我们还需要更新 mxnet 的版本。请在 Terminal 终端下运行以下命令:
cd ~/Downloads
tar -xvf ggc-mxnet-v0.11.0-python-intel.tar.gz
sudo ./mxnet_installer.sh
pip install mxnet==1.1.0(如果出错,可以在后面跟--user +你的用户名)
关掉当前 terminal ,并重新打开一个新的terminal,并键入
python
之后键入
import mxnet
print(mxnet.__version__)
看到当前 Mxnet的版本为1.1.0,如下图所示:
3.2 AWS IOT云端配置工作
接下来我们将完成在 AWS IOT 云端的配置,将云端的机器学习模型和 Lambda 推理代码部署到设备端。
3.2.1 Lambda配置
下载以下Lambda代码zip包到你的本地电脑:
https://s3.cn-north-1.amazonaws.com.cn/greengrass-ml-hands-on-lab/HumanActionDetect_lambda.zip
在AWS IOT Greengrass console点击选中刚才创建的 Grassgrass 组“action-Detect”:
- Greengrass→Groups→ ” action-Detect “→ Add Lambda
- 在打开的 Lambda console 中点击 Lambda→ Add Lambda → Create new Lambda, 如下图所示:
- 提供相应的配置参数:
-Name : human-action-detect
-RunTime: Python 2.7
-Role: Choose an existing role
– Exiting role: service-role/lambda_basic_execution
(如果没有看到这个 role,则在上一步中选择新建一个role)
- 上传刚才下载的 zip 包,并在 Lambda 的配置界面将Handler改成 HumanActionDetect.function_handler。如下图所示:
- 在 Configure test even 里面,保持默认的设置,命名为 “TestEvent”。并点击 create。
点击 Save。
- 点击 Actions → Publish new version. 给它一个版本号1.0。如下图所示:
- 点击 “Publish”.
以上步骤将会创建和发布一个 version 1 的 lambda 函数,可供后续 Greengrass 配置使用.
3.2.2 Greengrass group 配置
- 添加 Lambda 到你创建的 group
依次点击Groups → action-Detect → Lambda → Add Lambda → Use exiting Lambda → human-action-detect → Version 1。如下图所示:
- 在上面的界面点击 human-action-detect 进行相应的配置:
点击 Edit, 如下图所示:
配置相应的参数:
– Memory limit: 512 MB
– Timeout: 20 sec
– 选中 "Make this function long-lived and keep it running indefinitely"
– Enable "Read access to /sys directory"
– 其他保持默认
如下图所示:
- 添加本地文件系统
在 resource 界面,点击 Add Resource。如下图所示:
配置相应的参数:
-Resource name: tmp
-Resource type: Volume
-Source path: /tmp
-Destination path: /tmp
-选中 Automatically add OS group permissions of the Linux group that owns the resource
-选中 Read and write access
如下图所示:
点击 add another resource
- 添加摄像头
-Resource name: webcam
-选中 device
-device path: /dev/video0
-选中 Automatically add OS group permissions of the Linux group that owns the resource
-选中 Read and write access
如下图所示:
- 下载机器学习模型并上传S3
下载以下模型文件,并上传到你自己的 S3 存储桶中
https://s3.cn-north-1.amazonaws.com.cn/greengrass-ml-hands-on-lab/model.tar.gz
- 添加机器学习模型
-resource name: human-action-detect
-选中 Locate or upload a model in S3
–选中上一步上传到你自己S3存储桶中的模型文件
-local path: /models
-选中 read-only access
如下图所示:
- 检查 lambda 的资源配置。如下图所示:
- 添加 Subscriptions:
回到 greengrass group 中选中我们创建的group,在左侧的选项中选中subscriptions,点击 add subscription。如下图所示:
在 source 中选中 Lambda ,并选中刚才配置好的 lambda: human-action-detect。如下图所示:
在 target 中选中IOT Cloud。如下图所示:
点击 Next,在 topic filter 中输入 your/action。如下图所示:
点击 Next ,点击 finish
- 更新 service role:
在 AWS Console 中选中 IAM ,在 roles 选项页中筛选出 GreengrassServiceRole ,并点击进入。如下图所示:
在页面中找到 Attach policy ,点击后筛选出 AmazonS3ReadOnlyAccess,点击Attach policy。如下图所示:
最后GreengrassServiceRole的权限如下图所示:
回到 Greengrass group 中选中我们刚才的 group ,在左侧选中 settings ,点击右上角的 Add Role。如下图所示:
选中 GreengrassServiceRole ,并点击 save。如下图所示:
3.2.3部署 Greengrass的资源和配置到设备端并验证:
依次点击Groups → “action-detect”→ Actions → Deploy。如下图所示:
验证模式是否成功部署, Lambda 是否正常运行
在 AWS IOT console ,点击 test ,并在右侧的 subscription topic 里面输入 your/action ,点击 subscript to topic。如下图所示:
此时你在笔记本摄像头前可以做各种动作,比如将手举起来到脸旁边做挥手状。保持这个动作几秒钟,你就能在 Console 界面看到推理的结果。
注意:
- 我们提供的Lambda 每秒钟检测一次你的动作
- 检测结果成为消息上传到 AWS IOT ,然后被 console 的这个 IOT client 所订阅,整个过程会有几秒钟时延
- 我们提供的Lambda 检测你的动作时,如果 confidence level 不高于9,它不会上传 MQTT 消息,因此并不是你的所有动作它都会有消息产生
- 可以尝试挥手、鼓掌、刷牙、打电话等行为,查看是否能够正常获取推理结果
如下图所示:
3.3 问题排查:
你可以通过查看 Ubuntu 上的 /greengrass/ggc/var/log 目录中的以下日志文件来进行问题排查
- crash.log
-如果Greengrass程序崩溃或运行失败,会产生相应的日志
- system
– Greengrass软件所产生的系统日志,包括本地Lambda的失败信息
- user
– Lambda程序运行过程中产生的所有日志
具体可以参考以下链接:
https://docs.thinkwithwp.com/zh_cn/greengrass/latest/developerguide/greengrass-logs-overview.html
4. 总结
训练模式需要大量计算资源,因此它非常适合云计算, AWS 的 sagemaker 使得云端的训练变得非常的简单。 然而,许多客户希望运行更接近数据源的推理,以最大限度地减少等待时间以及通往云端的往返带宽问题。利用边缘计算机器学习推理的 Greengrass ML inference ,可以使得在设备上部署和运行机器学习模型变得更快,更容易。 这项新功能可以将推理模型应用到本地生成的数据,而无需往返云端。 AWS Greengrass ML inference 可以与云端的 sagemaker 良好集成,从而实现云端训练,本地推理的完整解决方案。而且,用户可以通过向 Greengrass 发送指令要求它将收集到的数据上传到云端,在云端进一步训练完成模型的更新,通过 AWS IOT 将新的模型以及新的推理代码推送到设备端,从而实现一个不断迭代和进化的机器学习生态系统。
本篇作者