跳转至

自制深度学习推理框架-第一课-什么是推理框架

什么是推理框架

视频链接: https://space.bilibili.com/1822828582

Github 链接: https://github.com/zjhellofss/KuiperInfer 欢迎star和PR

请配合视频课程一起看此教程

深度学习推理框架用于对已训练完成的神经网络进行预测.

也就是说,深度学习推理框架能够将深度训练框架例如Pytorch,Tensorflow中定义的算法移植到中心侧和端侧, 并高效执行. 与训练框架不同的是, 深度学习推理框架没有梯度反向传播功能, 因为算法模型文件中的权重系数已经被固化, 推理框架只需要读取, 加载并完成对输入数据的预测即可.

项目最终的效果图

在这里插入图片描述在这里插入图片描述

模型加载阶段

训练完成的模型被放置在两个文件中, 一个是模型定义文件, 一个是权重文件.

模型定义文件和计算图

模型定义文件

模型由多个节点的定义和节点之间的数据流图组成,节点定义模型中各节点的参数, 例如在卷积算子中的参数, 包括卷积核的大小, 步长以及输入输出特征图的尺寸大小等.

数据流图阐述了节点之间数据流动的前后顺序和依赖关系. 所有节点在根据模型文件中的定义初始化完毕之后, 根据数据流图对他们进行一一串联, 形成一个有向无环图(DAG), 或称为计算图.

但是这个计算图是缺少权重的,只是一个外壳, 它只有网络的节点和节点之间的联通关系. 模型的权重则保存在权重文件中, 需要在完成计算图的初始化之后加载到模型中. 在这里插入图片描述

权重文件

在DAG构建完成之后, 读取权重文件中各节点的weightbias数据并依次填充到对应的算子当中. 去填充计算图(外壳)中的权重信息.

输入输出

输入指的是由图片或者视频帧构建而成的RGB数据,KuiperInfer中数据的输入符合NCHW格式,分别表示批次, 通道和高宽. 输出指的是模型对于特定的输入作出的判断,在下图中对于云层图像的输出,模型给出的预测为cloud类别,至此推理框架完成了一次预测过程.

整体流程

在这里插入图片描述 在这里插入图片描述

课程大纲

课程节数 主要内容 进度 课程链接
第一次课 整体框架解读和开发环境配置 完成 https://www.bilibili.com/video/BV1HV4y1A7H8/
第二次课 张量Tensor类的解析和输入数据的内存排布 完成 https://www.bilibili.com/video/BV1Ed4y1v7Gb/
第三次课 CSV文件中初始化张量Tensor一个实例 完成 https://www.bilibili.com/video/BV1Pg411J7V5/
第四次课 手写第一个算子Relu并完成算子注册工厂类 完成 https://www.bilibili.com/video/BV1bG4y1J7sQ/
第五次课 Im2col的原理和卷积算子的实现 未完成
第六次课 照猫画虎, 完成MaxPooling算子 完成 https://www.bilibili.com/video/BV1m3411S7yy
第七次课 图结构(PNNX)讲解和计算图初步 完成 https://www.bilibili.com/video/BV1VW4y1V7vp
第八次课 读取PNNX并构建自己的计算图 未完成
第二季课程待叙 ... ...

近期和远期的打算

  1. 完成第一季的课程, 共八节
  2. 根据第一季的反馈迭代更新第二季的课程, 第二季结束能完成ResNet 18的推理
  3. 后期可能会出一个关于模型量化的课程, 在我们自制推理框架的基础上完成对模型的PTQ量化

本项目的教学方式

  1. 不会讲C++基础, 默认大家都多少懂C++或者C语言
  2. 不会长篇大论地讲, 不会手把手地带着敲( 毕竟不是编程培训班)
  3. 倾向于分模块讲解并以自己动手练习的方式来学习

第一次课程的内容

开发环境 - 开发语言:C++ 17 - 数学库:Armadillo OpenBlas - 加速库:OpenMP, 实现算子时候用 - 单元测试:Google Test - 性能测试:Google Benchmark

主项目代码走读

主项目地址:https://github.com/zjhellofss/KuiperInfer Tips: 不要求大家全部掌握, 我会在以后的课程中分模块的解读, 欢迎大家点赞 star.

安装OpenBlas并编译armadillo

Ubuntu 22.04上armadillo安装. armadillo本质上提供了一个方便的接口, 背后调用Openblas, https://arma.sourceforge.net/docs.html. 安装之前, 使用Linux对应发行版的包管理器安装必要的组件

apt update
apt install cmake libopenblas-dev liblapack-dev libarpack2-dev libsuperlu-dev
mkdir build
# 在https://arma.sourceforge.net/docs.html下载armadillo数学库的代码
# cd armadillo文件夹
mkdir build
cd build
cmake ..
make -j8
make install
# 默认情况下armadillo头文件安装在:/usr/include/
# 默认情况下armadillo库文件安装在:/usr/lib/x86_64-linux-gnu

编译安装其他依赖库

https://github.com/google/glog

glog安装过程

mkdir build
cd build
cmake ..
make -j8
make install 
# 默认情况下安装完成后库文件在:/usr/local/lib/
# 默认情况下安装完成后头文件:/usr/local/include/
# 如果发生库找不到的问题, 请可以自行试试增加库寻找路径, 如果还解决不了请添加交流群. 
vim ~/.bashrc 
# 末尾加 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
source ~/.bashrc

Google Test编译安装过程

https://github.com/google/googletest

gtest安装过程与glog类似

Tips: 以上两个库在安装完成后, 头文件位于/usr/local/include/ , 库文件位于/usr/local/lib/.

第一次课程的代码

https://github.com/zjhellofss/KuiperCourse.git

git clone https://github.com/zjhellofss/KuiperCourse.git 拉取本次课程的代码
git checkout first 切换分支,第一节课程在first 这个branch当中
mkdir build
cd build 
cmake ..
make -j8
国内git镜像地址:https://gitee.com/fssssss/KuiperCourse.git

完成第一节课的作业

需要注意的问题: armadillo是列主序的. Y=AxX+bias是一个矩阵相乘问题.

armadillo关于矩阵乘和加的文档如下: 请按照文档, 自行编写test/test_first.cppTEST(test_first, linear)的代码来完成上述操作,

如果编写正确则通过单元测试,并输出Result Passed!.


本文总阅读量