赞
踩
今天在电脑上成功编译安装了Spconv1.x,所以记录一下。
电脑配置:RTX 2080ti
CUDA10.0
cudnn7.6.5
pytorch1.1.0
python3.7
gcc5.4.0
Ubuntu20.0
pyyaml5.1
cmake3.14.4
Spconv1.x的版本不如2.x的好用,现在的最新Spconv版本可以直接使用命令行进行安装,比之前版本方便很多。看网上说的Spconv1.x版本对CUDA、cudnn、gcc、g++等版本要求比较高,如果不兼容的话很难编译上。我前几天一直编译安装不上,可能是因为cudnn版本太低,之前的配置是CUDA10.0+cudnn7.4.2。今天换成了cudnn7.6.5试了一下,结果就成功了。gcc版本不能太低,至少是gcc5或以上才行。对g++版本好像也有要求,不能太低。在作者提供的requirement.txt中并没有指明需要哪个版本的pyyaml,所以如果pyyaml太高的话运行train.py就会报错,所以我选择安装pyyaml的版本为5.1。
HAIS(Hierarchical Aggregation for 3D Instance Segmentation)是ICCV2021年的文章提出的网络,用于三维点云室内场景的语义分割和实例分割。其中比较新颖的一点是,作者提出了intra-instance prediction network,可以用于预测欠分割的点云集群,将其中的点分为前景点和背景点从而分割出物体实例。
在S3DIS上的表现: link
在复现HAIS网络时遇到的问题:
RuntimeError: CUDNN_STATUS_EXECUTION_FAILED
在网上搜了,说出现该问题的原因可能是cuda的版本与pytorch的版本不对应,导致cuda不能加速模型的训练同时执行失败。
我的解决方法是在train.py和test.py代码的顶部增加:
import torch
torch.backends.cudnn.enabled = False
该方法只是个临时解决方法,而且该方法的实质是禁用了cudnn加速,让代码在运行时使用pytorch的基本GPU操作而不是依赖于cudnn,这可能是代码运行速度降低。
昨天分别在两台电脑RTX 2080TI 和 RTX 3090TI配置了HAIS的实验环境,现在将自己的一点儿心得总结如下:
①在3090ti上配置HAIS环境:由于CUDA版本较高,所配置torch的时候不要照requirements.txt中直接pip install,要上pytorch官网搜适用于你自己的CUDA版本的安装命令行。比如我的是CUDA11.1,所以我使用的命令行如下
pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html
因为torch版本高所以就不能直接使用HAIS原代码包中的spconv来编译安装spconv1.0,需要按照作者提供的README中的步骤,重新git下来spconv1.2的包,然后进行编译。整个安装过程还算是顺畅,注意有一步是hais_ops的C++ 和CUDA扩展编译安装
cd HAIS/lib/hais_ops
export CPLUS_INCLUDE_PATH={conda_env_path}/hais/include:$CPLUS_INCLUDE_PATH
python setup.py build_ext develop
这里的{conda_env_path}
指的是你的conda环境所安装的位置,比如我的是/home/hmy/anaconda3/envs/
②在2080ti上配置HAIS环境:如我上述所说,在spconv1.0的安装时,需要注意pytorch的版本,还需要注意pyyaml的版本,昨天配置的时候结果还是出现了spconv的编译报错
‘remove_const_t’ is not a member of ‘std’
,后来查了一下发现可能是cmake的版本问题。requirements.txt中要求cmake不能低于3.13.2,所以我将cmake从3.20.0的版本更换为了3.14.4,然后进行编译就一次通过了。
③更改HAIS数据接口,使用自己的数据集训练(training on custom data):由于数据集的制作比较针对scannet V2这种室内场景的.ply格式,正好有个海外研究者Meida Chen的团队公开了STPLS3d数据集然后采用了HAIS作为baseline对STPLS3d进行了测试,该数据集是.txt格式的在GitHub上可以找到,他们也公开了baseline的代码,所以我就照着他们更改后的HAIS数据集制作的代码来生成我自己的数据集制作代码。
制作好了数据集以后,就要更改HAIS的hais.py、train.py、test.py,以及/HAIS/lib/hais_ops/src /hierarchical_aggregation/hierarchical_aggregation.cpp
和hierarchical_aggregation.cu
中的class_radius_mean和class_numpoint_mean_dict。
注意:因为hierarchical_aggregation.cpp
和hierarchical_aggregation.cu
是HAIS模型的C++ CUDA编译扩展,所以编译好了之后,再改代码内容,不会对这个模型有任何的影响。所以如果更改了这两个扩展代码后,需要先卸载以前的扩展,然后再删除/HAIS/lib
文件夹下,之前生成的那些.so文件和build文件夹、HAIS_OPS.egg-info文件夹,最后重新编译这个扩展。使用下面的命令行卸载原扩展。
cd HAIS/lib/hais_ops
python setup.py develop --uninstall
为什么会接二连三的在不同的电脑配置HAIS环境呢,因为第一次在2080ti上配置环境但是发现在跑ScannetV2的时候,电脑会卡住(推测GPU内存不够)所以更换了3090ti,果然效果很好,速度也提升了不少。后来在GitHub上发现STPLS3D数据集的公布团队更改了HAIS来对STPLS3D进行测试,所以后续工作都是基于Meida Chen等人更改后的HAIS模型上的。再后来,模仿着STPLS3D-HAIS进行了自己的数据集制作(custom data),并成功在HAIS上进行了训练,我的custom data 是Xiang B.等人(2023)发布的FOR-Instance数据集,该数据集是一个开源的国际综合无人机激光点云(ULS),GitHub地址:PanopticSegForLargeScalePointCloud。
但是由于custom data的点云数量确实太多,导致训练一半就容易出现报错:
CUDA Kernel failed: illegal argument
刚开始不知道这是为什么,只知道如果因为这个报错训练中断了的话,直接接着训练就ok了,但是10月下旬那会儿,当我训练并测试完一次之后,电脑就卡住不动了,不管怎么样都没有反应,强制关机重启后就无法正常开机了,最后托人检查之后才发现是固态被烧坏了。所以我揣测,可能是因为HAIS模型在分层聚合阶段内存消耗大,GPU跑的太厉害同时散热跟不上导致训练中断,而我当时不知道就直接让显卡接着训练,正常操作应该是等几个小时让温度降下来再训练,因为我的操作不当和无知,导致3090ti那台电脑被我搞崩了。
我感觉最好配置环境的还得是3090ti,在那台电脑上配置是最顺畅的。当然,在4090上跑实验是最爽的,毕竟流处理器、核心频率比3090ti都要高,使用同样的custom data 在3090ti上会出现训练中断的情况而4090则不会。
在4090这台电脑上,从安装ubuntu20.04,到配置环境我都做了一遍,现在说一些之前配置过程中没遇到过的问题。
电脑配置:RTX 4090
CUDA 11.1
cudnn 8.9.5
pytorch 1.8.0+cu111
python 3.7
gcc 9.4.0
Ubuntu 20.04
pyyaml 5.1
cmake 3.27.7
在这里没有出现像RTX 2080ti上出现的cmake不兼容的问题,所以在安装编译spoconv之前,所有步骤都和在RTX 3090ti上配置步骤差不多,在下载好spocnv1.2后,运行命令
cd HAIS/lib/spconv
python setup.py bdist_wheel
出现报错:nvcc fatal : Unsupported gpu architecture 'compute_89'
,说明是RTX4090 GPU 算力太高,需要降算力,使用以下命令降算力:
1. unset TORCH_CUDA_ARCH_LIST # 清除TORCH_CUDA_ARCH_LIST
2. export TORCH_CUDA_ARCH_LIST="8.0" # 设置cuda算力为8.0
降完算力之后,接着重新编译spconv,结果出现报错:spconv/include/spconv/box_iou.h:21:10: fatal error: boost/geometry.hpp: 没有那个文件或目录
,这说明我们的虚拟环境缺少spconv的依赖项,需要先更新,再下载依赖项,使用以下命令:
3. sudo apt-get update # 更新
4. sudo apt-get install libboost-all-dev # 下载依赖项
5. python setup.py bdist_wheel # 重新执行编译程序
如果成功的话,则会生成一个.whl文件,接着就是编译这个生成的.whl文件,先cd到.whl所在的文件夹,再使用pip安装命令安装这个.whl文件(wheel_file_name就是这个.whl文件的名字,编译的时候替换一下就行):
cd HAIS/lib/spconv/dist
pip install {wheel_file_name}.whl
最后一步是编译C ++ 和 CUDA扩展(Compile the external C++ and CUDA ops.),先进入hais_ops文件夹内,再将conda环境路径({conda_env_path},我的是/home/lidar/anaconda3/envs/)暂时写进环境变量,最后运行setup.py:
6. cd HAIS/lib/hais_ops
7. export CPLUS_INCLUDE_PATH={conda_env_path}/hais/include:$CPLUS_INCLUDE_PATH # 记得把{conda_env_path}替换为自己的conda环境路径
8. python setup.py build_ext develop
但是在这里出现了报错:error: command ':/usr/local/cuda-11.1/bin/nvcc' failed: No such file or directory: ':/usr/local/cuda-11.1/bin/nvcc'
,出现这个报错的原因是因为权限不够,所以我们需要先确定python路径,再给sudo权限运行命令行:
1. which python # 确定python路径,比如我的是 /home/lidar/anaconda3/envs/hais/bin/python
2. sudo /home/lidar/anaconda3/envs/hais/bin/python setup.py build_ext develop # 给python赋root权限,运行setup.py
但是在这里又出现了一个报错:fatal error: google/dense_hash_map: 没有那个文件或目录
,这个错误说明我们缺少依赖项,所以还是需要先下载依赖项,再使用root权限运行setup.py来编译扩展:
1. sudo apt-get install libssl-dev build-essential g++ libboost-all-dev libsparsehash-dev git-core perl # 下载依赖项
2. sudo /home/lidar/anaconda3/envs/hais/bin/python setup.py build_ext develop # 编译扩展
到这里环境配置就已经结束啦~如果有需要交流的问题可以
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。