亚马逊Sagemaker结合英伟达Jetson平台打造智能边缘

随着物联网和AI芯片的发展,未来会有越来越多的数据在边缘侧处理。很多业务场景都对边缘智能提出了明确的要求。例如,自动驾驶汽车每天产生5TB的数据,而智能工厂每天产生高达1PB的数据,包括视频和传感器数据。如果不能利用边缘智能技术,依靠互联网网络将数据传输到云端进行处理,会造成网络延迟和拥塞,影响实时推理结果,造成生产事故甚至安全事故。因此,本文将介绍使用Amazon SageMaker和Nvidia Jetson结合云创建一个边缘推理方案,总体方案架构如下:
在正式了解亚马逊Sagemaker和英伟达Jetson平台之前,我们先了解一下什么是目标检测和YOLO。
目标探测和YOLO(你只看一次)
目标检测是计算机视觉的一个重要分支,但神经网络模型在边缘设备或移动终端的部署需要大量的计算能力或GPU处理能力。近年来,由于边缘AI芯片计算能力的增强和边缘智能更广泛的应用场景,机器学习模型在边缘设备上的高效应用等研究课题日益火热。
目前,目标检测领域的深度学习方法主要分为两类:一类是两阶段的目标检测算法;另一种是一阶段的目标检测算法。
前者是通过算法生成一系列候选盒作为样本,然后用卷积神经网络对样本进行分类。在后一种情况下,一个阶段直接将目标边界定位问题转化为回归问题,而不生成候选帧。由于两种方法的不同,在性能上也有差异。前者在检测精度和定位精度上更胜一筹,后者在算法推理速度上更胜一筹。最近很多AI公司都在做是否戴口罩的鉴定,其实就是基于这两种方法。在目标探测中,精度和速度往往是零和游戏。我们通过实践来平衡它们,以获得最大的利益。
YOLO v3是YOLO的第三代版本,是目标探测的经典模型。由于其目标识别速度快,在业内被称为边缘目标检测之光。它是由华盛顿大学的约瑟夫雷德蒙和阿里法尔哈迪创建的,他们是目标探测领域的经典论文《YOLO》(你只看一次)的两位作者。2018年9月,YOLO v3正式发布。下图显示YOLOv3的运行速度快于其他性能相似的检测方法。为满足嵌入式应用需求而发布的Yolo V3 Tiny已经成为非常流行的目标检测算法,目前在主流AI芯片公司的产品中使用。工业场景或新零售中的缺陷检测和大众消费领域的智能驾驶得到广泛推广。关于YOLO的具体介绍和说明,请参考https://pjreddie.com/darknet/yolo/。
为什么选择Tiny Yolo v3?
Tiny Yolo v3是Yolo v3的简化版。Tiny Yolo v3的优点是网络简单,计算量小,可以在移动端或者设备端运行。缺点是准确率也低(候选框和分类准确率都低)。一般的深度学习网络架构对于很多边缘和移动的场景来说过于沉重,所以边缘端需要一个更轻、推理更快、更简单的网络模型。Tiny Yolo v3很合适,可以实现实时检测。下图由英伟达官网提供。TensorRT加速后,TensorFlow、PyTorch、Caffe/Caffe2、Keras、Mxnet等每一个ML框架。取得了良好的加速效果。TensorRT支持的对象检测模型中基于Darknet的Tiny YOLO V3非常不错。如下图:
因此,我们的下一步是训练微型YOLO V3模型,以实现边缘智能。
但是训练模型不仅仅是敲代码那么简单,因为大部分做机器学习或者数据分析的公司几乎一半的精力都花在了数据准备上,另外很大一部分精力花在了机器学习的训练环境的部署、框架安装、调优调试上。比如我用Darknet53来训练我的Yolo模型,但是我们大部分时间都花在了GPU驱动,CUDA安装,cuDNN匹配,OpenCV和Python上。VisualStudio引入了各种库函数或安装框架(版本一致)。每一步都是强耦合的,一步错一步。为了防止你重蹈覆辙,接下来,我们将介绍如何使用亚马逊Sagemaker来帮助我们简化复杂度,减少不必要的环境部署时间,提高效率。
亚马逊SageMaker
亚马逊SageMaker是一项完全托管的服务,可以帮助开发人员和数据科学家快速构建、训练和部署机器学习(ML)模型。SageMaker彻底消除了机器学习过程中每一步的繁重工作,更容易开发出高质量的模型。传统的ML开发是一个复杂、昂贵、迭代的过程,整个机器学习工作流程没有集成的工具可用,这就更加困难了。我们需要将工具和工作流拼接在一起,这既耗时又容易出错。SageMaker在单个工具集中提供了机器学习的所有组件,解决了这一难题,因此模型可以更快地投入生产,工作量更少,成本更低。
这里省略了创建亚马逊Sagemaker笔记本实例的步骤,直接使用创建好的亚马逊SageMaker笔记本进行开发。和本地使用jupyter notebook是一样的,不同的是我们可以直接调用AWS的底层计算资源,比如P3实例。它可以支持多达8个NVIDIA V100 TensorCore GPUs,并为机器学习应用提供高达100Gbps的网络吞吐量。我们可以轻松地启用或禁用可用资源。SageMaker还支持一键分享笔记本。所有的代码依赖都是自动捕获的,因此您可以轻松地与其他人协作。他们将得到存放在相同位置的完全相同的笔记本。现在我们可以直接将Yolo-tiny的源代码导入到SageMaker笔记本中进行模型开发。参考源代码链接https://github.com/AlexeyAB/darknet.训练最重要的是数据集。需要注意的是,darknet的数据集的标注格式是txt。我们要按照PASCAL VOC的目录结构给图片加标签,通过脚本把xml格式转换成txt格式的标签。结构和注释如下:
词汇开发工具包
-VOC2018
ImageSets #存储数据集列表文件,如Main下的train.txt或test.txt等。
Annotations #将图片文件存储在数据集中。
JPEGImages #以xml格式存储图片标签。
voc2yolo3.py #用于生成一个数据集列表文件
了解目录结构的意义在于,在使用Sagemaker时,我们可以对应到数据源为S3的目录结构。
我们想为darknet项目创建一个开发环境和依赖关系。幸运的是,
Amazon SageMaker笔记本实例带有多个安装环境。这些环境包含Jupyter内核和Python包,包括scikit、Pandas、NumPy、TensorFlow和MXNet。您也可以安装自己的环境,其中包含选定的软件包和内核。您通常使用conda install或pip install来完成此操作。而基于Darknet的YOLO具有依赖性小、执行效率高的优点,甚至不显示图片也可以省略opencv。要训练标记的数据,当然需要一台GPU计算能力强大的服务器。下图是通过亚马逊SageMaker NoteBook直接调用AWS底层计算资源的例子。如下图,我们调用p3.2xlage的GPU实例进行模型训练(train _ instance _ type=’ ml . p 3.2 xlage ‘)。
训练结束后,我们会得到一个模型文件权重。接下来就是如何将模型文件部署到边缘智能的开发板NVIDIA Jetson Nano上,通过NVIDIA TensorRT和DeepStream加速推理。
以下部分主要完成设备端的工作。主要步骤是:
1.捷成纳米环境部署
2.将Sagemaker训练的模型部署到Jetson Nano
测试
其实整个实验过程还是挺长的,由于篇幅原因我们就不展开每一步的实现方法了。在这里,我们先抛出一张最终的实现效果图。这是通过云端的Sagemaker服务进行训练,然后通过NVIDIA TensorRT和DeepStream实现实时目标检测。
捷成的环境部署
NIVIDA将使用的硬件和平台相关组件主要包括:
1.杰特森纳米
2.Jetson Nano开发套件SD卡图像
3.JetPack SDK
4.NVIDIA TensorRT
5.深水流
6.运行示例代码
由于博客篇幅原因,先来个概述。详情请参考以下链接。
1.杰特森纳米
首先我们需要一个边缘智能开发板NVIDIA Jetson Nano。虽然是入门级,但足以应对大部分对计算能力要求不高的场景。全南野介绍参考:https://developer.nvidia.com/embedded/Jetson纳米显影剂包
2.Jetson Nano开发套件SD卡图像
因为Jetson Nano的内核是Tegra-Ubuntu 4 . 9 . 140-Tegra A Arch 64架构,所以NVIDIA给了我们一个microSD卡的镜像烧在板上,但是推理框架、库、软件、驱动等等都要遵循它的架构。结果就是,没有一个好的工具,搭建一个边缘推理的环境是极其复杂的。于是就有了JetPack和SDK Manager。镜像刻录参考:3359 developer . NVIDIA . com/embedded/learn/get-started-jetson-nano-dev kit # write
3.JetPack SDK
NIVIDA JetPack可以在Jetson平台上快速搭建机器学习环境。JetPack包括系统映像、TensorRT、CUDA、各种库和API、开发工具和示例代码。我们可以使用SDK Manager来安装Jetson的软件环境。SDK Manager需要安装在Ubuntu主机上,然后它会将环境打包推送至Jetson Nano。
在使用SDK Manager部署环境之前,我们需要确认以下工作:
Jetson Nano必须通过MicroSD卡成功启动才能进入Ubuntu界面。Micro USB是用来链接Nano和Ubuntu主机的(这里需要注意的是,如果主机使用虚拟机,就必须添加USB控制器,如果你启用了USB2.0,3.0也是一样)。Nano将网线连接到外网,与Ubuntu主机在一个局域网内(如果主机使用虚拟机,请使用桥接模式。)然后部署安装。部署时间取决于您的主机配置和网络情况。Jetson nano的root认证会在刻录时弹出。请参阅:3359 docs . NVIDIA . com/SDK-manager/install-with-sdkm-jetson/index . html # install-with-sdkm-jetson。
4.NVIDIA TensorRT
NVIDIA TensorRT是NVIDIA推出的深度学习推理框架,也可以理解为优化器。它能以更低的延迟和更高的吞吐量将推理模型部署到嵌入式平台上。这个框架可以分析Caffe和TensorFlow的网络模型,然后与tensorRT中的相应层进行映射,将其他框架的模型全部转换为tensorRT。然后,在tensorRT中,我们可以对NVIDIA自己的GPU实施优化策略,并加速部署。TensorRT已经能够支持TensorFlow、Caffe、Mxnet、Pytorch、Darknet等深度学习框架。这里我们使用基于Darknet的Yolo。TensorRT可以直接分析他们的网络模型;对于caffe2、pytorch、mxnet等框架,首先要把模型转换成ONNX通用深度学习模型,然后再分析ONNX模型。Tensorflow和MATLAB已经将TensorRT集成到框架中。具体参考:https://developer.nvidia.com/tensorrt
5.深水流
NVIDIA DeepStream SDK提供了完整的流分析工具包,可用于基于AI的视频和图像分析。实时分析来自摄像头或传感器或物联网网关的数据。基于底层GStreamer的低延迟和高吞吐量。Kafka和MQTT等消息代理也可以将边缘集成到云中。NVIDIA平台上的设备可以加速H.264和H.265视频解码,以构建端到端的AI驱动的应用,如零售分析、停车管理、物流管理、光学检查和缺陷检测。具体参考:https://developer.nvidia.com/deepstream-sdk
Jetson Nano可以实时处理多达8个高清全运动视频流,可以部署为网络视频录像机(NVR)、智能摄像机和物联网网关的低功耗边缘智能视频分析平台。NVIDIA的DeepStream SDK使用ZeroCopy和TensorRT来优化端到端的推理管道,以实现边缘和本地服务器的极致性能。下图是我运行的样本代码,显示Jetson Nano在八个1080p流上执行对象检测,而基于ResNet的模型以全分辨率运行,吞吐量为500MP/s,解码速率为500 MP/s (H.264/H.265),视频编码速率为(250mp/s) H.264/H.265。
6.运行示例代码
这一点非常重要。我们需要先浏览一下示例代码。
在我们通过SDK Manager成功将DeepStream烧入系统后,Jetson Nano平台的推理环境成功部署在演示代码中,路径为opt:/opt/NVIDIA/DeepStream/DeepStream-4.0/samples/configs/DeepStream-app/running Nano . txt第五步是我们成功运行通过DeepStream的演示代码的截图。
将Sagemaker的训练模型部署到Jetson Nano
首先,找到Sagemaker上定义的output_path,将S3上的模型文件导出到Jetson Nano。解压后的模型文件,比如yolov3-tiny-xxx.weights。
这时候把模型导入Jetson Nano就不能直接运行了。即使直接运行,也没有经过TensorRT和DeepStream的优化和加速。如果不在Jetson Nano上使用TensorRT加速,会大大降低yolo的推理速度,比如yolo v31fps和yolov3 tiny8fps,所以需要以下三个步骤:
1.yolov 3-通过deepstream_reference_apps运行的微型应用程序
2.交叉编译
3.参数修改
1.yolov 3-通过deepstream_reference_apps运行的微型应用程序
在正式部署我们自己的模型之前,我们仍然要测试Yiny YOLO v3使用DeepStream进行目标检测的示例应用程序是否可以工作:darknet的TensorRT和DeepStream的Tiny YOLO v3在NVIDIA的技术网站中提供。主要操作步骤有:配置环境、下载trt-yolo-app的代码、修改参数、安装依赖项等。最后执行微小的YOLO推理:
见:3359 dev talk . NVIDIA . com/default/topic/1050377/jetson-nano/deep-learning-influence-benchmark-instructions/
$ CD ~/deep stream _ Reference _ Apps/YOLO $ sudort-YOLO-app-flag file=config/yolov 3-tiny . txt 2 .交叉编译
之所以要交叉编译,是因为Jetson Nano的系统是基于aarch64架构的,而我们是在amd64架构上训练的,所以可以把darknet-master (Yolov3-tiny自己训练的)的代码和Sagemaker上训练的模型权重加进去,导入Jetson Nano,然后做clean,再做成aarch64架构的darknet项目。
3.参数修改
我们将项目放在与示例项目相同的路径上:/deepstream _ SDK _ v 4 . 0 . 1 _ Jetson \ sources \ object detector _ Yolo。这样做的目的是因为在sources \ objectdetector _ YOLO的文件夹中有很多配置文件,比如DeepStream、GStreamer、trt(TensorRT) network。除此之外,还涉及到deepstream对trt的调用。我们简单的对objectDetector_Yolo和deepstream-app目录下的几个文件做个分析:
(1)来源\objectDetector_Yolo:
deestream _ app _ config _ yolov 3 _ tiny . txt # # deestream配置文件config _ infer _ primary _ yolov 3 _ tiny . txt # #配置文件nvdsinfer_yolo_engine.cpp ##根据网络类型创建引擎NVDSParseBox _ yolo.cpp ## YOLO目标检测结果输出yoloPlugins.cpp ##模型构建的部分组件及相应实现trt_utils.cpp ##构建tensorRT网络yolo.cpp ##创建引擎、创建网络等。(2) Sources \ apps \ sample _ apps \ \。
Deestream _ app.c # #调用TensorRT等Deestream的操作。deestream _ app _ config _ parser . c # #的配置文件解析灯。deestream _ app _ main . c # # create _ pipeline和图像显示灯。打开nvdsiner _ custom _ impl _ yolo/nvdsparsebbox _ yolo . CPP,修改参数NUM_CLASSES_YOLO。在这里,我的自定义权重是为了识别人和自行车。所以classes=2。
静态常数int NUM _ CLASSES _ YOLO=2;用自己新的模型文件替换示例项目中模型文件的参数,NvDsInferParseCustomYoloV3Tiny(),比如:
extern ‘ C ‘ bool nvdsinferparsecustomyolov 3(STD : vector const outputLayersInfo,nvdsinfernnetworkinfo const network info,nvdsinfernparsedetection params const detection params,STD : vector object list){ .来自椰子树数据集的9个聚类const STD :矢量Kan chors={ 10.0,13.0,16.0,30.0,33.0,23.0,30.0,61.0,62.0,45.0,59.0,119.0,116.0,90.0,156.0,198.0,373.0,326.0 };##指定上面9个锚点中的哪个使用静态常量std:vector kMASKS={ {6,7,8},{3,4,5},{0,1,2 } };}静态bool NvDsInferParseYoloV3(){ ##包围盒重叠阈值const float kNMS _ THRESH=0.5 f const float KP rob _ THRESH=0.7f # #预测盒常数kNUM _ bbox es=3;}具体步骤请参考:https://个文档。英伟达。com/metropolis/deep stream/Custom _ YOLO _模型_ in _ the _ deep stream _ YOLO _ app。可移植文档格式文件的扩展名(portable document format的缩写)
(3) 测试
测试我们的程序:
deepstream-app -c – gst-debug=总结
边缘智能随着低功耗和低成本的人工智能芯片普及,越来越多的企业关注智联网这个领域。边缘智能正在促成人工智能(大赦国际)与物联网(物联网)的融合,艾与物联网相辅相成:如果没有人工智能,物联网只是收集数据的传感器,如果没有物联网,人工智能也不会应用到边缘AIoT .项目确实比其他单纯的一个软件或硬件的研发更加复杂,它是多学科或技术栈的融合。比如,数据的采集、分析、展现需要大数据相关的技术,边缘逻辑的推理、判断需要应用机器学习的模型,对数据加工后又要与大数据结合去ETL。云端的逻辑编写、OTA升级、安全设计、设备管理也要与终端集成。另外,如果是视频流交互还涉及到编解码、流媒体等技术。
正是因为它的复杂性,我们在云端训练,在边缘推理,既利用云计算提供的服务和接口来快速原型和开发,又利用显卡提供的杰森一家平台,在边缘侧加速推理,提高边缘侧算力的利用率。
参考链接
https://pjreddie.com/darknet/yolo/
https://devblogs.nvidia.com/jetson-nano-ai-computing/
https://开发商。英伟达。com/embedded/jetson-nano-developer-kit
https://份文件。英伟达。com/metropolis/deep stream/dev-guide/index。超文本标记语言
https://份文件。英伟达。com/metropolis/deep stream/Custom _ YOLO _模型_ in _ the _ deep stream _ YOLO _ app。可移植文档格式文件的扩展名(portable document format的缩写)
https://份文件。英伟达。使用sdkm-jetson/index安装。超文本标记语言
https://份文件。英伟达。com/jet son/jetpack/install-jetpack/index。html #包管理工具
https://docs.nvidia.com/metropolis/deepstream/dev-guide/
本篇作者

其他教程

看直播卡顿怎么解决球址汇(足球不卡顿视频直播)

2022-8-29 22:56:14

其他教程

有两季的动漫(总之就是非常可爱动漫第二季什么时候出)

2022-8-29 22:58:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索