基于CPU的深度学习推理部署优化实践

标签: cpu 深度学习 推理 | 发表时间:2018-12-24 18:31 | 作者:爱奇艺技术产品团队
出处:https://www.jiqizhixin.com/

背景介绍  

随着人工智能技术在爱奇艺视频业务线的广泛应用,深度学习算法在云端的部署对计算资源,尤其是 GPU 资源的需求也在飞速增长。如何提高深度学习应用部署效率,降低云平台运行成本,帮助算法及业务团队快速落地应用和服务,让 AI 发挥真正的生产力,是深度学习云平台团队努力的目标 。

从基础架构的角度,GPU资源的紧缺和GPU 利用率的不足是我们面临的主要挑战。由于大量的算法训练及推理服务需求,云端 GPU 资源经常处于短缺状态;而使用 CPU 进行的推理服务常常由于性能问题,无法满足服务指标。除此之外,线上服务通常有较高的实时性要求,需要独占 GPU,但由于较低的 QPS,GPU 利用率经常处于较低的状态(<20%)。

在此背景下,我们尝试进行了基于CPU的深度学习推理服务优化,通过提升推理服务在CPU上的性能,完成服务从GPU迁移到CPU上的目的,以利用集群中大量的 CPU服务器,同时节省GPU计算资源 。

图1. 深度学习服务对云平台的挑战

1. 深度学习推理服务及优化流程

1.1 什么是深度学习推理服务?

深度学习推理服务通常是指将训练好的深度学习模型部署到云端,并对外提供gRPC/HTTP接口请求的服务。推理服务内部实现的功能包括模型加载,模型版本管理,批处理及多路支持,以及服务接口的封装等,如图2所示:

图2. 深度学习推理服务功能模块

业界常用的深度学习推理服务框架包括 Google的tensorflow serving、Nvidia的Tensor RT inference server,Amazon的Elastic Inference等。目前爱奇艺深度学习云平台(Jarvis)提供以tensorflow serving 为框架的自动推理服务部署功能,已支持的深度学习模型包括 tensorflow,caffe,caffe2,mxnet,tensorrt 等,未来还会支持包括 openvino,pytorch。除此之外,业务团队也可以根据自身需求实现和定制特定的深度学习服务化容器,并通过QAE进行服务的部署和管理。

1.2 服务优化的流程是怎样的?

服务优化流程如图3所示,是一个不断朝优化目标迭代的过程。

图3. 服务优化的流程

进行深度学习推理服务的优化,首先需要明确服务的类型和主要性能指标,以确定服务优化的目标。从系统资源的角度,深度学习服务可以分为计算密集或者I/O 密集类服务,例如基于CNN的图像/视频类算法通常对计算的需求比较大,属于计算密集型服务,搜索推荐类的大数据算法输入数据的特征维度较高,数据量大,通常属于I/O 密集型服务。从服务质量的角度,又可以分为延时敏感类服务和大吞吐量类型服务,例如在线类服务通常需要更低的请求响应时间,多属于延时敏感类服务,而离线服务通常是批处理的大吞吐量类型服务。不同类型的深度学习服务优化的目标和方法也不尽相同。

图4. 深度学习推理服务的分类

1.3 深度学习推理服务的性能指标有哪些?

深度学习服务的性能指标主要包括响应延时(latency),吞吐量(throughput),及模型精度(accuracy)等,如图5 所示。其中响应延时和吞吐量两个指标是进行服务化过程中关心的性能指标。明确服务性能指标后便于我们分析服务规模,计算单一服务节点需要达到的服务性能。

图5. 深度学习服务性能指标

2. 基于CPU的深度学习推理服务优化

2.1 CPU上进行深度学习优化的方法主要有哪些?

“工欲善其事,必先利其器”。CPU上进行深度学习推理服务优化的方法,可以分为系统级、应用级、算法级,每一级也有对应的性能分析工具,如图6所示:

系统级的优化主要从硬件和平台的角度进行计算加速,方法主要包括基于SIMD指令集的编译器加速、基于OMP的数学库并行计算加速、以及硬件厂商提供的深度学习加速 SDK 等方法。

应用级的优化主要从特定应用和服务的角度进行流水和并发的优化。通常的深度学习服务不仅仅包含推理,还有数据的预处理、后处理,网络的请求响应等环节,良好的并发设计可以有效的提升服务端到端的性能。

算法级的优化主要针对深度学习模型本身,利用诸如参数设置、网络结构裁剪、量化等方法来减小模型大小和计算量,从而加速推理过程。

图6. 深度学习服务性能优化方法及分析工具

2.2 如何进行系统级的优化?

CPU上系统级优化实践中我们主要采用数学库优化(基于MKL-DNN)和深度学习推理SDK优化(Intel OpenVINO)两种方式。这两种方式均包含了SIMD指令集的加速。

数学库优化对主流的深度学习框架(tensorflow,caffe,mxnet,pytorch等)均有官方源支持。以tensorflow为例,使用方法如下所示:

图7. 基于MKL-DNN 优化的 Tensorflow 使用方法

深度学习推理SDK优化方法,需要首先将原生深度学习模型进行转换,生成IR中间模型格式,之后调用SDK的接口进行模型加载和推理服务封装。具体流程如下所示:

图8. OpenVINO 优化推理服务流程

2.3 选用哪种系统级优化方式?

两种优化方式的比较如图9所示:

图9. 系统级优化方式比较

基于两种优化方式的特点,实践中可首先使用基于MKL-DNN的优化方式进行服务性能测试,如满足服务需求,可直接部署;对于性能有更高要求的服务,可尝试进行 OpenVINO SDK优化的方法。

2.4 系统级优化使用中有哪些影响性能的因素?

以上两种系统级优化方法,使用过程中有以下因素会影响服务性能。

(1)OpenMP参数的设置

两种推理优化方式均使用了基于OMP的并行计算加速,因此OMP参数的配置对性能有较大的影响。主要参数的推荐配置如下所示:

• OMP_NUM_THREADS = “number of cpu cores in container”

• KMP_BLOCKTIME = 10

• KMP_AFFINITY=granularity=fine, verbose, compact,1,0

(2)部署服务的CPU核数对性能的影响

CPU 核数对推理服务性能的影响主要是:

• Batchsize 较小时(例如在线类服务),CPU核数增加对推理吞吐量提升逐渐减弱,实践中根据不同模型推荐 8-16 核 CPU进行服务部署;

• Batchsize 较大时(例如离线类服务),推理吞吐量可随CPU核数增加呈线性增长,实践中推荐使用大于 20 核CPU进行服务部署;

(3)CPU型号对性能的影响

不同型号的 CPU 对推理服务的性能加速也不相同,主要取决于CPU中SIMD指令集。例如相同核数的Xeon Gold 6148的平均推理性能是Xeon E5-2650 v4的2倍左右,主要是由于6148 SIMD指令集由avx2升级为avx-512。

目前线上集群已支持选择不同类型的CPU进行服务部署。

(4)输入数据格式的影响

除 Tensorflow之外的其他常用深度学习框架,对于图像类算法的输入,通常推荐使用NCHW 格式的数据作为输入。Tensorflow原生框架默认在CPU上只支持 NHWC 格式的输入,经过 MKL-DNN 优化的 Tensorflow 可以支持两种输入数据格式。

使用以上两种优化方式,建议算法模型以 NCHW 作为输入格式,以减少推理过程中内存数据重排带来的额外开销。

(5)NUMA 配置的影响

对于NUMA 架构的服务器,NUMA配置在同一node上相比不同node上性能通常会有 5%-10%的提升。

2.5 如何进行应用级的优化?

