NVIDIA Jetson AGX Xavier安装OpenPCDet完整踩坑记录

最近要使用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点了都,累死了。

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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年5月21日
下一篇 2022年5月21日

相关推荐