1.动态导入
动态导入呢,主要是通过将环境中的包全都用yaml记录下来,然后再去道另外一个有anaconda软件中进行下载安装环境。
首先激活需要导出的环境
conda activate env_name
然后生成相关yaml文件,文件会生成在工作目录里
conda env export > your_env.yaml
在新电脑上根据yaml文件创建环境,再创建时需要对该文件里面的anaconda虚拟环境的路径进行修改,然后再运行以下命令,该命令运行一次之后就会生成环境,环境名称包含在了yaml中,与之前打包时的名称一样。
conda env create -f your_env.yaml
上面的命令只会导出使用conda安装的,而pip安装的还需要下面的命令,因为上面的yaml文件中不会添加pip源,导致一些pip的包就会安装不上,所以需要添加pip源再安装pip的包,这里推荐豆瓣源;
pip config set global.index-url https:// pypi.douban.com/simple/
pip freeze > requirements.txt
导入pip安装的包
pip install -r requirements.txt
2.有的系统上面不能访问外网,所以我们选择静态导入
静态导入则是将环境中所有的包都进行打包,然后放到新的环境解压即可直接使用,不需要再进行下载。
先安装打包工具
conda install -c conda-forge conda-pack # 如果安装不了,就去掉-c conda-forge
将环境打包,默认当前的工作目录下,可以通过在环境名前加路径修改位置
conda pack -n env_name -o your_out_env.tar.gz
env_name为环境名称,your_out_env为压缩包名称
切换到新电脑上,在Anaconda文件里的envs中创建好新环境目录 your_out_env
解压环境,解压时将your_out_env.tar.gz也放在新环境的文件夹里
cd 对应文件的路径
tar -xzvf your_out_env.tar.gz
新电脑激活环境
conda info -e # 查看是否存在了新的环境
conda activate env_name
conda-unpack
二、NVIDIA显卡驱动升级
添加源
sudo add-apt-repository ppa:graphics-drivers
更新库
sudo apt-get update
查看可使用的驱动
ubuntu-drivers devices
下载安装驱动
sudo apt-get install nvidia-driver-<version>
重启
sudo reboot
三、VScode连接远程服务器并调试python代码
1.下载并安装Rmote-SSH插件
2.点击左侧的Remote Explorer
3.点击SSH TARGETS旁边像齿轮一样的设置按钮,然后可以打开config配置文件,对里面的字段进行配置,包括地址和用户名。然后该窗口下就会出现刚刚这个添加的字段的主机,点击连接即可。
4.到这一步时,已经连接上服务器了,连接主机时会指定工作目录,然后就可以看到具体文件了;在这里如果需要调试python代码,首先需要下载python的插件,然后在调试窗口配置launch.json文件,该文件内容如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version" : "0.2.0" ,
"configurations" : [
{
"name" : "Python: Current File" ,
"type" : "python" ,
"python" : "/media/DATA/miniconda3/envs/ort/bin/python" ,
"request" : "launch" ,
"program" : "${file}" ,
"console" : "integratedTerminal" ,
"justMyCode" : true
}
]
}
该文件的所有字段必须安排上,特别是type和python两个字段,python字段时python的解释器路径,到现在就可以调试python了,至于python中的代码提示等则需要安装一些插件。
question:服务器已经连接上,但是无法调试代码,报配置类型‘python’不受支持???
answer:python插件自动更新后存在一些不兼容的问题,解决方法,
1,关闭插件自动更新,文件->首选项->设置->搜索extensions.autoUpdate->选择无或none
2,对python插件降低版本。扩展->搜索python->卸载下拉点击安装另外一个版本,稍后即可选择以前时间的版本,不宜选的过于久远,该插件有介绍,安装好后可以看看介绍
四、vscode远程连接docker容器中cmake编译并调试c++代码
其实这是两个问题,1是vscode连接docker容器,关于这个的连接跟连接Linux一样,不需要什么端口映射呀什么的,安装对应的插件就好了。2是vscode调试代码的配置。
如何让vscode连接上容器?先在配置文档里面写上主机的地址和用户名,然后于物理机建立连接,然后安装docker的插件,ctrl+shift+p或者右键容器attch vscode,就可以进入容器了。进入容器之后其实跟物理机上面是一样的。
到这,目前的条件是已经连接上容器了
1.首先在.vscode文件夹下面新建tasks.json和launch.json
tasks,json的文件内容如下:
{
"version" : "2.0.0" ,
"tasks" : [
{
"label" : "mkdir" ,
"type" : "shell" ,
"command" : "mkdir build -p"
},
{
"label" : "cmake" ,
"type" : "shell" ,
"command" : "cmake -DCMAKE_BUILD_TYPE=debug .." ,
"dependsOn" : [ "mkdir" ],
"options" : {
"cwd" : "${workspaceFolder}/build"
},
},
{
"label" : "make" ,
"type" : "shell" ,
"command" : "make -j8" ,
"options" : {
"cwd" : "${workspaceFolder}/build"
},
}
]
}
tasks.json的文件内容不需要更改,贴上即可。主要包含三个命令,(1)mkdir:在当前目录下创建build文件夹;(2)cmake:cwd中的内容表示切换到build目录,command中的内容表示执行cmake -DCMAKE_BUILD_TYPE=debug .. 在build目录生成makefile文件;(3)make:命令make -j8 进行编译。
所以再调试前需要点击1.“终端”-》“运行任务”-》mkdir,2.“终端”-》“运行任务”-》cmake,3.“终端”-》“运行任务”-》make;最后再点击调试按钮即可开始调试。
launch.json文件的内容如下:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version" : "0.2.0" ,
"configurations" : [
{
"name" : "(gdb) Launch" ,
"type" : "cppdbg" ,
"request" : "launch" ,
"program" : "${workspaceFolder}/build/your name" ,
"args" : [],
"stopAtEntry" : false ,
"cwd" : "${workspaceFolder}" ,
"environment" : [],
"externalConsole" : false ,
"MIMode" : "gdb" ,
"setupCommands" : [
{
"description" : "Enable pretty-printing for gdb" ,
"text" : "-enable-pretty-printing" ,
"ignoreFailures" : true ,
}
]
}
]
}
在launch.json里面需要更改 "program": "${workspaceFolder}/build/your name",里面的your name改成可执行文件名。
这样就可以开始调试了
如果报错:vscode error: Please specify the "MIDebuggerPath" option
说明容器中没有安装dgb,安装即可:apt install gdb
问题来了,上面的设置的输出目录是在当前工作目录的build文件夹下面,但是cmake如果生成的files不在这里就会报错,那么则需要将cmake命令改为cmke cmakelist路径 -B 输出路径
???vscode如何查看opencv像素值?如何查看数组的值?
在官方说明中不支持mat数据类型的查看,但是我们可以以数组的方式查看。在运行和调试界面有一个监视窗口,点击加号添加表达式:*(float(*)[768])featureInput,就可以以float类型查看featureInput数组的768个值。
2.在使用过程中,我们经常碰到有的运行时的动态链接库没有加入到运行或debug的环境中,在终端我们添加动态链接库的路径到LD_LIBRARY_PATH时,可以运行代码,但是在vscode中却无法运行,所以我们需要配置vscode运行时的环境变量。
在launch.json中进行如下配置
"environment": [
{
"name": "LD_LIBRARY_PATH",
"value": "${LD_LIBRARY_PATH}:${workspaceFolder}/libs-x86"
}
],
LIBRARY_PATH 环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。
LD_LIBRARY_PATH 环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。
五、前处理与后处理
1.由于python中用的图像通道到是RGB顺序的均值和方差,但是再c++写前处理时,也用了RGB的均值和方差,但图像却时BGR的通道顺序,所以结果中RB的通道出现了问题,底是RGB还是BGR,这个必须分清楚,不然后会导致后面的通道混乱。
2.对于一些看不懂原理的python代码,直接复刻执行步骤得到相同结果即可。
3.在使用tensorrt的插件时,需要在cmake里写上target_link_libraries nvinfer和 nvinfer_plugin,两个都需要重新进行链接动态库。然后在反序列化之前就写上nvinfer1::initLibNvInferPlugins(glogger, "");当插件加载成功后才会显示类似信息:trt msg:Registered plugin creator - ::BatchTilePlugin_TRT version 1
4.对于数组转vector,使用memcpy是最快的,该函数中复制的数量单位是字节,所以最好是使用len*sizeof(element),如果是二维,且需要注意输入的地址是一级还是二级地址,否则不会报错,但是数据没有复制过来。
六、关于tensorrt的坑
1.网络模型的输入和输出数据维度和类型必须要和pytorch保持一直
2.由于c++的输入是一维的数据,如果pytorch中是输入高维数据,那么则需要在输入模型前将数据先构造成高维,然后再按照一维数据转出来。
3.为什么要编译tensorrt?如果模型中有需要用到的插件,那么tensorrt则需要编译,在编译后出现tensorrt依然无法找到插件,预计是因为tensorrt与cuda版本不匹配,或者系统中存在其他版本的tensorrt,系统每次总是先加载和先使用系统内部的tensorrt。
tensorrt的github截图
在github上就已经有说明该版本的cuda需求,是在10.2到11.8,所以需要下载tensorrt合适的版本。
4.如何编译tensorrt?
NVIDIA Developer
在上面的链接中下载合适的包,主要是需要与cuda对应。
下载后将它解压,新建环境变量,
export TRT_RELEASE=/home/softwares/TensorRT-7.1.3.4
下载特定版本的tensorrt
git clone -b release/8.1 https:// github.com/nvidia/Tenso rRT TensorRT cd TensorRT git submodule update --init --recursive//此处需要多次执行直到不会报错为止
mkdir build
# 进入编译目录
cd build
cmake .. -DTRT_LIB_DIR=$TRT_RELEASE/lib -DTRT_OUT_DIR=`pwd`/out -DCUDA_VERSION=11.2
# 开始多线程编译
# 编译完成后,生成的文件都在~/repos/TensorRT/build/out中
make -j$(nproc)
将生成的库文件复制到$TRT_RELEASE/lib目录下 将生成的可执行文件复制到$TRT_RELEASE/bin目录下 make install
这里的安装将会把编译的动态库覆盖到刚刚我们下载基础包里面。到此就结束了。
7,linux软连接
linux里面存在一些软连接,但是经这些文件传到windows之后就不存在了,而linux与linux之间使用scp命令传递时,软连接会变成对应的文件,以至于后面引用时出错,linux内部之间的软连接拷贝不会出问题。经常存在的问题是,编译时找不到动态库,将动态库的路径加入到LD_LIBRARY_PATH,如果加上了还是找不到该库,说明库有问题,在可能是复制的时候软连接出了问题。
如果linux系统里面文件权限无法修改,使用了chmod依然无效,有可能是因为该文件存在挂载的盘上面,将其放到根盘上就可以。
8.轻松理解NCHW和NHWC维度
先说各自的含义吧,N代表的是batch,H代表二维图像的高度,W代表二维图像宽度,C代表二维图像的通道。
例如NHWC={1,224,224,3}代表的意思呢,就是1张3通道宽高为224的彩色图像。
那么NCHW={1,3,224,224}代表的谁是啥呢,那就是将一个三通道的图像按通道分开然后按照rgb排列单个二维图像。说起来有些抽象,下图则表示的是该维度的图像内存存放位置:
NCHW
图上为NCHW维度的图像,其中N==2,C==2,H=height,W==width,左上角是内存地址,有可能是虚拟地址或者是物理地址。然后这里的stirde主要存在的原因是我们在开辟内存时不一定有合适大小的内存的,所以存在这样的间隙,这种情况存在很多框架中,一般都会隐藏,一旦调用时就会自动加上。
8.cmake的本地源文件包含
在使用cmake编译文件时,包含本地文件一般有两种方式,但两种方式的文件放置的位置也不相同。第一种,使用include_directories包含头文件,使用set命令定义变量名包含各个源文件的路径。另外一种是直接使用aux_source_directory命令添加源文件的文件夹路径,源文件对应的头文件则存放在源文件夹里,但是头文件里包含其他本地的头文件时,则需要写上对文件的路径。