简介:这份资源面向初次接触三维重建的开发者与在校学生,聚焦3D Gaussian Splatting(3DGS)在Linux环境下的完整复现路径,帮助零基础读者跨越从环境搭建到训练出结果之间的各类报错障碍。包内为1个doc文档,压缩包约96.32MB,以图文笔记形式记录全流程,涵盖Ubuntu 20.04.3 LTS系统配置、显卡驱动安装、colmap编译、虚拟环境与依赖版本匹配等关键环节。内容围绕RTX 3080 Ti平台展开,具体涉及纯文本与图形界面切换、MP4无法播放、PNG读取异常、colmap编译中TIFFReadRGBAImage链接错误、cudart64_12.dll缺失以及点云ply文件可视化等典型问题,并给出逐一排查与解决思路。目前已有5056人学习,适合希望少走弯路、快速跑通3DGS训练流程的新手参考。
1. 从一张 3090 的显存账单说起:3DGS 复现到底难在哪
第一次跑 3D Gaussian Splatting(下面统一叫 3DGS),我盯着nvidia-smi里那根几乎顶到 24GB 的显存条,心里只有一个念头:这玩意儿真能在自己的机器上跑起来吗。3DGS 是 2023 年之后三维重建方向最火的一条路线,它用一堆带位置、协方差、颜色和透明度的三维高斯球去表达场景,再通过可微的光栅化把高斯投影到屏幕上做渲染,训练速度比 NeRF 快一到两个数量级,渲染也能做到实时。标题里说的「3D 高斯」和「3DGS」其实是同一件事的两种叫法,前者强调表示形式,后者强调整套训练与渲染流程。
这篇东西写给谁:手里有一台带 NVIDIA 显卡的机器、装过 Ubuntu、但没真正把 3DGS 从零跑通过的人。我会按「环境怎么搭 → 数据怎么准备 → 训练怎么起 → 指标怎么看 → 坑在哪」的顺序讲,命令和参数都给到能直接抄的程度。复现 3DGS 最劝退的从来不是算法本身,而是 CUDA 版本、PyTorch 版本、子模块编译这三件事凑不到一起,以及 Ubuntu 显卡驱动装完重启进不去桌面这种玄学问题。把这几关过了,剩下的就是等它训练。
2. 环境搭建:Ubuntu 22.04 + CUDA + PyTorch 的版本对齐
2.1 为什么优先选 Ubuntu 22.04 而不是 20.04
3DGS 官方代码依赖 CUDA 的扩展编译,对编译器版本敏感。Ubuntu 22.04 LTS 自带 GCC 11,Ubuntu 20.04 自带 GCC 9,而新版 CUDA Toolkit 对 GCC 版本有下限要求,20.04 上经常要手动装高版本 GCC 再切update-alternatives,多一层折腾。热搜里ubuntu22 3dgs、ubuntu20 3dgs都有人问,我的建议是:新装机直接上 22.04 LTS,省掉编译器对齐的麻烦。如果你只有 20.04,也不是不能跑,但要准备好手动升级 GCC 到 11。
显卡驱动这块,别用 Ubuntu「附加驱动」里那个版本随缘的选项,直接去 NVIDIA 官网按显卡型号下.run或走apt源装固定版本。驱动版本决定了你能用的 CUDA 上限,而 CUDA 版本又决定了 PyTorch 版本,这条链是单向的,必须从上往下定。
先确认显卡和驱动状态:
# 查看显卡型号与驱动版本,驱动没装好这里会报错或显示 llvmpipe nvidia-smi # 查看系统版本,确认是 22.04 lsb_release -a # 查看当前 GCC 版本,3DGS 编译扩展需要 GCC >= 9 gcc --versionnvidia-smi右上角那行CUDA Version: 12.x是驱动支持的最高 CUDA 版本,不是你已安装的版本,很多人在这里看错。真正装没装 CUDA 要看nvcc -V。
2.2 CUDA 与 PyTorch 的版本对齐表
这是整个复现里最容易翻车的一步。3DGS 的 CUDA 光栅化扩展在编译时要用nvcc,运行时要用 PyTorch 的 C++ 扩展接口,两边 CUDA 版本必须一致,否则会出现「编译过了但 import 报 undefined symbol」这种黑匣子错误。
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| Ubuntu | 22.04 LTS | GCC 11,省去编译器升级 |
| NVIDIA 驱动 | 525 及以上 | 支持 CUDA 12.x |
| CUDA Toolkit | 11.8 | 与主流 PyTorch 轮子匹配最稳 |
| PyTorch | 2.0.1 + cu118 | 官方预编译轮子,别自己编 |
| Python | 3.10 | 3.11 部分扩展兼容性差 |
| GCC | 11 | 22.04 默认 |
装 CUDA Toolkit 11.8 时,安装选项里记得把 Driver 那一项取消勾选,因为你已经单独装了驱动,重复装容易把驱动搞坏。装完配环境变量:
# 把 CUDA 路径写进环境变量,注意路径里的版本号要和实际安装一致 echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc # 验证,应该输出 release 11.8 nvcc -V环境变量配错是热搜里ubuntu环境变量配置错误的高频来源。判断标准很简单:新开一个终端,which nvcc能定位到/usr/local/cuda-11.8/bin/nvcc就对了。如果指向别的版本,说明 PATH 顺序有问题。
2.3 用 conda 隔离环境并装 PyTorch
不要往系统 Python 里装东西,用 conda 建独立环境:
# 创建并激活独立环境,Python 锁 3.10 conda create -n gs python=3.10 -y conda activate gs # 装 PyTorch,cu118 对应 CUDA 11.8,别装成 cpu 版 pip install torch==2.0.1 torchvision==0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 验证 PyTorch 能否看到显卡 python -c "import torch; print(torch.__version__, torch.cuda.is_available())"最后一行必须输出True。如果输出False,先别往下走,八成是 PyTorch 装成了 CPU 版,或者 CUDA 与驱动不匹配。这一步没过就继续装 3DGS,后面编译扩展时一定失败,而且报错信息不会直接告诉你根因。
3. 拉代码、编子模块:3DGS 复现最容易卡住的一步
3.1 克隆仓库与子模块初始化
3DGS 的仓库里带了几个 C++/CUDA 子模块,必须递归拉取,否则编译时找不到头文件:
# 递归克隆,--recursive 不能省,否则子模块目录是空的 git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive cd gaussian-splatting # 如果克隆时忘了 --recursive,用这条补上 git submodule update --init --recursive子模块里最关键的是third_party/glm和submodules/diff-gaussian-rasterization。前者是数学库,后者是核心光栅化扩展。判断子模块拉全没有,看目录里有没有实际文件,空目录就是没拉到。
3.2 编译三个 CUDA 扩展
3DGS 需要编译三个扩展:diff-gaussian-rasterization、simple-knn、fused-ssim。按顺序装:
# 核心光栅化扩展,编译时间最长,出错概率最高 pip install submodules/diff-gaussian-rasterization # 最近邻搜索,用于初始化高斯点的尺度 pip install submodules/simple-knn # 可选,用于评估阶段的 SSIM 加速 pip install submodules/fused-ssim编译diff-gaussian-rasterization时如果报nvcc fatal: Unsupported gpu architecture 'compute_XX',说明你的显卡算力代号不在扩展默认支持的列表里。解决办法是设置环境变量指定算力,比如 3090 是8.6,4090 是8.9:
# 指定目标显卡算力,避免编译时算力不匹配 export TORCH_CUDA_ARCH_LIST="8.6" pip install submodules/diff-gaussian-rasterizationTORCH_CUDA_ARCH_LIST这个参数很多人不知道,它是 PyTorch 扩展编译时决定生成哪些算力机器码的关键。设错会导致编译通过但运行时 kernel 找不到,报no kernel image is available for execution。查自己显卡算力可以用nvidia-smi --query-gpu=compute_cap --format=csv。
3.3 验证扩展是否装好
装完别急着训练,先验证:
# 逐个 import,任何一个报错都要先解决 python -c "from diff_gaussian_rasterization import GaussianRasterizationSettings; print('rasterizer ok')" python -c "from simple_knn._C import distCUDA2; print('knn ok')"两个都打印 ok 才算环境通了。如果 import 时报undefined symbol,基本是 CUDA 版本和 PyTorch 编译时用的 CUDA 不一致,回到 2.2 节重新对齐版本,别试图靠重装碰运气。
4. 数据准备与训练:从 colmap 到第一个高斯模型
4.1 用 colmap 做稀疏重建
3DGS 训练需要一份 colmap 输出的稀疏点云作为高斯点的初始位置。热搜里colmap安装问得多,Ubuntu 上最省事的方式是用预编译包或 conda:
# 用 conda 装 colmap,避免源码编译一堆依赖 conda install -c conda-forge colmap -y # 验证 colmap -h拿到一组多视角照片后,标准流程是「特征提取 → 特征匹配 → 稀疏重建 → 导出」。命令行版:
# 1. 特征提取,--ImageReader.single_camera 1 表示所有图共用内参 colmap feature_extractor \ --database_path ./data/database.db \ --image_path ./data/images \ --ImageReader.single_camera 1 # 2. 特征匹配,照片少用 exhaustive,多了换 sequential 或 vocab_tree colmap exhaustive_matcher --database_path ./data/database.db # 3. 稀疏重建 mkdir -p ./data/sparse colmap mapper \ --database_path ./data/database.db \ --image_path ./data/images \ --output_path ./data/sparseexhaustive_matcher是两两匹配,照片超过一两百张会非常慢,这时候要换sequential_matcher(按拍摄顺序匹配)或基于词汇树的匹配。重建完在./data/sparse/0下应该有cameras.bin、images.bin、points3D.bin三个文件,缺任何一个说明重建失败,通常是照片重叠度不够或纹理太弱。
4.2 训练命令与关键参数
数据目录结构要符合 3DGS 的约定:data/下放images/和sparse/0/。然后起训练:
# 基础训练命令,-s 指定场景目录,-m 指定输出目录 python train.py \ -s ./data \ -m ./output/exp1 \ --iterations 30000 \ --eval几个真正影响结果的参数:
| 参数 | 默认 | 作用与调整建议 |
|---|---|---|
--iterations | 30000 | 训练轮数,显存小可降到 7000 先看效果 |
--eval | 关 | 开启后按 7:3 划分训练/测试,才能算 PSNR |
--resolution | 自动 | 显存不够时设-r 2降采样,速度翻倍 |
--densify_grad_threshold | 0.0002 | 控制高斯点增殖,调大点变少、显存降 |
--data_device | cuda | 数据放显存还是内存,显存紧可设 cpu |
显存不够是最常见的拦路虎。一张 24GB 的卡跑 1080p 场景基本够,12GB 的卡要么降--resolution,要么把--densify_grad_threshold调大抑制高斯点数量。别一上来就硬刚全分辨率,先用-r 4跑通流程,确认整条链路没问题再提分辨率。
4.3 看训练日志判断是否正常
训练启动后日志里会周期性打印 loss 和点数。正常情况:loss 从 0.1 量级快速下降,高斯点数从 colmap 的几万个逐步增殖到几十万甚至上百万。如果点数一直不涨,检查--densify_grad_threshold是不是设太大;如果点数爆炸增长导致 OOM,把它调小反而更糟,应该调大阈值或加--densify_until_iter限制增殖轮数。
5. 避坑与排查:那些让我重装三次系统的问题
5.1 现象:nvidia-smi 报错,驱动装完重启进不了桌面
原因:.run包安装时和系统自带的 nouveau 驱动冲突,或者装驱动时没禁用 nouveau。解决:进恢复模式,sudo apt purge nvidia*清干净,然后sudo bash NVIDIA-xxx.run --no-opengl-files重装,--no-opengl-files能避免覆盖系统 OpenGL 导致桌面起不来。热搜里ubuntu显卡驱动卸载不掉就是这个场景,卸载要连nvidia-dkms一起清。
5.2 现象:编译扩展报 GCC 版本不兼容
原因:CUDA 11.8 对 GCC 有上限要求,GCC 12 及以上会报unsupported GNU version。解决:装 GCC 11 并用update-alternatives切过去,或者编译时加-allow-unsupported-compiler(不推荐,可能生成错误代码)。Ubuntu 22.04 默认 GCC 11,一般不会遇到,遇到的多是手动升过 GCC 的机器。
5.3 现象:训练时 CUDA out of memory
原因:分辨率太高、高斯点增殖太猛、或者--data_device cuda把数据也塞进了显存。解决:按优先级依次尝试-r 2降分辨率、调大--densify_grad_threshold、把--data_device改成 cpu。注意--data_device cpu会拖慢训练,是最后手段。
5.4 现象:colmap 重建出的点云是空的
原因:照片之间重叠度不够,或者全是纯色/反光表面导致特征点提不出来。解决:拍摄时保证相邻照片 70% 以上重叠,避免大面积玻璃和纯白墙面。重建失败时先看 colmap 日志里注册成功的相机数量,少于总照片数一半基本就是拍摄问题,不是软件问题。
5.5 现象:训练完渲染结果有大量漂浮物
原因:colmap 稀疏点云里混入了背景噪点,3DGS 把它们也初始化成了高斯点。解决:在 colmap 里用model_analyzer看点的分布,或者训练时加--percent_dense控制点的密度阈值。更彻底的办法是重建后手动裁剪点云,只保留目标区域。
6. 进阶技巧:用 3DGS 做 SLAM 与自定义场景的验证方法
把基础流程跑通之后,很多人会往3dgs slam方向走,也就是用 3DGS 做在线建图与定位。这条路和离线重建的区别在于:位姿不再是 colmap 给的固定值,而是要在训练中联合优化。常见做法是把 3DGS 的可微渲染接到 SLAM 的跟踪线程里,用渲染损失反传梯度更新相机位姿。我一般会先在离线数据上验证渲染质量,确认高斯表示能拟合场景,再接入在线跟踪,否则两个变量一起调根本不知道是谁的问题。
验证一个 3DGS 复现是否成功,别只看渲染图好不好看,要看三个量化指标:PSNR、SSIM、LPIPS。跑评估:
# 训练时开了 --eval 才能跑评估,输出三个指标 python render.py -m ./output/exp1 python metrics.py -m ./output/exp1metrics.py会打印每个测试视角的 PSNR/SSIM/LPIPS 和平均值。参考量级:合成数据集(比如 NeRF 的 blender 场景)PSNR 能到 30 以上,真实场景(Mip-NeRF 360)一般 25 上下。如果你的结果比这个低一大截,先别怀疑算法,回头查 colmap 位姿准不准——位姿误差会直接毁掉渲染质量,这是最隐蔽的坑。
自定义场景想快速验证,我有个习惯:先用手机拍 30 到 50 张环绕照片,colmap 重建后拿-r 4低分辨率跑 7000 轮,十分钟内就能看出这套数据能不能用。能用再上全分辨率 30000 轮。这个「先粗后精」的习惯帮我省了无数次白等一晚上的时间。3DGS 这个方向现在生态还在快速变,代码和依赖版本随时可能变,把环境版本锁死、把流程脚本化,比追最新版重要得多。希望帮到你。
本文还有配套的精品资源,点击获取