NVIDIA Jetson AGX Xavier安装OpenPCDet完整踩坑记录_openpcdect jetson-程序员宅基地

技术标签: 深度学习  linux  pytorch  嵌入式硬件  

最近要使用Xavier部署一些点云网络,需要安装OpenPCDet,于是开始了漫长的配环境之路。

前期准备

由于使用的是公司的板卡,因此需要首先获取sudo权限。一定要有sudo权限才可以。我拿到的时候板卡上面已经刷好了cuda10.2,nvcc -V可以直接看到。这一步还没到的同志们请先去看别的帖子把pack刷上。嵌入式和桌面端GPU不太一样,我之前没有相关的经验,所以环境配的很痛苦,很多相关的知识也没有。嵌入式上很多都没有提供aarch64的预编译包,很多都要自己编译。嵌入式也没有nvidia-smi,使用tegrastats查看利用率。

由于后面涉及到编译,为了加速编译,可以开启性能模式加速编译,还可以调整风扇转速加快散热提高性能。具体怎么使用可以参考其他帖子。

sudo nvpmodel -m 0 # 性能模式,所有核都工作
sudo nvpmodel -m 2 # 关闭性能模式
sudo jetson_clocks # 风扇

这里有需要conda的同学,anaconda没有aarch64的支持,可以用miniforge替代,使用起来跟anaconda没有什么区别,具体安装流程其他帖子很详细。建立环境的时候建议使用python3.6,这样和nvidia提供的torch的whl的python版本是匹配的。后面所有提到的python和pip都默认是python3和pip3。

安装torch和torchvision

然后需要安装torch和torchvision,这一步就费了很久的时间。xavier上的ubuntu系统是nvidia魔改的,跟普通的ubuntu有些区别,因此需要使用nvidia提供的torch安装方法,详见如下网址:PyTorch for Jetson - version 1.11 now available - Jetson & Embedded Systems / Jetson Nano - NVIDIA Developer Forumshttps://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-11-now-available/72048选择好自己所需要的torch版本后下载对应的wheel,然后使用pip3 install xxx.whl安装,安装好之后进入python环境测试(测试代码来源于上面的nvidia网站):

import torch
print(torch.__version__)
print('CUDA available: ' + str(torch.cuda.is_available()))
print('cuDNN version: ' + str(torch.backends.cudnn.version()))
a = torch.cuda.FloatTensor(2).zero_()
print('Tensor a = ' + str(a))
b = torch.randn(2).cuda()
print('Tensor b = ' + str(b))
c = a + b
print('Tensor c = ' + str(c))

注意,torch.cuda.is_available()一定要返回True才可以,如果是False的话,可以尝试使用sudo python,运行上述测试代码。这个困扰了我好久,我还尝试使用了nvidia在那个页面里提供的docker,但是docker似乎最终的openpcdet装的时候有点问题,最好还是不用docker直接装。似乎在xavier上只有sudo的时候才能检测到cuda,否则就会返回False,不知道是不是哪里我设置的有问题。在cuda文件夹里面的deviceQuery也是,只有sudo的时候能query成功,不sudo就query不到。其他还有sudo之后会导致环境变量改变之类的问题可以参考其他相关帖子解决。

安装torch成功后使用上面的网站中的示例安装和torch版本对应的torchvision,需要自己编译,这个网站里步骤写的很清楚,这里就不赘述了,安装成功后进python里import torchvision试一下就可以了。我装的是torch 1.8.0,torchivision0.9.0。

安装cumm和spconv

接下来就是安装OpenPCDet,安装这个需要先安装spconv,安装spconv需要先安装cumm,他们的对应github链接分别是:

open-mmlab/OpenPCDet: OpenPCDet Toolbox for LiDAR-based 3D Object Detection. (github.com)

traveller59/spconv: Spatial Sparse Convolution Library (github.com)

FindDefinition/cumm: CUda Matrix Multiply library. (github.com)

安装他们的时候一定要注意,使用tag对应的代码而不是默认master分支的代码!!否则可能会有bug!

安装之前先pip list看一下有没有cumm和spconv,保证

pip list | grep spconv
pip list | grep cumm

没有输出以后再进行下面的安装,如果有的话先把他们卸载掉。

首先安装cumm,由于我后续可能需要配多个类似的环境,因此选择了自己编译whl的方式,但是不自己编译whl后安装,直接JIT编译应该也可以。

