一、安装部署
GitHub主页在这里:
1.1下载相关的代码仓库
git clone --recursive https://github.com/NVlabs/InstantSplat.git
cd InstantSplat
git submodule update --init --recursive
cd submodules/dust3r/
mkdir -p checkpoints/
wget https://download.europe.naverlabs.com/ComputerVision/DUSt3R/DUSt3R_ViTLarge_BaseDecoder_512_dpt.pth -P checkpoints/
cd ../../
1.2创建conda环境
conda create -n instantsplat python=3.11 cmake=3.14.0
conda activate instantsplat
conda install pytorch torchvision pytorch-cuda=12.1 -c pytorch -c nvidia # use the correct version of cuda for your system
pip install -r requirements.txt
pip install submodules/simple-knn
# modify the rasterizer
vim submodules/diff-gaussian-rasterization/cuda_rasterizer/auxiliary.h
'p_view.z <= 0.2f' -> 'p_view.z <= 0.001f' # line 154
pip install submodules/diff-gaussian-rasterization
这里cmake3.14是创建在conda环境里面的,不会与系统内的cmake冲突,我的系统内cuda版本是2.5,但它是向下兼容的,因此可以兼容pytorch的12.1版本,倒数两行提醒了在vim中修改auxiliary.h第154行:把p_view.z <= 0.2f改成 p_view.z <= 0.001f,如图:
1.3为RoPE编译cuda kernel,用来加速dust3r
# DUST3R relies on RoPE positional embeddings for which you can compile some cuda kernels for faster runtime.
cd submodules/dust3r/croco/models/curope/
python setup.py build_ext --inplace
1.4运行
使用官网的命令,利用给的sh文件来运行
# InstantSplat train and output video (no GT reference, render by interpolation) using the following command.
bash scripts/run_train_infer.sh
# InstantSplat train and evaluate (with GT reference) using the following command.
bash scripts/run_train_eval.sh
二、遇到的问题
2.1pip install submodules/simple-knn时的编译错误
从图中可以看到,问题出在FLT_MAX那几行
这里参考了GPT的建议:在simple_knn.cu内,添加一行:#include <float.h>,然后解决
Q:#include <float.h>是什么?
A:#include <float.h> 是 C 标准库中的一个头文件,它定义了与浮点类型相关的宏。这些宏提供了浮点数在特定平台上的各种特性和限制的信息,如浮点数的最小值、最大值、精度等。
具体来说,<float.h>
头文件包含以下一些常用的宏:
- FLT_RADIX: 基数
- FLT_MANT_DIG, DBL_MANT_DIG, LDBL_MANT_DIG: 单精度、双精度和扩展精度浮点数的尾数位数
- FLT_DIG, DBL_DIG, LDBL_DIG: 单精度、双精度和扩展精度浮点数的十进制有效数字位数
- FLT_MIN, DBL_MIN, LDBL_MIN: 单精度、双精度和扩展精度浮点数的最小正值
- FLT_MAX, DBL_MAX, LDBL_MAX: 单精度、双精度和扩展精度浮点数的最大值
- FLT_EPSILON, DBL_EPSILON, LDBL_EPSILON: 单精度、双精度和扩展精度浮点数的机器精度(最小正数,使得1加上这个数不等于1)
然后,Instantsplat顺利安装。
2.2关于cuda12.1
我尝试安装过12.1,碰见了很多小问题,这里做记录
2.2.1为什么我明明用的是安装cuda12.1的命令,安装完却是最新版的cuda12.6?
坏就坏在这条命令:sudo apt-get update,这些安装cuda12.1的命令在执行到此之前,都是正常的12.1的步骤,它对要安装的版本号做了更新,所以安装的是最新版本12.6!去掉这条命令即可安装旧版本,确实一般安装12.6也能代替12.1,向下兼容嘛。
2.2.2一个系统多个cuda版本
我的系统中,现在有三个版本的cuda,分别是11.8、12.1、12.5,如何让他们自由切换呢?创建一个软连接即可:手动更新符号链接,步骤如下:
-
移除现有符号链接:
sudo rm -f /usr/local/cuda
-
创建新的符号链接:
假设你安装的CUDA 12.1在
/usr/local/cuda-12.1
目录下:sudo ln -s /usr/local/cuda-12.1 /usr/local/cuda
-
验证符号链接:
通过以下命令验证符号链接是否正确:
ls -l /usr/local/cuda
你应该看到输出类似于:
lrwxrwxrwx 1 root root 20 Aug 3 14:00 /usr/local/cuda -> /usr/local/cuda-12.1
注意,这个前提是环境变量中需要改成/usr/local/cuda这个软连接的位置
2.2.3runfile文件安装过程中cuda demo suite是什么?
CUDA Demo Suite是CUDA安装包中包含的一组示例程序和演示,用于展示CUDA的功能和性能。这些示例程序可以帮助开发者理解如何编写和优化CUDA程序。安装CUDA Demo Suite可以让你直接运行这些示例程序,查看CUDA在你的系统上的表现和效果。
安装CUDA时的选项
在使用runfile文件安装CUDA时,你可能会看到一个选项,询问你是否要安装CUDA Demo Suite。这些示例程序位于CUDA安装目录中的extras/demo_suite
文件夹内。
包含的示例
CUDA Demo Suite包括各种各样的示例程序,例如:
- 矩阵乘法
- 向量加法
- 图像处理
- 物理模拟
- 算法加速
这些示例程序展示了如何使用CUDA进行并行计算,并且可以用来测试你的CUDA安装是否正确配置。
是否安装CUDA Demo Suite
安装CUDA Demo Suite不是必须的,但对于那些希望学习CUDA编程或验证CUDA安装是否正确的人来说,它是一个有用的资源。安装过程中的选择取决于你的需求:
- 需要学习和测试:如果你是CUDA编程的新手,或者希望验证你的CUDA安装是否正常工作,建议安装CUDA Demo Suite。
- 空间有限或不需要:如果你已经熟悉CUDA,并且系统空间有限,或者不需要这些示例程序,可以选择不安装。
安装CUDA Demo Suite的步骤
在安装CUDA的过程中,当提示是否安装CUDA Demo Suite时,选择“是”即可。安装完成后,你可以在CUDA安装目录中找到这些示例程序,并通过以下命令运行它们:
cd /usr/local/cuda/extras/demo_suite
./<demo_program>
其中,<demo_program>
是具体的示例程序名称。
通过运行这些示例程序,你可以看到CUDA在你的系统上的表现,并学习如何编写和优化CUDA程序。
2.3关于cuda gpu的检查
我在执行 bash scripts/run_train_infer.sh时,终端报错(runtimeerror:no cuda gpus are available)找不到gpu,这是一个很奇怪的问题,我的各种配置明明是好的。求助GPT:我得到了一个全面排查cuda以及gpu状态的命令链条,最后找到问题所在,是sh脚本里面gpu_id写错了,应该是作者他们使用了多卡并行训练,一般单卡的时候gpu_id=0
全面排查cuda以及gpu状态的逻辑如下:
在运行你的bash脚本时出现RuntimeError: no CUDA GPUs are available
的错误,通常意味着PyTorch未能检测到你的CUDA兼容的GPU。这可能有几个原因:
排查步骤
-
检查GPU是否被其他进程占用:
使用nvidia-smi
命令查看当前GPU的使用情况:nvidia-smi
确认你的GPU (ID为6) 没有被其他进程占用。如果GPU被占用,可以考虑终止那些占用GPU的进程。
-
检查CUDA驱动和库的安装:
确保你的CUDA和驱动程序正确安装。使用以下命令检查CUDA和驱动程序版本:nvcc --version nvidia-smi
确保输出显示正确版本的CUDA和驱动程序。
-
验证PyTorch的CUDA支持:
进入Python环境,运行以下代码,检查PyTorch是否能检测到CUDA:import torch print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.current_device()) print(torch.cuda.get_device_name(0))
确保输出显示
True
,并列出你的GPU设备。 -
确保CUDA环境变量正确配置:
确保CUDA相关的环境变量在运行你的bash脚本时是正确配置的。你可以在bash脚本的开头添加以下行来确保环境变量配置正确:export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
-
指定正确的CUDA设备:
确保在脚本中指定的GPU ID是正确的。你可以通过nvidia-smi
查看GPU的ID,并在脚本中确认GPU_ID=6是正确的。
修改脚本以便调试
在运行bash脚本时,你可以添加一些调试信息来帮助你定位问题。例如,在每个命令前后打印一些调试信息:
echo "========= Checking GPU availability ========="
nvidia-smi
python -c "import torch; print(torch.cuda.is_available())"
echo "========= ${SCENE}: Dust3r_coarse_geometric_initialization ========="
eval $CMD_D1
echo "========= ${SCENE}: Train: jointly optimize pose ========="
eval $CMD_T
echo "========= ${SCENE}: Render interpolated pose & output video ========="
eval $CMD_RI
通过这些调试信息,你可以更好地了解在脚本运行期间GPU的状态和PyTorch对CUDA的检测情况。
最后建议
如果以上步骤都没有解决问题,建议重启系统,并确保所有相关服务(如CUDA驱动)正确启动后再运行脚本。
三、实例demo
首先作者提供的命令是在linux环境下,如果是window建议使用wsl,或者docker,作者也提到了docker里面pull的命令。
按照GitHub主页安装好环境以后,可以下载作者的demo数据进行实验,也可以使用自己的数据。
主页的命令贴过来了:
# InstantSplat train and output video (no GT reference, render by interpolation) using the following command.
bash scripts/run_train_infer.sh
# InstantSplat train and evaluate (with GT reference) using the following command.
bash scripts/run_train_eval.sh
上面的bash文件在:instantsplat/scripts目录底下,一个是infer,另一个是eval,只需要看重建效果的用infer.sh就行,需要详细查看指标的使用eval.sh
完成训练以后,根据infer.sh里面填的参数,执行的时候需要注意路径,这个比较关键
GPU_ID=6
DATA_ROOT_DIR="/ssd2/zhiwen/projects/InstantSplat/data"
DATASETS=(
# TT
sora
# mars
)
SCENES=(
# Family
# Barn
# Francis
# Horse
# Ignatius
santorini
)
N_VIEWS=(
3
# 5
# 9
# 12
)
这个是模型读取训练数据的路径,训练前需要注意填对路径:
SOURCE_PATH=${DATA_ROOT_DIR}/${DATASET}/${SCENE}/${N_VIEW}_views
训练完成以后,模型文件.ply会在这个路径下面:
MODEL_PATH=./output/infer/${DATASET}/${SCENE}/${N_VIEW}_views_${gs_train_iter}Iter_${pose_lr}PoseLR/
还有一个容易忽略的细节,第一行里面有一个GPU_ID=6,作者可能使用了多卡训练,如果是单卡,这里的GPU_ID=0
最后,给大家看看我使用作者提供的公开数据训练的结果,GPU4080,20个view,object场景:
室外: