活动回顾|机器学习驱动业务实践之从0到1优化AI推理任务

openlab_4276841a 更新于 2年前

1月8日,我们与行业重磅嘉宾、近千名线上线下开发者和工程师齐聚中海国际中心,尽享一场技术盛宴!

作为2022年的开场活动,本次分享以「探讨 机器学习 如何驱动业务实践」为主题。来自谷歌、英特尔 和 Airwallex,拥有大规模业务场景实战经验的专家们,为大家深度分享了电商、模型加速和异常交易监测等多方面的业务实践。

活动主题:探讨机器学习如何驱动业务实践

环节主题:从0到1优化AI推理任务


干货速览-从0到1优化AI推理任务

一个高效的优化策略,不仅可以极大提高推理任务的响应速度,同时也更进一步降低项目前期设备采购与后期运营维护的开销。本次分享将结合实际工程案例,讲解如何利用OpenVINO™ 工具套件,降低在英特尔平台上的AI推理优化门槛,实现面向边缘计算场景,更快捷的行业应用落地。

什么是AI模型的性能优化,简单来说就是让AI预测的速度变得更快。根据不同AI应用场景,在这里我们有两个重要的评价指标需要被考虑——延迟和吞吐量。从这个示例可以看出,延迟就是指处理单任务所消耗的时间,而吞吐量是一次处理多个任务所消耗的平均时间。假设你的应用是一个图片检测系统比如医疗影像检测,或者是一个OCR识别系统,那这时,我们需要对处理延时做更多的优化。那如果你的应用是在处理一段连续的影像数据,比如安防视频分析,同时该业务对延迟有一定容忍性,这时我们就要考虑优化AI应用的吞吐量性能。

图:延迟和吞吐量

那为什么说AI性能优化是非常重要的呢?首先更短的AI处理时长,能带给你更快的应用反应速度,设想你在开发一款乒乓球对战机器人,球的运行速率是非常高的,这就要求我们的视觉处理系统要能够实时地跟踪到球在运行轨迹中的每一个位置,来做即时的反应和挥拍,这时可能一秒钟需要做出50次以上的判断。其次高效的推理,也能为你节省设备能源消耗。设想你需要在一个由电池供电的端侧设备上完成语音识别,一次快速的推理,能让设备从高功耗模型迅速切换到低功耗模型,从而减少整体资源消耗。最后,目前已经有非常的多的AI应用是部署在云端的,优化以后的AI模型,可以让你在达到客户所预期的处理能力的基础上,使用更少的计算资源,以便更进一步降低购买云服务的开销。

大家可能都有过这样的经历:出于成本优化的考虑,被客户或者老板要求在短时间内使模型提升2倍以上的性能。而在没有现成工具的情况下,这的确是一个急需优化的过程,甚至需要不断调整的你的模型结构,进行重训练操作,以平衡模型准确性和推理性能。但如果大家使用英特尔平台的话,就不用担心这一点,因为英特尔的AI开发平台提供了强大而丰富的生态工具包,可以让你的AI应用在几个小时内,提升2倍甚至更多的推理性能。

这个工具套件就叫做 OpenVINO™ 。OpenVINO™ 是一个深度学习的推理框架,旨在加速英特尔平台上的模型推理性能。OpenVINO™ 的前端目前已经适配大部分主流的深度学习训练框架 (如Caffe, MXNet, Keras, TensorFlow, ONNX, PyTorch等),在后端算力支持方面,OpenVINO™ 的模型可以部署在几乎任何一个英特尔的计算单元上,大到一个至强系列的服务器,小到一个atom的嵌入式平台,都可以利用OpenVINO™ 进行推理。此外,开发者也不用担心自己原有的应用没有办法顺利地往OpenVINO™ 上做移植,因为OpenVINO™ 的底层依赖库可以在Windows,ubuntu, centos, MacOS等任何一个主流操作系统下进行编译,开发者也可以很方便地通过Python, C, C++等API接口将自己的应用轻松移植。

图:OpenVINO™生态

OpenVINO™ 包括了一个完整的推理引擎 API 管道。在工程的实际应用中,对于在PC端训练出来的模型权重文件,在部署平台需要进行权重转换,OpenVINO™ 提供 Model Optimizer 的转换方式,并支持对ONNX 格式以及 nGraph 自定义模型的直接读取,在这个过程中Model Optimizer会自动完成模型拓扑的解析和图优化,例如算子融合,以及正对卷积的步长优化等。

图:OpenVINO™ 开发流程

通过Inference Engine的高层级API函数可以实现从加载模型、硬件配置、创建推理请求、准备输入、进行推理、获得结果等一系列的功能,OpenVINO™ 会可根据用户指定的推理平台以及配置参数,自动实现在runtime过程中的底层优化策略,其中就包含内存重排,向量并行化加速等,便于开发者的应用快速集成。