export CUMM_CUDA_VERSION="10.2" # 10.2改成你的cuda版本
export CUMM_DISABLE_JIT="1" # 不用JIT编译cumm,而是编译成whl后再安装
export CUMM_CUDA_ARCH_LIST="7.2" # xavier是7.2,TX2是6.2,orin是8.7,来源于SpConv github的readme
git clone -b v0.2.8 https://github.com/FindDefinition/cumm # v0.2.8换成你想要用的github代码cumm对应tag版本
cd cumm # cd到cumm的代码根目录
python setup.py bdist_wheel # 编译生成cumm的whl在dists文件夹内
pip install dists/xxx.whl # 安装编译好的cumm的whl,名字应该类似cumm_cu102-0.2.8-cp36-cp36m-linux_aarch64.whl

安装好以后一定要进python里import cumm试一下,没问题再进行下一步,否则会不知道哪步出了问题,找起来很困难。如果不用JIT的话,就是进python里import cumm的时候执行编译,具体流程参考github对应的readme,都写的比较清楚。需要注意的就是需要设置CUMM_CUDA_VERSION和CUMM_CUDA_ARCH_LIST。

下一步是安装spconv,同样使用自己编译whl的方式。注意spconv v1.2.1和v2.x的安装方式有差别,这里只给出v2.x的安装方式,v1.2.1未测试。注意spconv和cumm可能有版本之间的依赖关系,去仔细看一看对应github的readme。

安装spconv v2.x的时候要注意把文件夹中pyproject.toml里的cumm依赖删掉,这点github的readme里也有提到。

export CUMM_CUDA_VERSION="10.2" # 10.2改成你的cuda版本
export SPCONV_DISABLE_JIT="1" # 不用JIT编译spconv,而是编译成whl后再安装
export CUMM_CUDA_ARCH_LIST="7.2" # xavier是7.2,TX2是6.2,orin是8.7,来源于SpConv github的readme
git clone -b v2.1.21 https://github.com/traveller59/spconv --recursive # v2.1.21换成你想要用的github代码的spconv对应tag版本,注意需要加recursive,尤其是v1.1和v1.2.1版本
cd spconv # cd到spconv的代码根目录
pip install pccm cumm wheel # 安装一些依赖包
python setup.py bdist_wheel # 编译生成spconv的whl在dists文件夹内,时间较长,可能要20min左右
pip install dists/xxx.whl # 安装编译好的spconv的whl,名字应该类似spconv_cu102-2.1.21-cp36-cp36m-linux_aarch64.whl

安装好以后一定要进python里import spconv试一下,没问题再进行下一步。

如果出现了

raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'nvidia-smi': 'nvidia-smi'

或者 

OSError: libcuhash.so: cannot open shared object file: No such file or directory

或者

Command '['ninja', '-v']' returned non-zero exit status 1

等等错误,多半是cumm或者spconv没装好,要不就是没有sudo导致没找到cuda,一步一步从头开始检查是哪里的问题。不要从后往前检查,要不查不到出错的具体位置。['ninja', '-v']的错误我出现了好久,试了网上的很多方法,比如去改torch的cpp_extention.py之类的,至少在我这都不好用,换torch版本也试了,换了1.9.0,1.8.0,1.6.0都不行,最后发现是cumm安装出了问题,而我当时安装的时候没有检查cumm,只是import spconv发现有错,误以为spconv装炸了,其实是cumm就没装好,耽误了好长时间。

安装llvm和llvmlite

接下来是OpenPCDet的安装,安装这个的requirements里有llvmlite,安装llvmlite又需要先安装llvm,因此先来安装llvm:

去llvm的官网下载aarch64的对应版本的预编译好的文件,可以去官网下,也可以从对应的github仓库的release里面下载:

Download LLVM releases

Releases · llvm/llvm-project (github.com)

我是从github上面下载的10.0.0版本的压缩包clang+llvm-10.0.0-aarch64-linux-gnu.tar.xz,解压以后把bin加到环境变量里即可,具体的可以参考如何安装llvm的帖子。

export PATH=$PATH:/home/clang+llvm-10.0.0-aarch64-linux-gnu/bin/ # your path to llvm
export LLVM_CONFIG=/home/clang+llvm-10.0.0-aarch64-linux-gnu/bin/llvm-config # your path to llvm-config

设置了LLVM_CONFIG的变量是因为一会安装llvmlite不设置可能会报错。安装完成后输入

clang --version

试一下,如果输出了相应的版本信息就没问题了。接下来安装llvmlite,可以直接用pip安装。

pip3 install llvmlite==0.34.0 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com # 0.34.0换成你需要的版本即可

如果装不上的话给pip换一下国内源就可以了,还不行的话可以尝试一下升级pip。注意llvmlite和llvm版本是有对应关系的,对应关系可以在这里看:

llvmlite · PyPI

llvmlite的官方文档链接(左下方可以切换不同版本对应的文档):

llvmlite — llvmlite 0.39.0dev0-23-gaeddf44-dirty documentation

如果还是有问题装不上,可以尝试一下:

sudo apt-get install libedit-dev

