经过数据采集,数据清洗,环境搭建,模型训练,模型评估和测试等艰苦工作,最终可以应用到具体场景中。但是,我们突然发现,我们不知道如何调用自己的模型,我们不知道如何部署它们!

这也是今天的计算机视觉研究所,跟大家分享一下,部署模式需要考虑哪些问题,需要考虑哪些步骤以及现在常用的部署方式!

1背景

经过数据采集,数据清洗,环境搭建,模型训练,模型评估和测试等艰苦工作,最终可以应用到具体场景中。但是,我们突然发现,我们不知道如何调用自己的模型,我们不知道如何部署它们!

使用GPU编码器生成整个端到端应用的代码

将深度学习模型部署到生产环境中有两个挑战:

我们需要支持各种不同的框架和模型,这导致了开发复杂性和工作流问题数据科学家基于新算法和新数据开发新模型,如果我们使用英伟达GPU提供卓越的推理性能,我们需要不断更新生产环境首先,GPU是强大的计算资源,每个GPU运行一个模型可能效率很低在单个GPU上运行多个模型不会自动同时运行这些模型来最大化GPU利用率

Matlab案例

一个可以从数据中学习,识别模式并在很少人为干预的情况下做出决策的系统令人兴奋深度学习是一种使用神经网络的机器学习,它正迅速成为解决许多不同计算问题的有效工具,如对象分类和推荐系统可是,将经过训练的神经网络部署到应用和服务中可能会给基础设施管理者带来挑战多重框架,未充分利用的基础设施和缺乏标准实现甚至可能导致AI项目的失败今天,我们讨论了如何应对这些挑战,并将深度学习模型部署到数据中心或云中的生产环境中

一般来说,我们的应用程序开发人员与数据科学家和IT部门合作,将AI模型部署到生产环境中数据科学家使用特定的框架来为许多使用场景训练机器/深度学习模型我们将经过训练的模型集成到为解决业务问题而开发的应用程序中然后,IT运营团队在数据中心或云中运行和管理部署的应用程序

2部署要求

以下需求解释转自陈子知乎天。

要求1:简单demo演示,看效果就行。

选择caffe,tf,pytorch等任意框架,并将其切至测试模式用python运行就行了,写个简单的GUI方便的展示结果,高级的,可以用CPython封装一层接口,然后用C++ project调用

需求2:要在服务器上运行,不需要吞吐量和时间延迟。

选择caffe,tf,pytorch等任意框架,老老实实按照官方部署教程用C++部署比如pytorch模型通过工具引导到libtorch这还没有脱离框架,还有很多为训练方便而保留的特性没有去掉,性能也不是最优的另外,这些框架要么是CPU,要么是NVIDIA GPU,对硬件平台要求高,不灵活,还有,框架真的很大,占用内存和磁盘

要求:在服务器上运行,要求吞吐量和延时。

这类应用多见于互联网公司,一般是互联网产品的后端AI计算,如人脸验证,语音服务,带深度学习的智能推荐等由于大规模部署,不仅要考虑吞吐量和时延,还要考虑功耗和成本所以除了软件,硬件也会努力

硬件,如NVIDIA P4和CAMBRIAN MLU100专用于推理与桌面显卡相比,这些推理卡功耗更低,单位能耗计算效率更高,硬件结构更适合高吞吐量

一般来说,软件不会直接进入深度学习框架对于NVIDIA的产品,一般用TensorRT来加速TensorRT使用了CUDA,CUDNN,图优化,fp16,int8量化等

要求:运行在NVIDIA嵌入式平台上,注意延时。

比如PX2,TX2,Xavier等,参考上面的,就是贵一点的

要求:运行在其他嵌入式平台上,注意时间延迟。

硬件方面,根据模型计算和时延的要求,结合成本和功耗的要求,选择合适的嵌入式平台。

比如模型计算量大,可能需要选择带GPU的SoC,用opencl/opengl/vulkan编程,也可以尝试NPU,但是现在NPU支持的运营商不多,一些自定义OPs比较多的网络可能部署不了,

对于小机型,或者对帧率要求不高的机型,CPU可能就够用了,但一般需要做一些优化在手机上部署深度学习模型也可以包含在这个列表中,但是没有硬件的选择你必须将它们部署在用户使用的任何手机上

上述软件部署和优化工作已经在一些移动开源框架中完成一般改装后就可以用了,性能不错

要求:以上部署方案不符合您的要求。

比如开源的移动框架不够快mdashmdash自己写一套比如商汤,全食,Momenta都有自己的前向传播框架,性能应该比开源框架要好自己写一个只是费时费力,如果没有经验,很可能半天都写不好

MATLAB使用GPU编码器将深度学习应用部署到NVIDIA GPU。

NVIDIA Jetson上的目标检测生成并部署CUDA代码。

3个部署示例

选择要分析的嵌入式部署场景。

