橦言无忌

一个不想改变世界的程序媛

model selection and deployment

前言

模型选择和实际部署中的要素点~

模型

模型部署的要考虑的要点

要考虑计算量、参数量、访存量、内存占用等,也就是:

  • 精度
  • 大小
  • 参数类型(模型op)
  • 速度

模型选择的要素

  • 任务类型:分类、检测、分割、识别、NLP;
  • 任务特点:数据集分布,数据特点;
  • 考虑部署对象:如移动端的计算量或桌面端的方寸影响;
  • 硬件相关:如选择部分硬件友好的网络结构

模型结构设计

  • 经验选择:如dcn系列、senet中的se模块、yolo中的fcos模块
  • NAS搜索
  • 根据任务设计
  • 其他即插即用模块:DCNv2和v3,RepVGG等重参数化结构

查看他人的模型的要素

  • 模型的输入输出大小、shape、精度类型
  • 模型包含的op算子类型,op名称
  • 模型的大小,权重精度
  • 模型在哪个平台训练的
  • 模型的权重和结构格式

模型评价

常见指标

  • AP、mAP、AR
  • F1 score:精确率和召回率的调和平均值
  • AUC:ROC 曲线下的面积,表示正样本的分数高于负样本的分数的概率

benchmark模型性能

  • 模型latency,充分预热后跑一次模型的耗时
  • 模型吞吐量,1s内可以模型可以跑多少次
  • 模型附带的预处理和后处理耗时,整体耗时
  • 模型输入输出相关耗时,传输耗时

压力测试考虑的其他因素

  • 计算资源是不是这个模型独享,会不会有其他模型一起抢占
  • 该模型1s中会有多少请求同时发过来
  • 该模型请求的输入图像尺寸是否每次一致(如果模型是动态尺寸)

框架

基本框架

  • pytorch
  • tensorflow

任务框架

使用这类轮子的优劣:

  • 自己实现可能自定义性更好,但是比较费时间去造轮子
  • 使用轮子,上手轮子可能也比较花时间,尤其是比较重的轮子,上手周期也挺长
  • 使用现有的轮子,这个轮子不断更新的话,你也可以享受到这个新功能或者实用的功能,不用你自己实现或者移植

ONNX

需要了解ONNX模型机构组成,和protobuf的一些细节;能够根据要求修改ONNX模型;能够转换ONNX模型;同时也需要知道、了解ONNX的一些坑。

修改ONNX模型**
修改模型,如果直接使用官方的helper接口会比较麻烦,建议使用onnx-graphsurgeon或者尝试尝试onnx-modifier。

调试ONNX模型
埋坑。可以看知乎中openmmlab相关文章。

ONNX学习相关建议
多找些ONNX的模型看看,转换转换,看看相关github的issue
也可以加入大老师的群,群里很活跃很多大佬,相关ONNX问题大老师会亲自回答

相关文章
https://github.com/daquexian/onnx-simplifier
https://github.com/ZhangGe6/onnx-modifier
https://github.com/NVIDIA/TensorRT/tree/master/tools/onnx-graphsurgeon
https://github.com/onnx/onnx
模型部署入门教程(五):ONNX 模型的修改与调试
https://github.com/onnx/onnx/blob/main/docs/Operators.md

TVM

  • 如何评测模型的速度
  • 如何benchmark模型各层的错误
  • 解析trtexec中的benchmark
  • 解析TVM中的graph和VM

TensorRT

  • python端口调用
  • C++端口调用
  • 多线程调用
  • 各种模型转换TensorRT(ONNX、Pytorch、TensorFLow)
  • 各种和TensorRT相关的转换库

libtorch

简单好用的对Pytorch模型友好的C++推理库。

  • torch.jit.trace
  • torch.jit.script
  • python导出libtorch模型,C++加载libtorch模型

AITemplate

AITemplate借助Stable Diffusion火了一下,其加速Stable Diffusion的效果比TensorRT要好不少。

部署

平台

  • 手机(苹果的ANE、高通的DSP、以及手机端GPU)
  • 服务端(最出名的英伟达,也有很多国产优秀的GPU加速卡)
  • 电脑(Intel的cpu,我们平时使用的电脑都可以跑)
  • 智能硬件(比如智能学习笔、智能台灯、智能XXX)
  • VR/AR/XR设备(一般都是高通平台,比如Oculus Quest2)
  • 自动驾驶系统(英伟达和高通)
  • 各种开发板(树莓派、rk3399、NVIDIA-Xavier、orin)
  • 各种工业装置设备(各种五花八门的平台)