图:Inference Engine API调用流程

接下来从一个典型的客户应用案例来看下,我们应该怎样去使用OpenVINO™ 进行推理性能优化。

客户A主要面向零售行业提供AI解决方案。其中一个非常重要的场景就是,通过在超市部署的AIBOX和摄像头,实时地检测分析顾客和服务人员的运动轨迹,从而做更进一步的数据分析,提升顾客进店后的服务体验。当你在一个小超市部署这套系统时,其实非常的简单,2-3个摄像头加一个小的工控机就可以搞定。但一旦当你的商场规模达到一个数量级后,比如要求更大监测覆盖面积,更大实时客流统计量,那这时你就要考虑同时接入更多的摄像头,这同样意味着你需要更大算子做支撑,但零售是一个对投入产出比非常敏感的行业,如何在保证功能和性能的同时,减少终端用户在购买和维护设备时的开销,变成方案优化最需要考虑的问题。

由于这次的项目是一个面向视频分析的场景,所以优化吞吐量便是这次任务的核心方向。那我们先来看下结果,原本这家客户在部署一个60个摄像头的商场时,用了4个RTX4000 GPU加速卡以及服务器来做实时AI推理。当他对模型利用OpenVINO™做优化以后,只需要用到若干台Xeon服务器就可以满足相同的性能要求,而且这些服务器有些甚至是一些终端用户闲置的资源,不需要再额外采购昂贵的加速卡。带来的效益也是非常显而易见,整体的设备采购成本相较GPU降低了3.5倍,用电维护成本降低了3.7倍。那OpenVINO™到底是如何做到这一切的呢?

图:面向零售行业的业务扩张挑战

在正式开始我们的推理部署优化之前。首先我们说所有的指标都必须被量化以后,才能知道这套系统可以被优化的方向和程度。为此,OpenVINO™中就自带了一个名叫Deep Learning Workbench的图形化工具,用于实现对模型性能的评估,开发可以简单动动鼠标来对模型推理时的运行参数进行配置,然后观察不同配置下模型性能表现,以此作为依据,对模型做进一步优化。比如你可以测试模型每一个layer的运行时长,workbench会用颜色对运行时长不同的node进行区分。同时你也可以用1-2张图片,快速地对模型推理结果的准确性进行验证。此外该工具还会自动对模型结构进行分析,并给出建议的优化方向。

https://docs.openvino.ai/latest/workbench_docs_Workbench_DG_Introduction.html

图:Deep Learning Workbench

1. 第一步就是选择一个合适的模型。一个适用于当前场景下最轻量的模型,更轻量就意味着更快的速度。目前市面上大部分的预训练模型都是用ImageNet这样的公开数据集进行训练,一般都用于学术竞赛,可输出非常丰富的预测结果。但实际工程化的场景下,你可能只需要1-2种分类结果就够了,并且这些模型也不会为你特定的应用场景而优化。为了帮助我们的开发更高效地挑选合适的模型,Intel特别开发Open Model Zoo工具。其中提供的预训练模型都是针对特定的应用场景深度优化,确保在intel平台上有比较好的精度和性能表现,目前该平台工具已在Github开源,大家可以根据自己的场景需求,免费去下载这些模型。这边也特别举个例子,假设我们找到了两个面向零售场景的人体检测预训练模型。其中一个模型可以接受更小的人体像素范围,另一个算力消耗则更小。如果你的应用场景里基本可以保证人体都在100个像素尺寸以上,那就更推荐使用第二个模型,因为它可以带来更显著的性能提升。

图:Open Model Zoo 面向零售的人体检测模型

2. 第二个优化方案就是开启异步模式,在同步模式下,你需要等待上一个数据处理任务完成后,你才能开始下一个推理任务。当开启异步模式时,你可以申请多个推理请求,并且不需要等待上一个数据推理请求完成后,才能进行下一帧的的处理。在执行异步推理函数后,他会立马进行return,不会把当前进程锁死,你可以立马开启一帧图像的读取和预处理工作,与上一帧的推理请求并行执行,同时等待推理完成后,进行下一帧的推理。这个模式可以更进一步节省数据读取与传输时的等待开销,该功能已经支持在workbench下开启,并进行调试。

图:同步与异步API

