gsplat这个词,玩3D重建和神经渲染的人应该不陌生。它是3D Gaussian Splatting(3D高斯泼溅)最主流的CUDA实现库,用一句话概括:给你一组围绕某个场景拍摄的照片,它能重建出一个可以实时渲染的3D模型,速度比传统NeRF快一个量级。官方生态里Linux环境基本开箱即用,但到了Windows本地部署这一步,网上能搜到的完整教程不算多,踩坑的人倒是不少。
这篇文章就讲我在Windows上把gsplat从零跑通的全过程,包括环境怎么准备、编译怎么过、踩过哪些坑、最后怎么验证它能真正干活。适合三类人:想在Windows工作站上做3DGS实验的研究生、做三维重建落地的工程师、还有想本地体验神经渲染但不想碰Linux的玩家。我不会去复述官方文档,只讲实际部署中真正卡人的细节。
我建议你把这篇文章当作一条完整的操作路径,先从第一章了解自己要装的东西,再逐步照着第二章到第四章执行。每个步骤我都标注了"我为什么会这么选",这样即使版本更新、命令变了,你也有能力自己调整。
1. gsplat是什么:先搞懂你手上要装的东西
1.1 从NeRF到3DGS:这个库到底解决了什么问题
3D Gaussian Splatting是2023年火起来的场景表示方法。它不像NeRF那样用神经网络去隐式拟合一个场,而是直接用成千上万个3D高斯分布来表示场景。每一个高斯都有自己的一组参数:中心位置、协方差(由缩放和旋转得到)、不透明度、颜色。训练时优化这些参数,渲染时把高斯投影到2D图像平面上,按深度排序后做alpha blending,一帧画面就出来了。
gsplat就是这套流程的CUDA实现库,由nerfstudio团队维护,底层是C++和CUDA,对外提供Python API。它火起来的原因非常实在:NeRF渲染一张高分辨率图可能要几十毫秒到几百毫秒,3DGS在消费级显卡上能跑到实时帧率;训练时间也从原来的小时级缩短到分钟级。配合nerfstudio生态,从拍摄到出成果的链路变得非常短。
我在实际使用中最直观的感受是:同一组数据,用gsplat训练30000步出来的效果,已经能接近甚至超过很多NeRF方法训10万步的结果。这也是为什么这个库在三维重建、自动驾驶仿真、数字人等领域迅速铺开。理解这一点,你就知道部署gsplat不是在装一个普通的Python包,而是在给整个3DGS训练管线搭台子。
1.2 为什么Linux顺滑,Windows却要折腾一圈
gsplat的官方CI和预编译产物主要面向Linux,Windows的预编译wheel经常缺失或滞后。原因在于库内含大量自定义CUDA算子,安装时需要用nvcc把C++/CUDA源码编译成当前显卡能跑的机器码。Windows下的工具链比Linux要复杂:编译器要用MSVC,CUDA路径要配环境变量,PyTorch的CUDA绑定版本还要和nvcc对得上,任何一个环节出了偏差就会编译失败。
从个人经验看,Windows部署gsplat的典型失败场景,十次里有八次出在环境依赖上,而不是库本身。比如找不到cl.exe、nvcc不在PATH里、PyTorch装了CPU版本、CUDA_HOME没有配置,这些问题和gsplat代码本身没关系,但足以把一个下午耗光。
那为什么还要在Windows本地部署?我的理由是:第一,不用装双系统或开虚拟机,直接在熟悉的系统里干活;第二,很多同学的主力机就是Windows加一块NVIDIA显卡,本地能跑通了迭代效率高很多;第三,gsplat的训练和渲染在单卡Windows环境下完全够用,不必什么实验都往服务器上丢。看清楚这一点,你就明白折腾环境是值得的。
1.3 部署前先理清依赖链:从Python到CUDA再到编译器
安装gsplat不是一个孤立的pip install,它依赖一整条链,我习惯把它记为几个环节:
- Python解释器(3.10或3.11)
- CUDA Toolkit(用于nvcc编译)
- Visual Studio C++ Build Tools(提供MSVC编译器)
- PyTorch(必须带正确的CUDA运行时)
- 最后才是gsplat本身
这条链的每一环都有版本匹配问题。PyTorch编译时用到的CUDA版本、gsplat源码编译时用到的nvcc版本、以及运行时显卡驱动支持的CUDA版本,三者之间不完全一致也会出问题。因此第一章末尾我先给你一个操作原则:所有组件尽量选"当前主流稳定版本",不要追新。我在部署时用的组合是Python 3.10 + CUDA 12.1 + PyTorch 2.1(cu121)+ MSVC v143,这个组合在官方的兼容矩阵里都有对应支持,踩坑概率最小。
2. 环境准备:把四块地基一块块砸实
2.1 先看硬件和驱动:别急着敲命令
开始之前,先在终端里执行nvidia-smi看一下显卡信息。重点看右上角的Driver Version和CUDA Version。这里有个经典误区:nvidia-smi显示的CUDA Version不是你已经装了CUDA Toolkit,而是驱动最高支持的CUDA版本。比如它显示CUDA Version: 12.2,意思是你最多能装12.2及以下的Toolkit,并不代表已经装好了。
我建议先用GPU-Z或者任务管理器确认显卡型号和显存。显存大小直接决定你能处理的数据规模,8GB显存跑30张图的场景问题不大,跑100张以上的高分辨率图就会紧张。驱动最好保持在较新版本,NVIDIA官方每个月都有更新,如果驱动太老,CUDA 12.x直接不支持。
确认完硬件之后,还要看一眼Windows系统的版本。Win10 21H2以上、Win11都可以,太老的Win10版本在装Build Tools和CUDA时可能出现兼容性报错。如果条件允许,我建议把系统更新到最新再开始,能省掉不少莫名其妙的麻烦。
2.2 Miniconda隔离环境:Python版本怎么选才不出岔子
我强烈建议用Miniconda来管理环境,而不是直接用系统Python。原因很实际:gsplat依赖的PyTorch、numpy、opencv等包版本比较敏感,conda能为每个项目隔离出独立的Python环境,切换项目不打架。Miniconda装完之后,打开Anaconda Prompt,执行:
conda create -n gsplat python=3.10 -y conda activate gsplatPython版本选择上,3.10是我的首选。3.8和3.9对某些较新版本的PyTorch和gsplat支持不完整,3.12虽然能用,但不少依赖包(尤其是torchvision和opencv)在3.12上的wheel更新滞后,容易出现装不上的情况。选择3.10,你会在后面的安装中少踩至少一半的坑。
环境建好之后,顺手把pip升级到最新版,python -m pip install --upgrade pip。这一步很多人忽略,但旧版pip在解析带--index-url的安装源时表现不稳定,升级能规避一些莫名其妙的下载错误。另外,整个安装过程中所有命令都在conda激活后的终端里执行,不要换终端窗口,不然环境变量容易丢失。
2.3 CUDA Toolkit安装:版本匹配才是关键
gsplat编译必须要CUDA Toolkit,因为它要用nvcc来编译CUDA算子。去NVIDIA官网下载对应版本的Toolkit安装包,我这里选的是CUDA 12.1.1。下载安装时注意几个地方:安装类型选自定义,不要选精简;组件里建议不要勾选Visual Studio Integration(除非你后面还要用VS开发CUDA程序),其他的默认保留即可。
安装路径建议保持默认:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1。装完后CUDA不一定自动加入PATH,你需要手动配置环境变量。在系统环境变量里新增:
CUDA_HOME=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1- Path里追加
%CUDA_HOME%\bin和%CUDA_HOME%\libnvvp
之后重新打开终端,执行nvcc -V,如果能看到Cuda compilation tools的版本信息,说明CUDA Toolkit就位了。这里再提醒一次:nvidia-smi显示的CUDA版本和nvcc -V显示的版本不是一回事,前者看驱动支持,后者看实际安装的Toolkit,两个都要确认。
2.4 Visual Studio Build Tools:百分之八十失败的根源所在
这是Windows部署gsplat最容易翻车的一环。gsplat的C++代码用MSVC编译,编译器由Visual Studio Build Tools提供,注意它不是MinGW,也不是Miniconda里自带的什么编译器。去Visual Studio官网下载Build Tools安装器,在"工作负载"里勾选"使用C++的桌面开发",右边详细信息里确认包含"MSVC v143 - VS 2022 C++ x64/x86生成工具"和"Windows 11 SDK"。
装这个组件比较耗时,大概要下载2到4GB,取决于你勾选的选项。装完后不需要安装完整的Visual Studio IDE,Build Tools已经够用。很多人在这里犯的错误是:装了社区版VS但没选C++工作负载,或者装了Build Tools但忘记勾选Windows SDK,结果编译时找不到windows.h。
验证是否装好:在开始菜单找到"x64 Native Tools Command Prompt for VS 2022",打开后执行cl,能看到编译器版本信息就说明MSVC可用。注意,普通终端里是没有cl.exe的,你需要么在VS的命令行里操作,么把MSVC路径手动加到PATH,但更简单的做法是:后续所有编译操作都在这个VS命令行里先conda activate gsplat,再执行编译命令。
2.5 PyTorch安装:CPU版本是隐形大坑
PyTorch的安装是另一个高发问题点。很多人直接pip install torch,结果装到的是CPU版本,运行gsplat时直接报CUDA不可用。正确做法是去PyTorch官网用对应的index-url安装:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121这里cu121代表CUDA 12.1版本。装完后在Python里验证:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.version.cuda)如果torch.cuda.is_available()返回True,说明PyTorch的CUDA绑定已经正常工作。这一步务必确认后再继续,否则后面gsplat编译出来也会因为CUDA版本不一致而出各种怪问题。我在第一次装的时候就是忽略了这一点,结果编译本身成功了,但一跑train.py就报CUDA error,白白排查了半天。
3. 安装gsplat:一条快速路,一条源码路
3.1 快速路线:pip直装能成最好
环境准备齐全后,第一步尝试最省事的方式:
pip install gsplat如果你的Python版本、CUDA版本恰好和pypi上的预编译wheel匹配,这一步直接完成,几分钟后就能import。但坦白讲,在Windows上能走到这步的概率并不高,gsplat的官方wheel主要覆盖Linux,Windows上的wheel要么缺失、要么版本落后。如果pip直接拉到了source tarball开始编译,那你前面搭的编译链就派上用场了,它会自动调用nvcc和cl.exe。
如果pip install时下载很慢或者一直卡住,可以加国内镜像源,比如-i https://pypi.tuna.tsinghua.edu.cn/simple。但注意:镜像源镜像的是pypi上的包,不会影响PyTorch那个自定义源。如果pip安装过程中报错,不要慌,直接跳到下面的源码路线,很多环境问题在源码编译时暴露得更清晰。
3.2 源码路线:自己编译的几种好处
我推荐直接走源码编译路线,不是因为它更简单,而是它更可控、也更容易排查问题。把仓库克隆到本地:
git clone https://github.com/nerfstudio-project/gsplat.git cd gsplat pip install -e .pip install -e .实际上做了几件事:先检测环境里的CUDA路径,然后调用setuptools执行setup.py,其中会编译大量CUDA算子,最后把编译好的扩展安装成可编辑包。所谓"可编辑",意思是你改了源码里的Python文件,不用重新安装就能生效,这对后面调试和学习源码非常有帮助。
首次编译会花不少时间。我实测在i5-12400 + RTX 3060的机器上,完整编译大约需要10到15分钟,期间看到一堆nvcc -O3开头的编译命令滚屏幕,这是正常的。如果编译中途报错,先记录错误类型,下面第四章我会整理最常见的几类。整个编译过程结束后,看到类似"Successfully installed gsplat"的提示就成功了。
3.3 安装成功不等于能用:先跑通一个验证脚本
很多人在这一步急于去跑训练Demo,我建议先花两分钟跑一个最简化的光栅化验证脚本,确认核心算子是通的。脚本如下:
import torch import gsplat dev = "cuda:0" # 生成100个随机的高斯球 N = 100 means = torch.rand(N, 3, device=dev) * 2.0 - 1.0 scales = torch.rand(N, 3, device=dev) * 0.1 quats = torch.randn(N, 4, device=dev) quats = quats / quats.norm(dim=-1, keepdim=True) opacities = torch.rand(N, device=dev) colors = torch.rand(N, 3, device=dev) # 一个简单的透视相机 viewmats = torch.eye(4, device=dev).unsqueeze(0) Ks = torch.tensor([[[100.0, 0.0, 50.0], [0.0, 100.0, 50.0], [0.0, 0.0, 1.0]]], device=dev) renders, alphas, meta = gsplat.rasterization( means=means, scales=scales, quats=quats, opacities=opacities, colors=colors, viewmats=viewmats, Ks=Ks, width=100, height=100, ) print("渲染输出shape:", renders.shape) print("alpha shape:", alphas.shape)如果输出类似于renders.shape: torch.Size([1, 100, 100, 3]),说明gsplat的CUDA光栅化算子已经能跑通,部署算是成功了。这里要注意:不同gsplat版本的函数参数名可能有细微变化,比如旧版本用viewmat而新版本用viewmats,如果报TypeError,用python -c "import gsplat; help(gsplat.rasterization)"查一下当前版本的签名就行。
3.4 用真实图片跑一次完整重建流程
验证算子是第一步,真正有意义的是跑通一个完整的3DGS训练流程。官方仓库的examples目录下提供了train.py,你可以用手机绕着一个物体(比如一个毛绒玩具、一个石膏摆件)拍30到50张照片,导出到一个文件夹里。
数据集预处理是关键:3DGS需要知道每张照片的相机位置和内外参,通常用COLMAP来估计。Windows下安装COLMAP最简单的方式是直接从GitHub的Release页下载exe安装包。安装后,在数据集目录下跑特征提取和匹配,会生成sparse/0/文件夹。如果你嫌COLMAP命令行麻烦,可以先用官方示例里自带的datasets/下的预处理数据跑通,后面再尝试自己的数据。
训练命令:
python examples/train.py --data path/to/your/dataset --steps 30000训练过程中终端会打印loss和PSNR指标。我第一次跑的时候用的是一组35张照片的毛绒玩具数据集,在RTX 3060上约30分钟完成30000步,最终渲染出的新视角视频效果相当惊艳。这里再给一个实用建议:训练时的--data_factor 2参数可以先用起来,它会先把图片降分辨率,训练速度提升明显,适合环境验证阶段用。
4. 踩坑实录:这些问题我基本都遇到过
4.1 error: Microsoft Visual C++ 14.0 is required
这个报错属于"教科书级"错误了。出现原因很简单:编译环境里找不到MSVC编译器。排除思路如下:先确认Build Tools装没装,装了的话确认安装时勾选了"使用C++的桌面开发",然后确认你是在VS的命令行终端(x64 Native Tools Command Prompt)里执行安装命令。
如果Build Tools装好了还是报这个错,多半是conda环境的PATH覆盖了系统Path。在终端里执行where cl,如果找不到cl.exe,就去Build Tools的安装目录手动确认一下,常见路径是C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\版本号\bin\Hostx64\x64。把这个路径临时加进当前终端的PATH里再进行编译,报错就会消失。
4.2 nvcc身份谜团:找不到CUDA编译器
另一种高频报错是nvcc: 未找到命令或者CUDA_HOME is not set。这种情况大多不是CUDA没装,而是环境变量没生效。在终端里设置:
set CUDA_HOME=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1 set PATH=%CUDA_HOME%\bin;%PATH%然后用nvcc -V验证。确认能输出版本信息后再重新执行pip install -e .。这里要注意:每次新开终端都可能会丢失手动set的变量,所以我建议直接把这个设到用户环境变量里,一劳永逸。另外,在cmd里设置环境变量用set,在PowerShell里要用$env:CUDA_HOME="...",别搞混了。
4.3 PyTorch和CUDA版本不对齐:训练时炸出CUDA error
编译成功后,运行时却报CUDA error: invalid device function或者no kernel image is available for execution on the device。这个错误几乎可以锁定为PyTorch的CUDA版本和gsplat编译时用的CUDA版本不一致,或者显卡算力不在编译目标里。
处理方法分两步:第一步,确认PyTorch版本里自带的是哪个CUDA,运行torch.version.cuda;第二步,确认gsplat编译时用的nvcc版本,运行nvcc -V。两者应该一致。如果PyTorch是cpu版本,卸载重装对应cu121版本。第二个处理方法是检查显卡算力,比如RTX 3060是compute_86,RTX 4090是compute_89,如果设置了TORCH_CUDA_ARCH_LIST环境变量,要确保里面包含你的显卡算力值,或者干脆删掉这个环境变量让库自动检测。
4.4 LNK1104: cannot open file 'python310.lib'
源码编译时遇到LNK1104是典型的链接器找不到Python库。常见原因是conda环境路径包含中文或空格,导致编译器在解析lib路径时出错。解决方法:第一,装Miniconda时选择纯英文路径,比如D:\miniconda;第二,环境名也用纯英文。如果路径没问题还报错,手动把Python的lib目录加进LIB环境变量:
set LIB=D:\miniconda\envs\gsplat\libs;%LIB%不同的Python版本对应的lib文件名不同,3.10就找python310.lib,3.11找python311.lib。用where python确认当前环境下Python的安装位置,再根据实际路径调整上面的命令。
4.5 import gsplat后的各种运行时怪问题
有一个现象是:编译安装成功了,import gsplat也不报错,但调用gsplat.rasterization时报AttributeError: module 'gsplat' has no attribute ...。这种多半是包版本和API不匹配。旧版本gsplat的调用方式和现在差异不小,比如旧版用gsplat.rasterization但参数可能叫viewmat不是viewmats,新版可能还加了rasterization的额外参数如near_plane、far_plane。
如果源码编译时某个算子编译失败,但setup.py没有正确报错退出,最终生成的包可能不完整。这种情况重新执行一次干净编译,并加--no-cache-dir参数:
pip install -e . --no-cache-dir编译过程中留意最后的日志里有没有error关键字。理论上setuptools只要发现编译错误就会退出,但Windows上偶尔会有子进程闪退不报错的情况,干净重编是有效的排查手段。
4.6 高频问题速查表
| 问题现象 | 最可能原因 | 解决动作 |
|---|---|---|
| pip install gsplat 下载很慢 | 网络问题 | 加清华源-i https://pypi.tuna.tsinghua.edu.cn/simple |
| 编译时找不到cl.exe | MSVC未安装或未生效 | 安装Build Tools,用VS终端操作 |
| nvcc不是内部或外部命令 | CUDA环境变量未配置 | 设置CUDA_HOME并把%CUDA_HOME%\bin加入PATH |
| torch.cuda.is_available()返回False | 装了CPU版PyTorch | 卸载后重新用cu121源安装 |
| 训练时报CUDA error | PyTorch/CUDA/显卡算力不匹配 | 统一版本,检查TORCH_CUDA_ARCH_LIST |
| LNK1104: cannot open python310.lib | 路径含中文/空格或Python库路径丢失 | 用纯英文路径,手动设置LIB |
| import后找不到rasterization属性 | API版本不一致或编译不完整 | 查函数签名,干净重编译 |
| 训练时显存不足 | 数据分辨率太高或图像太多 | 用--data_factor 2降采样,减小批次 |
5. 跑起来之后:实测数据与参数调节参考
5.1 几台不同显卡的实测训练耗时
部署成功只是开始,接下来你可能关心的是:我的显卡跑这个库到底要多久?这里给出我自己的几组实测数据,全部来自Windows环境,gsplat版本1.4.0,数据是同一组42张图的室内场景,图像分辨率约1600×1200:
| 显卡 | 显存 | 迭代步数 | 训练耗时 | 备注 |
|---|---|---|---|---|
| RTX 3060 | 12GB | 20000 | 约35分钟 | 分辨率降到800×600时约15分钟 |
| RTX 4070 Laptop | 8GB | 20000 | 约25分钟 | 显存紧张,需要data_factor=2 |
| RTX 4090 | 24GB | 30000 | 约18分钟 | 全分辨率无压力 |
这里有个经验:图像分辨率对训练时间的影响不是线性的。分辨率每翻一倍,高斯投影的像素填充量可能变成三到四倍,耗时也跟着暴涨。所以当你只是想验证一个想法时,先用低分辨率跑通流程,再上全分辨率出最终效果。
5.2 影响训练效果和速度的关键参数
--iterations/--steps:官方常用30000步,但如果你只是快速确认效果,10000步也能看出大趋势。步数太多后期loss基本不再下降,纯属烧时间。--data_factor:1、2、4三档,表示图像降采样倍数。显存小的机器建议直接上2,速度能快一倍以上,画质损失在可接受范围内。--sh_degree:球谐阶数,默认3。值越大颜色表现越细腻,但训练和渲染都更慢,不是所有场景都需要高阶梯。--density_reg:密度正则化权重,控制点云的稀疏程度。如果你的重建结果出现大量漂浮物(floaters),适当调大这个值能明显改善。
调参时的基本原则是:一次只动一个变量。很多新手喜欢同时改好几个参数,一旦效果变差根本不知道是哪个参数引起的。我先改data_factor观察速度和显存变化,再调steps观察质量曲线,每一步都记录,最终形成一个可复现的配置。
最后分享一点我个人的体会。gsplat在这个部署上,卡住人的地方从来不是gsplat本身,而是依赖链上任何一环的不对齐:编译器、CUDA、PyTorch、Python版本,哪个歪了都白搭。我第一次装的时候,就栽在Visual Studio Build Tools只装了IDE没装C++工作负载上,硬生生花了一个下午才排查出来。后来把流程梳理成标准步骤后,在另一台新机器上只花40分钟就完成了从零部署。
如果看完这篇文章你依旧遇到问题,我建议先退回第二章重来一遍,把环境变量、编译器、CUDA版本这三个点重新检查一遍,90%的问题都出在这三个点上。后续想深挖的话,推荐把gsplat源码里的CUDA kernel读一遍,看看作者是怎么优化光栅化的内存访问和并行调度,这比只会跑demo有意思多了。