深度学习部署 基础篇
往期文章RK3588+docker+YOLOv5部署:https://blog.csdn.net/FJN110/article/details/149673049RK3588测试NPU和RKNN函数包装https://blog.csdn.net/FJN110/article/details/149669753RK3588刷机:https://blog.csdn.net/FJN110/article
往期文章
RK3588+docker+YOLOv5部署:https://blog.csdn.net/FJN110/article/details/149673049
RK3588测试NPU和RKNN函数包装https://blog.csdn.net/FJN110/article/details/149669753
RK3588刷机:https://blog.csdn.net/FJN110/article/details/149669404
以及深度学习部署工程师1~31主要学习tensorRT、cmake、docker、C++基础、语义分割、目标检测、关键点识别、RTSP推流、3D模型部署、车牌检测于识别项目、人脸属性分析(年龄、性别、名称、是否佩戴口罩)等知识
好的进入本节课程:
这节课主要是对部署端进行一个基础学习,如果你主要进行模型优化,而不打算进行板端部署,可以跳过本节。等你接触到RKNN的部署再回头学习。
本人在接触这节课前是已经刷过C++的部分知识了,面向有一定的基础的。如果你基础薄弱的话,可能理解会有些困难。本节课部分图片来自网络资源,如有侵犯我会修改。
为什么要学
从部署的角度

我们训练过程一般用python完成,因为python对神经网络的配置比较友好,有大量的神经网络库,训练起来会比较方便,但是我们部署到板端一般用的是C++。你后面去工厂也是这样,大都是用C++完成模型的调用以及后处理这些,这是因为C++占用体积小、运行快,python包含的库太多了,不利于板端的运行。
从工作的角度
相比于模型的优化这种比较看重学历的工作,模型部署工程师会比较偏向于经验,不需要较扎实的数学基础。而且每个落地到产品的项目,基本都需要部署,所以部署工程师还是比较吃香的,先裁员也是先裁优化模型的工程师,啊哈哈。
生产部署必要性: 训练好的深度学习模型需要稳定高效地服务生产环境,这是模型部署的核心价值
完整工作流程:
-
准备数据集(Python)
-
模型训练(Python)
-
原型Demo搭建(Python)
-
生产环境部署(C++)
也就是说上游任务基本都是python完成,但是落地的最后一步需要C++,这个也是小工厂最需要的岗位

硬件适配方案: 在英伟达GPU上实现高性能部署首选C++结合TensorRT的方案,适用于Jetson系列嵌入式GPU、桌面级GPU和服务器级GPU
也就是说上面这3种硬件都会接触到tensorRT高性能部署
本节课主要目标是教会你使用:深度学习C++必须知识点、TensorRT高性能部署

以上是本节课会接触到的内容,但是jetson nano可能需要过段时间才会完成,先用电脑替代。因为jetson nano我没有买,需要和同学借啊哈哈。
C++内容:
本节课为基础扫盲课,只是简单过一下C++的知识。我们最后的课程将会像以下流程一样。

好的废话不多说,让我们一起加油吧!
入门小菜:C++环境配置与第一个程序
准备材料
运行环境推荐是:英伟达GPU+ubuntu
英伟达GPU就是nvidia
ubuntu是linux的一个比较流行的版本,我们用c++一般都会在linux中编写,以后工作也基本都是linux+C++的配置

这里你可以在windows下载个双系统,也可以将本地设置成ubuntu或者你直接在NIVIDIA jetson上运行也可以
其他的方法就是租服务器(下载双系统和虚拟机的方式我这边就不赘述了,之前在环境搭建中有配置过)
我这里采用的gpu+本地ubuntu
基础环境安装
首先安装vscode,vscode的安装在环境搭建中有提到,之后有关安装软件的,都可以去环境搭建中寻找。
安装vscode后点击扩展: 配置
cinese(中文包)、C++(编程识别包)、ssh(远程连接包,这个非必须安装)

以下是ssh远程连接的教程,非必须执行,他能实现的效果就是我们有一台主机,一台ubuntu电脑。然后我们想要在主机上编程,那么就可以用vscode的ssh去远程连接ubuntu,然后在主机上进行编程。
这种模式对于ubuntu是服务器的那种,也就是没有UI界面的会比较好,如果你的ubuntu本身就是带桌面的,那就直接在ubuntu的编程就可以了!
主机上ssh远程ubuntu(可跳过)
然后输入ifconfig

然后你就可以在windows下用vscode远程连接Ubuntu了


然后就可以远程连接了
运行python(测试你的vscode)
学习vscode怎么运行python、debug等知识
测试python
解压我的vscode测试程序

然后在这个目录下输入code .就可以打开vscode
下载附件1.C++环境配置及第一个程序源码
我把我的测试程序放到了demo1中,自己创建了个demo2进行仿照
解压之后有这些文件


你可以跟着里面的程序敲一遍,我这里只介绍知识,我们先创建一个python文件,仿照我1demo.py写

点击运行1demo.py,然后右上角运行python成功
-
课外技巧一:which python3可以查找你的python3在哪个地方,用这招可以查看其他的包

python的debug
然后就是配置python的debug模式
-
先在程序中点一个小红点

-
然后点击菜单中的调试模式

-
选择python后就会卡在了你的小红点处,我在for循环点击了一个小红点,然后就可以分步调试我的程序了

我每点击一次运行键就会卡在我的小红点处,直到我点击的次数达到5.我每点击一次都会更新左边的变量信息,这个在以后工作调试中非常有用。
如果你遇到这个问题,可能是你没有点击小红点(断点)或者是你第一次用debug模式。反正我一开始也遇到了,然后我点击不再显示后,再次点击调试就没有了。

