在经历了数据收集、清洗、环境搭建、模型训练和评估之后,你可能会面临一个问题:如何调用和部署你的深度学习模型?
今天,我们将探讨模型部署时需要考虑的问题、步骤以及当前常用的方法。
1 背景
将深度学习模型部署到生产环境面临两大挑战:
首先,我们需要支持多种框架和模型,这增加了开发的复杂性,并可能导致工作流问题。数据科学家不断开发基于新算法和新数据的新模型,因此我们需要频繁更新生产环境。使用英伟达GPU可以显著提升推理性能,但在单个GPU上运行多个模型可能导致效率低下,且这些模型并不会自动并发运行以提升GPU利用率。
深度学习利用神经网络学习数据、识别模式并在少量人为干预下做出决策,已成为解决各种计算问题的一种有效工具。然而,将训练好的神经网络部署到应用和服务中可能会给基础设施管理带来挑战。多个框架的使用、基础设施的未充分利用以及缺乏标准化的实施,可能导致AI项目的失败。今天我们将讨论如何应对这些挑战,并在数据中心或云端将深度学习模型部署到生产环境。
通常,应用开发人员与数据科学家和IT部门合作,将AI模型部署到生产环境。数据科学家使用特定框架训练适应多种使用场景的机器学习模型。经过训练的模型被整合到为解决业务问题而开发的应用程序中,IT运营团队则在数据中心或云端运行和管理已部署的应用。
2 部署需求
以下需求来自于《知乎-田子宸》
需求一:简单的DEMO演示,只需查看效果。
可以选择caFFe、tf、pyTorch等框架,切换到测试模式,使用Python进行简单演示,并编写一个简单的GUI展示结果;更高级的做法是使用CPython包裹接口,并用C++工程调用。
需求二:放到服务器上运行,不要求吞吐和时延。
同样可以选择caFFe、tf、pyTorch等框架,按照官方部署教程,使用C++进行部署,例如将pyTorch模型导出到libTorch下运行。这种方式仍然依赖框架,可能保留了一些为训练设计的特性,性能不一定最优。此外,这些框架通常对硬件平台有要求,且占用内存和磁盘空间较大。
需求三:服务器上运行,要求吞吐和时延(重点是吞吐)。
此类应用在互联网企业中较为常见,通常是后端AI计算的应用,例如人脸验证、语音服务和智能推荐等。大规模部署时,不仅要考虑吞吐和时延,还要关注功耗和成本,因此在软件和硬件方面都需要下功夫。
在硬件方面,可以选择NVIDIA P4、寒武纪MLU100等推理专用卡,这些推理卡比桌面显卡功耗低,单位能耗下计算效率更高,适合高吞吐量情况。
在软件方面,通常不会直接使用深度学习框架。对于NVIDIA的产品,通常会使用TensoRRT来加速,利用CUDA、CUDNN以及图优化、fp16、int8量化等技术。
需求四:放在NVIDIA嵌入式平台上运行,注重时延。
例如PX2、TX2、XavieR等,参考上述需求。
需求五:放在其他嵌入式平台上运行,注重时延。
需要根据模型计算量和时延要求,以及成本和功耗要求,选择合适的嵌入式平台。对于计算量大的模型,可能需要选择带GPU的SoC,使用opencl/opengl/vulkan编程;也可以尝试NPU,但目前支持的算子较少,自定义Op较多的网络可能无法部署。对于小模型或帧率要求不高的情况,CPU可能已足够,但通常需要优化(如剪枝、量化、SIMD、汇编、WinogRad等)。在手机上部署深度学习模型也属于此类,只是硬件选择较少,需根据用户使用的手机进行部署。
上述部署和优化的软件工作在一些移动端开源框架中已有实现,通常可以直接进行修改以满足需求,性能也相对不错。
3 部署举例
以嵌入式部署为例进行分析。
从离线训练到在线部署,通常依赖离线训练框架(如静态图的tensoRflow、caFFe,动态图的pyTorch、Mxnet等)。静态图在工业部署中成熟且问题较少;动态图灵活便捷,便于预研,各有优劣。此外,还需要依赖在线推理框架(如阿里的MNN、腾讯的NCNN等,一般不建议自己去处理底层细节),可以大大缩短部署周期,因为时间对公司至关重要。
选定工具链后,接下来的任务是如何进行部署,即部署流程。
一般流程分为以下几个步骤:
- 模型设计和训练
- 针对推断框架的模型转换
- 模型部署
尽管流程分为三步,但三者之间相互联系、相互影响。第一步的模型设计需要考虑推断框架对操作的支持程度,因此可能需要调整网络结构,修改或裁剪模型是常见的操作;在模型转换时,需要确认推断框架是否能直接解析所选模型格式,确保所有操作都能被支持,若发现不支持的部分,则需进行相应调整。
4 深度学习模型部署方法
本文主要介绍离线部署的方法,分为两个阶段:第一阶段是训练得到模型,第二阶段则是在移动端进行部署。以下内容聚焦于第二阶段。
压缩网络
尽管深度学习在多个领域的表现超越了传统算法,但在实际项目中仍然面临许多问题:
- 计算量巨大
- 模型占用内存高
由于移动端系统资源有限,深度学习模型可能高达数百MB,因此将其应用于移动端系统中变得困难。
压缩方法
现有的深度模型压缩方法主要分为四类:
- 基于参数修剪和共享的方法,去除冗余和不重要的参数。
- 基于低秩因子分解的技术,通过矩阵/张量分解来估计信息参数。
- 基于传输/紧凑卷积滤波器的方法,设计特殊的结构以降低存储和计算复杂度。
- 知识蒸馏方法,通过训练一个更紧凑的神经网络来重现较大网络的输出。
一般来说,参数修剪和共享、低秩分解及知识蒸馏方法适用于全连接层和卷积层的CNN,而使用转移/紧凑型卷积核的方法仅支持卷积层。低秩因子分解和转移/紧凑卷积核的方法提供了一个端到端的流程,便于在CPU/GPU环境中实现。相对而言,参数修剪和共享方法使用不同技术(如矢量量化、二进制编码和稀疏约束),通常需要多个步骤才能达到目标。
移动端部署
目前,许多公司推出了开源的移动深度学习框架,基本不支持训练,只支持前向推理。这些框架采用离线方式,确保用户数据的私密性,无需依赖互联网连接。
CaFFe2
2017年4月19日,FACEbook在F8开发者大会上推出了CaFFe2,这是专为手机定制的深度学习框架,旨在使手机能高效应用深度学习算法。
开源地址: fACEbookaRcHive/caFFe2
TensoRFlow LITe
2017年5月17日,Google在I/O大会推出了TensoRFlow LITe,专为移动设备优化的TensoRFlow版本,具备三个重要功能:
- 轻量级:支持机器学习模型的推理在较小的二进制文件下进行,快速初始化和启动。
- 跨平台:可在多种平台上运行,目前支持Android和iOS。
- 快速:针对移动设备优化,包括显著减少模型加载时间和支持硬件加速。
模块如下:
- TensoRFlow Model: 存储在硬盘上的训练好的模型。
- TensoRFlow LITe Converter: 将模型转换为TensoRFlow LITe文件格式的程序。
- TensoRFlow LITe Model file: 基于FlatBuffers的模型文件格式,优化了速度和大小。
TensoRFlow LITe目前支持多种针对移动端训练和优化的模型。
CoRe ML
2017年6月6日,Apple在WWDC大会上推出了CoRe ML。CoRe ML的主要功能是将已经训练好的模型转换为iOS可理解的形式,并将新数据“喂给”模型以获取输出。虽然模型训练和改进较为复杂,但Apple提供了一系列工具来简化模型转换过程,使开发者能够轻松在iOS应用中使用前人训练的模型。
CoRe ML驱动了iOS的视觉识别和语义分析相关API,开发者可以直接利用高层API,如人脸识别和文字识别等。这些功能在iOS 11 SDK中被集中到新框架中,并提供了更底层的控制选项,允许开发者指定底层使用的模型,从而为iOS计算机视觉带来了新的可能性。
[[[IMG_1]]]