安装好llvmlite之后还是进python试着import一下,没问题再继续。

安装OpenPCDet

进行到这里已经快完成了,前面的是最费劲的部分。终于可以开始装OpenPCDet了。

git clone -b v0.5.2 https://github.com/open-mmlab/OpenPCDet.git # v0.5.2换成你想要的openpcdet的版本tag
cd OpenPCDet # cd到openpcdet的代码根目录
pip install -r requirements.txt # 安装依赖,可能要装很多,比较久
sudo python setup.py develop # 注意要sudo

如果pip install -r requirements.txt里的scipy安装不上,可以尝试使用sudo apt-get install python3-scipy来代替pip安装。

注意最后一句python setup.py develop可能需要sudo权限,否则可能会报

arch_list[-1] += '+PTX'
IndexError: list index out of range

的错误。

到这里,OpenPCDet终于安装完成了,赶快去按照OpenPCDet的Quick Demo试一试吧!记得跑的时候也要sudo,要不然会报找不到cuda的error:

RuntimeError: No CUDA GPUs are available

还需要指明环境变量

CUMM_CUDA_ARCH_LIST="7.2" # xavier是7.2,TX2是6.2,orin是8.7,来源于SpConv github的readme

要不然没有指定CUMM_CUDA_ARCH_LIST环境变量,程序就会去尝试执行nvidia-smi来获取相关信息,而Xavier这样的嵌入式GPU又没有nvidia-smi,就会报这个错误:

raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'nvidia-smi': 'nvidia-smi'

所以只要加上,就可以避免这个错误啦。第一次运行可能会编译比较久。 

测试结果

终于完成啦,比如我想试一个SECOND网络,就可以使用如下命令来部署。second_7863.pth是从github相关readme链接里下的预训练模型,my_data.npy是100*4维的随机数假装真实数据。由于我用的是命令行远程连接板卡,所以还需要把open3d和mayavi相关的显示代码在demo.py里注释掉才行。

sudo CUMM_CUDA_ARCH_LIST="7.2" python demo.py --cfg_file cfgs/kitti_models/second.yaml --ckpt ~/OpenPCDet-0.5.2/checkpoint/second_7862.pth --data_path ~/my_data.npy

 运行结果:

总结

有问题一步步从前往后检查看看哪个没装好,是不是环境变量没写,是不是没用sudo导致找不到cuda,是不是git clone的时候没有加recursive导致没有下载完全,有问题可以去看一看nvidia网站的问答,还有几个github repo里的issue,很可能有相似的问题和解决方案。

没了

终于跑通了,连着整这个整了好多天,环境都配吐了。第一次写博客,纪念一下配了这么久的环境。快半夜4点了都,累死了。

抱紧我的蘑菇抱枕去睡觉了。祝大家都能成功配好环境尽快跑通。

后续

重新装了环境,jetpack升级为5.0.1。

此时自带的python版本为3.8,cuda版本为11.4。

为了重新安装OpenPCDet,又踩了一些坑。首先就是jetpack 5.0.1,NVIDIA官网只提供了torch 1.11.0的安装包,然而torch 1.11.0相比1.10.0删除了THC.h,会导致OpenPCDet安装时出错,所以为了适配,只好自己编译1.10.0版本的torch,流程就是按照NVIDIA那个网址里的Build From Source的流程进行即可,编译可能比较久。

(1条消息) Jetson Xavier下编译的pytorch 1.10.0安装包,基于jetpack5.0.1_Popuffu的博客-程序员宅基地

之后又装了torchvision为0.11.1,llvm为12.0.1,llvmlite为0.38.0,亲测可以跑。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/popuff/article/details/124854726

智能推荐

Java面试题之:日志_logback面试问题-程序员宅基地

文章浏览阅读614次。Java面试题之:日志一、Slf4j二、Log4j三、LogBackLogback 优点四、ELK一、Slf4j  slf4j 的全称是 Simple Loging Facade For Java,即它仅仅是一个为 Java 程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如 JDBC 一样,只是一种规则而已。所以单独的 slf4j 是不能工作的,必须搭配其他具体的日志实现方案,比如 apache 的 org.apache.log4j.Logger,jdk 自带的 java.util.lo_logback面试问题

树莓派安装mysql并开启远程访问(开启3306端口)_树莓派 mysql client sdk-程序员宅基地

文章浏览阅读2.5w次,点赞2次,收藏15次。使用dpkg -l|grep mysql:查看是否安装mysql注意:在2016-02-26-raspbian-jessie这个版本中:系统安装了mysql和java 在2015-05-05-raspbian-wheezy这个版本中:系统没有安装mysql、java1、卸载mysql一开始安装的操作系统是raspbian-jessie,故需_树莓派 mysql client sdk

