Skip to main content

moregeek program

模型压缩部署概述-多极客编程

一,模型在线部署


深度学习和计算机视觉方向除了算法训练/研究,还有两个重要的方向: 模型压缩(模型优化、量化)、模型部署(模型转换、后端功能SDK开发)。所谓模型部署,即将算法研究员训练出的模型部署到具体的端边云芯片平台上,并完成特定业务的视频结构化应用开发。


现阶段的平台主要分为云平台(如英伟达 GPU)、手机移动端平台(ARM 系列芯片)和其他嵌入式端侧平台(海思 3519、安霸 CV22、地平线 X3、英伟达 jetson tx2 等芯片)。对于模型部署/移植/优化工程师来说,虽然模型优化、量化等是更有挑战性和技术性的知识,但是对于新手的我们往往是在做解决模型无法在端侧部署的问题,包括但不限于:实现新 OP、修改不兼容的属性、修改不兼容的权重形状、学习不同芯片平台的推理部署框架等。对于模型转换来说,现在行业主流是使用 CaffeONNX 模型作为中间模型。


1.1,深度学习项目开发流程


在高校做深度学习 demo 应用一般是这样一个过程,比如使用 Pytorch/TensorFlow 框架训练出一个模型,然后直接使用 Pytorch 框架做推理(test)完成功能验证,但是在工业界这是不可能的,因为这样模型推理速度很慢,一般我们必须有专门的深度学习推理加速框架去做模型推理(inference)。以 GPU 云平台推理框架 TensorRT 为例,简单描述模型训练推理过程就是:训练好网络模型(权重参数数据类型为 FP32)输入 TensorRT,然后 TensorRT 做解析优化,并进行在线推理和输出结果。两种不同的模型训练推理过程对比如下图所示:


训练和推理.jpg


前面的描述较为简单,实际在工业届,理想的深度学习项目开发流程应该分为三个步骤: 模型离线训练、模型压缩和模型在线部署,后面两个步骤互有交叉,具体详情如下:




  1. 模型离线训练:实时性低,数据离线且更新不频繁,batchsize 较大,消耗大量 GPU 资源。



    • 设计开发模型网络结构;
    • 准备数据集并进行数据预处理、EDA 等操作;
    • 深度学习框架训练模型:数据增强、超参数调整、优化器选择、训练策略调整(多尺度训练)、TTA、模型融合等;
    • 模型测试。



  2. 模型优化压缩:主要涉及模型优化、模型转换、模型量化和模型编译优化,这些过程很多都在高性能计算推理框架中集成了,各个芯片厂商也提供了相应的工具链和推理库来完成模型优化压缩。实际开发中,在不同的平台选择不同的推理加速引擎框架,比如 GPU 平台选择 TensorRT,手机移动端(ARM)选择 NCNN/MNNNPU 芯片平台,如海思3519、地平线X3、安霸CV22等则直接在厂商给出的工具链进行模型的优化(optimizer)和压缩。



    • 模型优化 Optimizer:主要指计算图优化。首先对计算图进行分析并应用一系列与硬件无关的优化策略,从而在逻辑上降低运行时的开销,常见的类似优化策略其包括:算子融合(conv、bn、relu 融合)、算子替换、常数折叠、公共子表达式消除等。
    • 模型转换 ConverterPytorch->CaffePytorch->ONNXONNX模型->NCNN/NPU芯片厂商模型格式(需要踩坑非常多,PytorchONNXNPU 三者之间的算子要注意兼容)。注意 ONNX 一般用作训练框架和推理框架之间转换的中间模型格式。
    • 模型量化 Quantizer:主要指训练后量化(Post-training quantization PTQ);权重、激活使用不同的量化位宽,如速度最快的量化方式 w8a8、速度和精度平衡的量化方式 w8a16
    • 模型编译优化(编译优化+NPU 指令生成+内存优化)Compiler模型编译针对不同的硬件平台有不同优化方法,与前面的和硬件无关的模型层面的优化不同。GPU平台存在 kernel fusion 方法;而 NPU 平台算子是通过特定二进制指令实现,其编译优化方法包括,卷积层的拆分、卷积核权重数据重排、NPU 算子调优等。



  3. 模型部署/SDK输出: 针对视频级应用需要输出功能接口的SDK。实时性要求高,数据线上且更新频繁,batchsize 为 1。主要需要完成多模型的集成、模型输入的预处理、非DL算法模块的开发、 各个模块 pipeline 的串联,以及最后 c 接口(SDK)的输出。



    • 板端框架模型推理: InferenceC/C++。不同的 NPU 芯片/不同的公司有着不同的推理框架,但是模型的推理流程大致是一样的。包括:输入图像数据预处理、加载模型文件并解析、填充输入图像和模型权重数据到相应地址、模型推理、释放模型资源。这里主要需要学习不同的模型部署和推理框架。
    • pipeline 应用开发: 在实际的深度学习项目开发过程中,模型推理只是其中的基础功能,具体的我们还需要实现多模型的集成、模型输入前处理、以及非 DL 算法模块的开发: 包括检测模块、跟踪模块、选帧模块、关联模块和业务算法模块等,并将各模块串联成一个 pipeline,从而完成视频结构化应用的开发。
    • SDK集成: 在完成了具体业务 pipeline 的算法开发后,一般就需要输出 c 接口的 SDK 给到下层的业务侧(前后端)人员调用了。这里主要涉及 c/c++ 接口的转换、pipeline 多线程/多通道等sample的开发、以及大量的单元、性能、精度、稳定性测试。
    • 芯片平台板端推理 Inference,不同的 NPU 芯片有着不同的 SDK 库代码,但是模型运行流程类似。




