Adlik深度学习模型编译器介绍

将深度学习模型部署到生产环境实现应用是深度学习算法落地的重要一步。部署阶段的场景和目标设备多种多样,目前针对不同设备有不同的推理框架,如Tensorflow Serving、Tensorflow Lite、OpenVINO、TensorRT、MNN。然而这些推理框架互不兼容,用户根据业务需求使用不同推理框架时需要安装和测试多次。如何使训练得到的深度学习模型能够在不同于训练平台的目标设备上保持性能、高效执行?在同样的平台上,如何快速安装、测试不同推理引擎,保持同样的用户体验?业界有不同的项目针对此目标做出了努力,Adlik是其中一项。

1. Adlik简介

Adlik是一款端到端的深度学习模型推理加速工具链,主要包含三部分:模型优化,模型编译和服务引擎。Adlik模型编译器提供多条编译线路,可以把多种深度学习模型编译为不同目标设备所需的不同模型格式,并且支持Tensorflow Lite、TensorRT模型8-bit量化。在推理阶段,Adlik支持OpenVINO, TensorFlow Serving-CPU, TensorFlow Serving-GPU,TensorRT, TensorFlow Lite五种格式的推理运行时,提供benchmark自动测试、云原生镜像和业界典型网络推理测试结果。Adlik提供一套完整的优化、编译、推理平台,用户可根据其提供的benchmark和云原生镜像按需选择、直接使用,避免了多次安装、测试,能够极大的提高用户的使用体验和执行效率。

图1-1 Adlik推理加速工具链

2. Adlik模型编译器

深度学习广泛应用于图像识别、自然语言处理、推荐系统、视频分析等领域,对准确性和性能要求的提高也导致模型的复杂度和尺寸不断增大。模型编译器可促进训练和部署环境之间的过渡、并调整深度学习模型,以在目标设备上实现最优执行。我们训练得到的模型可以称为源模型,服务引擎能直接部署和用来进行推理的中间表示称为目标模型。不同的推理引擎接收模型格式不同,并且目前均是唯一对应的,深度学习训练得到的不同格式模型经过模型编译器转换为推理引擎接受的目标模型格式,从而能直接在线推理或集成到最终应用里进行部署。编译时可以通过图转换、层融合等操作使目标模型的操作节点少于原始模型,再结合模型优化,能够在不降低推理准确度的基础上压缩模型,方便模型部署,有效减少推理时间。Adlik模型编译器支持主流的深度学习框架包括:Tensorflow、Pytorch、Caffe,支持编译为Tensorflow Serving CPU、Tensorflow Serving GPU、TensorRT、Tensorflow Lite、OpenVINO等多种推理服务引擎所需模型格式,能够针对目标设备优化模型、提升推理速度。

图2-1 Adlik模型编译器编译路线图

2.1 Adlik模型编译器使用简介

  1. 拉取Adlik模型编译器镜像

    docker pull registry.cn-beijing.aliyuncs.com/adlik/model-compiler:7.0.0.11_10.0

备注:7.0.0.11代表tensorrt版本,10.0为cuda版本,用户可选择不同版本的tensorrt和cuda,注意保持两者适配


2)使用Adlik示例代码训练一个简单的keras深度学习模型

git clone https://github.com/Adlik/Adlik.git
cd Adlik/examples/keras_model
python3 train_model.py

3)运行Adlik模型编译器镜像

docker run -it --rm -v $PWD:/home/john/model registry.cn-beijing.aliyuncs.com/adlik/model-compiler:7.0.0.11_10.0 bash
  1. 编译模型:编译训练得到的keras模型到Tensorflow Serving需要的模型格式

