diff-gaussian-rasterization 二次编译复现记录——PyTorch 2.4.0cu124 × CUDA 12.6 × FaceLift 项目环境本文是 Windows 11 下编译 diff-gaussian-rasterization 完整踩坑记录——PyTorch 2.7.1cu126 × CUDA Toolkit 13.1 × RTX 3090 的姊妹篇。记录在另一个全新 venv 环境中FaceLift 项目用不同的 PyTorch CUDA 版本组合重新编译 diff-gaussian-rasterization 的完整过程。核心发现选对 CUDA Toolkit 版本比修改源码更重要。上次需要 patchcpp_extension.py绕过版本检查这次只需switch-cuda 12.6一条命令即可编译通过——因为 PyTorch cu124 对 CUDA 12.6 只产生 Warning不再报致命错误。https://github.com/ashawkey/diff-gaussian-rasterizationhttps://github.com/weijielyu/FaceLift一、与上次编译的关键差异对比上次ComfyUI 环境本次FaceLift 环境项目位置H:\PythonProjects3\Win_ComfyUI\J:\PythonProjects4\FaceLift\Python3.12.113.12.x同版本 venvPyTorch2.7.1cu126torch.version.cuda12.62.4.0cu124torch.version.cuda12.4实际编译用的 CUDA Toolkit13.1 → 需 patch cpp_extension.py12.6 → 无需 patch仅 Warning是否修改 cpp_extension.py是绕过_check_cuda_version否diff-gaussian-rasterization 来源git clone 手动配 GLM从上次成功目录复制含 GLMVS 版本VS 2022 Professional v17.12.17VS 2022 Professional v17.12.19CUDA 切换方式PowerShellSwitch-CUDACMDswitch-cuda.bat二、成功编译的完整环境清单这是经过验证的可复现环境缺一不可2.1 系统与硬件Windows 11NVIDIA RTX 3090sm_86显卡驱动595.022.2 编译工具链Visual Studio 2022 Professional v17.12.19MSVC v14.42.34444cl.exe for x64必须在VS 2022 Developer Command Prompt中操作Windows SDK 10.0.26100.0CUDA Toolkit 12.6V12.6.85通过switch-cuda.bat 12.6切换含内嵌 cuDNN 8.xninja通过pip install ninjaPyTorch cpp_extension 自动调用2.3 Python 环境Python 3.12.xvenv 虚拟环境PyTorch 2.4.0cu124setuptools已含 bdist_wheel 支持2.4 源码依赖diff-gaussian-rasterizationgraphdeco-inria/diff-gaussian-rasterizationGLM 数学库已放置于diff-gaussian-rasterization/third_party/glm/GLM 的准备方法请参见上篇文章。本次直接复用了上次编译成功的目录含 GLM省去了重新配置的步骤。如果你是首次编译必须先准备 GLMcd diff-gaussian-rasterization\third_party git clone https://github.com/g-truc/glm.git三、编译全过程3.1 第一次尝试CUDA 13.1 → 失败在 VS 2022 Developer Command Prompt 中系统默认 CUDA 版本为 13.1set DISTUTILS_USE_SDK1 set MSSdk1 python setup.py bdist_wheel立即报错RuntimeError: The detected CUDA version (13.1) mismatches the version that was used to compile PyTorch (12.4). Please make sure to use the same CUDA versions.错误根因PyTorch 2.4.0cu124 编译时使用的是 CUDA 12.4而系统默认 nvcc 是 13.1。cpp_extension.py中_check_cuda_version()检测到主版本号差异13 vs 12直接raise RuntimeError阻止编译。3.2 CMD 中切换 CUDA 版本这里正是我们刚开发的 CMD 版switch-cuda.bat发挥作用的地方。但在 VS Developer Command Prompt 中doskey宏可能未加载因为 VS 的启动脚本不走cmd-init.bat的 AutoRun所以需要用全路径调用D:\Program\switch-cuda.bat 12.6输出[OK] Switched to CUDA 12.6 CUDA : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6 CUDA x64 : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\bin\x64 cuDNN : C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\bin Cuda compilation tools, release 12.6, V12.6.85切换后验证编译器就位where cl :: D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.42.34433\bin\Hostx64\x64\cl.exe3.3 清理旧的 build 目录因为是从上次编译的目录复制过来的build/目录里残留着上次环境PyTorch 2.7.1cu126的编译产物直接用会导致链接时符号不匹配。必须清理rd /s /q build rd /s /q dist rd /s /q diff_gaussian_rasterization.egg-info3.4 第二次尝试CUDA 12.6 → 成功set DISTUTILS_USE_SDK1 set MSSdk1 python setup.py bdist_wheel这次_check_cuda_version()检测到 CUDA 12.6 vs PyTorch cu12412.4只产生Warning而非致命错误UserWarning: The detected CUDA version (12.6) has a minor version mismatch with the version that was used to compile PyTorch (12.4). Most likely this shouldnt be a problem.编译正常推进5 个编译单元全部通过[1/5] nvcc ... forward.cu → forward.obj ✓warning #177-D 无害 [2/5] nvcc ... backward.cu → backward.obj ✓warning #177-D 无害 [3/5] cl ... ext.cpp → ext.obj ✓ [4/5] nvcc ... rasterizer_impl.cu → rasterizer_impl.obj ✓ [5/5] nvcc ... rasterize_points.cu → rasterize_points.obj ✓链接阶段link.exe ... /OUT:_C.cp312-win_amd64.pyd 正在创建库 ... _C.cp312-win_amd64.lib 已完成代码的生成最终产出 wheelcreating dist\\diff_gaussian_rasterization-0.0.0-cp312-cp312-win_amd64.whl3.5 安装验证安装pip install dist\diff_gaussian_rasterization-0.0.0-cp312-cp312-win_amd64.whl --force-reinstall :: Successfully installed diff-gaussian-rasterization-0.0.0验证python -c import diff_gaussian_rasterization; print(✅ 安装成功)四、PyTorch 版本检查机制详解这次编译最关键的认知是理解cpp_extension.py中_check_cuda_version()的判断逻辑PyTorch cu版本 实际 nvcc 版本 主版本号差异 结果 ───────────── ────────────── ────────── ──────────── 12.4 13.1 13≠12 → 大 RuntimeError致命 12.4 12.6 1212 → 小 UserWarning可忽略 12.6 13.1 13≠12 → 大 RuntimeError致命 12.6 12.6 1212 → 无 无任何提示规则总结只要 nvcc 主版本号与 PyTorch 编译时的 CUDA 主版本号一致就只会产生 Warning。这意味着PyTorch cu124 → 用 CUDA 12.x 的任何小版本都行12.4/12.6/12.8/12.9PyTorch cu126 → 同上但任何 12.x PyTorch 都不能直接用 CUDA 13.x 编译除非 patch 源码这就是为什么上次cu126 CUDA 13.1需要修改cpp_extension.py而这次cu124 CUDA 12.6完全不需要。五、编译过程中的 Warning 说明编译通过但产生了几个 Warning均无害5.1 CUDA 小版本 WarningUserWarning: The detected CUDA version (12.6) has a minor version mismatch with the version that was used to compile PyTorch (12.4).无害。同一主版本号内的 CUDA Toolkit 二进制兼容。5.2 TORCH_CUDA_ARCH_LIST 未设置UserWarning: TORCH_CUDA_ARCH_LIST is not set, all archs for visible cards are included for compilation.无害。PyTorch 自动检测到 RTX 3090 并使用compute_86,codesm_86编译产物只适用于 Ampere 架构RTX 30 系列但对我们来说这正是需要的。如果想加速编译或明确指定set TORCH_CUDA_ARCH_LIST8.65.3 variable p_proj was declared but never referencedauxiliary.h(151): warning #177-D: variable p_proj was declared but never referenced无害。diff-gaussian-rasterization 原始代码中的未使用变量不影响功能。5.4 setup.py install is deprecatedSetuptoolsDeprecationWarning: setup.py install is deprecated.无害。setuptools 的弃用提醒不影响 wheel 生成。5.5 Py_DEBUG is unsetRuntimeWarning: Config variable Py_DEBUG is unset, Python ABI tag may be incorrect无害。使用非调试版 Python 时的正常提示。六、从复制目录编译的注意事项如果你和我一样把之前编译成功的 diff-gaussian-rasterization 目录复制到新项目使用有几点必须注意6.1 必须清理 build 目录旧的build/目录里的.obj和.pyd是在旧环境不同的 PyTorch 版本、不同的 CUDA 版本下编译的符号表和 ABI 都可能不匹配。不清理直接编译可能链接失败符号未定义编译成功但 import 时 crashrd /s /q build dist diff_gaussian_rasterization.egg-info6.2 GLM 可以直接复用third_party/glm/是纯头文件数学库不含编译产物跨环境复用没有任何问题。6.3 源码不需要修改diff-gaussian-rasterization 的.cu/.cpp/.h源码是通用的不需要为不同环境修改。所有适配工作都在编译环境CUDA 版本、环境变量层面完成。七、PyTorch 离线安装技巧由于网络原因pip install torch2.4.0 ... --index-url https://download.pytorch.org/whl/cu124可能超时失败。解决方法是先获取 wheel URL用 IDM 等下载工具下载到本地再本地安装:: 1. 先尝试 pip install从报错或日志中获取 wheel 下载地址 pip install torch2.4.0 --index-url https://download.pytorch.org/whl/cu124 -v :: 2. 用 IDM / aria2 等工具下载 torch wheel 到本地 :: 例如下载 torch-2.4.0cu124-cp312-cp312-win_amd64.whl :: 3. 本地安装 torch其余依赖走 pip 在线 pip install 本地路径\torch-2.4.0cu124-cp312-cp312-win_amd64.whl torchvision0.19.0 torchaudio2.4.0 --index-url https://download.pytorch.org/whl/cu124安装后验证python -c import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available()) :: 2.4.0cu124 12.4 True八、一键编译脚本CMD 版将编译步骤封装为 batch 脚本方便日后复现echo off chcp 65001 nul 21 setlocal REM diff-gaussian-rasterization 编译脚本CMD 版 REM 前提在 VS 2022 Developer Command Prompt 中运行 REM 前提已安装好 Python venv PyTorch REM 1. 切换 CUDA 版本匹配 PyTorch 主版本号 call D:\Program\switch-cuda.bat 12.6 REM 2. 设置编译环境变量 set DISTUTILS_USE_SDK1 set MSSdk1 set TORCH_CUDA_ARCH_LIST8.6 REM 3. 清理旧构建 if exist build rd /s /q build if exist dist rd /s /q dist if exist diff_gaussian_rasterization.egg-info rd /s /q diff_gaussian_rasterization.egg-info REM 4. 编译 python setup.py bdist_wheel REM 5. 安装 for %%f in (dist\*.whl) do pip install %%f --force-reinstall endlocal九、完整决策树应对不同 PyTorch × CUDA 组合开始编译 diff-gaussian-rasterization │ ├─ 检查 PyTorch 的 CUDA 版本 → python -c import torch; print(torch.version.cuda) │ 得到 X.Y如 12.4 │ ├─ 检查系统 nvcc 版本 → nvcc --version │ 得到 A.B如 13.1 │ └─ X 和 A 的主版本号相同 │ ├─ 是 (如 12.4 vs 12.6) → 直接编译忽略 Warning │ └─ 否 (如 12.4 vs 13.1) → 两条路 │ ├─ 路线 A推荐switch-cuda 切换到 12.x 版本 │ switch-cuda 12.6 → 再编译 │ └─ 路线 B修改 cpp_extension.py 将 _check_cuda_version 中的 raise RuntimeError 改为 warnings.warn → 再编译 详见上篇文章十、总结维度结论最省事的方式switch-cuda切到与 PyTorch cu版本同主版本号的 CUDA免改源码能复用什么源码目录含 GLM可跨环境复用但 build/ 必须清理不需要修改的diff-gaussian-rasterization 源码、cpp_extension.py前提是 CUDA 主版本号匹配必须设置的变量DISTUTILS_USE_SDK1、MSSdk1必须在哪里编译VS 2022 Developer Command Prompt确保 cl.exe 在 PATH 中无害的 WarningCUDA minor mismatch、TORCH_CUDA_ARCH_LIST、p_proj unused、setup.py deprecated、Py_DEBUG unset系列文章索引1. Windows 多版本 CUDA cuDNN 环境配置完全指南2. Windows CMD 多版本 CUDA cuDNN 一键切换管理方案3. Windows 11 下编译 diff-gaussian-rasterization 完整踩坑记录首次编译4. 本文diff-gaussian-rasterization 二次编译复现记录不同环境复现FaceLift 项目运行测试