nerfstudio以及相关使用记录(长期更新)
NeRFStudio 是NeRF/3DGS研究和开发的集成平台。 提供了一个用户友好的界面和一系列工具,帮助研究人员和开发者更高效地构建、训练和评估 NeRF 模型。以前使用的时候用完就丢一边了,没有注意记录,现在有一个工程调用了nerfstudio,部署之余顺便专门写一篇来做完整的记录,也使他变得清晰。
官方主页:nerfstudio
GitHub主页:GitHub - nerfstudio-project/nerfstudio: A collaboration friendly studio for NeRFs
1.Ubuntu22下的部署以及报错
NeRFStudio部署是很令人头疼的事情,问题比较琐碎,必须使用NVIDIA显卡以及cuda。
1.1conda创建虚拟环境
python版本大于等于3.8,我这里使用了3.11
conda create --name nerfstudio -y python=3.11
conda activate nerfstudio
pip install --upgrade pip
1.2依赖:tiny-cuda-nn
NeRFStudio依赖tiny-cuda-nn依赖cuda,cuda的安装这里不再赘述,tiny-cuda-nn的主页在这里:GitHub - NVlabs/tiny-cuda-nn: Lightning fast C++/CUDA neural network frameworkLightning fast C++/CUDA neural network framework. Contribute to NVlabs/tiny-cuda-nn development by creating an account on GitHub.https://github.com/NVlabs/tiny-cuda-nn
1.cuda11.8
对于cuda11.8的版本,官网主页以及给出了示范:
pip install torch==2.1.2+cu118 torchvision==0.16.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118
conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit
pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
2.cuda12.*
我的cuda版本当前是12.5,对于cuda12应该都是兼容的,所以直接进入tiny-cuda-nn的主页安装。这里作者列出来了必须要有的工具:
然后对于cuda要把路径添加进终端或者.bashrc中,我选择了添加到终端,不动系统的设置,即在终端中输入:
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
#PATH 是一个环境变量,用于指定系统在哪些目录中查找可执行文件。将 CUDA 的可执行文件目录(通常是 /usr/local/cuda/bin)添加到 PATH 变量中。$PATH 表示现有的 PATH 值,这样新的路径会追加到现有路径的前面,确保系统首先查找 CUDA 的工具。
#LD_LIBRARY_PATH 是一个环境变量,用于指定系统在哪些目录中查找共享库(动态链接库)。这行命令将 CUDA 的库文件目录(通常是 /usr/local/cuda/lib64)添加到 LD_LIBRARY_PATH 变量中。$LD_LIBRARY_PATH 表示现有的 LD_LIBRARY_PATH 值,这样新的路径会追加到现有路径的前面,确保系统首先查找 CUDA 的库。
我的cuda是一个软链接,link到了cuda-12.5,这里路径只要输入一个电脑里有的cuda12路径就行。
然后clone并且安装:
$ git clone --recursive https://github.com/nvlabs/tiny-cuda-nn
$ cd tiny-cuda-nn
接着cmake编译就完了:
/tiny-cuda-nn$ cmake . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
/tiny-cuda-nn$ cmake --build build --config RelWithDebInfo -j
另外,还有一个PyTorch extension,就是cudnn那一块,可装可不装,按实际来,我安装了
pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
到这里,tinycuda就安装编译好了。下面的过程中遇到的坑:里面有的是部署其他工程时,需要安装nerfstudio,在过程中遇到的问题,也是一样的。
报错1:执行git clone --recursive https://github.com/nvlabs/tiny-cuda-nn的时候
OSError: Unknown compute capability. Specify the target compute capabilities in the TCNN_CUDA_ARCHITECTURES environment variable or install PyTorch with the CUDA backend to detect it automatically.
这个错误是由于tiny-cuda-nn在安装时无法自动检测到CUDA架构(compute capability)导致的。tiny-cuda-nn需要知道GPU的CUDA架构才能正确编译。需要手动设置TCNN_CUDA_ARCHITECTURES环境变量,指定GPU的CUDA架构。
首先,查找你的GPU的CUDA架构版本:
nvidia-smi --query-gpu=compute_cap --format=csv
然后,根据查到的CUDA架构版本,在安装前设置环境变量。例如,如果你的GPU是NVIDIA RTX 3090,其CUDA架构是8.6,那么在当前终端里设置该变量:
export TCNN_CUDA_ARCHITECTURES=86
如果你不确定你的GPU的CUDA架构,或者想支持多种架构,可以设置多个值,用分号分隔。例如:export TCNN_CUDA_ARCHITECTURES="75;80;86"
报错2:执行git clone --recursive https://github.com/nvlabs/tiny-cuda-nn的时候
OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.
这个问题就是一开始的cuda路径没有成功添加进去,重新添加一下,像前面一样。添加好可以验证一下:echo $PATH以及echo $LD_LIBRARY_PATH
如果你确定确实添加进去了,但是,还是报这个错误,那就要检查你的pytorch版本是不是cpu的,如果是,赶紧卸了重新装吧!我这里就是犯了这样的错误,来来回回检查不知道哪里错了,因为使用了conda安装的pytorch,他先是给我装了cuda-toolkit=12.2(我本来系统就带了两个cuda版本11和12都有),然后又装了cpu版本的pytorch,真的服了。。。还是少用conda安装这两样相关的东西,里面的兼容逻辑非常神奇,不是大神不建议碰。
python
>>>import torch
>>>torch.cuda.is_available()
#如果是cpu版本,会输出False
如果不知道你的cuda路径,可以找一下:
which nvcc
whereis nvcc
报错3:执行cmake . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
/home/lee/miniconda3/envs/relight_nerfstudio/bin/x86_64-conda-linux-gnu-c++:
No such file or directory
这是编译的过程中找不到g++,在conda环境中安装一个即可
报错4:执行pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
/home/lee/miniconda3/envs/relight_nerfstudio/compiler_compat/ld: cannot find -lcuda: No such file or directory
collect2: error: ld returned 1 exit status
error: command '/home/lee/miniconda3/envs/relight_nerfstudio/bin/x86_64-conda-linux-gnu-c++' failed with exit code 1
这个报错是编译过程中的,很长,大概有700行,ld 负责将目标文件和库文件链接在一起,生成最终的可执行文件或共享库。-lcuda 是链接器的一个选项,表示需要链接 libcuda.so 库。链接器会在默认的库路径(如 /usr/lib、/usr/local/lib 等)中查找这个库。所以这个报错是在编译过程中,链接器(ld)在尝试链接 libcuda 库时失败了,无法找到 libcuda.so 文件。
在一开始指定LD_LIBRARY_PATH的路径下,我的在这里也就是:/usr/local/cuda/lib64,在这里面寻找libcuda.so,没有找到,所以报错,但是我在安装目录中寻找了libcuda.so,发现它在又一级目录下面:/usr/local/cuda/lib64/stubs/libcuda.so。。。
所以我直接简单粗暴创建软链接放在/usr/local/cuda/lib64下:
sudo ln -s /usr/local/cuda/lib64/stubs/libcuda.so /usr/local/cuda/lib64/libcuda.so
最后重新执行,成功编译!
1.3安装 nerfstudio
推荐安装编译最新的
git clone https://github.com/nerfstudio-project/nerfstudio.git
cd nerfstudio
pip install --upgrade pip setuptools
pip install -e .
到这里nerfstudio安装完毕,这一步安装还是很顺利的,80%的问题基本都在编译tinycuda的过程中。