python3.6 学习笔记之安装PIL_python3.6 image.pil-程序员宅基地

文章浏览阅读4.6k次。安装环境:Python 3.6.3PIL(Python Image Library)是python 的一个强大的图像处理库,不过只支持到python2.7pillow是PIL的一个派生分支,如今已发展成比PIL更具活力的图像处理库本次安装使用pip命令查看python的版本安装pillow步骤如下:1、以管理员运行命令提示符,首先_python3.6 image.pil

TP5隐藏public和index.php_tp5.1 nginx 去除public-程序员宅基地

文章浏览阅读3.1k次。个人理解:将public下的index.php文件移动到主目录下和更改index的入口文件可以在URL去掉public将public下的.htaccess文件复制到主目录下并更改配置是:当url地址访问不存在的文件或路径时,调用正则表达式进行替换自动补齐/index.php/。也就是说即使你加上index.php访问也不会出错。一、Apache1、public下的index.php入口文件..._tp5.1 nginx 去除public

bash命令的使用方法_bash怎么用-程序员宅基地

文章浏览阅读1.7w次,点赞11次,收藏58次。小编给大家分享一下bash命令的使用方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Bash(Bash)是Bourne Again Shell的缩写,用于执行描述命令(如Linux中的命令)的shell。在Linux上采用bash作为标准,基本上它描述了对带有“.sh”扩展名的vi编辑器等文本的处理并执行。与编程一样,它有许多函数,如变量,函数和算术处理,所以如果你是一个小程序,你可以用bash编写..._bash怎么用

创意多彩CSS3垂直时间轴特效_基于css实现垂直时间轴特效-程序员宅基地

文章浏览阅读1.5k次。简要教程这是一款创意多彩CSS3垂直时间轴特效。该CSS3垂直时间轴通过CSS伪元素和css transform属性,制作椭圆形和箭头,并配以多彩的颜色,构建出漂亮的垂直时间轴效果。 使用方法在页面中引入bootstrap.min.css文件。<link rel="stylesheet" href="bootstrap.min.css" type="text/css"> HTML结构该..._基于css实现垂直时间轴特效

随便推点

嵌入式Linux系统BSP简介_auto linux bsp-程序员宅基地

文章浏览阅读1k次。 作者:李智敏,华清远见嵌入式学院讲师。嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环_auto linux bsp

源码仓库搭建---linux搭建svn服务器_linux服务器做源码库-程序员宅基地

文章浏览阅读151次。1、检查系统是否已经安装如果安装就卸载检查:svnserve --version卸载:yum remove subversion2、安装yum install subversion3、建立SVN库(文件位置可自由)创建仓库文件夹:mkdir -p/opt/svn/repository用svn管理员身份创建一个仓库:svnadmincreate/opt/svn/repository执行上面的命令后,自动建立repositories库,查看/opt/svn..._linux服务器做源码库

python程序的循环结构_循环14到19的程序用python的-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏14次。遍历循环 for无限循环 while循环控制保留字循环的高级用法遍历循环遍历某个结构形成的运行方式for <循环变量> in <遍历结构> : <语句块>从遍历结构中逐一提取元素,放在循环变量由保留字fo_循环14到19的程序用python的

统计大写辅音字母 (15分)_7-11 统计大写辅音字母 (15分)英文辅音字母是除a、e、i、o、u以外的字母。本题要求编写程序-程序员宅基地

文章浏览阅读1k次。英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。输入格式:输入在一行中给出一个不超过80个字符、并以回车结束的字符串。输出格式:输出在一行中给出字符串中大写辅音字母的个数。输入样例:HELLO World!输出样例:4注意点就是记录的字母一定是要大写的;参考代码#include<stdio.h>#include..._7-11 统计大写辅音字母 (15分)英文辅音字母是除a、e、i、o、u以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

【教程】phpstudy设置伪静态-程序员宅基地

文章浏览阅读1k次。开启phpstudy扩展,勾选“rewrite_module”开启phpstudy伪静态支持,打开httpd-conf,修改所有“AllowOverrideNone”为“AllowOverrideAll”修改并保存后,需重启Apache服务器在网站根目录下添加.htaccess文件,创建时需要使用文本编辑器进行另存为创建,比如Editplus.htaccess文件代码..._php_study 伪静态

从sockaddr结构获取IP和端口_socketaddress获取ip和端口号-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏10次。前言 从sockaddr结构中提取IP, 先将结构sockaddr转为sockaddr_in结构,然后用在利用相关API将其中的IP地址从网络格式转化我们熟悉点分十进制的字符串。一、sockaddr和sockaddr_in结构程序员不应操作sockaddr结构,sockaddr是给操作系统用的程序员应使用sockaddr_in来表示地址,sockaddr_in区分..._socketaddress获取ip和端口号