当前位置: 首页 > 科技观察

训练好的深度学习模型本来是这样部署的

时间:2023-03-19 18:46:10 科技观察

经过我们努力的收集数据、清洗数据、搭建环境、训练模型、评估模型,终于可以应用到具体的场景中了。然而,我们突然发现,我们不知道如何调用自己的Model,更不知道如何部署模型!这也是《计算机视觉研究院》今天要和大家分享的,部署模型需要考虑哪些问题,需要考虑哪些步骤,以及现在常用的部署方式!1背景当我们收集数据、清洗数据、搭建环境、训练模型、评估和测试模型时,我们最终可以将其应用到具体的场景中。然而,我们突然发现,我们不知道如何调用自己的模型,更不用说如何部署模型了!使用GPUCoder生成整个端到端应用程序的代码将深度学习模型部署到生产环境面临两大挑战:我们需要支持许多不同的框架和模型,这导致开发复杂性,并且存在工作流程问题。数据科学家基于新算法和新数据开发新模型,如果我们使用NVIDIAGPU提供卓越的推理性能,我们需要不断更新生产环境。首先,GPU是强大的计算资源,每个GPU运行一个模型可能效率低下。在单个GPU上运行多个模型不会自动同时运行这些模型以最大限度地提高GPU利用率Matlab示例可以从数据中学习、识别模式并以最少的人工干预做出决策的系统令人兴奋。深度学习是一种使用神经网络的机器学习,正在迅速成为解决从对象分类到推荐系统等许多不同计算问题的有效工具。然而,将训练有素的神经网络部署到应用程序和服务中可能会给基础架构经理带来挑战。多个框架、未充分利用的基础设施和缺乏标准实施,这些挑战甚至可能导致AI项目的失败。今天,我们探索如何应对这些挑战并将深度学习模型部署到数据中心或云端的生产中。通常,我们的应用程序开发人员与数据科学家和IT合作,将AI模型部署到生产中。数据科学家使用特定框架为许多用例训练机器/深度学习模型。我们将训练有素的模型整合到为解决业务问题而开发的应用程序中。然后,IT运营团队在数据中心或云中运行和管理已部署的应用程序。2部署要求以下要求从链接《知乎-田子宸》解释:https://www.zhihu.com/question/329372124/answer/743251971要求1:简单的demo演示,只看效果Caffe、tf、pytorch和其他框架随便选一个,切换到测试模式,用python运行,写一个简单的GUI显示结果;更高级的,可以用CPython包裹一层接口,然后用C++工程调用需求2:放在服务器上运行,对吞吐量和延迟没有要求Caffe、tf、pytorch等框架,随便选一个,按照官方的部署教程,老老实实实战的C++部署,比如使用工具将pytorch模型导入libtorch并运行。这仍然没有脱离框架,还有很多为了方便训练而保留的特征没有去掉,性能也不是最优的。另外,这些框架要么是CPU,要么是NVIDIAGPU,对硬件平台有要求,不灵活;还有,框架真的很大,占内存(tf也占显存)和磁盘。需求三:在服务器上运行,需要吞吐量和延迟(重点是吞吐量)。这类应用多为互联网公司使用,一般为互联网产品的后端AI计算,如人脸验证、语音服务、深度学习应用等。智能推荐等。由于一般是大规模部署,此时不仅要考虑吞吐量和时延,还要考虑功耗和成本。所以除了软件,硬件也会下功夫。硬件方面,比如使用推理专用的NVIDIAP4、寒武纪MLU100等。这些推理卡比桌面级显卡功耗更低,单位能耗计算效率更高,硬件结构更适合高吞吐量情况。在软件方面,一般不会直接使用深度学习框架。对于NVIDIA的产品,一般都会使用TensorRT来加速。TensorRT使用了CUDA、CUDNN,也有图优化、fp16、int8量化等。需求4:在NVIDIA嵌入式平台上运行,注意PX2、TX2、Xavier等延迟,参考上面,即是,它更贵。要求5:在其他嵌入式平台上运行,注意延时硬件,根据模型的计算量和延时要求,结合成本和功耗要求,选择合适的嵌入式平台。比如模型计算量大,可能需要选择带GPU的SoC,使用opencl/opengl/vulkan来编程;也可以试试NPU,但是现在NPU不支持很多operator,有些自定义Ops很多的网络可能部署不上去。上;对于小模型,或者对帧率要求不高的模型,使用CPU可能就够了,但一般需要做一些优化(剪枝、量化、SIMD、组装、Winograd等)。在手机上部署深度学习模型也可以归入这一类,但是没有硬件的选择,你得部署在用户用什么手机上。上面提到的部署和优化软件工作已经在一些移动开源框架中完成。一般修改后即可使用,性能不错。需求六:以上部署方案不能满足您的需求。比如开源的移动端框架不够快——自己写一个。比如商汤科技、旷世科技、Momenta都有自己的前向传播框架,性能应该优于开源框架。只是自己写一套比较费时费力,而且如果没有经验,很可能会花很长时间写MATLAB。使用GPUCoder在NVIDIAGPU上部署深度学习应用链接:https://ww2.mathworks.cn/videos/implement-deep-learning-applications-for-nvidia-gpus-with-gpu-coder-1512748950189.html目标检测在NVIDIAJetson上生成和部署CUDA代码链接:https://ww2.mathworks.cn/videos/generate-and-deploy-cuda-code-for-object-detection-on-nvidia-jetson-1515438160012.html3部署示例选择嵌入式部署场景分析一般从离线训练到在线部署,需要依赖离线训练框架(静态图:tensorflow、caffe,动态图:pytorch、mxnet等)。静态图工业部署成熟坑少,而动态图灵活方便,便于预研。各有各的优势;还需要依赖在线推理的框架(比如腾讯的阿里MNN,腾讯的NCNN等,一般不建议大家自己挖出neon等simd底层),可以大大减少你的部署周期,毕竟在公司工期为王!上面的工具链选好之后,剩下的就是如何部署,或者说部署流程,这是我们关心的。大体流程分为以下几个步骤:模型设计和训练推理框架的模型转换虽然模型部署将整个过程分为三个步骤,但三者是相互关联、相互影响的。首先,第一步的模型设计需要考虑推理框架中对Op的支持程度,以便相应地调整网络结构,修改或裁剪是很常见的;模型转换还需要确认推理框架是否可以直接解析,或者选择的分析媒介是否支持网络结构中的所有Ops,如果有不支持的地方,再进行平衡调整。下面我为大家推荐几个部署案例。在产品部署中应用了很多案例。离线训练框架主要使用tensorflow和mxnet,在线推理框架主要使用阿里MNN。案例参考以下链接:静态图部署过程:实际MNN的MobilenetSSD部署(含源码)https://zhuanlan.zhihu.com/p/70323042tf-MobilonetSSD-cpp部署详解MNN的流程https://zhuanlan.zhihu.com/p/70610865MNN的tflite-MobilenetSSD-c++部署流程详解https://zhuanlan.zhihu.com/p/72247645基于tensorflow的BlazeFace-lite人脸检测器https://zhuanlan.zhihu.com/p/79047443BlazeFace:亚毫秒级人脸检测器(含代码)https://zhuanlan.zhihu.com/p/73741766动态图的部署过程:PFLD-lite:基于MNN的嵌入式部署和mxnethttps://zhuanlan.zhihu.com/p/80051906集成mxnet和MNN的嵌入式部署流程https://zhuanlan.zhihu.com/p/75742333集成Pytorch和MNN的嵌入式部署流程https://zhuanlan.zhihu。com/p/766053634深度学习模型部署方法来源:智云查看链接:https://www.zhihu.com/question/329372124/answer/1243127566主要介绍离线部署方法主要分为两个阶段,第一阶段它是训练得到模型,第二阶段是得到模型后部署到移动端。本文主要讲解第二阶段。训练模型在训练模型的第一阶段,已经有非常成熟的开源框架和算法来实现,但是为了能够部署到移动端,需要压缩加速。压缩网络目前,深度学习在各个领域都可以轻松碾压传统算法,但是实际应用到实际项目中会出现一个很大的问题:计算量非常大,模型占用内存大。由于移动端系统资源有限,深度学习模型可能会高达数百M,因此深度学习很难应用到移动端系统。Compressionmethods综合现有的深度模型压缩方法,主要分为四类:Parameterpruning和sharing-based方法针对模型参数的冗余,尽量去除冗余和不重要的项。基于低秩分解的技术使用矩阵/张量分解来估计深度学习模型的信息参数。基于传输/紧凑卷积滤波器的方法设计特殊的结构卷积滤波器以降低存储和计算复杂度。知识蒸馏方法通过学习蒸馏模型和训练更紧凑的神经网络来再现更大网络的输出。一般来说,参数修剪和共享、低秩分解和知识蒸馏方法可用于具有完全连接层和卷积层的CNN,但另一方面,使用移位/紧凑卷积核的方法仅支持卷积层。基于低秩分解和变换/紧凑卷积核的方法提供了一个可以在CPU/GPU环境中轻松实现的端到端流水线。相反,参数剪枝和共享使用不同的方法,如矢量量化、二进制编码和稀疏约束来执行任务,这通常需要几个步骤才能达到目标。移动端部署目前很多公司都推出了开源的移动端深度学习框架,基本不支持训练,只支持前向推理。这些框架是离线的,这确保了用户数据的隐私,不再依赖于互联网连接。Caffe22017年4月19日Facebook在F8开发者大会上推出了Caffe2。该项目是专门为手机定制的深度框架。在caffe2的基础上进行了迁移。目的是让最普通的智能设备——手机也能广泛高效地应用深度学习算法。开源地址:facebookarchive/caffe2TensorFlowLite2017年5月17日,Goole在I/O大会上推出了TensorFlowLite,这是针对移动设备优化的TensorFlow版本。TensorFlowLite具有以下三个重要功能:轻量级(Lightweight):支持以更小的二进制数进行机器学习模型推理,可以快速初始化/启动跨平台(Cross-platform):可以在很多不同的平台上运行,现在支持安卓和iOSFast(快速):针对移动设备进行了优化,包括大大减少模型加载时间,支持如下硬件加速模块:TensorFlow模型:将训练好的TensorFlow模型存储在硬盘上LiteModelFile:基于FlatBuffers的模型文件格式,针对速度和大小进行了优化。TensorFlowLite目前支持许多针对移动设备训练和优化的模型。CoreML2017年6月6日Apple在WWDC会议上介绍了CoreML。机器学习模型的训练是一项非常繁重的工作。CoreML扮演的角色更多是将训练好的模型转换成iOS可以理解的形式,并将新的数据“喂”给模型以获得输出。虽然抽象问题和创建模型并不难,但是模型的改进和训练可以说是值得研究一辈子的,本文的读者可能不会对它太感冒。幸运的是,Apple提供了一系列工具,可以将各种机器学习模型转换成CoreML可以理解的形式。有了这个,你就可以很方便的在你的iOSapp中使用前人训练好的模型了。以前这可能需要你自己找模型,然后写一些C++代码跨平台调用,很难利用到iOS设备的GPU性能和Metal(除非你自己写一些shader来执行)矩阵运算)。CoreML降低了大量使用模型的入门门槛。CoreML驱动了iOS视觉识别的Vision框架和Foundation中语义分析相关的API。普通开发者可以直接从这些高级API中获益,比如人脸图片或者文字识别。这部分内容在之前版本的SDK中也存在,但在iOS11SDK中它们被集中到一个新的框架中,并暴露了一些更具体、更底层的控件。比如可以在Vision中使用高层接口,但同时指定底层使用的模型。这为iOS上的计算机视觉开辟了新的可能性。MACE小米开源了深度学习框架MACE,具有异构加速、汇编级优化、支持多种框架模型转换等特点。有了异构性,不同的模型可以运行在CPU、GPU、DSP上,实现真正的生产部署,比如人脸检测、人脸识别、人脸跟踪等,可以同时运行在不同的硬件上。小米支持的GPU并不局限于高通,很常见也很不错。比如瑞芯微的RK3299,可以同时发挥CPU和GPU的优势。MACE是一个针对移动设备优化的深度学习模型预测框架。MACE从设计之初就针对移动设备的特点进行了专门的优化:速度:对于在移动端计算的模型,整体的预测延迟一般都有非常高的要求。在框架的底层,针对ARMCPU进行了NEON指令级优化,针对移动GPU进行了高效的OpenCL内核代码。对于高通DSP,集成了nnlib计算库,用于HVX加速。同时在算法层面,采用Winograd算法加速卷积。功耗:移动终端对功耗非常敏感。该框架针对ARM处理器的big.LITTLE架构,提供高性能、低功耗等多种组合配置。对于AdrenoGPU,提供了不同的功耗和性能选项,开发者可以灵活调整性能和功耗。系统响应:针对GPU计算模式,框架底层自适应拆分调度OpenCL内核,保证GPU渲染任务更好的抢占式调度,从而保证系统的流畅性。初始化延迟:在实际项目中,初始化时间对用户体验至关重要,框架会相应地对其进行优化。内存占用:通过分析模型算子的依赖关系,引入内存复用技术,大幅降低内存占用。机型保护:对于手机机型来说,知识产权的保护往往非常重要。MACE支持将模型转换为C++代码,大大增加了逆向工程的难度。此外,MACE支持TensorFlow和Caffe模型,并提供转换工具将训练好的模型转换成专有的模型数据文件。同时还可以选择将模型转换为C++代码,支持生成动态库或静态库,提高模型保密性。目前,MACE已经应用于小米手机的多个应用场景,包括人像模式、场景识别、图像超分辨率、离线翻译(即将上线)等。开源地址:XiaoMi/maceMACEModelZoo除了MACE,还有MACEModelZoo项目,目前包括物体识别、场景语义分割、图像风格化等多个公共模型。链接:Xiaomi/mace-modelsFeatherCNN和NCNNFeatherCNN由腾讯AI平台部研发。它们是基于ARM架构的高效神经网络前向计算库。核心算法已申请专利。计算库支持caffe模型,具有无依赖、速度快、轻量级三大特点。该库具有以下特点:无依赖性:计算库没有第三方组件,静态库或源代码可以方便地部署在ARM服务器、嵌入式终端、安卓、苹果手机等移动智能设备上。速度快:该计算库是目前最好的开源正向计算库之一。在64核ARM众核芯片上比Caffe和Caffe2快6倍和12倍,在iPhone7上比Tensorflowlite快2.5倍。轻量级:计算库编译后的后端Linux静态库仅115KB,前端Linux静态库575KB,可执行文件仅246KB。FeatherCNN采用TensorGEMM加速的Winograd变体算法,并使用ARM指令集将CPU效率提升到极致,为移动端提供强大的AI计算能力。使用这个计算库可以接近甚至达到专业神经网络芯片或GPU的性能,保护用户现有的硬件投资。NCNN是一个针对手机优化的高性能神经网络前向计算框架。ncnn从设计之初就深入考虑了移动端的部署和使用。无第三方依赖,跨平台,手机cpu比目前已知的所有开源框架都快。基于ncnn,开发者可以轻松将深度学习算法移植到手机端高效执行,开发人工智能APP,让AI触手可及。QQ、Q空间、微信、天天Ptu等很多腾讯应用都使用了ncnn,这两个框架都是腾讯出品的,FeatherCNN来自腾讯AI平台部,NCNN来自腾讯优图。重点是:全部开源,只支持cpuNCNN开源的更早,性能更好,用户更多。FeatherCNN开源较晚,基础较好。FeatherCNN开源地址:Tencent/FeatherCNNNCNN开源地址:Tencent/ncnnMDL百度移动深度学习,MDL框架主要包括模型转换模块(MDLConverter)、模型加载模块(Loader)、网络管理模块(Net)、矩阵运算模块(Gemmers)和Android端调用的JNI接口层(JNIInterfaces)。其中,模型转换模块主要负责将Caffe模型转换为MDL模型,支持将32bit浮点参数量化为8bit参数,从而大大压缩模型体积;模型加载模块主要负责模型的反量化和加载验证、网络注册等过程,网络管理模块主要负责网络中各层的初始化和管理;MDL提供了一个JNI接口层供Android端调用,开发者可以通过调用JNI接口轻松完成加载和预测过程。作为一款移动深度学习框架,需要充分考虑移动应用本身和运行环境的特点,在速度、体积、资源占用等方面有着严格的要求。同时,还需要考虑扩展性、健壮性和兼容性。为了保证框架的可扩展性,MDL对layer层进行了抽象,方便框架用户根据模型的需要自定义实现具体类型的layer。使用MDL通过添加不同类型的层来支持更多的网络模型,无需更改其他位置的代码。为了保证框架的健壮性,MDL通过反射机制将C++底层异常抛给应用层,应用层通过捕获异常来处理异常,比如通过日志收集异常信息,保证软件的可持续优化。目前业界有多种深度学习训练框架,但MDL不支持模型训练能力。为了保证框架的兼容性,MDL提供了将Caffe模型转换为MDL的工具脚本。用户只需一行命令即可完成模型转换和量化。过程。开源地址:PaddlePaddle/Paddle-LiteSNPE这个是高通骁龙的官方SDK,没有开源。主要支持自带的DSP、GPU和CPU。模型训练在流行的深度学习框架上进行(SNPE支持Caffe、Caffe2、ONNX和TensorFlow模型。)训练完成后,训练好的模型被转换成DLC文件,可以加载到SNPE运行时。然后可以使用此DLC文件使用其中一个Snapdragon加速计算核心执行前向推理过程