一般从线下培训到线上部署,都需要依靠线下培训框架静态图工业部署成熟坑少,动态图灵活方便,预研方便,各有优势,你还需要依靠网上信息的框架,这样可以大大缩短你的部署周期

上面的工具链选定之后,剩下的就是如何部署,或者说部署过程,这是我们关心的问题。

通常,该过程分为以下步骤:

推理框架的模型设计和训练模型转换模型部署

虽然整个过程分为三个步骤,但它们是相互联系,相互影响的首先,第一步的模型设计需要考虑Op在推理框架中的支持程度,这样相应地调整网络结构,修改或删减是常见的,模型转换还需要确认推理框架是否可以直接解析,或者选择的解析媒介是否支持网络结构中的所有Op如果发现任何未支撑的零件,将对其进行称重和调整

这里我推荐几个部署案例,很多都是在产品部署中使用的tensorflow和mxnet是主要的离线训练框架,阿里MNN是主要的在线推理框架

静态图的部署流程:

动态图的部署流程:

4深度学习模型的部署方法

主要有两个阶段,第一阶段是训练得到模型,第二阶段是得到模型后在移动端部署本文主要讲解第二个阶段

培训模式

在第一阶段训练模型中,已经实现了成熟的开源框架和算法,但是为了部署到移动终端,需要压缩和加速。

压缩网络

目前,深度学习可以轻松碾压各个领域的传统算法,但真正用于实际项目时会出现很大的问题:

计算量巨大的模型占用大量内存。

由于移动系统的资源有限,深度学习模型可能高达几百米,很难将深度学习应用于移动系统。

压缩法

综合现有的深度模型压缩方法,主要分为四类:

针对模型参数的冗余性,基于参数剪枝和共享的方法试图去除冗余和不重要的项基于低秩分解的技术利用矩阵/张量分解来估计深度学习模型的信息参数基于透射/紧凑卷积滤波方法,设计了一种特殊结构的卷积滤波器,降低了存储和计算复杂度知识提取方法通过学习提取模型和训练更紧凑的神经网络来再现更大网络的输出

一般来说,参数剪枝和共享,低秩分解和知识提取的方法可以用于具有全连接层和卷积层的CNN,但另一方面,使用转移/紧凑卷积核的方法只支持卷积层基于低秩因子分解和变换/紧凑卷积核的方法提供了端到端的流水线,可以在CPU/GPU环境中容易地实现相反,参数剪枝和共享使用不同的方法,如矢量量化,二进制编码和稀疏约束来执行任务,这往往导致需要几个步骤才能实现目标

移动部署

目前很多公司都推出了开源的移动深度学习框架,基本不支持训练,只支持正向推理这些框架都是离线的,可以保证用户数据的私密性,可以不再依赖互联网连接

咖啡2

日前,脸书在F8开发者大会上推出了Caffe2项目是专门为手机定制的深度框架,在caffe2的基础上进行迁移,目的是让最常见的智能设备mdashmdash手机也可以广泛高效地应用深度学习算法

开放源地址:facebookarchive/caffe2

TensorFlow Lite

Goole在2017年5月17日的I/O大会上推出了TensorFlow Lite,这是针对移动设备优化的TensorFlow版本。TensorFlow Lite具有以下三个重要功能:

轻量级:支持小二进制数的机器学习模型推理,可以跨平台快速初始化/启动它可以运行在许多不同的平台上,现在它支持Android和iOS Fast它针对移动设备进行了优化,包括大大减少模型加载时间和支持硬件加速

这些模块如下:

张量流模型:存储在硬盘上的经过训练的张量流模型。

TensorFlow Lite转换器:将模型转换为TensorFlow Lite文件格式的程序。

TensorFlow Lite模型文件:基于FlatBuffers的模型文件格式,针对速度和大小进行了优化。

TensorFlow Lite目前支持许多针对移动终端进行训练和优化的模型。

核心ML

日前,苹果在WWDC发布会上推出了Core ML机器学习模型的训练是一项繁重的任务,Core ML的作用更多的是把训练好的模型转化成iOS可以理解的形式,把新的数据转化成向问好,模型,得到输出虽然抽象问题和创建模型并不难,但是模型的改进和训练可以说是值得研究一辈子的,这篇文章的读者可能并不感兴趣幸运的是,苹果提供了一系列工具,将各种机器学习模型转化为Core ML可以理解的形式这样你就可以在你的iOS app中轻松使用前人训练的模型了以前可能需要自己找模型,然后写一些C++代码跨平台调用,很难利用iOS设备的GPU性能和金属ML降低了很多使用模型的门槛

权杖

小米开放了深度学习框架MACE,有几个特点:异构加速,汇编级优化,支持多种框架的模型转换。

有了异构性,就可以在CPU,GPU,DSP上运行不同的模型,实现真正的生产部署,比如人脸检测,人脸识别,人脸跟踪,可以同时运行在不同的硬件上小米支持的GPU不仅限于高通,很通用也不错比如瑞芯微的RK3299,可以充分发挥cpu和GPU两者的优势