3. 刚刚第二种方法适用于对单通道的视频处理场景做优化,如果是多通道场景下,我们可以开启CPU的Throughput模式来提升网络吞吐量。申请多个inference请求后,然后把些请求负载到不同CPU core上去,并行运行,降低线程同步所带来的性能损失。那你可能会问一般开启多少个并行的stream比较好,这边有一些基础的建议,如果是CPU,那就选择和CPU核心数对应的stream数量,如果是iGPU,你可以设置成AUTO模式,让OpenVINO自动来判断。如下图,我们可以测试不同stream数量下CPU的性能表现,并以此作为依据选择实际应用场景下的项目配置参数,达到最理想的性能tradeoff。这个例子里我们选择2,因为他在throughput到达峰值的情况下有最小的延迟。

图:Throughput Mode

4. 通常情况下在intel的CPU上都会带一个集成GPU,或者是其他加速卡,为了充分激活他们的能力,开发者可以通过开启Multi-device mode,为我们的推理请求指定到多个目标设备,该函数接口会自动将多个推理任务部署在不同的异构设备上并行执行,从而提高吞吐量,这仅仅只需要修改一小段代码。

图:Multi-device mode

5. 第五个优化方案就是量化。量化是模型压缩技术的一种,在不影响准确性的情况下,用低精度例如int8的数值来参与运算,从而减少模型的容量,提高模型运行速率。主要有以下这些价值点:

· 减小模型尺寸,如8位整型量化可减少75%的模型大小

· 减少存储空间,在边缘侧存储空间不足时更具有意义

· 易于在线升级,模型更小意味着更加容易传输

· 减少内存耗用,更小的模型大小意味着不需要更多的内存

· 加快推理速度,访问一次32位浮点型可以访问四次int8整型,整型运算比浮点型运算更快

· 减少设备功耗,内存耗用少了推理速度快了自然减少了设备功耗

OpenVINO™ 提供的Post-training Optimization工具(以下简称POT)可以帮助你进行模型量化,并且这个工具可以直接通过workbench来运行。POT是一个无需模型重训练的离线量化工具,开发者可以尝试先从default模式量化自己的模型。如果觉得这种情况下模型精度不够,也可选择精度感知模式,这时需要开发者设定一个精度下降的阈值,并准备一些带标签的样本数据做校准,在量化过程中,POT工具会计算量化后的每一个layer对于精度的影响,如果超过预设阈值,则不会对该layer做量化,让其保持在原始精度的参加运算。如果以上提到的混合精度量化策略也没有办法满足应用场景的推理速度需求,我们将进一步使用NNCF模型压缩工具,对模型进行全int8精度的量化重训练,进一步优化模型的推理速度。此时,我们需要开发者引入原始的模型训练框架,以及少量带标签的训练样本进行量化重训练。

图:POT and NNCF

除了以上5点优化方案以外,我们的客户还会将模型以服务的形式部署在OpenVINO™ 自带的model server上,并以Restful或者gRPC api的形式对外输出推理结果。这就意味着你的client应用程序可以使用任何编程语言去构建,只需要通过api接口来订阅服务,就可以达到与runtime api接口调用几乎相同的性能。同时你可以将你的推理服务部署在docker容器上,并通过k8s等容器编排引擎实现对服务器资源的扩容,用以接入更多的client用户。

图:OpenVINO™ Model Server

总结来说,通过OpenVINO™ 的这一系列优化策略,你可以在Intel的CPU以及集成显卡上更高效地运行你的深度学习推理任务,降低这些任务的设备采购与维护服务开销,更好地将深度学习技术服务于各行各业的应用。

最后如果大家想要更加深入了解或者掌握AI模型优化方法的话,目前英特尔推出了一个面向边缘计算场景的开发者认证课程。这个课程是完全免费的,其中包含了很多基于真实场景的模型优化应用案例,供大家学习。同时实践课程中所涉及算力平台也是免费开放的,学员可以在上面实现并测试自己的AI应用。如果大家学完课程有所收获的话,也可以尝试购买考试认证服务,获得英特尔官方认证的AI开发者证书,帮助大家提升自己应聘简历的含金量。

借助英特尔® 边缘人工智能开发者认证,推动您的职业发展,认证您非凡的新技能。可自定义进度的在线培训课程包括虚拟课堂指导和动手实践项目,让您学习使用最新的英特尔开发人员工具和平台来创建自己的边缘人工智能解决方案。

认证培训包括:

· 使用边缘人工智能 工具和平台的实践体验,包括英特尔® OpenVINO™ 开发工具套件和面向边缘的英特尔® DevCloud for the Edge。

· 通过结合计算机视觉深度学习推理的应用,解决检测安全装置、防止零售损失、识别制造缺陷以及其他实际问题的用例。

· 利用适用于 TensorFlow*、PyTorch*、开放式神经网络交换 (ONNX*) 及其他公共模型的库和 API,开发您自己的边缘人工智能 解决方案组合,并在您选择的英特尔® DevCloud for the Edge 硬件集群上运行。

0个评论