进行应用级的优化,首先需要将应用端到端的各个环节进行性能分析和测试,找到应用的性能瓶颈,再进行针对性优化。性能分析和测试可以通过加入时间戳日志,或者使用时序性能分析工具,例如 Vtune,timeline 等 。优化方法主要包括并发和流水设计、数据预取和预处理、I/O加速、特定功能加速(例如使用加速库或硬件进行编解码、抽帧、特征embedding等功能加速)等方式。

下面以视频质量评估服务为例,介绍如何利用Vtune工具进行瓶颈分析,以及如何利用多线程/进程并发进行服务的优化。

视频质量评估服务的基本流程如图10 所示,应用读入一段视频码流,通过OpenCV进行解码、抽帧、预处理,之后将处理后的码流经过深度学习网络进行推理,最后通过推理结果的聚合得到视频质量的打分,来判定是何种类型视频。

图10. 视频质量评估服务流程

图11是通过 Vtune工具抓取的原始应用线程,可以看到OpenCV单一解码线程一直处于繁忙状态(棕色),而OMP推理线程常常处于等待状态(红色)。整个应用的瓶颈位于 Opencv 的解码及预处理部分。

图11. 应用优化前线程状态

图12显示优化后的服务线程状态,通过生成多个进程并发进行视频流解码,并以 batch的方式进行预处理;处理后的数据以batch的方式传入OMP threads进行推理来进行服务的优化。

图12. 应用并发优化后线程状态

经过上述简单的并发优化后,对720帧视频码流的处理时间,从7秒提升到了3.5秒,性能提升一倍。除此之外,我们还可以通过流水设计,专用解码硬件加速等方法进一步提升服务整体性能。

2.6 如何进行算法级的优化?

常见的算法级优化提升推理服务性能的方法包括batchsize的调整、模型剪枝、模型量化等。其中模型剪枝和量化因涉及到模型结构和参数的调整,通常需要算法同学帮助一起进行优化,以保证模型的精度能满足要求。

2.7 Batchsize的选取在CPU上对服务性能的影响是怎样的?

Batchsize选取的基本原则是延时敏感类服务选取较小的batchsize,吞吐量敏感的服务选取较大的batchsize。

图13是选取不同的 batchsize 对推理服务吞吐量及延时的影响。测试结果可以看batchsize 较小时适当增大batchsize(例如bs从1到2),对延时的影响较小,但是可以迅速提升吞吐量的性能;batchsize 较大时再增加其值(例如从8到32),对服务吞吐量的提升已没有帮助,但是会极大影响服务延时性能。因此实践中需根据部署服务节点CPU核数及服务性能需求来优化选取batchsize。

图13. Batchsize 对服务性能影响

总结与展望

以上介绍的系统级优化方法,已在深度学习云平台落地超过10+应用和算法,部署上千core的服务,平均性能提升在1~9倍。更详细的使用方法可以参考文末相关链接。

对于深度学习的推理服务优化,深度学习云平台还计划加入更多的异构计算资源来加速特定任务,例如VPU、FPGA等计算资源。同时在服务的弹性和优化调度、部署参数的自动优化选取等方面,我们也会继续深入优化,以充分发挥云平台的计算资源和能力,加速深度学习推理服务的落地。

相关链接

(1)OpenVINO: https://software.intel.com/en-us/openvino-toolkit

(2)Vtune性能分析工具: https://software.intel.com/en-us/vtune

相关 [cpu 深度学习 推理] 推荐:

基于CPU的深度学习推理部署优化实践

- - 机器之心
随着人工智能技术在爱奇艺视频业务线的广泛应用,深度学习算法在云端的部署对计算资源,尤其是 GPU 资源的需求也在飞速增长. 如何提高深度学习应用部署效率,降低云平台运行成本,帮助算法及业务团队快速落地应用和服务,让 AI 发挥真正的生产力,是深度学习云平台团队努力的目标. 从基础架构的角度,GPU资源的紧缺和GPU 利用率的不足是我们面临的主要挑战.

深度学习二三事

