从零编写深度学习推理框架-第一课-前言-创新互联
视频链接: https://space.bilibili.com/1822828582
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、虚拟空间、营销软件、网站建设、登封网站维护、网站推广。Github 链接: https://github.com/zjhellofss/KuiperInfer 欢迎star和PR
请配合视频课程一起看此教程
深度学习推理框架
用于对已训练完成的神经网络进行预测.
也就是说,深度学习推理框架
能够将深度训练框架例如Pytorch
,Tensorflow
中定义的算法移植到中心侧和端侧, 并高效执行. 与训练框架不同的是,深度学习推理框架
没有梯度反向传播功能, 因为算法模型文件中的权重系数已经被固化, 推理框架只需要读取, 加载并完成对输入数据的预测即可.
训练完成的模型被放置在两个文件中, 一个是模型定义文件, 一个是权重文件.
模型定义文件和计算图 模型定义文件模型由多个节点的定义和节点之间的数据流图
组成,节点定义模型中各节点的参数, 例如在卷积算子中的参数, 包括卷积核的大小, 步长以及输入输出特征图的尺寸大小等.
数据流图
阐述了节点之间数据流动的前后顺序和依赖关系. 所有节点在根据模型文件中的定义初始化完毕之后, 根据数据流图对他们进行一一串联, 形成一个有向无环图(DAG), 或称为计算图.
但是这个计算图是缺少权重的,只是一个外壳, 它只有网络的节点和节点之间的联通关系. 模型的权重则保存在权重文件中, 需要在完成计算图的初始化之后加载到模型中.
在DAG构建完成之后, 读取权重文件中各节点的weight
和bias
数据并依次填充到对应的算子当中. 去填充计算图(外壳)中的权重信息.
输入指的是由图片或者视频帧构建而成的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 并构建自己的计算图 | 未完成 | |
第二季课程待叙 | … | … |
- 完成第一季的课程, 共八节
- 根据第一季的反馈迭代更新第二季的课程, 第二季结束能完成
ResNet 18
的推理 - 后期可能会出一个关于模型量化的课程, 在我们自制推理框架的基础上完成对模型的
PTQ
量化
- 不会讲
C++
基础, 默认大家都多少懂C++
或者C
语言 - 不会长篇大论地讲, 不会手把手地带着敲( 毕竟不是编程培训班)
- 倾向于分模块讲解并以自己动手练习的方式来学习
开发环境
- 开发语言:C++ 17
- 数学库:Armadillo OpenBlas
- 加速库:OpenMP, 实现算子时候用
- 单元测试:Google Test
- 性能测试:Google Benchmark
主项目地址:https://github.com/zjhellofss/KuiperInfer
Tips: 不要求大家全部掌握, 我会在以后的课程中分模块的解读, 欢迎大家点赞 star.
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.cpp
中TEST(test_first, linear)
的代码来完成上述操作,
如果编写正确则通过单元测试,并输出Result Passed!
.
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享文章:从零编写深度学习推理框架-第一课-前言-创新互联
网页URL:http://scyanting.com/article/csehph.html