推理框架

  • CPU端:ONNXruntime、OpenVINO、libtorch、Caffe、NCNN
  • GPU端:TensorRT、OpenPPL、AITemplate
  • 通吃:TVM、OpenPPL
  • 其他平台

本地部署

  • 客户端和服务的设计
  • 资源分配,本地部署往往资源有限,如何分配模型优先级,模型内存显存占用是比较重要的问题
  • 模型加密,本地部署的模型当然是放在本地,想要不被竞品发现模型的结构信息和权重,当然要进行加密,加密的方法很多,对模型文件流进行加密、对权重加密、对解密代码加密等等

需要学习的内容

  • flask 比较简单的模型部署 可以简单先尝试下
  • workflow 可以基于此后端搭建自定义的http服务
  • triton inference server 目前开源最好的TensorRT推理框架,支持在线和离线推理
  • triton服务器客户端-python自己设计
  • triton服务器客户端-C++自己设计
  • 服务器预处理、后处理

嵌入式端

  • 亲民的树莓派,社区资源很丰富,价格个人玩家买得起
  • NVIDIA的jetson系列,nano、NX、Xavier,资源也很丰富,算力高,可玩性好
  • 高通的嵌入式平台,算力其实还可以,但是资源很少,个人玩家很难玩
  • INTEL的计算棒
  • 国产的地平线旭日X3派,支持也不错

模型加密

  • 模型文件直接加密,把模型的二进制文件直接加密,一般都会有加密算法,对模型的前xx字节进行加密,解密的时候对前xx字节进行解密即可,这种加密只在load时候做,会影响模型加载速度,但是不影响运行速度
  • 模型结构不加密,模型权重加密,有的可以采用类似于模型压缩的方法把权重压缩了,推理时以自定义协议读取加载推理
  • 也需要对解密模型的代码进行加密,代码混淆要做,不过这样会影响解密代码也就是load模型过程,会变慢,就看你代码混淆做到什么程度了

聊聊模型转换

常见的不同模型格式:

  • Caffe
  • ONNX
  • Pytorch
  • TFLITE
  • NCNN、MNN

Netron supports ONNX, Tensorflow Lite, Caffe, Keras, Darknet, PaddlePaddle, ncnn, MNN, Core ML, RKNN, MXNet, MidsSpore Lite, TNN, Barracuda, Tengine, CNTK, Tensorflow.js, Caffe2 and UFF.
Netron has experimental sopport for Pytorch, TensorFlow, TorchScript, OpenVINO, Torch, Vitix AI, Kmodel, Arm NN, BigDL, Chainer, Deeplearning4j, MediaPipe, MegEngine, ML.NET and scikit-learn.

模型转换之后要对齐的问题

  • 转换后看一下模型的输入输出类型、维度、名称、数量啥的是否和之前一致
  • 转换后首先跑一张训练时的图(或者一批图),看下新模型的输出和旧模型差多少,一定要保证最终输入到模型的tensor一致(也可以使用random输入或者ones输入测试,不过对于模型权重分布特殊的模型来说,对于这种输入可能评测不是很准确)
  • 批量跑测试集测一下精度是否一致
  • benchmark转换后模型的速度是否符合预期

模型优化

蒸馏剪枝

  • To prune or not to prune exploring the efficacy of pruning for model compression
  • prune ppt

量化

可以直接看PPQ教程,需要的知识点有:

  • 量化基本概念,与硬件的关系
  • PTQ量化和QAT量化,两种量化还有很多方法。PTQ有 EasyQuant(EQ)、;QAT有LSQ(Learned Step Size Quantization)、DSQ(Differentiable Soft Quantization)
  • 可以实施量化的框架,怎么使用

算子优化

  • cuda 入门的正确姿势:how-to-optimize-gemm
  • 深入浅出GPU优化系列:elementwise优化及CUDA工具链介绍
  • [施工中] CUDA GEMM 理论性能分析与 kernel 优化
  • 深入浅出GPU优化系列:reduce优化

有几种可以自动生成op的框架:

  • TVM
  • triton(此triton非彼triton)

可视化工具

  • 画模型图的工具,graphvis
  • NVIDIA的nsight system和nsight compute
  • pytorch的profiler
// 代码折叠