模型转换、模型压缩、模型加速工具汇总
目录一、场景需求解读二、模型转化工具汇总1、模型转换工具的作用2、模型转换工具简介三、模型压缩和加速工具汇总1、模型压缩加速工具的作用2、模型压缩加速工具简介参考资料注意事项一、场景需求解读 在现实场景中,我们经常会遇到这样一个问题,即某篇论文的结果很棒,但是作者提供的训练模型是使用pytorch训练的,而我自己却比较擅长用tensorflow,我想要使用该模型做一些其它的项目。那么很多人就..
一、场景需求解读
在现实场景中,我们经常会遇到这样一个问题,即某篇论文的结果很棒,但是作者提供的训练模型是使用pytorch训练的,而我自己却比较擅长用tensorflow,我想要使用该模型做一些其它的项目。那么很多人就会采取一种方式,去阅读别人的论文、理解别人的代码,然后使用自己熟悉的工具进行代码重现、重新训练一个模型。这个阶段会耗用大量的人力和物力,最终还不能保证一定能得到论文的效果。本文即将介绍的几个模型转换的工具就可以很好的帮你解决你的这个问题,比较有名的包括mmdnn、onnx等。
除此之外,我们的目的是将深度学习模型应用到现实场景中的任务中,但是现实场景中的硬件五花八门,包含着大多数的算力不足的设备,以ARM处理处居多。那么这里面就涉及到了一个问题,即使你说你的模型有多牛逼,但是如果你的模型比较大,需要大量的算力才能跑起来,那么对于应用场景而言,你这个算法其实没有多少利用价值的。为了将使用N卡的GPU训练出来的模型成功的部署在这些低功耗的设备上面,我们通常需要对这些模型进行模型压缩和模型加速操作,比较有名的几个工具包括TensorRT、PocketFlow、TVM等。
二、模型转化工具汇总
1、模型转换工具的作用
简而言之,模型转换工具的作用是:将使用不同训练框架训练出来的模型相互联系起来,用户可以进行快速的转换,节省了大量的人力和物力花销。
2、模型转换工具简介
1、MMdnn
官网链接
上图展示了MMdnn的主要功能。MMDNN是一套帮助用户在不同的深度学习框架之间进行交互操作的工具。例如,模型转换和可视化。转换caffe、keras、mxnet、tensorflow、cntk、pytorch onnx和coreml之间的模型。 简而言之,通过这个工具,我们可以方便的将某一个框架训练出来的模型转换成另外一个框架所支持的模型,图中基本上包含了当前所有主流的深度学习训练框架,包括Tensorflow、Pytorch、Caffe、MxNet等。除此之外,图中包含了一个关键的概念,那就是Intermediate Representation-中间表示,即这个工具首先将输入框架的模型转换为IR,然后通过IR转换成另外一个框架所支持的模型。
上图展示了MMdnn工具当前所支持的模型。上面的对号表示的是你可以随意的在不同框架之间进行该模型的转换。
# 将Tensorflow的resnet_v2_152模型转换为Pytorch支持的模型
mmdownload -f tensorflow -n resnet_v2_152 -o ./
mmconvert -sf tensorflow -in imagenet_resnet_v2_152.ckpt.meta -iw imagenet_resnet_v2_152.ckpt --dstNodeName MMdnn_Output -df pytorch -om tf_resnet_to_pth.pth
上面展示了一个简单的使用案例,通过简单的两行指令就可以将Tensorlfow的模型转换为pytorch所支持的模型,是不是很方便呢!
2、 ONNX
官网链接
ONNX是一个开放的生态系统,它使人工智能开发者能够随着项目的发展选择正确的工具。ONNX为人工智能模型提供了一种开源格式,包括深度学习和传统的ML。它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义。目前,我们关注的是推断(评分)所需的能力。
ONNX得到了广泛的支持,它可以应用到很多框架、工具和硬件中。它可以实现不同框架之间的相互转换,并加速研究到产品的速度。
上图展示了ONNX所支持的一些深度学习框架,图中包括了一些主流的框架,但是并不完善,tensorflow的身影竟然没有出现。
上图展示了该工具所支持的一些Converters,不仅包括深度学习框架Tensorflow、Keras等,而且包括ML工具Scikit-learn、Xgboost、LibSVM等。
上图展示了该工具所支持的一些Runtimes(运行时),它更偏向模型的部署端,图中包含了多个大厂,包括NVIDIA、Qualcomm、Tencent、synppsys等。
上图展示了该工具所支持的底层编译器,包括了大名鼎鼎的TVM,下面会对该工具进行详细的介绍。除此之外,包含了一些可视化网络模型的工具,NETRON工具相当好用,具体的细节请看这里。
3、 X2Paddle
官网链接
X2Paddle支持将其余深度学习框架训练得到的模型,转换至PaddlePaddle模型。一个比较小众的工具,感兴趣的请在官网查看具体的细节,这里不再祥述。
三、模型压缩和加速工具汇总
1、模型压缩加速工具的作用
简而言之,模型压缩加速工具的作用是:将训练好的模型进行压缩和加速,然后将其部署到一些特定的设备上去,从而满足现实场景的需求。
2、模型压缩加速工具简介
1、PocketFlow
官网链接
PocketFlow是一个开源框架,可以使用最少的人力压缩和加速深度学习模型。深度学习广泛应用于计算机视觉、语音识别、自然语言翻译等各个领域。然而,深度学习模型通常计算成本很高,这限制了在计算资源有限的移动设备上的进一步应用。
PocketFlow旨在为开发人员提供一个易于使用的工具包,以提高推理效率,而不会降低或降低性能。开发人员只需要指定所需的压缩比或加速比,然后PocketFlow将自动选择适当的超参数来生成高效的压缩模型以进行部署。
上图展示了PocketFlow的整个框架。该框架主要由两类算法组件组成,即学习器和超参数优化器,如上图所示。给定一个未压缩的原始模型,学习模块使用随机选择的超参数组合生成一个候选压缩模型。然后对候选模型的精度和计算效率进行评估,并将其作为反馈信号,用于确定学习模块要探索的下一个超参数组合。经过几次迭代,所有候选模型中最好的一个输出为最终的压缩模型。
上图展示了该工具中所包含的压缩方法。主要包括3大类:裁剪、权重稀疏和量化。
# 对网络进行裁剪操作
./scripts/run_seven.sh nets/resnet_at_cifar10_run.py \
--learner channel \
--cp_prune_option uniform \
--cp_uniform_preserve_ratio 0.5
# 对网络进行权重稀疏操作
./scripts/run_local.sh nets/resnet_at_cifar10_run.py \
--learner weight-sparse \
--ws_prune_ratio_prtl uniform \
--data_disk hdfs
# 对网络进行量化操作
./scripts/run_local.sh nets/resnet_at_cifar10_run.py \
--learner uniform \
--uql_use_buckets \
--uql_bucket_type channel \
--data_disk hdfs
上面分别展示了一个网络裁剪、网络权重稀疏、网络量化的实例。整个工具操作起来比较简单,用户仅仅需要确定自己需要的压缩比或者加速比即可,工具可以通过强化学习算法来帮你找到一个最优的结果。
2、TensorRT
官网链接
Nvidia Tensorrt™是一个高性能深度学习推理平台。它包括一个深度学习推理优化器和运行时,为深度学习推理应用程序提供低延迟和高吞吐量。在推理过程中,基于Tensorrt的应用程序的执行速度比仅使用CPU的平台快40倍。使用Tensorrt,您可以优化在所有主要框架中训练的神经网络模型,高精度校准低精度,最后部署到超尺度数据中心、嵌入式或汽车产品平台。
Tensorrt建立在Nvidia的并行编程模型CUDA上,使您能够利用CUDA-X人工智能、自主机器、高性能计算和图形中的库、开发工具和技术,优化所有深度学习框架的推理。
Tensorrt为深度学习推理应用程序(如视频流、语音识别、推荐和自然语言处理)的生产部署提供了int8和fp16优化。降低的精度推断显著降低了应用程序延迟,这是许多实时服务、自动和嵌入式应用程序的一项要求。
上图展示了TensorRT的整体框架。输入到整个tensorRT中的是一个训练好的神经网络,该工具中包含了多个优化工具,具体包括精度矫正、动态张量内存、层/张量融合、内核自动微调、多级流执行等,通过这些操作,我们可以对原始的输入模型进行快速的压缩和加速,从而满足我们的需求。但是细心的你可能注意到了该工具只适合应用在NVIDIA显卡上,在CUDA的基础上进行优化,通用性较差!!!
3、distiller
官网链接
Distiller是一个用于神经网络压缩研究的开源python包。网络压缩可以减少神经网络的内存占用,提高其推理速度,节约能源。Distiller为原型制作和分析压缩算法提供了一个pytorch环境,如稀疏诱导法和低精度算法。
# 显示网络的稀疏度
python3 compress_classifier.py --resume=../ssl/checkpoints/checkpoint_trained_ch_regularized_dense.pth.tar -a=resnet20_cifar ../../../data.cifar10 --summary=sparsity
上图展示了使用该工具来显示某个网络的稀疏度。执行命令之后会输出一个文本表,详细说明参数张量的各种稀疏性。第一列是参数名,后面是它的形状、密集模型和稀疏模型中非零元素的数量(nnz)。下一组列显示列、行、通道、内核、过滤器和元素的稀疏度。概括起来就是元素绝对值的标准差、平均值和平均值。
上图展示的是裁剪敏感性分析图。该图可以辅助你在模型压缩的过程中快速的定位到不同网络层对裁剪的敏感程度,然后有针对性的执行一些操作。
4、TVM
官网链接
TVM是一个针对CPU、GPU和专用加速器的开放式深度学习编译器堆栈。它旨在缩小以生产力为中心的深度学习框架与以性能或效率为导向的硬件后端之间的差距。TVM提供以下主要功能:
- 将keras、mxnet、pytorch、tensorflow、coreml、darknet中的深度学习模型编译为各种硬件后端上可部署的最小模块。
- 自动生成和优化更多后端上的张量运算符并提高性能的基础结构。
TVM提供两个级别的优化。执行高级操作员融合、布局转换和内存管理等任务的计算图优化。然后是张量运算符优化和代码生成层,用于优化张量运算符。
上图展示了TVM工具的整体框图。整个工具具有如下的优势:
- 其输入时任意一个深度学习框架输出的模型,即该工具不挑模型,全部通吃!!! 其输出是针对现实场景中的各种硬件,具体包括Intel的CPU/GPU、NVIDIA的GPU、ARM的CPU\GPU、树莓派、FPGA、ASCI等,即该工具也不挑部署设备,基本上全部通吃。
- TVM中包含了多级模型优化机制,具体包括高级的IR优化和低级的图优化。除此之外,还有一个强大的工具就autotvm,这个工具可以通过一些ML算法寻找到针对不同硬件最优的一种卷积层实现方式,从而实现进一步的压缩和加速。
- TVM不想TensorRT那么局限,它几乎可以很好的支持市面上所有的硬件设备,这是它的一个强大之处。主要通过LLCM来支持Intel和ARM CPU等一些设备;通过Opencl来支持ARM的MailGPU;通过CUDA来支持NVIDIA的设备;通过Metal来支持苹果的设备;通过VTA来很好的支持FPGA和ASCI(即自己设计的芯片)。
- TVM的众多优势之一在于它对多种平台和语言的丰富支持。我们提供了框架的两个组件:包含完整优化库以生成优化机器代码的编译器堆栈和轻量级的运行时,它提供了在不同平台上部署编译模块所需的可移植性。**TVM目前支持Python和C++接口到嵌入式编译器堆栈。**我们设计了具有最大重用的框架,以便编译器堆栈的改进可以在Python和C++组件之间互换应用。我们还提供了一个轻量级运行时,它可以直接运行在诸如JavaScript、Java、Python和C++等平台上的TVM编译代码,这些平台包括Android、IOS、树莓PI和Web浏览器。
TVM装载ONNX模型并执行模型优化的简单案例
import onnx
import numpy as np
import tvm
import tvm.relay as relay
from tvm.contrib.download import download_testdata
######################################################################
# Load pretrained ONNX model
# ---------------------------------------------
# The example super resolution model used here is exactly the same model in onnx tutorial
# http://pytorch.org/tutorials/advanced/super_resolution_with_caffe2.html
# we skip the pytorch model construction part, and download the saved onnx model
model_url = ''.join(['https://gist.github.com/zhreshold/',
'bcda4716699ac97ea44f791c24310193/raw/',
'93672b029103648953c4e5ad3ac3aadf346a4cdc/',
'super_resolution_0.2.onnx'])
model_path = download_testdata(model_url, 'super_resolution.onnx', module='onnx')
# now you have super_resolution.onnx on disk
onnx_model = onnx.load(model_path)
######################################################################
# Load a test image
# ---------------------------------------------
# A single cat dominates the examples!
from PIL import Image
img_url = 'https://github.com/dmlc/mxnet.js/blob/master/data/cat.png?raw=true'
img_path = download_testdata(img_url, 'cat.png', module='data')
img = Image.open(img_path).resize((224, 224))
img_ycbcr = img.convert("YCbCr") # convert to YCbCr
img_y, img_cb, img_cr = img_ycbcr.split()
x = np.array(img_y)[np.newaxis, np.newaxis, :, :]
######################################################################
# Compile the model with relay
# ---------------------------------------------
target = 'llvm'
input_name = '1'
shape_dict = {input_name: x.shape}
mod, params = relay.frontend.from_onnx(onnx_model, shape_dict)
with relay.build_config(opt_level=1):
intrp = relay.build_module.create_executor('graph', mod, tvm.cpu(0), target)
######################################################################
# Execute on TVM
# ---------------------------------------------
dtype = 'float32'
tvm_output = intrp.evaluate()(tvm.nd.array(x.astype(dtype)), **params).asnumpy()
######################################################################
# Display results
# ---------------------------------------------
# We put input and output image neck to neck
from matplotlib import pyplot as plt
out_y = Image.fromarray(np.uint8((tvm_output[0, 0]).clip(0, 255)), mode='L')
out_cb = img_cb.resize(out_y.size, Image.BICUBIC)
out_cr = img_cr.resize(out_y.size, Image.BICUBIC)
result = Image.merge('YCbCr', [out_y, out_cb, out_cr]).convert('RGB')
canvas = np.full((672, 672*2, 3), 255)
canvas[0:224, 0:224, :] = np.asarray(img)
canvas[:, 672:, :] = np.asarray(result)
plt.imshow(canvas.astype(np.uint8))
plt.show()
5、tflite
官网链接
TensorFlow Lite 是一种用于设备端推断的开源深度学习框架,该工具专注于模型优化和模型部署,使得tensorflow的整个生态更加完善,首先使用tensorflow训练好的模型,然后通过tflite进行模型加速,最终将其部署在android或者ios设备上。
上图展示了tflite的整个流程。首先需要选择一个合适的模型;然后使用Lite converter将模型转换为FlatBuffer格式;接着将.tflite文件部署到嵌入式设备中;最后进行模型量化操作。
6、ncnn
添加链接描述
ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。ncnn 从设计之初深刻考虑手机端的部署和使用。无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行,开发出人工智能 APP,将 AI 带到你的指尖。ncnn 目前已在腾讯多款应用中使用,如 QQ,Qzone,微信,天天P图等。
7、MNN
官网链接
MNN是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。此外,IoT等场景下也有若干应用。
主要特点如下所示:
整体设计架构如下所示:
上图展示了MNN的整体设计架构。其支持的深度学习框架包括Tensorflow、Caffe、ONNX;Frontends包括Tensorflow、Caffe、ONNX;包含的图优化操作包括:融合操作、替换操作和调节操作;引擎包括图调度和CV处理;Backends包括CPU、Metal、OpenCL、Vulkan;底层的优化技术包括:Neon或者ASM、多线程、内存重复使用、异构计算等。
8、OpenVIO
官网链接
openVIO是Intel官方针对Intel cpu推出的一款加速工具。该工具专注于边缘端的推理;用户可以使用该工具对Intel的CPU/GPU/FPGA等产品进行加速;可以直接调用优化好的Opencv和OpenVX包。
如上图所示,openVIO不仅可以用来执行基于深度学习的一些CV任务,而且可以用来执行一些传统的CV任务。除此之外,它还可以对特定的硬件进行加速。通过openVIO,你可以让你的算法在CPU端实现4~5倍的加速,它让你的算法运行在CPU端成为了可能,在很多应用场景下面会具有更高的性价比。
9、Tengine
官网链接
Tengine是由开放式人工智能实验室开发的一个面向嵌入式设备的精简、高性能、模块化的推理引擎。Tengine引擎由六个模块组成core/operator/serializer/executor/driver/wrapper。
- core提供了系统的基本组件和功能;
- operator定义了运算符的模式,如卷积、relu、池化等操作;
- serializer用来加载保存的模型。该框架是可扩展的,可以支持不同的输入格式,包括自定义格式。caffe/onnx/tensorflow/mxnet和tengine模型可以由tengine直接加载;
- executor实现了运行graph和operators的代码。当前版本为多个A72核提供了高度优化的实现;
- driver是真实h/w的适配器,通过hal-api为设备执行器提供服务。单个驱动程序可以创建多个设备;
- wrapper为不同的框架提供了api包装。caffe api包装器和tensorflow api包装器现在都可以正常使用啦。
10、ARMNN
官网链接
ArmNN是Arm机构开源的基于arm嵌入式设备的inference框架,在Arm Cortex-A CPUs、Arm Mali GPUs、Arm Machine Learning processor都可以达到很高的加速效果。不过可惜的是,由于缺乏文档及教程,该框架在国内推广的程度不高,目前Github上star仅有359个。相对于其他竞品inference框架如NCNN、Tengine、Mace、MNN等等,ArmNN的知名度显得很小。不过笔者在项目的多次使用中,发现ArmNN是一个被低估的框架(在arm设备上的性能几乎都优于目前的前传框架),不亏是ARM家精心调教的SDK,对自家核心的性能调教到了极致。
ArmNN基于Arm的另外一个开源计算引擎ComputeLibrary做后端的核心计算,前端支持多种离线训练框架,如TensorFlow、TFLITE、CAFFE以及ONNX。从功能上来说,几乎实现了与市面上所有离线训练框架无缝对接。而且ArmNN在FP32、FP16及INT8上的加速非常可观,笔者在RK3399上做300x300的Mobilenet-SSD(depth_multiplier=1.0),效率可达90ms/ 帧,其余的框架大多在160ms左右徘徊。
11、Paddle Lite
官网链接
Plader Lite是Plader Mobile的更新版本,这是一个开源的深度学习框架,旨在使在移动、嵌入式和物联网设备上执行推理变得容易。它与飞桨和其他来源的预训练模型兼容。
- 轻量化。在移动设备上,由于我们的执行模块和分析模块是分离的,因此可以在没有第三方库的情况下部署执行模块。在arm v7上,只占用800kb,而在arm v8上,1.3mb占用了由paddle-lite提供的动态库中的80个操作符和85个内核。无需额外优化,桨叶式Lite即可实现即时推理。
- 高性能。Paddle lite支持设备优化内核,最大限度地提高arm cpu性能。它还支持使用桨叶模型压缩工具进行int8量化,从而减小模型的大小并提高模型的性能。在华为的npu和fpga上,性能也得到了提升。
- 高兼容性。硬件兼容性:Paddle Lite支持多种硬件——ARM CPU、Mali GPU、Adreno GPU、Huawei NPU和FPGA。在不久的将来,我们还将支持来自Cambricon和Bitmain的人工智能微芯片。模型兼容性:Paddle Lite与PaddlePaddle完全兼容。验证了18个模型(主要是cv模型和ocr模型)和85个算子的准确性和性能。今后,我们还将支持其他机型。框架兼容性:除了在PaddlePaddle上训练的模型之外,那些在Caffe和Tensorflow训练的模型也可以通过X2Palle转换成Paddle Lite。在未来,我们还将支持onnx格式的模型。
12、FeatherCNN
官网链接
FeatherCNN是腾讯人工智能平台部开发的一个高性能轻量级cnn推理库。功能cnn源于我们的《荣耀之王》游戏ai项目,我们的目标是为moba游戏ai建立一个神经模型并在移动设备上运行。FeatherCNN目前的目标是ARM CPU。我们将在不久的将来把它扩展到其它的架构上面。与其他库相比,feathercnn具有以下特点:
- 高性能。FeatherCNN在多种设备上提供最先进的推理计算性能,包括移动电话(iOS/Android)、嵌入式设备(Linux)以及基于ARM的服务器(Linux)。
- 轻松部署。FeatherCNN将所有内容打包在一个代码库中,以摆脱第三方依赖。因此,它有助于在移动平台上部署。
- 轻量级。编译的eatherCNN库是很小,只有数百kbs。
13、DNNL
官网链接
深度神经网络库(dnnl)是一个用于深度学习应用的开源性能库。该库包括针对英特尔体系结构处理器和英特尔处理器图形优化的神经网络的基本构建块。dnnl是为有兴趣在intel cpu和gpu上提高应用程序性能的深度学习应用程序和框架开发人员而设计的。
14、MACE
官网链接-Model_Zoo-官方文档
Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台(支持Android, iOS, Linux, Windows)优化的神经网络计算框架。 主要从以下的角度做了专门的优化:
- 性能-代码经过NEON指令,OpenCL以及Hexagon HVX专门优化,并且采用 Winograd算法来进行卷积操作的加速。 此外,还对启动速度进行了专门的优化。
- 功耗-支持芯片的功耗管理,例如ARM的big.LITTLE调度,以及高通Adreno GPU功耗选项。
- 系统响应-支持自动拆解长时间的OpenCL计算任务,来保证UI渲染任务能够做到较好的抢占调度, 从而保证系统UI的相应和用户体验。
- 内存占用-通过运用内存依赖分析技术,以及内存复用,减少内存的占用。另外,保持尽量少的外部 依赖,保证代码尺寸精简。
- 模型加密与保护-模型保护是重要设计目标之一。支持将模型转换成C++代码,以及关键常量字符混淆,增加逆向的难度。
- 硬件支持范围-支持高通,联发科,以及松果等系列芯片的CPU,GPU与DSP(目前仅支持Hexagon)计算加速。CPU模式支持Android, iOS, Linux等系统。
- 模型格式支持-支持TensorFlow, Caffe和ONNX等模型格式。
15、SNPE
官网链接
SNPE是高通的一个神经网络框架,该平台具有广泛的异构计算功能,这些功能经过精心设计,可以在设备上运行经过训练的神经网络,而无需连接到云。Qualcomm®人工智能(AI)神经处理SDK旨在帮助开发人员在Snapdragon移动平台(无论是CPU,GPU还是DSP)上运行经过Caffe / Caffe2,ONNX或TensorFlow训练的一个或多个神经网络模型。
Qualcomm神经处理SDK旨在帮助开发人员节省时间和精力,以优化带有Snapdragon的设备上经过训练的神经网络的性能。它通过提供用于模型转换和执行的工具以及用于通过功能和性能配置文件来针对核心的API以匹配所需的用户体验来实现此目的。高通神经处理SDK支持卷积神经网络和自定义层。
Qualcomm神经处理SDK完成了在Snapdragon移动平台上运行神经网络所需的许多繁重工作,这可以帮助开发人员提供更多时间和资源来专注于构建新的创新用户体验。
为了使AI开发人员的生活更轻松,Qualcomm神经处理软件开发工具包没有定义另一个网络层库。取而代之的是,它使开发人员可以使用熟悉的框架自由设计和训练网络,并在发布时支持Caffe / Caffe2,ONNX和TensorFlow。开发工作流程如下:
16、model-compression
Github链接
model-compression是一个基于Pytorch的模型压缩工具。该工具具有如下的特点:
- 量化:任意位数(16/8/4/2 bits)、三值/二值
- 剪枝:正常、规整、针对分组卷积结构的剪枝
- 分组卷积结构
- 针对特征(A)二值的BN融合
该项目当前支持的的功能如下所示:
- 普通卷积和分组卷积结构
- 权重W和特征A的训练中量化, W(FP32/16/8/4/2bits, 三/二值) 和 A(FP32/16/8/4/2bits, 二值)任意组合
- 针对三/二值的一些tricks:W二值/三值缩放因子,W/grad(ste、saturate_ste、soft_ste)截断,W三值_gap(防止参数更新抖动),W/A二值时BN_momentum(<0.9),A二值时采用B-A-C-P可比C-B-A-P获得更高acc
- 多种剪枝方式:正常剪枝、规整剪枝(比如model可剪枝为每层剩余filter个数为N(8,16等)的倍数)、针对分组卷积结构的通道剪枝(剪枝后仍保证分组卷积结构)
- batch normalization融合及融合前后model对比测试:普通融合(BN层参数 —> conv的权重w和偏置b)、针对特征(A)二值的融合(BN层参数 —> conv的偏置b)
17、MediaPipe
Github链接
MediaPipe是一个用于构建多模式(如视频、音频、任何时间序列数据)、跨平台(即Android、iOS、web、边缘设备)应用ML管道的框架。使用MediaPipe,感知管道可以构建为模块化组件的图形,例如,包括推理模型(例如,TensorFlow、TFLite)和媒体处理功能。
18、Glow
Github链接
Glow是一个用于硬件加速器的机器学习编译器和执行引擎。它被设计成用作高级机器学习框架的后端。编译器的设计允许最先进的编译器优化和神经网络图的代码生成。它是一个类似于TVM的深度学习编译器。
Glow将传统的神经网络数据流图降为两相强类型中间表示(IR)。高级IR允许优化器执行特定于域的优化。较低级别的基于指令的仅地址IR允许编译器执行与内存相关的优化,例如指令调度、静态内存分配和副本消除。在最低级别,优化器执行特定于机器的代码生成,以利用专门的硬件功能。Glow具有一个降低阶段,通过消除在所有目标上实现所有运算符的需要,编译器可以支持大量输入运算符以及大量硬件目标。降低阶段旨在减少输入空间,并允许新的硬件后端集中于少量线性代数原语
19、TNN
Github链接
TNN是由腾讯优图实验室打造,移动端高性能、轻量级推理框架,同时拥有跨平台、高性能、模型压缩、代码裁剪等众多突出优势。TNN框架在原有Rapidnet、ncnn框架的基础上进一步加强了移动端设备的支持以及性能优化,同时也借鉴了业界主流开源框架高性能和良好拓展性的优点。
1、计算优化
针对不同架构在硬件指令发射、吞吐、延迟、缓存带宽、缓存延迟、寄存器数量等特点,深度优化底层算子,极致利用硬件算力;主流硬件平台(CPU: ARMv7, ARMv8, GPU: Mali, Adreno, Apple) 深度调优;CNN 核心卷积运算通过 Winograd,Tile-GEMM, Direct Conv 等多种算法实现,保证不同参数、计算尺度下高效计算;Op 融合:离线分析网络计算图,多个小 Op(计算量小、功能较简单)融合运算,减少反复内存读取、kernel 启动等开销。
2、低精度优化
支持 INT8, FP16 低精度计算,减少模型大小、内存消耗,同时利用硬件低精度计算指令加速计算;支持 INT8 Winograd 算法,(输入6bit), 在精度满足要求的情况下,进一步降低模型计算复杂度;支持单模型多种精度混合计算,加速计算同时保证模型精度。
3、内存优化
高效”内存池”实现:通过 DAG 网络计算图分析,实现无计算依赖的节点间复用内存,降低 90% 内存资源消耗;跨模型内存复用:支持外部实时指定用于网络内存,实现“多个模型,单份内存”。
20、Tengine Lite
Github链接
Tengine Lite 由 OPEN AI LAB 主导开发,该项目实现了深度学习神经网络模型在嵌入式设备上快速、高效部署。为实现众多 AIoT 应用中跨平台部署,本项目基于原有 Tengine 项目使用 C 语言进行重构,针对嵌入式设备资源有限的特点进行深度框架裁剪。同时采用完全分离的前后端设计,利于 CPU、GPU、NPU 等异构计算单元快速移植和部署。同时兼容 Tengine 框架原有 API 和 模型格式 tmfile,降低评估、迁移成本。
Tengine Lite 核心代码由 4 个模块组成:
- dev: NN Operators 后端模块,当前提供 CPU 代码,后续逐步开源 GPU、NPU 参考代码;
- lib:框架核心部件,包括 NNIR、计算图、硬件资源、模型解析器的调度和执行模块;
- op:NN Operators 前端模块,实现 NN Operators 注册、初始化;
- serializer:模型解析器,实现 tmfile 格式的网络模型参数解析。
21、rknn与rknpu
Github链接
rknn是瑞芯微官方针对PC、RK3390Pro、 RK1806、RK1808、RV1109、RV1126提出的一套模型转换、模型推理与模型评估工具。这套工具支持将大多数框架训练生成的模型转换成瑞芯微官方支持的.rknn格式的int量化模型,具体包括:Caffe、DarkNet、Keras、Mxnet、Pytorch、Tensorflow、TFlite和ONNX格式。整个工具具有完整的文档与简单易用的教程,很适合新手入手。除此之外,该工具量化之后的int8模型的推理速度已经可以与Hisi设备进行媲美,建议大家自己去体验一下。
该工具主要支持以下的功能,具体包括:
- 模型转换:支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、Darknet、Pytorch、MXNet 和Keras 模型转成 RKNN模型,支持RKNN模型导入导出,后续能够在Rockchip NPU平台上加载使用
- 量化功能:支持将浮点模型转成量化模型,目前支持的量化方法有非对称量化 (asymmetric_quantized-u8),动态定点量化(dynamic_fixed_point-8 和 dynamic_fixed_point-16)。
- 模型推理:能够在 PC上模拟Rockchip NPU 运行RKNN模型并获取推理结果;也可以将 RKNN模型分发到指定的NPU设备上进行推理。
- 性能评估:能够在 PC上模拟Rockchip NPU 运行RKNN模型,并评估模型性能(包括总 耗时和每一层的耗时);也可以将RKNN模型分发到指定NPU 设备上运行,以评估模型在实际设备上运行时的性能。
- 内存评估:评估模型运行时对系统和NPU内存的消耗情况。使用该功能时,必须将RKNN 模型分发到NPU 设备中运行,并调用相关接口获取内存使用信息。
- 模型预编译:通过预编译技术生成的 RKNN 模型可以减少在硬件平台上的加载时间。对 于部分模型,还可以减少模型尺寸。但是预编译后的RKNN模型只能在NPU设备上运行。
- 模型分段:该功能用于多模型同时运行的场景下,可以将单个模型分成多段在 NPU 上执 行,借此来调节多个模型占用 NPU 的执行时间,避免因为一个模型占用太多执行时间,而使其他模型得不到及时执行。
- 自定义算子功能:如果模型含有RKNN-Toolkit 不支持的算子(operator),那么在模型转 换阶段就会失败。
- 量化精度分析功能:该功能将给出模型量化前后每一层推理结果的欧氏距离或余弦距离, 以分析量化误差是如何出现的,为提高量化模型的精度提供思路。
- 可视化功能:该功能以图形界面的形式呈现RKNN-Toolkit 的各项功能,简化用户操作步骤。
- 模型优化等级功能:RKNN-Toolkit 在模型转换过程中会对模型进行优化,默认的优化选 项可能会对模型精度产生一些影响。
- 模型加密功能:RKNN-Toolkit 从 1.6.0 版本开始支持模型加密功能。
四、其它加速工具
1、Halide
官网链接
Halide是一种编程语言,旨在使在现代机器上编写高性能图像处理代码变得更容易。Halide当前支持的目标包括:
- CPU架构:x86、ARM、MIPS、Hexagon、PowerPC
- 操作系统:Linux、Windows、Mac OS X、Android、iOS、高通Qurt
- gpu计算api:cuda、opencl、opengl、opengl计算着色器、apple metal、microsoft direct x 12
- Halide并不是一种独立的编程语言,Halide是嵌入在C++中。这意味着你可以编写C++代码,使用Halide的C++ API构建Halide管道的内存表示;然后可以将这个表示编译为一个对象文件,或者通过jit编译它并在同一进程中运行它。
2、TACO
官网链接
TACO是一个C++文库,它在稀疏和稠密张量上计算张量代数表达式。在稀疏张量代数和稀疏线性代数的广泛应用库中,它使用新的编译器技术来获得与手工优化的内核相竞争的性能。您可以使用TACO作为C++库,让您加载张量、从文件读取张量,并计算张量表达式。也可以使用TACO作为代码生成器,生成计算张量表达式的c函数。
3、weld
官网链接
Weld是一种用于提高数据密集型应用程序性能的语言和运行时。它通过使用公共中间表示来表示库中的核心计算,并跨每个框架进行优化,从而跨库和函数进行优化。现代分析应用程序结合来自不同库和框架的多个功能来构建复杂的工作流。尽管单个功能可以单独实现高性能,但由于功能之间的大量数据移动,组合工作流的性能通常比硬件限制低一个数量级。Weld解决这个问题的任务是为整个工作流懒洋洋地建立一个计算,然后仅在需要结果时才对其进行优化和评估。
4、ATLAS
官网链接
ATLAS是一个android客户端容器化框架。我们称之为android动态组件框架。atlas的特性如下所示:
-ATLAS提供了分离、组件和动态支持。Atlas涵盖了项目编码期、APK运行期和后续运行维护中的各种问题
- 在项目期间,ATLAS使工程师能够独立开发、独立调试,因为他们的项目是物理隔离的。
- 在apk运行时,ATLAS具有完整的组件生命周期、类隔离等机制。
- 在运行和维护期间,Atlas提供快速增量更新和快速升级能力。
- ATLAS把工作尽可能的投入到项目期间,保证运行简单稳定,维护方便。
5、TensorComprehensions
官网链接
TensorComprehensions(TC)是一个全功能的C++库,利用Halide、ISL和NVRTC或LLVM自动合成高性能的机器学习内核。TC还提供了与caffe2和pytorch的基本集成。具体的细节请看论文。这个库的设计是高度可移植的,机器学习框架不可知的,只需要一个简单的张量库,具有内存分配、卸载和同步功能。
6、opentuner
官网链接
程序自动微调已在许多领域得到证明,以实现更好或更便携的性能。然而,autotuner本身在项目之间通常不是很容易移植的,因为使用域通知的搜索空间表示对于获得好的结果是至关重要的,并且因为没有一种单一的搜索技术对所有问题都表现得最好。
opentuner是一种新的领域专用多目标程序自动调谐框架。opentuner支持完全可定制的配置表示、允许特定于域的技术的可扩展技术表示,以及用于与优化程序通信的易于使用的接口。opentuner中的一个关键功能是同时使用各种不同的搜索技术,性能良好的技术将获得更大的测试预算,性能较差的技术将被禁用。
参考资料
[1] MMdnn链接
[2] ONNX链接
[3] X2Paddle链接
[4] PocketFlow链接
[5] TensorRT链接
[6] distiller链接
[7] TVMl链接
[8] tflite链接
[9] ncnn链接
[10] MNN链接
[11] openVIO链接
[12] Tengine链接
[13] ARMNN链接
[14] Paddle-Lite链接
[15] FeatherCNN链接
[16] Halide链接
[17] TACO链接
[18] weld链接
[19] atlas链接
[20] FFTW链接
[21] TensorComprehensions链接
[22] opentuner链接
[23] DNNL官网链接
[24] MACE官网链接
[25] SNPE官网链接
[26] model-compression官网链接
[27]mediapipe官网链接
[28] Glow官网链接
[29] TNN官网链接
[30] Tengine Lite链接
[31] rknn链接
注意事项
[1] 如果您对AI、自动驾驶、AR、ChatGPT等技术感兴趣,欢迎关注我的微信公众号“AI产品汇”,有问题可以在公众号中私聊我!
[2] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[3] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[4] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[5] 本文测试的图片可以通过关注微信公众号AI产品汇之后找我索取!
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊,备注“项目”!!!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)