深度学习模型部署技术栈随笔

学了半年,和大家分享一下深度学习模型部署所需要掌握的技术及学习路线,纯干货!!!

一、概述

想要真正的将训练好的模型部署到边缘计算设备上,并能够以可接受的速度和精度来运行需要掌握很多知识。技术栈可以粗分成两个部分,即软件栈和硬件栈,软件栈主要针对算法,包括对深度学习模型的了解、对模型加速技术的了解;硬件栈需要了解自己选择的边缘计算设备的硬件架构,边缘计算设备的ISP、存储、算力等性能。以下主要结合计算视觉方向对我了解到内容做一些分享。

二、软件栈

深度学习推理基础

我们需要掌握三部分:模型前处理、模型推理、后处理三部分内容。
(1)前处理:
了解图像从获取到输入到网络需要哪些基本的操作,常见的减均值,除标准差,通道变换,RGB变换,仿射变换,透视变换等,根据业务场景不同进行组合。
(2)模型推理:
了解网络结构模型的设计方法和各部分算子的具体意义。对于部署模型来讲,可能不需要对模型设计有创造性的能力,但需要掌握模型结构设计的基本知识,比如一个通用的目标检测模型包含骨干网络和检测头,针对不同的应用场景,需要我们灵活地调整骨干网络,搭起一个架子,是用VGG还是Resnet,用不用FPN或者Attention模块,有必要的要加进去,没必要的别瞎往里堆。实现一个高精度的深度学习模型网络结构。计算机视觉方向有很多优秀的开源工作,有监督网络里的目标检测、实例分割、关键点检测,无监督网络里的MOCO,github上有很多star作品,比自己设计要强,能白嫖谁还自己搭是吧?
(3)后处理:
明白一个模型推理结束之后,如何通过后处理得到自己想要的结果,分类加sigmoid,目标检测需要nms,关键点检测需要基于heatmap映射关键点。得到基本的信息之后再拿到自己的业务场景里去做内容。

模型加速技术基础

掌握了模型推理基础内容之后,开始模型加速技术相关工作,我们需要把一个在服务器上得到的大模型变成一个小模型,方便边缘计算设备去支持、去计算。很多人直接拿着模型就去进行加速,先剪枝、蒸馏、量化来一套再说,这样不能说错,但是真正想要兼顾速度和精度,还是要深入分析一个模型的特点,再去进行针对性的加速优化。
(1)分析一个模型
如何分析一个模型或者如何衡量一个模型的大小?模型的大小是否单单是由运算量体现的?好多人加速完模型已测试,卧槽咋变慢了?
模型大小的衡量指标包括计算量、参数量、访存量、计算密度,前三个是绝对值,最后一个是相对值,衡量一个模型大小或者加速一个模型要从这四个方面去考量。因为内存墙的原因,访存比往往成为影响模型推理速度的一个重要因素。
我们不需要自己去计算这些指标,不同的平台或者后端都提供了这些指标的计算API,比如ONNX,Tensorrt,PPL,根据对应的API很快就能分析出一个模型在特定计算设备的指标情况。从模型推理角度出发,各种profiler能够更直观的看到整个模型推理过程中,流水线、计算时间等是怎么分布的。有了这些基本的认识之后,就可以针对性地进行模型加速了
(2)常用的加速技术
加速技术很多,图优化技术,如结构重参数化技术;模型压缩技术如剪枝,蒸馏、量化;此外,不同的软件栈也针对性的做了很多其他方面的优化工作,kernel优化、动态内存,多线程优化技术等等,底层的技术都是类似的,只不过实现细节略有差异,性能也是千差万别。
1)剪枝:
剪去不需要的权重,相当于减少了模型的运算量,在模型的运算量是模型瓶颈的时候益处很大,各种剪枝方法也很多,设计损失函数的核心就是某个channel的权重重不重要,比如LI norm,L2 norm, Slim pruner, FPGM pruner,这些都是结构化剪枝方法,非结构化剪枝需要特定的ASIC,否则稀疏化和没做没啥区别。但当性能瓶颈不是计算量,而是访存时,剪枝技术的优点就不那么明显了。
2)量化
量化后放存量必然减少了,采用向量化的方法,计算设备单次发射的指令能够处理更多的数据,真香!
主流的量化方法还是对称量化,饱不饱合的得看数据到底啥样。
3)结构重参数化
减少访存的利器,把网络结构里能合并的层合并在一起,实现访存优化,常见的就是CBR融合,RepVGG融合,关键看实操。
(3)工具链
大厂为我们提供了成熟的白嫖工具,自动完成所需要的优化工作:Tensorrt,NCNN轻松实现量化、结构重参,还附带其他内存优化、多线程工具,但如果你选择的边缘计算芯片不支持常用的工具链,优化工作就要自己做了,这才是真正检测功底的工作。

三、硬件栈

(1)通用计算芯片和专用计算芯片
首先肯定得了解GPU,CPU,GPU代表英伟达,CPU代表intel,了解主流的GPU,CPU芯片一代代迭代,和计算相关的架构变化到底涉及了哪些内容。
以GPU为例,Nvidia的进化史大致是Kepler,Maxwell,Pascal,Volta,Turing, Ampere,每一代芯片都进行了那些更新,算力,显存怎么做的提升,都支持了那些操作等等。
(2)专用芯片硬件架构
CPU、GPU架构主要在任务通用性上下了功夫,相较于专门针对计算机视觉的专用芯片性能很大差距。专用的ASIC种类很多了,架构各有特色,但都是为了一个目的:高性能+低功耗。以Google为代表的TPU问世后掀起了专用ASIC的研发热潮,这十年国产芯片也在疯狂输出,FPGA、KPU,NPU等各种PU层出不穷,性能鱼龙混杂,我们还是要擦亮眼睛去识别的。
涉及到模型部署还是要优选搭配软件栈的芯片,自己去实测芯片性能是最可靠的方法,别看彩页说的如何牛p,还得看模型、看实测!
了解视觉信号从输入芯片到输出芯片全流程参与的硬件,这些硬件是怎么参与整个模型的前处理、推理和后处理的,比如昇腾的芯片采用专用硬件实现img2col,Nvidia采用软件实现img2col,各自的特点是怎么样的;再比如Nvidia专用的硬件解码,对于模型推理有怎样的增益等等

四、语言篇

Python是一门高级抽象语言,便利了深度学习模型搭建、训练,但用来部署无法和C++一较高下了,简单说说针对算法部署需要掌握的C++知识有哪些?答:就那些
(1)面向对象编程的基础:类
(2)继承:构造函数、析构函数、指针、引用、重写,模板函数
(3)STL:常用的序列容器及特性,共享内存
(4)C++多线程:掌握 threading, mutex,condition_variable,future,RAII怎么用
(5)C++动态内存管理:我也不会,google去吧
(6)编译基础,动静态库,makefile
其实在学习这门语言的过程中,我们就会逐渐明白为什么C++是一门关注性能的语言,比如编译-运行模式,内存管理,STL设计等等,这些都是关注性能的方面。

五、不同的工具链及特性

待续>>>

你可能感兴趣的:(算法部署,深度学习,人工智能,机器学习,边缘计算)