MACE是一个针对移动设备优化的深度学习模型预测框架。自设计之初,MACE就针对移动设备的特点进行了特别优化:

速度:一般放在移动端进行计算的模型,对整体预测延迟的要求非常高在框架底层,针对ARM CPU进行NEON指令级优化,针对移动GPU实现高效的OpenCL内核代码对于高通DSP,集成了nnlib计算库来加速HVX同时,在算法层面,采用Winograd算法加速卷积功耗:移动终端对功耗非常敏感该框架的目标是大ARM处理器架构少,并提供高性能,低功耗等多种组合配置对于Adreno GPU,提供了不同的功耗性能选项,开发者可以灵活调整性能和功耗系统响应:针对GPU计算模式,OpenCL内核在框架底层自适应拆分调度,保证了GPU渲染任务能够被更好地抢占和调度,从而保证了系统的流畅度初始化延迟:在实际项目中,初始化时间对用户体验至关重要,框架对此进行了优化内存占用:通过分析模型中运算符的依赖性,引入内存重用技术,大大减少了内存占用模特保护:对于移动模特来说,知识产权的保护往往非常重要MACE支持模型到C++代码的转换,大大提高了逆向工程的难度

此外,MACE支持TensorFlow和Caffe模型,并提供转换工具,可以将训练好的模型转换成专有的模型数据文件同时,还可以选择将模型转换成C++代码,支持动态库或静态库的生成,提高模型的保密性

目前,MACE已经应用在小米手机的多个应用场景中,包括相机的人像模式,场景识别,图像超分辨率,离线翻译等。

开源地址:小米/mace

梅斯模型动物园

与MACE一起的还有MACE Model Zoo项目,目前包括了物体识别,场景语义分割,图像风格化等多个公共模型。

链接:小米/mace—型号

费瑟CNN和NCNN

由腾讯AI平台部开发的FeatherCNN是一个基于ARM架构的高效神经网络正向计算库核心算法已获专利这个计算库支持caffe模型,具有三个特点:独立,高速,轻量

无依赖性:计算库没有第三方组件,静态库或源代码可以轻松部署在ARM服务器,嵌入式终端,Android,苹果手机等移动智能设备中速度:该计算库是目前最好的开源正向计算库之一,在64核ARM众核芯片上比Caffe和Caffe2分别快6倍和12倍,在iPhone7上比Tensorflow lite快2.5倍轻量级:编译后的后端Linux静态库只有115KB,前端Linux静态库575KB,可执行文件只有246KB

FeatherCNN采用TensorGEMM加速的Winograd变体算法,配合ARM指令集提高CPU效率,为移动终端提供强大的AI计算能力这个计算库可以接近甚至达到专业神经网络芯片或GPU的性能,保护用户现有的硬件投资

两个框架都是腾讯出品,FeatherCNN来自腾讯AI平台部,NCNN来自腾讯优图。

重点是:都是开源的,只支持cpu。

NCNN开源更早,性能更好,用户更多FeatherCNN是一个开源比较晚的,有很好的基础

FeatherCNN开源地址:腾讯/FeatherCNN

NCNN开源地址:Tencent/ncnn

主要数据程序

百度的mobile—deep—learning,MDL框架主要包括模型转换模块,模型加载器模块,网络管理模块,矩阵运算模块和面向Android的JNI接口其中,模型转换模块主要负责将Caffe模型转换为MDL模型,同时支持将32位浮点参数量化为8位参数,从而大大压缩了模型体积,模型加载模块主要完成模型的逆量化,加载验证和网络注册,网络管理模块主要负责网络中Layer的初始化和管理MDL提供了一个JNI接口层供Android调用,开发者可以通过调用JNI接口轻松完成加载和预测过程

作为一个移动深度学习框架,需要充分考虑移动应用本身的特点和运行环境,在速度,体积,资源占用率等方面都有严格的要求同时,可扩展性,健壮性和兼容性也需要考虑为了保证框架的可扩展性,MDL对层layer进行了抽象,便于框架用户根据模型的需要定制和实现特定类型的层通过添加不同类型的层,MDL可用于支持更多的网络模型,而无需更改其他地方的代码为了保证框架的健壮性,MDL通过反射机制将C++底层异常抛给应用层,应用层通过捕捉异常来处理异常,比如通过日志收集异常信息,保证软件的可持续优化目前业界有很多种深度学习训练框架,但是MDL不支持模型训练的能力为了保证框架的兼容性,MDL提供了将Caffe模型转换为MDL的工具脚本,用户只需一行命令就可以完成模型转换和量化的过程

开源地址:PaddlePaddle/Paddle—Lite

国营火药炸药公司

这是高通骁龙的官方SDK,它不是开源的主要支持自己的DSP,GPU,CPU在流行的深度学习框架上训练模型后,训练好的模型将被转换成可以加载到SNPE运行时的DLC文件然后,您可以使用这个DLC文件来使用一个骁龙加速计算核心来执行正向推理传输