不同平台的模型的编译优化是不同的,比如 NPU 和一般 GPU 的区别在于后端模型编译上,GPU 是编译生成 kernel library(cuDNN 函数),NPU 是编译生成二进制指令;前端的计算图优化没有本质区别,基本通用。



所以综上所述,深度学习项目开发流程可以大致总结为三个步骤: 模型离线训练模型优化压缩模型部署/SDK输出,后两个步骤互有交叉。前面 2 个步骤在 PC 上完成,最后一个步骤开发的代码是需要在在 AI 芯片系统上运行的。最后以视差模型在海思 3519 平台的部署为例,其模型部署工作流程如下:


视差模型在海思3519平台部署工作流程.png


1.2,模型训练和推理的不同


为了更好进行模型优化和部署的工作,需要总结一下模型推理(Inference)和训练(Training)的不同:



  1. 网络权重值固定,只有前向传播(Forward),无需反向传播,因此:

    • 模型权值和结构固定,可以做计算图优化,比如算子融合等;
    • 输入输出大小固定,可以做 memory 优化,比如 feature 重排和 kernel 重排。


  2. batch_size 会很小(比如 1),存在 latency 的问题。
  3. 可以使用低精度的技术,训练阶段要进行反向传播,每次梯度的更新是很微小的,需要相对较高的精度比如 FP32 来处理数据。但是推理阶段,对精度要求没那么高,现在很多论文都表明使用低精度如 in16 或者 int8 数据类型来做推理,也不会带来很大的精度损失。

二,手机端CPU推理框架的优化


对于 HPC 和软件工程师来说,在手机 CPU 端做模型推理框架的优化,可以从上到下考虑:



  1. 算法层优化:最上面就是算法层,如可以用winograd从数学上减少乘法的数量(仅在大channel尺寸下有效);
  2. 框架优化:推理框架可以实现内存池、多线程等策略;
  3. 硬件层优化:主要包括: 适应不同的硬件架构特性、pipelinecache优化、内存数据重排、NEON 汇编优化等。

三,参考资料



  1. 《NVIDIA TensorRT 以及实战记录》PPT

©著作权归作者所有:来自51CTO博客作者嵌入式视觉的原创作品,请联系作者获取转载授权,否则将追究法律责任

arm 算子性能优化上手指南-多极客编程

作者:林锦豪 | 旷视 MegEngine 架构师 前言 做 arm 侧算子开发时,不能不关心的就是性能。本文主要就是介绍 arm 算子性能优化的常用思路,做为一个入门级的参考。文章以 ARM Cortex a55 上的 GaussianBlur 优化为例展开,并在文末对 arm 性能优化思路做了一个总结。 GaussianBlur 的优化 Q1: 什么是 GaussianBlur? Gaus

github 车牌检测识别项目调研-多极客编程

一,EasyOCR 1.1,仓库介绍 1.2,使用记录 二,HyperLPR 2.1,HyperLPR 概述 2.3,使用记录 2.3,使用建议 三,simple-car-plate-recognition-2 3.1,仓库介绍 3.2,使用记录 3.3,使用建议 四,车牌检测-License-Plate-Detector 4.1,仓库介绍 4.2,建议 五,MMOCR

一文入门 3d 视觉算法基础-多极客编程

背景知识 一,基于3DMM的三维人脸重建技术概述 1.1,3D 人脸重建概述 1.2,初版 3DMM 二,视觉SLAM算法基础概述 2.1,视觉里程计 2.2,后端优化 2.3,回环检测 2.4,建图 三,三维点云语义分割和实例分割综述 3.1,三维数据的表示方法 3.2,基于点云的分类和检测 3.3,基于点云的语义分割 四,参考资料 3D 视觉算法包括很多内容,此文仅当作

