老潘的AI部署以及工业落地学习之路

Hello我是老潘,好久不见各位。

最近在复盘今年上半年做的一些事情,不管是训练模型部署模型搭建服务,还是写一些组件代码,零零散散是有一些产出。

虽然有了一点点成果,但仍觉着缺点什么。作为深度学习算法工程师,训练模型和部署模型是最基本的要求,每天都在重复着这个工作,但偶尔静下心来想一想,还是有很多事情需要做的:

  • 模型的结构,因为上线业务需要,更趋向于稳定有经验的,未探索一些新的结构
  • 模型的加速仍然不够,还没有压榨完GPU的全部潜力

深感还有很多很多需要学习的地方啊。

WX20210206-201747@2x

WX20210206-201733@2x

提问的都是明白人,随着人工智能逐渐普及,使用神经网络处理各种任务的需求越来越多,如何在生产环境中快速、稳定、高效地运行模型,成为很多公司不得不考虑的问题。不论是通过提升模型速度降低latency提高用户的使用感受,还是加速模型降低服务器预算,都是很有用的,公司也需要这样的人才。

在经历了算法的神仙打架、诸神黄昏、灰飞烟灭等等这些知乎热搜后。AI部署工业落地这块似乎还没有那么卷…相比AI算法来说,AI部署的入坑机会更多些。

Pytorch

Pytorch训练出来的模型经过或者可以导出为格式,随后可以通过libtorch中的API加载然后运行,因为libtorch是纯C++实现的,因此libtorch可以集成在各种生产环境中,也就实现了部署(不过libtorch有一个不能忽视但影响不是很大的缺点,限于篇幅暂时不详说)。

libtorch是从1.0版本开始正式支持的,如今是1.9版本。从1.0版本我就开始用了,1.9版本也在用,总的来说,绝大部分API和之前变化基本不大,ABI稳定性保持的不错!

libtorch适合Pytorch模型快速C++部署的场景,libtorch相比于pytorch的python端其实快不了多少(大部分时候会提速,小部分情况会减速)。在老潘的使用场景中,一般都是结合TensorRT来部署,TensorRT负责简单卷积层等操作部分,libtorch复杂后处理等细小复杂op部分。

基本的入门教程:

  • 利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测
  • Pytorch的C++端(libtorch)在Windows中的使用

官方资料以及API:

  • USING THE PYTORCH C++ FRONTEND
  • PYTORCH C++ API

libtorch的官方资料比较匮乏,建议多搜搜github或者Pytorch官方issue,要善于寻找。

一些libtorch使用规范附:

  • Load tensor from file in C++

TensorRT

TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C++推理框架。我们利用Pytorch、TF或者其他框架训练好的模型,可以转化为TensorRT的格式,然后利用TensorRT推理引擎去运行我们这个模型,从而提升这个模型在英伟达GPU上运行的速度。速度提升的比例是比较可观的。

在GPU服务器上部署的话,TensorRT是首选!

OpenVINO toolkit

在我这边CPU端场景不是很多,毕竟相比于服务器来说,CPU场景下,很多用户的硬件型号各异,不是很好兼容。另外神经网络CPU端使用场景在我这边不是很多,所以搞得不是很多。

哦对了,OpenVino也可以搭配英特尔的计算棒,亲测速度飞快。

详细介绍可以看这里:

  • OpenVino初探(实际体验)

NCNN/MNN/TNN/TVM

有移动端部署需求的,即模型需要运行在手机或者嵌入式设备上的需求可以考虑这些框架。这里只列举了一部分,还有很多其他优秀的框架没有列出来…是不是不好选/p>

  • NCNN
  • MNN
  • TNN
  • TVM
  • Tengine

个人认为性价比比较高的是NCNN,易用性比较高,很容易上手,用了会让你感觉没有那么卷。而且相对于其他框架来说,NCNN的设计比较直观明了,与Caffe和OpenCV有很多相似之处,使用起来也很简单。可以比较快速地编译链接和集成到我们的项目中。

repvgg结构

老潘也在项目中使用了repvgg,在某些任务的时候,相对于ResNet来说,repvgg可以在相同精度上有更高的速度,还是有一定效果的。

剪枝

剪枝很早就想尝试了,奈何一直没有时间啊啊啊。

我理解的剪枝,就是在大模型的基础上,对模型通道或者模型结构进行有目的地修剪,剪掉对模型推理贡献不是很重要的地方。经过剪枝,大模型可以剪成小模型的样子,但是精度几乎不变或者下降很少,最起码要高于小模型直接训练的精度。

积攒了一些比较优秀的开源剪枝代码,还咩有时间细看:

  • yolov3-channel-and-layer-pruning
  • YOLOv3-model-pruning
  • centernet_prune
  • ResRep

蒸馏

我理解的蒸馏就是大网络教小网络,之后小网络会有接近大网络的精度,同时也有小网络的速度。

