为了完成导师交代的任务,卑微的打工人开始了没有停息的斗争。尽管没有人阻碍你划水摸鱼,但是问题一天不解决,自由就一天也不会来到。
我 向 往 自 由 !!!!!!!!!!
通往自由的道路就是在Xavier上加速yolo的推理。至于你用什么办法,剪枝还是量化,用哪个网络,tiny不tiny,没人管,也没人在乎。
涉世未深的我哪里知道通往自由的道路哪条最短,于是只能一样样试。
Xavier是arm架构,这引发了许多原本没有的问题。我们依次来解决。文章主要给第一次操作的朋友避免走弯路用。
器材准备:一台全新的AGX Xavier,一台装了虚拟机的笔记本,网线一根。
网上有许多刷机的教程,其流程大抵相似:从nvidia官网上把sdkmanager的包下载下来,然后dpkg -i安装一下,然后命令行sdkmanager,接下来手动操作。这其中你网速快慢,nvidia要不要注册个账号,都只是影响你的速度而已,并无大的坑。已有的内容我不再重复。我只说那些文章中没有说的。
(1)网络
我第一次刷机是在家里,慢的令人窒息的网速令刷机的速度慢如蜗牛,实际上我们知道当一个数无限接近于0那就可以理解为是0。于是我当然想到了给宽带升个级,一顿央求父亲大人母亲大人之后宽带终于升级到了千兆,于是我愉快地打开了sdknamger,期待地看着进度条。
它还是不动!!!而且step 1到step 2有时候都能卡死。。。
挂!它进度条还是不动啊不动!!!
中间过程略去不说...反正后来回了学校,用区区百兆的教育网,分分钟进度条就刷刷地涨。。。
结论: 在学校用教育网刷机。可能学校跟Nvidia有什么合作吧,谁知道呢。
(2)虚拟机内存
我当时在VMware中创建了60G的虚拟机内存,心想这怎么着也够了。没想到装完ubuntu之后就只剩二十多个G了,而刷机的镜像要求约莫32g内存,所以最好预留40g以上。
可能性一:你还没有创建虚拟机:创建一个100g的虚拟机并安装ubuntu系统。
可能性二:你已经创建了虚拟机,但内存不够用:
千万不需要通过传统linux的方法去扩展硬盘!不是说不可以,而是说没必要。传统的方法是先创建物理卷,然后变成卷组,然后逻辑卷,然后逻辑卷组BALABALA...中间出了点差错的话你就忙吧。ubuntu用户就用ubuntu的方法啊喂。
方案:1.虚拟机关机,删除快照,点击编辑虚拟机设置,点击扩展磁盘容量。
2. sudo apt-get install gparted
gparted
确保新空间未上锁。如果之前通过命令行操作使得新空间成为了别的状态(物理卷等),则需按原路返回,删除分区,直至gparted显示未加锁。
3.使用较为不错的智商手动操作合并磁盘空间。
(3)按部就班完成刷机。其中step 3 我使用的是手动模式,没有想象的那么烦,按照网上已有的教程就可以了。刷完机后,你的xavier中就应该已经有TensorRT了+cuda+cudnn了。
教程:https://zhuanlan.zhihu.com/p/98807348
https://blog.csdn.net/DraemSky/article/details/103823201
https://blog.csdn.net/haoqimao_hard/article/details/83447696
(4)Xavier的网络连接 有几种办法:
1.用没有密码的网线连接
2.JetPack4.2后支持无线网卡 我刷机的时候JetPack已经是4.5了
3.手动配置网线连接的教育网(比较麻烦而且我按照步骤最后把账号密码输进去了看起来完全正确但是依然没有网
4.教育网有密码配置起来烦的要死,又不想自己掏钱另外买无线网卡,使用一根网线完成笔记本和Xavier的网络共享。使用笔记本连接无线网络,进入主机的网络连接,设置WLAN属性。
里面这样设置:
此时用网线连接电脑和Xavier,顺利的话Xavier已经连上网了。不过一旦重启就会失去连接。
解决办法:将/etc/NetworkManager 里面的NetworkManager.conf 中的managed属性修改为true,点击保存。
(5)换源 注意Xavier是arm架构,不可换amd的源。https://blog.csdn.net/X_kh_2001/article/details/89198134
进入root模式
cp /etc/apt/sources.list /etc/apt/sources.list.bak
gedit /etc/apt/sources.list
删掉或者全部注释掉,换成:
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main universe restricted
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main universe restricted
点击保存
apt-get update
为了使用TensorRT完成之后的识别功能,也为了推理的更快,我们当然必须要安装opencv。
如果是愣头青不要命地直接就开干,那肯定是凉凉。
我们当然要先看教程了!!
教程1:https://www.cnblogs.com/gloria-zhang/p/13819297.html
这篇教程总体来说是不错的。但是犯了致命错误!
1.原文中~如果直接复制出去会变中文下的~ 2.原教程里OPENCV_EXTRA_MODULES_PATH 前竟然没写-D!! 如此严重的问题,网络教程不可尽信啊 3.root模式下的~会移动到root文件夹下 因此建议直接写/home/用户名
问题1:安装libjasper依赖失败。
修改源,ubuntu18.04是bionic,对应的清华源里面没有libjasper,网上主流的方案是直接加一条语句,但我实测行不通。还有人直接去debian官网下,但我点他那个链接进去发现官网都没这个软件包了。
方案:将清华源中(假设是清华源)带security的两行中的bionic降级到xenial(原地改写就行)
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
进入root模式
apt-get update
apt-get install libjasper1 libjasper.dev
完事儿再把源换回来。
接着按照这个教程来将可以使你在c++和python2中顺利使用opencv,yolo的MakeFile文件中的OPENCV=1也可以设置然后运行了。但是你会发现进入python3环境后import cv2提示你没有这个module,这很奇怪啊,刚刚一顿编译不是挺好的吗?实际上你如果看cmake命令后的显示(由于是在Xavier上进行的操作,因此就没有图了),其中有一块地方显示了各语言的支持度,(拿英文写的,好歹是给人看的语言因此慢慢看就可以了)python3是不支持编译的,而python2却可以。因此需要删除CMakeCache.txt,重新写cmake语句进行编译。
问题2.部分文件下载失败。解决方案:https://blog.csdn.net/weixin_43727678/article/details/108775097
问题3: opencv2/xfeatures2d/cuda.cpp文件缺失
https://www.tqwba.com/x_d/jishu/195647.html
找到stitching的cmakelist.txt里加入:
INCLUDE_DIRECTORIES("/home/open/opencv/opencv-3.4/opencv_contrib/modules/xfeatures2d/include")路径对应自己改
教程2:https://blog.csdn.net/limuyuanrs/article/details/107988682
直接拉到教程最下方,我们发现里面有几处地方需要注意:
-D BUILD_opencv_python3=YES
-D PYTHON3_EXECUTABLE=/usr/bin/python3
-D PYTHON_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython3.5m.so
-D PYTHON3_NUMPY_INCLUDE_DIRS=/home/rpdzkj/.local/lib/python3.5/site-packages/
由于该作者使用的平台与Xavier不同,因此路径上有差异。应仔细查看路径后重写2-4条。我的Xavier上敲的命令如下(如果同为Xavier,刷机过程也一样,大概率也是一样的):
在~/opencv3.4.3/release目录下敲:
cmake -D WITH_CUDA=ON -D CUDA_ARCH_BIN="7.2" -D CUDA_ARCH_PTX="" -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_opencv_python3=YES -D PYTHON3_EXECUTABLE=/usr/bin/python3 -D PYTHON_LIBRARIES=/usr/lib/aarch64-linux-gnu/libpython3.6m.so -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.6/dist-packages/ -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/path/opencv-3.4.3/opencv_contrib-3.4.3/modules ..
2021/7/15 注:OPENCV_EXTRA_MODULES_PATH后面的路径也要按照自己的路径来,不要照抄。这条命令作用是引入了一部分extra mudules,即便敲错,也能顺利import cv2,但在使用extra mudules 如 xfeatures2d时会报找不到,因此隐蔽性极高。打开CMakeCache.txt,搜索extra,看看OPENCV_EXTRA_MODULES_PATH,检查到底写进去没有。
上面的路径都是绝对路径,opencv3.4.3文件夹在哪就对应着来敲。
赶紧python3 import cv2试试,于是试试就逝世,报错:非法指令(核心已转储)。
开始自闭。(开始吐血
(然后开始试图使用pip3 install opencv-python来解决,一顿操作后安装成功后还是报非法指令,然后发现这会不会是网上他们tensorflow用户cpu版本不支持avx指令集的问题一样的呢?然后发现xavier好像还真不支持avx,然后开始搜索opencv和avx指令,发现人家opencv是不会因为你不支持avx就整个失败的,然后就又自闭了...
答案是:这是因为opencv底层使用了OPENBLAS基础线性代数子程序库,而这个库默认是非ARM架构的,那么你Xavier肯定就不行了。实际上你会发现import numpy也不行的,道理一样。
那么为什么python2可以import cv2呢?
这个问题我也没办法回答你。。。我猜想是python3 和python2对opencv的使用方式是不同的。
方案:gedit ~/.bashrc
底部加入如下语句:export OPENBLAS_CORETYPE=ARMV8 点击保存
source ~/.bashrc
问题解决。
不过还有个小tip就是如果你gedit是在root模式下的话最好先退出root模式再进行操作,否则重启后可能会出错,原因不明。
教程:https://github.com/jkjung-avt/tensorrt_demos
把这个东西git clone下来,放到Xavier里面去,教程按照其Readme中的来。
当然,其中总会产生问题。在./install_pycuda.sh这步前,实际上应先sudo apt-get install protobuf-compiler,当然你不需要预先知道这个,如果按照步骤来的话,只需要报什么错就把什么装上即可,而且这部分出的错网上都容易找到解决的办法。需要注意的有一点:
onnx的版本不要随意改动,1.5.0以上版本的onnx后面编译是不会成功的,要问为什么,那就是官方不支持。。
注意点:
1.把你的cfg文件和weights文件复制到tensorrt_demos/yolo文件夹下,然后把名字改了,改成yolov3-416.cfg,yolov3-416.weights这样的格式。
2.原命令python3 yolo_to_onnx.py -m yolov4-416 后需加 -c 类别数
这部分操作实际上看似非常复杂,出错的几率却比之前的几步要小的多。|
结束后可以进行测试,先测一张图看看。
python3 trt_yolo.py --image 某路径/dog.jpg -m yolov4-416 -c 类别数
要测多张图的话还需要修改原来的代码,不过这部分相比起坑爹的工程问题都是小儿科了。
后续还可以改成int8精度加速,不过我现在还没试,不过料想应该不至于比前面的几步更难了。
补充:目前已完成int8加速。在Xavier上加速很可观:
原速度:yolov3完整版,输入尺寸416*416:15-18fps ->30fps(单精度浮点数) ->50fps(int8)
由于你按照了正的顺序来没有走弯路,实际上你到这并没有花很多的时间。其中容易绕弯路的点简直数不胜数,还容易搞错问题的方向,随便往错误的方向上试试就是几个小时。我没有看到一篇教程能覆盖其中多个弯路的,因此感到还是需要记录一下,给后来者省下一些时间。
总需要人写下这样的记录,我既在树下受人阴凉之惠,自当为后来者省却来时功夫。