深度学习背景下的图像三维重建技术进展综述-多极客编程

原文首发于《中国图象图形学报》作者:杨航,陈瑞,安仕鹏,魏豪,张衡原文地址:​​深度学习背景下的图像三维重建技术进展综述​​三维重建是指从单张二维图像或多张二维图像中重建出物体的三维模型,并对三维模型进行纹理映射的过程。三维重建可获取从任意视角观测并具有色彩纹理的三维模型,是计算机视觉领域的一个重要研究方向。传统的三维重建方法通常需要输入大量图像,并进行相机参数估计、密集点云重建、表面重建和纹理映

机器学习技术系列:一篇图文笔记了解【机器学习基础知识】-多极客编程

导言 最近有小半年由近半数工作和生活时间在机器学习技术(ML)的学习与工程实践中,感觉自己阅读了几本ML方面好书,找到了一些更好的学习网站,所以重新梳理了一下自己理解的的ML基础知识。 相关参考摘录书籍及网站如下 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》(第2版) 《Python深度学习》(第2版) 网站:https://www.showmeai.tech

实录 | megengine 大 kernel 卷积工程优化实践-多极客编程

本篇整理自 3.19 日 “Large Kernel Makes CNN Great Again” 专题 Meetup 中《MegEngine 大 Kernel 卷积工程优化实践》分享。 视频回顾 01:10:55 直达 从卷积到矩阵乘 矩阵乘(GEMM)具有计算密度大和易并行等优良特点,传统领域例如芯片产业和高性能计算领域往往将 GEMM 作为 benchmark 并已经将其优化到接近硬件理

arm 算子性能优化上手指南-多极客编程

作者:林锦豪 | 旷视 MegEngine 架构师 前言 做 arm 侧算子开发时,不能不关心的就是性能。本文主要就是介绍 arm 算子性能优化的常用思路,做为一个入门级的参考。文章以 ARM Cortex a55 上的 GaussianBlur 优化为例展开,并在文末对 arm 性能优化思路做了一个总结。 GaussianBlur 的优化 Q1: 什么是 GaussianBlur? Gaus

github 车牌检测识别项目调研-多极客编程

一,EasyOCR 1.1,仓库介绍 1.2,使用记录 二,HyperLPR 2.1,HyperLPR 概述 2.3,使用记录 2.3,使用建议 三,simple-car-plate-recognition-2 3.1,仓库介绍 3.2,使用记录 3.3,使用建议 四,车牌检测-License-Plate-Detector 4.1,仓库介绍 4.2,建议 五,MMOCR

一文入门 3d 视觉算法基础-多极客编程

背景知识 一,基于3DMM的三维人脸重建技术概述 1.1,3D 人脸重建概述 1.2,初版 3DMM 二,视觉SLAM算法基础概述 2.1,视觉里程计 2.2,后端优化 2.3,回环检测 2.4,建图 三,三维点云语义分割和实例分割综述 3.1,三维数据的表示方法 3.2,基于点云的分类和检测 3.3,基于点云的语义分割 四,参考资料 3D 视觉算法包括很多内容,此文仅当作

实录 | megengine 大 kernel 卷积工程优化实践-多极客编程

本篇整理自 3.19 日 “Large Kernel Makes CNN Great Again” 专题 Meetup 中《MegEngine 大 Kernel 卷积工程优化实践》分享。 视频回顾 01:10:55 直达 从卷积到矩阵乘 矩阵乘(GEMM)具有计算密度大和易并行等优良特点,传统领域例如芯片产业和高性能计算领域往往将 GEMM 作为 benchmark 并已经将其优化到接近硬件理

目标检测模型的评价标准-ap与map-多极客编程

前言 一,精确率、召回率与F1 1.1,准确率 1.2,精确率、召回率 1.3,F1 分数 1.4,PR 曲线 1.4.1,如何理解 P-R 曲线 1.5,ROC 曲线与 AUC 面积 二,AP 与 mAP 2.1,AP 与 mAP 指标理解 2.2,近似计算AP 2.3,插值计算 AP 2.4,mAP 计算方法 三,目标检测度量标准汇总 四,参考资料 前言 为了了解模型的泛

onnx模型分析与使用-多极客编程

本文大部分内容为对 ONNX 官方资料的总结和翻译,部分知识点参考网上质量高的博客。 一,ONNX 概述 深度学习算法大多通过计算数据流图来完成神经网络的深度学习过程。 一些框架(例如CNTK,Caffe2,Theano和TensorFlow)使用静态图形,而其他框架(例如 PyTorch 和 Chainer)使用动态图形。 但是这些框架都提供了接口,使开发人员可以轻松构建计算图和运行时,以优