再具体点,两个网络分别可以称之为老师网络和学生网络,老师网络通常比较大(ResNet50),学生网络通常比较小(ResNet18)。训练好的老师网络利用去教学生网络,可使小网络达到接近大网络的精度。

印象中蒸馏的作用不仅于此,还可以做一些更实用的东西,之前比较火的centerX,将蒸馏用出了花,感兴趣的可以试试。

稀疏化

稀疏化就是随机将Tensor的部分元素置为0,类似于我们常见的dropout,附带正则化作用的同时也减少了模型的容量,从而加快了模型的推理速度。

稀疏化操作其实很简单,Pytorch官方已经有支持,我们只需要写几行代码就可以:

上述代码来自于Pruning/Sparsity Tutorial 。这样,通过Pytorch官方的模块就可以对模型的卷积层tensor随机置0。置0后可以简单测试一下模型的精度…精度当然是降了哈哈!所以需要finetune来将精度还原,这种操作其实和量化、剪枝是一样的,目的是在去除冗余结构后重新恢复模型的精度。

那还原精度后呢样模型就加速了吗然不是,稀疏化操作并不是什么平台都支持,如果硬件平台不支持,就算模型稀疏了模型的推理速度也并不会变快。因为即使我们将模型中的元素置为0,但是计算的时候依然还会参与计算,和之前的并无区别。我们需要有支持稀疏计算的平台才可以。

英伟达部分显卡是支持稀疏化推理的,英伟达的显卡在运行bert的时候,稀疏化后的网络相比之前的dense网络要快50%。我们的显卡支持么要是架构的显卡都是支持的(例如30XX显卡)。

  • Exploiting NVIDIA Ampere Structured Sparsity with cuSPARSELt
  • How Sparsity Adds Umph to AI Inference

quantize_op

带有和算子的ONNX可以通过加载,然后就可以进行量化推理:

Added two new layers to the API: IQuantizeLayer and IDequantizeLayer which can be used to explicitly specify the precision of operations and data buffers. ONNX’s QuantizeLinear and DequantizeLinear operators are mapped to these new layers which enables the support for networks trained using Quantization-Aware Training (QAT) methodology. For more information, refer to the Explicit-Quantization, IQuantizeLayer, and IDequantizeLayer sections in the TensorRT Developer Guide and Q/DQ Fusion in the Best Practices For TensorRT Performance guide.

而TensorRT8版本以下的不支持直接载入,需要手动去赋值MAX阈值。

相关例子:

  • ResNet-50 v1.5 for TensorFlow
  • BERT Inference Using TensorRT
  • Questions about int8 inference procedure

常见部署流程

假设我们的模型是使用Pytorch训练的,部署的平台是英伟达的GPU服务器。

训练好的模型通过以下几种方式转换:

  • Pytorch->ONNX->trt onnx2trt
  • Pytorch->trt torch2trt
  • Pytorch->torchscipt->trt trtorch

其中onnx2trt最成熟,torch2trt比较灵活,而trtorch不是很好用。三种转化方式各有利弊,基本可以覆盖90%常见的主流模型。

遇到不支持的操作,首先考虑是否可以通过其他pytorch算子代替。如果不行,可以考虑TensorRT插件、或者模型拆分为TensorRT+libtorch的结构互相弥补。trtorch最新的commit支持了部分op运行在TensorRT部分op运行在libtorch,但还不是很完善,感兴趣的小伙伴可以关注一下。

常见的服务部署搭配:

  • triton server + TensorRT/libtorch
  • flask + Pytorch
  • Tensorflow Server

后记

来北京工作快一年了,做了比较久的AI相关的训练部署工作,一直处于快速学习快速输出的状态,没有好好总结一下这段时间的工作内容和复盘自己的不足。所以趁着休息时间,也回顾一下自己之前所做的东西,总结一些内容和一些经验罢。同时也是抛砖引玉,看看大家对于部署有没有更好的想法。

AI部署的内容还是有很多,这里仅仅是展示其中的冰山一角,对于更多相关的内容,可以关注老潘一起交流哈。

看了上述介绍,如果不确定自己的方向的,可以先打打基础,先看看C++/python等,基础工具熟悉了,之后学习起来会更快。

先这样,我是老潘,我们下期见~

撩我吧

  • 如果你与我志同道合于此,老潘很愿意与你交流;
  • 如果你喜欢老潘的内容,欢迎关注和支持,点赞最好了~

老潘也整理了一些自己的私藏,希望能帮助到大家,在此神秘传送门。

文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树人工智能深度学习210534 人正在系统学习中

老潘的AI部署以及工业落地学习之路 微信公众号 老潘的AI部署以及工业落地学习之路 老潘的博客,程序员眸中的fantasy life

来源:老潘的博客

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月7日
下一篇 2021年7月7日

相关推荐