cd /home/john/model/
python3 compile_model.py
  1. model_repos目录,查看编译成功得到的目标模型。###2.2 Adlik模型编译器编译原理 Adlik模型编译器集成了多种推理引擎模型优化、编译操作,包括Tensorflow Serving模型编译器、Tensorflow Lite转换器、OpenVINO模型优化器、TensorRT模型优化器,能够把深度学习模型优化转换为使用不同指令集架构的目标设备(如Intel CPU, Nvidia GPU,移动端Arm CPU, FPGA)支持的模型表示。####2.2.1 Adlik模型编译器之Tensorflow Serving TensorFlow Serving是一个服务系统,可以直接读取SavedModel格式的模型,帮助用户在实际生产环境中灵活、高性能地部署机器学习模型。SavedModel是tensorflow提供的一系列序列化标准格式的文件,可以部署到各种目标平台(例如服务器,移动设备,嵌入式设备,浏览器等)。SavedModel 格式是一个包含 protobuf 二进制文件和 Tensorflow 检查点(checkpoint)的目录。它不需要原本的模型代码就可以加载,所以很容易在 TFLite, TensorFlow.js, TensorFlow Serving, or TensorFlow Hub 上部署。

ls {saved_model_dir}
assets  saved_model.pb  variables

其中,saved_model.pb文件用于存储实际 TensorFlow 程序或模型,以及一组已命名的签名(每个签名标识一个接受tensor输入和产生tensor输出的函数)。SavedModel 可以包含模型的多个变体,多个v1.MetaGraphDefs,通过 saved_model_cli --tag_set 可以查看。

saved_model_cli show --dir {saved_model_dir} --tag_set serve

variables 目录包含一个标准训练检查点(checkpoint),检查点可以捕获模型使用的所有参数(tf.Variable 对象)的确切值。

ls {saved_model_dir}/variables
variables.data-00000-of-00001  variables.index

assets目录包含 TensorFlow 计算图使用的文件,例如,用于初始化词汇表的文本文件。SavedModel 可能有一个用于保存 TensorFlow 计算图未使用的任何文件的 assets.extra 目录,例如,为使用者提供的关于如何处理 SavedModel 的信息。####2.2.2 Adlik模型编译器之Tensorflow Lite Tensorflow Lite是TensorFlow的轻量级版本,专为移动和嵌入式设备而设计。它以较小的二进制大小实现了低延迟的推理,能够实现直接在设备上执行推理,从而无需在设备与服务器之间来回发送数据,达到缩短延迟、保护隐私、降低功耗的目的。Tensorflow Lite由两部分组成:TensorFlow Lite 转换器,它可将 TensorFlow 模型转换为方便解释器使用的格式,并可引入优化以减小二进制文件的大小和提高性能。TensorFlow Lite 解释器,它可在手机、嵌入式 Linux 设备和微控制器等很多不同类型的硬件上运行经过专门优化的模型。TensorFlow Lite 转换器可根据输入的 TensorFlow 模型生成 TensorFlow Lite 模型(一种优化的 FlatBuffer 格式,以 .tflite 为文件扩展名),可在不影响准确率的情况下减小模型的大小和提高其性能。FlatBuffers 是一个开源的高效的跨平台序列化库,常与 per-object 内存分配相结合,在直接访问数据时不需要再次解析包或者解压缩。相比于protocol buffers,FlatBuffers 的代码体积小很多。

图2-2 Tensorflow Lite模型转换器(图片来自Tensorflow官方网站)

TensorFlow Lite 转换器可以通过Python API和命令行的方式使用。在Adlik模型编译器中,使用Python API的方式进行转换。主要使用的API为:

tf.lite.TFLiteConverter.from_saved_model()
tf.lite.TFLiteConverter.from_keras_model()
2.2.3 Adlik模型编译器之OpenVINO

OpenVINO是英特尔推出的针对英特尔硬件的一套深度学习推理加速工具链,包括模型优化、推理引擎等一系列与深度学习模型部署相关的工具。OpenVINO工具包的核心组件之一是模型优化器,它是一种跨平台的命令行工具,可以将经过训练的神经网络从其源框架转换为与nGraph兼容的中间表示(IR),以在英特尔CPU和GPU上进行更加高效的推理操作。

图2-3 OpenVINO模型优化器(图片来自OpenVINO官方网站)

OpenVINO模型优化器支持多种深度学习训练框架和模型格式,将训练得到的模型转换的中间表示(IR),可以使用推理引擎对其进行读取、加载和推理。中间表示是一对描述模型的文件:

.xml-描述网络拓扑
.bin-包含优化后的网络参数和变量