- - FreeBuf.COM | 关注黑客与极客
我知道博客标题中使用否定词很奇怪,但是前几天有一波讨论正好相应于我正在思考的一些问题. 这一切开始于 Jeff Leek 发表的 一篇有关说明在小样本范围内使用深度学习的文章. 要言之,他认为当样本较小时(生物领域中属于常见现象),带有少许参数的线性模型甚至比带有少量层和隐藏单元的深度网络性能更优.

关于深度学习&mdash;&mdash;Deep Learning

- - 互联网旁观者
转载自: http://blog.csdn.net/abcjennifer/article/details/7826917. Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,最近研究了机器学习中一些深度学习的相关知识,本文给出一些很有用的资料和心得.

深度学习的本质探究??

- - ITeye博客
原创 2016-10-07 朱洁 . 标志型事件,阿尔法围棋(AlphaGo)战胜李世石. alphago是一款围棋人工智能程序,由谷歌(Google)旗下DeepMind公司的戴维·西尔弗、艾佳·黄和戴密斯·哈萨比斯与他们的团队开发,这个程序利用“价值网络”去计算局面,用“策略网络”去选择下子. 2015年10月阿尔法围棋以5:0完胜欧洲围棋冠军、职业二段选手樊麾;2016年3月对战世界围棋冠军、职业九段选手李世石,并以4:1的总比分获胜.

深度学习利器:TensorFlow实战

- - 孟飞阳的博客
深度学习及TensorFlow简介. 深度学习目前已经被应用到图像识别,语音识别,自然语言处理,机器翻译等场景并取得了很好的行业应用效果. 至今已有数种深度学习框架,如TensorFlow、Caffe、Theano、Torch、MXNet,这些框架都能够支持深度神经网络、卷积神经网络、深度信念网络和递归神经网络等模型.

深度学习三大框架对比

- -
| 导语 Science is NOT a battle, it is a collaboration. 人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在我们的耳边,如人工智能,机器学习,深度学习等. “人工智能”的概念早在1956年就被提出,顾名思义用计算机来构造复杂的,拥有与人类智慧同样本质特性的机器.

8086 CPU 寄存器简介

- 田野 - 博客园-首页原创精华区
打算写几篇稍近底层或者说是基础的博文,浅要介绍或者说是回顾一些基础知识,. 自然,还是得从最基础的开始,那就从汇编语言开刀吧,. 从汇编语言开刀的话,我们必须还先要了解一些其他东西,. 像  CPU ,内存这些知识点还是理解深刻一点的比较好,. 所以这一篇博文就绕着 80x86  CPU 中寄存器的基础部分下手,至于其他的一些将会在后续的博文中介绍.

CPU架构:i386,x86,AMD64

- - 脚本爱好者
IA32 : 32 bits Intel Architecture (32位带宽Intel构架). IA64 : 64 bits Intel Architecture (64位带宽Intel构架). i386 : Intel 386 ( 老的386机器,也泛指IA32体系的CPU). i586 : Intel 586 ( Pentium ,K6 级别CPU ).

深度学习大牛Bengio教授在Reddit吐槽

- - 博客园_新闻
     Deep Learning 界的三架马车,目前 Geoffrey Hinton 已被 Google 收编, Yann LeCun 已被 Facebook 收编,还留在学术界的 Yoshua Bengio 最近心情好,在 reddit 上定期回答问题. 我抽取了一些比较有料的观点在下面,希望对大家了解这方面有帮助(再不上船可就晚了).

深度学习技术可以给你带来第三只眼

- - 互联网分析沙龙
智能手机已经采用了多种技术,使得日常任务更易于完成. 打开谷歌地图或其他使用手机GPS传感器的导航应用. 但是美国普渡大学一位教授认为,当前的技术只能做到这些. 普渡大学研究员们正在研发一种技术,可以从根本上将智能手机转化成人的第三只眼睛. 这项技术使用一种被称为深度学习(deep learning)的算法系统,使智能手机摄像头立即辨识它看到的物体.