知乎大佬们好,我懂深度学习算法,目前想往模型部署优化这个方向发展,请问学习路线是什么?

请问如何满足如图所示jd,我现在只会Python,每天工作就是写脚本处理数据,训练模型,但是没什么工程能力,我想往模型部署优化,算法落地这个方向发展,…
关注者
1,093
被浏览
539,000

29 个回答

我想往模型部署优化,算法落地这个方向发展,请问该怎么学习与规划?Q:当年作为核心SE在MindSpore团队从0到1构建了MindSpore Lite推理引擎!现在在华为和荣耀手机上的AI能力都是基于Lite推理引擎,调用次数已经超过10亿/天啦!!!

所以就基于之前的工作,总结了《AI推理引擎:核心原理》这个系列的内容:从推理系统整体架构开始,然后到模型小型化、模型压缩,在真正推理之前需要进行模型转换和图优化,最后到kernel和runtime优化。还是很有意思的,也花了很多时间,希望能够帮助到大家啦!!!


在讲推理引擎/推理系统,又或者是推理部署之前呢,我们回顾下训练和推理的区别 ^_^

训练过程通过设定数据处理方式,并设计合适的网络模型结构以及损失函数和优化算法,在此基础上将数据集以小批量(mini-batch)反复进行前向计算并计算损失,然后反向计算梯度利用特定的优化函数来更新模型,来使得损失函数达到最优的结果。训练过程最重要的就是梯度的计算和反向传播。

而推理就是在训练好的模型结构和参数基础上,做一次前向传播得到模型输出的过程。相对于训练而言,推理不涉及梯度和损失优化。推理的最终目标是将训练好的模型部署生产环境中。真正让 AI 能够运用起来。推理引擎可以将深度学习模型部署到云(Cloud)端或者边缘(Edge)端,并服务用户的请求。模型训练过程好比是传统软件工程中的代码开发的过程,而开发完的代码势必要打包,部署给用户使用,那么推理系统就负责应对模型部署的生命周期中遇到的挑战和问题。

当推理系统将完成训练的模型进行部署,并在服务时还需要考虑设计和提供负载均衡,请求调度,加速优化,多副本和生命周期管理等支持。相比深度学习框架等为训练而设计的系统,推理系统不仅关注低延迟,高吞吐,可靠性等设计目标,同时受到资源,服务等级协议(Service-Level Agreement),功耗等约束。本章将围绕深度学习推理系统的设计,实现与优化内容展开,同时还会在最后介绍部署和 MLOps 等内容。

移动端的推理引擎应该挺多的了,google在2017年推出了TF-Lite,腾讯在2017年推出了ncnn,Apple在2017也推出了CoreML,阿里在2018年推出了MNN,华为2019年推出了MindSpsore-Lite。距今已经过去了快5年的时间,技术上也接近收敛。下面让我们一起打开推理引擎的技术吧!

系列内容

  • 《推理系统》推理系统是本分享的重点概述,推理就是在训练好的模型结构和参数基础上,执行前向传播得到模型输出的过程。相对于训练而言,推理不涉及梯度和损失优化。推理的最终目标是将训练好的模型部署生产环境中,真正让 AI 能够运用起来。推理引擎可以将深度学习模型部署到云(Cloud)端或者边缘(Edge)端,并服务用户的请求。模型训练过程好比是传统软件工程中的代码开发的过程,而开发完的代码势必要打包,部署给用户使用,那么推理系统就负责应对模型部署的生命周期中遇到的挑战和问题。
  • 《轻量网络》在端侧推理引擎中,主要是执行轻量的模型结构。主要思想是针对神经网络模型设计更高效的网络计算方式,从而使神经网络模型的参数量减少的同时,不损失网络精度,并进一步提高模型的执行效率。本节主要集中介绍模型小型化中需要注意的参数和指标,接着深入了解CNN经典的轻量化模型和Transformer结构的轻量化模型。
  • 《模型压缩》模型压缩跟轻量化网络模型不同,压缩主要是对轻量化或者非轻量化模型执行剪枝、蒸馏、量化等压缩算法和手段,使得模型更加小、更加轻便、更加利于执行。
  • 《模型转换&优化》在这一节当中分为模型转换和模型优化,在整体架构图中属于离线模型转换模块。一方面,推理引擎需要把不同 AI 框架训练得到的模型进行转换;另外一方面需要对转换后的模型进行图优化等技术。
  • 《Kernel优化》在上层应用或者 AI 网络模型中,看到的是算子;但是在推理引擎实际执行的是具体的 Kernel,而推理引擎中 CNN 占据了主要是得执行时间,因此其 Kernel 优化尤为重要。

希望这个系列能够给大家、朋友们带来一些些帮助,也希望自己能够继续坚持完成所有内容哈!

希望这个系列能够给大家、朋友们带来一些些帮助,也希望自己能够继续坚持完成所有内容哈!

然这里不是打广告,而是希望跟所有关注开源项目的好朋友一起探讨研究,共同促进学习讨论,也欢迎各位专家和朋友多拍拍砖,多提点意见。相关的材料都开源在这里:

github.com/chenzomi12/D

具体大纲

通过《推理引擎:核心原理》系列,我们会给大家介绍下面一些内容:


名称 具体内容
推理系统 推理系统整体介绍,推理引擎架构梳理
轻量网络 轻量化主干网络,MobileNet等SOTA模型介绍
模型压缩 模型压缩4件套,量化、蒸馏、剪枝和二值化
模型转换&优化 AI框架训练后模型进行转换,并对计算图优化
Kernel优化 Kernel层、算子层优化,对算子、内存、调度优化

1. 推理系统

  1. 推理内容介绍( video
  2. 什么是推理系统( video
  3. 推理流程全景( video
  4. 推理系统架构( video
  5. (上) 推理引擎架构( video
  6. (下) 推理引擎架构( video

2. 模型小型化

  1. 推理参数了解( video
  2. (上) CNN模型小型化( video
  3. (下) CNN模型小型化( video
  4. Transformer小型化( video

3. 模型压缩

  1. 压缩四件套介绍( video
  2. 低比特量化原理( video
  3. 感知量化训练 QAT( video
  4. 训练后量化PTQ与部署( video
  5. 模型剪枝( video
  6. (上) 知识蒸馏原理( video
  7. (下) 知识蒸馏算法( video

4. 模型转换

  1. 基本介绍( video
  2. 架构与文件格式( video
  3. 自定义计算图IR( video
  4. 流程细节( video

5. 图优化模块

  1. 计算图优化策略( video
  2. 常量折叠&冗余节点消除( video
  3. 算子融合/替换/前移( video
  4. 数据布局转换&内存优化( video

6. Kernel优化

  1. Kernel优化架构( video
  2. 卷积操作基础原理( video
  3. Im2Col算法( video
  4. Winograd算法( video
  5. QNNPack算法( video
  6. 推理内存布局( video

完结,撒花!

模型部署优化可简单分为三个大方向:

  1. 模型结构优化:设计出更适合目标硬件的模型结构,目前人工设计居多,也有一些NAS
  2. 模型压缩:不改变模型框架的情况下,压缩其理论计算量,其中模型剪枝、模型量化最为常用
  3. 推理优化:编写高性能的算子来加速模型在目标硬件的计算(需要优化到汇编级别)

答主的训练框架是PyTorch,我推荐一个相对简单的路线,把各个部分过一下,然后你可以选择自己感兴趣的点深入

  1. 结构:学习一下 MobileNet(当初面试,就被问了MobileNet的特点和实现细节)、ShuffleNet 、Yolo等面向部署的模型结构,最好读读论文搞懂为什么要这样设计
  2. 剪枝:用NNI、 TinyNeuralNetwork 等框架对模型进行剪枝,并阅读其源码了解常用的剪枝方法
  3. 量化:用PyTorch 的 FX 模块、TinyNeuralNetwork等框架完成模型的量化,如果要深入了解原理建议阅读 Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference 这篇论文(非常经典,里面还有汇编如何实现等底层细节)。
  4. 推理:这块已经很成熟了,基本就调用目标芯片对应的框架,例如TensorRT(NVIDIA GPU),OpenVINO(Intel CPU),MNN、TNN、TFLite(大部分移动端芯片),TFLite Micro、Tengine(特定嵌入式芯片),除此之外很多芯片厂商还提供了自己的解决方案此处不多赘述。
  5. 推理性能优化:目前深度学习推理性能优化,大部分情况下等同于矩阵乘法的加速,因此题主可以找几篇矩阵乘法加速的文章阅读并实践一下。此处不建议直接去读推理框架源码,除非真的很感兴趣并决定深耕,因为这块较为底层,上手难度很大。


-----2023-6-7更新-----

最近大模型比较火,我们组最近做了一点大模型相关的模型压缩工作,可以参考看看:
TinyNN 开源超便捷大模型量化推理工具

这个jd看上去是一个算法中心里面工程组发的,大概率进去之后是做一些工具来帮助算法同学将算法落地到业务上,这个在我看来主要分为两个角度,性能优化的算法角度与工程角度,目标就是用尽可能低的代价取得尽可能高的指标

1、算法角度

从算法侧来做性能优化基本就是这几个套路:设计紧凑模型,模型剪枝,模型量化,知识蒸馏等等,除此之外就是在这几个套路上面再套个automl。要入手这个方向比较简单,顺着mit的hansong组最新的论文看就好,再顺着里面提到的参考文献挑感兴趣的看,不过他们组大部分工作是关于cv的,如果要做特定应用的性能优化直接在Google用关键字搜一下相关论文即可(只看大组和高引论文)。总体来说在算法角度上这个事没有特别深。

2、工程角度

工程角度上感觉这个事会更深一些,相对算法角度而言个人感觉难度也大很多,需要比较扎实的计算机基础。

如果从一个经过充分算法优化的pretrained模型出发,首先这个pretrained模型本质上就是一个经过序列化的DAG图,其中的每个节点就是一个算子(例如卷积),模型进行推理其实就是从输入节点开始遍历这个图,每个节点执行对应的算子进行计算,直到最后的输出节点。只从优化模型推理时间的角度来考虑的话(先不考虑peak memory优化,数据加载优化等),整个过程的时间其实就是花在每个节点上的时间之和,那么可以做的事情有两个: 减小遍历的节点数 减小在单个节点上的时间 。减小遍历的节点数也就是计算图优化,例如可以从输出节点反向遍历依赖的节点,将不需要的节点进行裁剪,还有就是将一些算子进行融合,例如将matmul+add操作合并为gemm,以及conv+bn层融合进单个conv层,计算图优化比较好的实践是Google的grappler。减小单个节点上的时间也就是算子优化,单个节点上花的时间由访存+计算两方面组成,有的算子是计算密集型的(例如conv),有的算子是访存密集型的(例如add),如果某个模型绝大部分都是访存密集型算子,那通过优化计算时间能得到的加速也会很有限(参考Amdahl加速定律)。优化算子除了高效的实现(例如用Winograd计算卷积,矩阵相乘时分块开多线程计算等)之外,还需要考虑部署平台的特性,例如不同平台不同指令集对低精度计算的支持不一样,Intel直到Cascade Lake才开始支持半精度浮点计算(bf16),在gpu上用半精度加速计算的套路在前几年的Intel cpu上就不好使了。

前面光是推理加速就一堆东西可以做,除此之外还有流计算等方向可以做很多事。总而言之工程方面想做的深不太容易,建议多看看计算机系统类的书籍(csapp和计算机系统量化方法等),除此之外再看看现有的解决方案(tensorrt,ncnn,tvm等),以及多实践。

插个眼~

我觉得这个问题问的非常好,期待下大佬们的回答!

说下我的情况吧。

我从毕业开始做图像算法,四年多的时间。我记得刚毕业那会儿(16年),行业内的图像解决方案基本上都是adaboost,SVM然后加上传统图像处理的手段,然后突然到16年年底的时候,新出来的文章很多都是DL方向的了,甚至感觉是爆发式的一样,全行业开始搞AI,然后产品宣传,铺天盖地都是AI。然后我也感觉有点懵逼,随大流呗,然后开始搞caffe。

最开始上手DL,搞caffe,然后搞 RCNN -> Fast RCNN ->Faster RCNN,后来搞darknet,这些框架真的牛逼,只是自己搭网络,增加新层会比较麻烦,后来SSD出来,自带了修改过的caffe,然后后来很长一段时间都在ssd框架下玩,改backbone

再后来,逐渐转到pytorch,keras,框架做的越来越好。api抽象程度越来越高,搭建网络和训练越来越不那么需要脑子了

然后随着每一年毕业生进入职场,大家都会看paper,都会调框架,内卷都快卷出花来了

再回头看看项目落地,特别是边缘计算平台的落地,情况远没有算法这块乐观,模型压缩,计算加速,好像变得越来越高端

后来强迫自己去学了一下tensorRT,ncnn,发现这里面也是有套路可循,并且这种类似的框架的易用性也在变好,调用api也在越来越抽象,这是好事

直接去学习优秀的部署框架里面对基本算子的操作,可以对算法的理解更上一个台阶

我建议你以High Performance Computing(HPC)为关键词搜索一下世界名校的公开课,看一下他们的课程设置,再结合自己的水平逐个攻破。

几十年前的HPC只要搞清楚一段代码是怎么转化成指令以及数据怎么被读进寄存器,最后完成计算的。但CPU越做越复杂,缓存层数也越来越多,再加上并行,GPU加速,等等,真是越来越复杂。

最后,我要推荐一下知乎大神 @李沐 讲他的成名作的那个视频,给做“系统”的人科普“机器学习”,也可以看作给学“机器学习”的人科普“系统”的思想。

不请自来,推荐下自己的项目,一个使用C++完成的深度学习模型部署工具箱。将主流深度学习推理框架抽象成统一接口,包括ONNXRUNTIME、MNN、NCNN、TNN、PaddleLite和OpenVINO。提供多种场景、语言的部署Demo。如果有兴趣可以一起学习~