OpenVINO模型优化器在转换模型格式的同时,对模型进行了优化,无需重新训练模型,即可实现推理加速。Adlik中OpenVINO模型优化器执行优化实施的主要操作包括:线性运算融合和分组卷积融合。1)线性运算融合 许多卷积神经网络包括BatchNormalizationScaleShift层(例如,Resnet *Inception *),可以将它们表示为一系列线性运算:加法和乘法。例如,ScaleShift层可以表示为Mul → Add序列,这些层可以融合到先前的Convolution层或FullyConnected层中。具体的操作可以分为三步:第一步,将BatchNormalizationScaleShift层分别分解。将BatchNormalization层分解为Mul → Add → Mul → Add序列,将ScaleShift层分解为 Mul → Add序列。第二步,线性运算合并。在此阶段,我们将MulAdd运算的序列合并到单个Mul→Add实例中。例如,我们的网络结构图中有BatchNormalizationScaleShift层,在第一步,将其分别替换为Mul → Add 序列后,在本步中,如果我们没有可用的Convolution层或FullyConnected层可以融合,则使用ScaleShift层替换模型计算图中BatchNormalization层和ScaleShift层的后者。第三步,线性运算融合。在此阶段,模型优化器将MulAdd运算融合到ConvolutionFullyConnected层。需要注意的是,它在模型图中向后和向前搜索Convolution层和FullyConnected层进行融合(除了Add操作,该操作不能沿向前方向融合到卷积层)。下面以Caffe * Resnet269拓扑结构图进行示例,其中BatchNormScaleShift层将融合到Convolution层。

图2-4 OpenVINO模型优化-线性操作融合(图片来自OpenVINO官方网站)

2)分组卷积融合 分组卷积融合是适用于TensorFlow *拓扑的特定优化。此优化的主要思想是合并Split输出的卷积结果,然后使用Concat操作以从Split中分离出来的顺序重新组合它们。

图2-5 openvino模型优化-分组卷积融合(图片来自OpenVINO官方网站)

2.2.4 Adlik模型编译器之TensorRT

TensorRT是英伟达推出的用于深度学习推理的SDK。它基于CUDA和cuDNN提供API和解析器,支持从所有主流的深度学习框架中训练的模型进行推理。TensorRT以一个C++库为核心,能够在英伟达的GPU上进行模型推理性能的优化,通过强大的优化,降低的精度使用和实现有效的内存利用,帮助用户以低延迟处理大量数据。对于Tensorflow模型,TensorRT可以直接解析他们的网络模型;对于Caffe2,Pytorch,等框架则需要先将模型转为 ONNX 通用深度学习模型格式,然后对ONNX模型做解析。Adlik TensorRT模型优化器目前支持ONNX格式模型优化转换,支持FP16或INT8量化,尚不支持TF-TRT(TensorFlow与TensorRT的集成),将在下个版本中引入。TensortRT优化推理流程图如图2-6所示,为了优化推理模型,TensorRT采用用户提供的已完成训练的网络,执行包括平台特定优化在内的模型优化,并生成一个.plan序列化格式文件。

图2-6 TensorRT模型优化图(图片来自TensorRT官方网站)

Adlik中TensorRT在编译时对模型计算图进行的优化主要有:1)层与张量融合。TensorRT将convolutionbiasReLU运算进行纵向融合,融合为一层(CBR)。之后进行横向融合,整合拥有相同源张量和使用完全相似参数的层。通过层与张量的融合,减少对cuDNN API的调用次数,能有效优化GPU显存和带宽的使用。2)消除推理时不使用的层和等同于无操作的层。3)合并concatenation层。TensorRT将层的输出直接定向到正确的最终需要输入的位置,减少一次传输吞吐。4)支持FP16和INT8量化。TnsorRT提供完全自动化的精度校准,能够在有效地保持模型性能的基础上,降低存储带宽,提升推理速度。

图2-7:(a)具有多个卷积和激活层的TensorRT优化示例GoogLeNet Inception卷积神经网络。(b)TensorRT采用纵向和横向层融合以及层消除优化功能简化了的GoogLeNet Inception模块图。

Adlik Github:https://github.com/Adlik

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值