我们给python点个断点就可以分步调试了
运行c++(测试你的vscode)
点击2hello.cpp

编写2hello.cpp然后在命令行中运行g++编译命令
g++ ./src/2hello.cpp -o main
./main
这里的g++是编译器,我们写得c++程序在经过g++编译器之后就生成二进制文件,变成电脑所能理解的程序。./main就是运行我们的可执行文件,最后输出了Hello ward!
C++也运行成功
当然你点击右上角的运行键也是可以运行你的cpp程序的
配置vscode


点击第一个,发现你的目录下会多了一个2hello的可执行文件

如果你前面用命令的方式已经生成过了,那他就不会重复生成了
./src/2hello

如果你是直接在我的源码中进行生成的话,他是不会在工作区的基础目录下生成的,他会在release目录下生成

或者用快捷键也会在release中生成,为什么在我提供程序文件夹中会在其他路径中生成可执行文件,而你的可执行文件则是在程序所在目录下呢
![]()
为什么我的就可以在release目录下生成,而重新创建一个就不能呢?
这就进入我们本节课的第一个重点了
点开我的源码中,可以发现.vscode,里面有个task.json\

而如果是你自己新建的目录现在是没有tasks.json文件的,这个文件是用来控制生成文件的目录,也就是他其实就是前面g++ 2.hello.cpp -o main这条命令,那为什么不再终端中写程序,反而要在tasks.json中敲这条命令呢?
这是因为用task.json写好后只要按下快捷键就能生成可执行文件了,不用重复去打g++ 2.hello.cpp -o main这条命令
那如果你是在自己的电脑中没有tasks.json就跟着我做



这条命令就是在release中生成的指令
首先评估一下launch.json\settings.json\tasks.json这些vscode的配置文件需要必备吗?不需要,这个你了解一下,这几个文件的作用是你在vscode中进行写c++程序的时候,但是你不想要用cmake的时候才需要去学习这3个程序,配置这3个程序就可以无论你的程序多大,多复杂,只要用ctrl+shift+b就能生成可执行文件,并且容易整理你的程序框架。
tasks.json里面的内容需要你自己去敲一遍,以后会经常接触
其实这个tasks.json也没有什么难的,type是你的程序类型,这个敲多了就大概知道有什么类型了,像现在是cppbuild,我记得还有shell
label是你这个快捷编译的名称,你可以随便改,改完后按ctrl+shell+b后,就可以看见你的快捷编译名称了
args就是你是想要快捷操作什么,比如我们前面在终端的指令是g++ 2hello.cpp -o main,那么args里面的-g,-std等都是g++编译里面的参数。比如-o我后面是不是main,你看我的tasks.json也是这样,-o 后面的就是我生成可执行文件的名称

这些$代表什么意思,以及workspaceFolder是什么我就不多赘述了,我文章末尾有介绍这些变量代表的意思。
如果你是新开的窗口,没有task.json可以点击点击配置任务生成task.json
基本文件变量:
${file} - 当前打开文件的完整路径
${fileWorkspaceFolder} - 当前文件所属的工作区文件夹
${relativeFile} - 当前文件相对于工作区的相对路径
${relativeFileDirname} - 当前文件目录相对于工作区的相对路径
${fileBasename} - 当前文件的文件名(包含扩展名)
${fileBasenameNoExtension} - 当前文件名(不含扩展名)
${fileExtname} - 当前文件的扩展名
${fileDirname} - 当前文件所在目录的完整路径
工作区相关变量
${workspaceFolder} - 当前工作区文件夹路径
${workspaceFolderBasename} - 当前工作区文件夹名称
${pathSeparator} - 操作系统路径分隔符(Windows为\,Unix为/)
系统和环境变量
${env:变量名} - 系统环境变量,如 ${env:HOME} 或 ${env:PATH}
${userHome} - 用户主目录路径
编辑器相关变量
${lineNumber} - 光标所在行号
${selectedText} - 当前选中的文本
${execPath} - VSCode可执行文件的路径

然后就可以看到你刚刚在tasks.json设置label名称了

点击运行后你就会在release文中生成2hello了,而不是在./src中了

同样的,你也可执行他,只是生成位置不一样了而已
然后是c++debug
配置launch文件,如果你没有就点击

我的源码程序中launch、tasks程序都是已经修改过的,你们可以在自己的程序仿照我的程序写,看有什么效果和区别
tasks.json是用来运行生成任务的
launch.json是用来debug程序的

将launch文件替换成我下面这个,或者是我源码里面那个
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg", // C++调试
"request": "launch",
"program": "${workspaceFolder}/release/${fileBasenameNoExtension}", // 文件所在的文件夹路径/release/当前文件的文件名,不带后缀
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}", // 文件所在的文件夹路径
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ 生成活动文件" // tasks.json的label
},
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}", // 当前文件
// "program": "demo.py", // 指定文件
"console": "integratedTerminal",
"justMyCode": true // false表示可以进入第三方库(如Pytorch)里进行调试
}
]
}
C/C++: g++ 生成活动文件"是task.json中的,也是我们的debug会先生成可执行文件,然后再进行调试

可以看到debug正常运行
第一小节作业:
前面我们学会了which寻找包,学会了python的debug、c++的debug,以及vscode的2个主要配置文件。现在就来复习一下吧!
新建一个窗口,从0开始配置launch、tasks

敲一下3main.cpp
源码
通过网盘分享的文件:course1.zip
链接: https://pan.baidu.com/s/1PX6viH5UzqpVPGhhqmo49g?pwd=nir8 提取码: nir8
--来自百度网盘超级会员v3的分享
更多推荐

所有评论(0)