资讯动态

IS-Fusion部署避坑指南:Ubuntu 20.04+CUDA 11.1+PyTorch 1.10.1全流程

发布时间:2026/9/16 20:49:01 来源:尧图企业网站定制
写这篇避坑指南的初衷很简单IS-Fusion这类带神经隐式重建的SLAM项目代码本身反而不是最难啃的最难的是把环境跑通。我前后在Ubuntu 20.04上完整部署了两遍第一遍因为版本组合问题折腾了两天第二遍只花了一个下午。这里把整套流程、踩过的坑、报错的原因都记下来给你一条能直接照着走的路。这篇文章适合准备跑IS-Fusion或者任何依赖CUDA 11.1 PyTorch 1.10.1组合的视觉SLAM项目的读者新机器、已有环境改造、服务器无显示器部署都覆盖到了。1. 部署前先想清楚这几件事1.1 IS-Fusion到底是什么它需要什么样的环境底座IS-Fusion这个仓库本质上是一个基于增量式场景融合的实时三维重建/SLAM项目。它把深度图和位姿信息通过神经隐式表示融合成一个场景模型运行过程中还要做帧到模型的跟踪和可视化。这类项目对运行环境的要求有几个共同特点需要GPU加速、需要PyTorch做神经网络推理、需要CUDA runtime做底层算子支撑、还需要一个可视化后端处理三维点云和Mesh。很多第一次上手的人容易犯一个错就是随便拿一个最新版的环境去跑结果就是torch版本不对、CUDA编译器缺失、Open3D API不兼容一步一个坎。IS-Fusion的作者在README里写得很清楚用的就是Ubuntu 20.04 CUDA 11.1 PyTorch 1.10.1这套组合这个组合不是随便选的是因为仓库里有些自定义算子依赖CUDA 11.1下的nvcc编译同时PyTorch 1.10.1是当时对这套算子兼容性最好的版本。你如果强行换新版本可能也能跑通但代价是你得自己处理各种ABI兼容问题不值得。1.2 硬件和系统层面的最低要求先说结论显卡建议NVIDIA显卡显存至少8GB。IS-Fusion运行时模型权重、特征图、TSDF体素数据都会占用显存我实测下来一个中等规模的房间序列显存占用大概在5GB到6GB左右。如果你是跑大厅、走廊这种大场景显存很容易直接冲到10GB以上。内存建议16GB起步推荐32GB。CPU方面不用太好但编译源码时多核优势很大建议4核以上。系统方面我建议你直接用Ubuntu 20.04不建议用更高版本的系统去强行兼容。因为CUDA 11.1对Ubuntu 20.04的内核和GCC版本做过完整适配到了Ubuntu 22.04上GCC默认版本变成了11会导致很多老代码编译失败。你如果一定要在22.04上跑也不是不行但要额外装低版本GCC操作上会多一些麻烦这个后面章节我会提一句。1.3 三个常见环境混用误区先打三个预防针后面会反复碰到。第一个误区把驱动版本和CUDA版本搞混。nvidia-smi显示的是驱动支持的CUDA最高版本比如你看到一个很新的驱动显示CUDA 12.6这不代表你系统里的CUDA就是12.6也不代表你不能装CUDA 11.1。驱动和CUDA Toolkit是两个独立的东西驱动向下兼容你装CUDA 11.1只需要驱动版本大于等于某个最低值就行。第二个误区装了CUDA Toolkit就以为nvcc命令能用了。很多时候你明明装了CUDA 11.1但打开终端输入nvcc --version却提示找不到命令这是因为没有把/usr/local/cuda/bin加到环境变量PATH里或者/usr/local/cuda这个软链接指向的是别的版本。第三个误区用conda创建环境就不需要管系统CUDA了。PyTorch 1.10.1和CUDA 11.1搭配的官方包已经自带CUDA runtime如果你只是跑inference确实不用系统CUDA。但IS-Fusion里有自定义的C/CUDA算子编译时要用到nvcc所以系统的CUDA Toolkit仍然是必需的这点千万别省。2. 基础环境搭建Ubuntu 20.04 CUDA 11.12.1 全新系统安装后的第一件事更换镜像源如果你是用官方ISO装的Ubuntu 20.04那基本装完系统的第一件事就是把软件源换成国内镜像。这一步非常建议做不然你后面装各种依赖库的时候速度会让你怀疑人生。清华、阿里、中科大源都可以我常用的是清华源。这里顺便说说Ubuntu镜像和rootfs的话题。如果你不想重装整个系统而是想通过容器或者chroot方式搭建一个干净的20.04环境那确实需要自己下载Ubuntu 20.04的rootfs。清华开源软件镜像站里Ubuntu的路径有base和ports两种amd64架构用base目录下的arm64架构要去ports目录下找。下载完base的rootfs后还需要自己配置源、安装基础工具再用chroot进入过程比直接装系统稍微麻烦一点但优点是环境干净不会影响宿主机的状态。如果你就是想在物理机或服务器上正经跑IS-Fusion我还是推荐直接装完整系统省心很多。换源的操作不复杂直接修改/etc/apt/sources.list把archive.ubuntu.com批量替换成mirrors.tuna.tsinghua.edu.cn然后执行sudo apt update。顺手把vim、curl、git、build-essential这些基础工具装上后面都会用得到。2.2 NVIDIA驱动安装不是版本越新越好IS-Fusion跑起来后实时渲染和三维修剪都需要比较流畅的GPU操作驱动不到位很容易出现CUDA报错。我推荐直接在终端里用sudo ubuntu-drivers autoinstall自动安装推荐版本的驱动装完重启nvidia-smi能正常输出就说明驱动OK了。CUDA 11.1要求驱动最低版本是456.38但现在的驱动随便装一个都远超这个数所以不需要纠结具体版本。备选方案是去NVIDIA官网下载对应型号的.run驱动手动装但需要先卸载系统自带的nouveau驱动步骤多新手容易搞挂系统能自动装就自动装。装完驱动以后我强烈建议你运行一下nvidia-smi看看状态。如果你在一个没有显示器的服务器上操作可能需要配置持久化模式执行sudo nvidia-smi -pm 1不然GPU会默认在无任务时进入休眠状态导致第一次运行时初始化特别慢。2.3 CUDA 11.1 Toolkit安装最关键的坑位CUDA 11.1的下载页在NVIDIA官网还能找到选择Linux x86_64 Ubuntu 20.04 runfilelocal方式。我推荐用runfile而不是deb方式原因很简单runfile装完以后所有文件都在/usr/local/cuda-11.1目录下方便管理多版本并存deb方式会把CUDA路径和系统绑定得比较死后面如果换版本会很痛苦。安装时注意当安装程序问你要不要安装驱动时一定要选No跳过驱动安装。因为你已经在第2.2步装好了合适的驱动如果再让CUDA安装包装一个它自带的驱动容易覆盖成旧版驱动引发一系列兼容问题。CUDA Toolkit里自带驱动安装时小心别覆盖掉系统驱动直接选跳过即可。装完以后需要配置环境变量在~/.bashrc或者~/.zshrc末尾加入下面几行然后source一下export PATH/usr/local/cuda-11.1/bin:$PATH export LD_LIBRARY_PATH/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH export CUDA_HOME/usr/local/cuda-11.1验证方式是打开新终端运行nvcc --version看是否输出版本信息。这里要特别提醒一个细节确保/usr/local/cuda软链接指向/usr/local/cuda-11.1很多工具编译时会默认找/usr/local/cuda这个路径。如果软链接不对后面就会碰到CUDA_HOME set but nvcc not found这类问题。2.4 Anaconda环境与PyTorch 1.10.1安装IS-Fusion的Python依赖是通过conda管理的我建议也照做。创建一个干净的虚拟环境Python版本选择3.8这是PyTorch 1.10.1支持度最好的版本之一。conda create -n isfusion python3.8 conda activate isfusionPyTorch 1.10.1和CUDA 11.1的配对安装命令官方给的是pip install torch1.10.1cu111 torchvision0.11.1cu111 torchaudio0.10.1 -f https://download.pytorch.org/whl/torch_stable.html这个命令会直接下载对应的CUDA 11.1版本的wheel包。国内网络环境下这个地址可能比较慢你可以把https://download.pytorch.org/whl/torch_stable.html换成清华PyPI镜像的pytorch稳定版列表或者直接先配置pip使用清华镜像源再从官方下载。我当时是直接用的官方地址速度也能接受看当地网络情况。装完以后一定要验证一下CUDA是否真的可用这个验证非常关键python -c import torch; print(torch.__version__, torch.cuda.is_available())如果输出的是1.10.1cu111 True那环境就OK了。如果输出的是True前面没有cu111说明你装的是CPU版本需要卸载重装。如果输出False先检查驱动加载和nvidia-smi状态再检查是不是装成了CPU版。2.5 其他依赖库与Open3D注意事项IS-Fusion依赖的核心库还有numpy、open3d等。open3d这里要特别小心版本问题这个仓库用的API在旧版本和新版本之间差异非常大比如read_triangle_mesh和read_triangle_model这种命名变化、Visualizer的渲染流程变化都会导致代码直接跑挂。IS-Fusion的README里会注明依赖的open3d版本范围一般是0.12.0左右如果你装了一个1.0以上的新版本大概率会报各种找不到属性的错。一个稳的经验是把open3d版本固定在一个已知可用的版本上不要随手装最新版。其他依赖建议用pip install -r requirements.txt方式安装装完以后手动确认一遍关键库的版本避免依赖冲突。3. 源码获取与编译从clone到能跑起来3.1 克隆仓库并检查目录结构IS-Fusion的源码在GitHub上克隆时用--recursive参数把submodule一起拉下来这一步经常被忽略。很多SLAM项目会把第三方依赖库作为submodule如果你直接git clone忘了加上--recursive后面编译到一半就会提示找不到某些头文件或者库文件非常坑。git clone --recursive https://github.com/xxx/IS-Fusion.git cd IS-Fusion ls -la进来以后先看一眼目录结构一般会有scripts、src、configs、data这些目录。scripts里通常有现成的运行脚本configs里是配置文件。你先花几分钟把README的Installation部分完整读一遍看它缺了哪些依赖再决定下一步怎么做。这一步不能省仓库作者写README时一般都会把编译依赖列出来。3.2 自定义算子的编译流程IS-Fusion里如果包含自定义的C/CUDA算子一般是通过setup.py或者CMakeLists.txt来编译的。以常见的setup.py方式为例在激活conda环境后执行python setup.py build_ext --inplace这里最常遇到的问题就是找不到nvcc。如果你在前面章节里已经正确配置了CUDA_HOME环境变量通常不会出问题。但如果编译时报RuntimeError: The detected CUDA version (12.x) mismatches the version that was used to compile PyTorch (11.1)那说明系统里默认的CUDA版本不对。解决办法是让编译时使用的nvcc来自/usr/local/cuda-11.1/bin你可以在~/.bashrc里把/usr/local/cuda-11.1/bin放在PATH最前面或者临时在编译前执行export PATH/usr/local/cuda-11.1/bin:$PATH export CUDA_HOME/usr/local/cuda-11.1另一种情况是编译时提示gcc: error: unrecognized command line option -stdc17这通常说明gcc版本太老。Ubuntu 20.04默认的gcc 9是没问题的如果你在旧系统上或者conda环境里不小心改了gcc版本就需要手动确认gcc --version的结果。编译完成的标志是生成了.so文件比如isfusion_cuda.cpython-38-x86_64-linux-gnu.so这种。生成后可以做一个快速验证在Python里import一下如果不报错编译就算成功了。3.3 链接库路径的坑编译成功只是第一步运行时的动态链接库路径是另一个坑点。如果运行报错提示找不到libcudart.so.11.0或者libc10_cuda.so那大概率是LD_LIBRARY_PATH没有包含CUDA和PyTorch的库目录。我的做法是在运行任何脚本之前都先确保两个路径在环境变量里export LD_LIBRARY_PATH/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH export LD_LIBRARY_PATH$(python -c import torch; print(torch.__file__.rsplit(/,1)[0]))/lib:$LD_LIBRARY_PATH第二条命令是把PyTorch自带的库目录加进去避免版本冲突。这类项目最烦的就是编译过了、import过了但实际运行时才暴露链接问题。我的排查经验是遇到error while loading shared libraries先执行ldd 你的可执行文件看哪些库missing然后挨个补齐路径。3.4 源码编译阶段的常见报错速查表报错信息原因解决方案nvcc not found环境变量没配好确认CUDA_HOME和PATH重新sourceCUDA version mismatch with PyTorch编译时nvcc版本和PyTorch编译用的CUDA版本不一致指定nvcc来自CUDA 11.1检查软链接fatal error: cuda_runtime.h: No such file or directoryCUDA头文件路径缺失确认CUDA_HOME包含include目录GLIBCXX_3.4.29 not foundconda环境的libstdc版本过旧升级conda的libstdcconda install libstdcxx-ngundefined symbol编译时和运行时的库版本不对应用ldd排查清理环境变量多余的路径gcc: unrecognized command line option -stdc17gcc版本过旧确认gcc 7以上Ubuntu 20.04默认gcc 9没问题4. 数据准备与首次运行4.1 数据集格式和目录组织IS-Fusion这类SLAM项目通常需要你提供RGB-D序列或者一组连续深度图再配上相机内参和每帧的位姿。如果你没有现成的数据可以先用TUM RGB-D数据集里的某个小序列试试水下载一个短序列把RGB图像和深度图像按时间戳对齐好就行。数据目录参考结构一般是这样的data/ ├── rgb/ │ ├── 0000.png │ ├── 0001.png │ └── ... ├── depth/ │ ├── 0000.png │ ├── 0001.png │ └── ... ├── intrinsics.txt └── poses.txt如果你是自采数据深度图和RGB图的时间戳对齐是个体力活网上有现成的对齐工具和脚本。如果你是第一次跑这个项目我建议直接用仓库作者提供的demo数据通常放在Google Drive或者百度网盘里会有下载链接。下载完解压以后把每个序列文件夹放到data目录下按配置文件里的路径设定好。4.2 配置文件的参数含义配置文件一般是YAML或者JSON格式里面会写明数据集路径、相机参数、融合分辨率、跟踪参数、可视化开关等。开始训练/运行前必须逐条看一遍特别是这几个字段:参数含义建议值dataset_path数据序列的根目录改成你自己的绝对路径intrinsic相机焦距和光心来自你的内参标定文件depth_scale深度值缩放系数TUM一般5000自采数据按传感器型号来n_iters每帧优化迭代次数默认即可显存不够时可降低visualize是否开启可视化窗口无显示器时设为false发布时间比较久的仓库配置文件里可能还有sensor_resolution这种硬编码的宽高参数如果你的数据是1280x720但配置里写的是640x480整个重建结果会直接崩掉输出一片模糊或者位置错乱。建议先跑demo数据验证整条链路再换自己的数据逐步调整参数。这样能把数据问题、配置问题、代码问题分开定位。4.3 无显示器环境如何跑通可视化与渲染IS-Fusion的实时可视化依赖Open3D的GUI窗口但你在服务器上通常是没有显示器的这时候如果直接跑带可视化的代码大概率会报Cannot open display或者QStandardPaths: XDG_RUNTIME_DIR not set的错误。两个解决办法一是装一个虚拟显示器用Xvfb跑后台渲染命令类似xvfb-run -a python run.py --config xxx.yml二是直接用VNC或者X11转发到本机窗口。我建议在调试阶段用Xvfb在最终结果验证阶段用X11转发因为X11转发能实时看到窗口和点云体感更好。这里还有一点就是Open3D在无显示器环境下即使不开窗口某些版本也可能会尝试初始化GUI上下文导致程序卡住不往下走。如果遇到这种情况检查一下visualize参数是否设为false以及在代码里是否有o3d.visualization.draw_geometries这种必须弹窗的函数被强制调用有的话注释掉或加一个条件判断即可。4.4 首次运行的完整验证流程我第一次完整跑通IS-Fusion用的就是官方demo序列大致流程是先激活conda环境设置好环境变量然后执行仓库里提供的run_demo.sh脚本。脚本的内容一般就是指定配置文件并加上一些命令行参数你可以用cat scripts/run_demo.sh看下脚本内容把路径改成实际的相对或绝对路径。运行后正常情况下会打印出每一帧的处理时间、当前位姿、融合的体素数量等信息并弹出可视化窗口显示深度图和RGB图像。如果是用Xvfb跑没有窗口但日志会照常输出。过程中我建议开一个nvidia-smi的监控窗口实时看显存占用和GPU利用率如果显存占用接近上限但没有报错说明系统在运行边缘后续可以把n_iters调小一点。整个demo跑完以后会生成一个重建好的Mesh文件比如mesh.ply或mesh.pcd用Open3D或MeshLab打开看看重建质量。如果Mesh结构完整、细节清晰说明整个环境配置成功可以开始跑自己的数据了。5. 高频报错与排查实录5.1 PyTorch的CUDA不可用问题深挖torch.cuda.is_available()返回False是出现频率最高的报错之一。除了前面说的装错版本还有一种情况是你系统里同时有多个CUDA版本PyTorch加载时找不到正确的libcudart。这时可以先运行python -c import torch; print(torch.__version__)看看有没有动态库加载的报错。我的经验是先用conda list | grep cudatoolkit确认conda环境里有没有多装一个cudatoolkit。如果你在conda环境里装了cudatoolkit11.1同时系统也有CUDA 11.1两边的库会打架。解决方法是先把conda环境里的cudatoolkit卸载只保留PyTorch自带的CUDA runtime。5.2 编译链接阶段底层依赖冲突IS-Fusion运行底层会调用很多本地库这些库之间会出现版本冲突最常见的表现就是GLIBCXX和GLIBC版本错误。尤其是conda环境下系统里自带的libstdc.so.6版本比conda环境的要新很多程序运行时优先加载了conda环境里的老版本标准库然后报GLIBCXX_3.4.29 not found。我处理过一次最后是在conda环境里执行conda install libstdcxx-ng更新标准库解决。原理就是让conda环境里的libstdc版本追上系统版本避免动态链接器把老库加载进来。5.3 显存不足与耗时的排查优化IS-Fusion融合一个房间级别的场景显存占用我实测在5GB到8GB左右如果你用的是8GB显存的卡跑稍大的场景会直接在优化中途被OOM杀掉。日志里通常能看到CUDA out of memory字样有时还会提示Tried to allocate 512.00 MiB这种信息。这时候可以调整几个参数来降低显存占用降低体素分辨率比如从512降到256降低每帧优化迭代次数减小batch size把深度图下采样后再喂进去。如果你发现运行很慢比如一帧要3秒以上先看GPU利用率是不是一直为0%。如果你能看到日志在跑但GPU利用率很低那很可能是CPU端的预处理成了瓶颈比如深度图像加载、预处理太慢。解决方向是把读取深度图的步骤放到多线程里或者把图片尺寸缩小以提高处理速度。5.4 数据读取相关的坑与对齐技巧数据读取的问题隐蔽性很强一般不报明显错误但重建出来的东西歪七扭八。IS-Fusion读取深度图时一般用16-bit PNG格式TUM数据集里深度值的单位是毫米而代码内部期望的单位可能是米如果你忘了除以depth_scale重建出来的模型会直接缩小500倍或者放大500倍。另一个坑是深度图有无效值即像素值为0的点这些点在反投影到三维空间时会产生一堆离群点导致可视化时画面里飘着很多杂质严重时还会污染TSDF融合。解决办法是使用一张mask图把值为0的深度像素在反投影前过滤掉。如果你是用RealSense或者其他RGB-D相机自采数据还有一层坑就是RGB图和深度图的配准。RealSense的RGB和深度是多个传感器出厂时内外参不一样如果你不先做对齐再保存深度图和RGB图会对不上。实际效果就是重建出的模型表面有“重影”。解决方式是使用RealSense SDK里的align_to_color功能提前把深度帧对齐到彩色帧。5.5 多版本环境管理的避坑建议环境管理上IS-Fusion适合一套独立的conda环境专跑一个项目不要图省事把很多SLAM项目依赖全都装进同一个conda环境里。不同项目的依赖冲突是我的血泪教训曾经因为帮另一个项目装了高版本open3d把IS-Fusion环境里共享的路径变量搞乱了又花了一下午排查。单独的环境虽然占点磁盘空间但隔离风险值得。如果你在同一个环境里要切换PyTorch版本建议直接新建环境不要在一个环境里反复装不同版本的torch。conda和pip混用时也要注意PyTorch用pip安装纯Python库用conda安装避免两个包管理器的元数据互相干扰导致import时加载了错误版本。6. 一点实操后的体会最后按照惯例记录几条我在完整部署过程中沉淀下来的操作习惯希望对你有帮助。第一每完成一个环境配置的大步骤立刻做一次验证。比如装完驱动验证nvidia-smi装完CUDA验证nvcc --version装完PyTorch验证torch.cuda.is_available()每步都确认无误再往下走。多花的那几十秒能帮你把问题定位到具体阶段而不是在最后全盘排查。第二养成看日志的习惯。第一次跑IS-Fusion时输出信息会很多很多人直接跳过不看的。但很多隐蔽问题其实早就被警告信息暗示过了比如某处读取数据失败、某个参数即将被废弃、某帧跟踪退化了。学会从日志里找线索是排查问题的最快路径。第三如果某个报错的英文意思你不确定直接把它原封不动复制到搜索引擎里搜你可以找到自己需要的答案。这类开源SLAM项目的部署问题绝大多数都是别人踩过的坑解法基本都是现成的。IS-Fusion的环境部署确实是有门槛的但同时它也是一个很好的练手项目。跑通这套流程后再看其他依赖PyTorch的SLAM、NeRF类项目你会觉得环境配置有了一个非常清晰的心智模型。按着这篇指南一步步来遇到报错时对照报错表排查你应该能在一个下午内从零跑到demo输出Mesh。祝顺利。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价