知乎大佬们好,我懂深度学习算法,目前想往模型部署优化这个方向发展,请问学习路线是什么?
请问如何满足如图所示jd,我现在只会Python,每天工作就是写脚本处理数据,训练模型,但是没什么工程能力,我想往模型部署优化,算法落地这个方向发展,请问该怎么学习与规划。请学习路线是什么? 模型部署优化这个方向其实比较宽泛。从模型完成训练,到最终将模型部署到实际硬件上,整个流程中会涉及到很多不同层面的工作,每一个环节对技术点的要求也不尽相同。
文:王佩琪部署的流程大致可以分为以下几个环节:
一、模型转换
从训练框架得到模型后,根据需求转换到相应的模型格式。模型格式的选择通常是根据公司业务端 SDK 的需求,通常为 caffe 模型或 onnx 模型,以方便模型在不同的框架之间适配。
该环节的工作需要对相应的训练框架以及 caffe/onnx 等模型格式有所了解。
常用的 Pytorch 和 TensorFlow 等框架都有十分成熟的社区和对应的博客或教程;caffe 和 onnx 模型格式也有很多可参考和学习的公开文档。
即使没找到有可参考的文章时,好在二者都是开源的,依然可以通过对源码和样例代码的阅读来寻找答案。
二、模型优化
此处的模型优化是指与后端无关的通用优化,比如常量折叠、算数优化、依赖优化、函数优化、算子融合以及模型信息简化等等。
部分训练框架会在训练模型导出时就包含部分上述优化过程,同时如果模型格式进行了转换操作,不同IR表示之间的差异可能会引入一些冗余或可优化的计算,因此在模型转换后通常也会进行一部分的模型优化操作。
该环节的工作需要对计算图的执行流程、各个 op 的计算定义、程序运行性能模型有一定了解,才能知道如果进行模型优化,如何保证优化后的模型具有更好的性能。
了解得越深入,越可以挖掘到更多的模型潜在性能。
三、模型压缩
广义上来讲,模型压缩也属于模型优化的一部分。模型压缩本身也包括很多种方法,比如剪枝、蒸馏、量化等等。模型压缩的根本目的是希望获得一个较小的模型,减少存储需求的同时降低计算量,从而达到加速的目的。
该环节的工作需要对压缩算法本身、模型涉及到的算法任务及模型结构设计、硬件平台计算流程三个方面都有一定的了解。
当因模型压缩操作导致模型精度下降时,对模型算法的了解,和该模型在硬件上的计算细节有足够的了解,才能分析出精度下降的原因,并给出针对性的解决方案。
对于模型压缩更重要的往往是工程经验,因为在不同的硬件后端上部署相同的模型时,由于硬件计算的差异性,对精度的影响往往也不尽相同,这方面只有通过积累工程经验来不断提升。
OpenPPL 也在逐步开源自己的模型压缩工具链,并对上述提到的模型算法、压缩算法和硬件平台适配等方面的知识进行介绍。
四、模型部署
模型部署是整个过程中最复杂的环节。从工程上讲,主要的核心任务是模型打包、模型加密,并进行SDK封装。
在一个实际的产品中,往往会用到多个模型。
模型打包是指将模型涉及到的前后处理,以及多个模型整合到一起,并加入一些其他描述性文件。模型打包的格式和模型加密的方法与具体的 SDK 相关。在该环节中主要涉及到的技能与 SDK 开发更为紧密。
从功能上讲,对部署最后的性能影响最大的肯定是 SDK 中包含的后端库,即实际运行模型的推理库。开发一个高性能推理库所需要的技能点就要更为广泛,并且专业。
并行计算的编程思想在不同的平台上是通用的,但不同的硬件架构的有着各自的特点,推理库的开发思路也不尽相同,这也就要求对开发后端的架构体系有着一定的了解。
具体到不同架构的编程学习,建议参考当前各大厂开源的推理库来进一步学习。
尝试一下:《从 0 到 1,使用 OpenPPL 实现一个 AI 推理应用》
加入我们:《OpenPPL 招人啦!》
欢迎 star
openppl-public/ppl.nn 交流 QQ 群:627853444,入群密令 OpenPPL 一般你部署的每一个硬件平台都有自己家的推理框架,需要自己做的任务基本也就是调用api来对一些模型进行落地,这其实不难,只要稍微熟悉一些c/c++即可。如果想进阶,学习一些优化的知识,比如卷积优化算法winograd,sgemm,或者更深入的汇编优化等等可以关注知乎移动端专栏或者GiantPandaCV公众号,都会带来一些比较良心的部署优化相关的文章。 深度学习进阶:算法与应用5 手写数字识别 懂深度学习算法就不会问这个问题了... 你应该是会调用ops自己组网... 但是对框架本身不懂。从要求来看,主要侧重于优化方面,而且是边缘优化,看起来是对性能要求较高的手机端app部署... 这个建议看看各路来源框架吧,
边缘部署
菊厂的mindsphore,小米的mace,腾讯的TNN,apache tvm, 亚马逊的SageMaker Neo
然后需要会QNN加速(一般写一行转化就好)
会并行计算懂CUDA我觉得比较硬盒了,除非是自己组需要自己写模型,不用框架,就是前向后向运算都要自己撸... 否则一般不会接触到CUDA的...
然后服务器部署的话,服务器不同的点是,要保证低延迟而且稳定两个特性,同时要兼顾高并发以及可扩展性。这些集其一身的话用的比较多的就是Flask+Gunicorn (PyThon)。对于Java来说建议学AWS出的DJL:
Deep Java Library总之学习路线不再是深度学习本身,要懂一些服务部署的知识,同时还有各种优化的方法。还有常见框架动态图转静态图的算法之类的。 插个眼~
我觉得这个问题问的非常好,期待下大佬们的回答!
说下我的情况吧。
我从毕业开始做图像算法,四年多的时间。我记得刚毕业那会儿(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也在越来越抽象,这是好事
直接去学习优秀的部署框架里面对基本算子的操作,可以对算法的理解更上一个台阶 题主贴的图里面提到了汇编和cuda,很有可能是这个团队里面的研究岗的自由度比较高,经常整出框架里面不支持的算子。
他们比较看中的应该是算子优化的能力吧,算子优化方面可以学习一下NCNN的代码,arm和x86的算子优化都比较完整。
https://github.com/Tencent/ncnn 这个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等),以及多实践。 hi大佬我有实现过简单的RNN落地手机App,Java调用tflite模型
当然用的是tf了,据说torch也有相应的功能,似乎和caffe差不多,
当然,阿里腾讯也有框架,MNN和NCNN,或许我们会再次相遇。 -菜鸡,也算走这个方向,安防行业,说说自己的看法。
-首先这个工作是开发。对算法的熟悉是为了帮助工程实现,对算法的要求和研究员的关键区别是不太需要算法上的创新。
1. 网络压缩,没深入过不太了解,个人感觉还是有点偏算法,实际干起来就变成 循环{训练}。或者搞计算图转换,算子融合;
2. 封SDK,这个看平台,有时候可能需要手撸部分计算代码,包括指令集啊CUDA啊啥的,因为稀奇古怪的需求很多,尤其是前后处理;
3. 打杂,嘿嘿嘿。。。
-这个应该还不是专业搞框架的,看看框架实现有助于实际工程落地,但框架和sdk还是有区别的。自下向上结构应该是这个样子:框架(tf等)-SDK-顶层应用(监控软件、手机美颜) ,作为中间商了解上下游才能赚差价
-核心技能也就是学习路线:
1. 压缩没深入过不太了解;
2. C/C++和python,数据结构,计算机原理等等开发的内功;
3. 经验经验经验经验经验!做这个平时的主要问题都是:小明,来需求了;小明,检测sdk挂了;小明,新上的识别太慢了;甚至是小明,测试机显卡是不是烧掉了。看看git上有些开源的完整的应用,啥检测美颜变脸什么的,是那种最后输出exe和apk(有上下游更好理解),不是一个脚本python run.py(并不是说所有python的工程都是这样,很多集群部署是python);
4. 所有软件开发工程师的知识都应该有,一点点学,毕竟算是改行了。
总结就是,C/C++开发工程师做AI方面的软件开发,开发别的要会啥,这里也一样。
页:
[1]