GaussianGPT(3D 高斯自回归场景生成)复现记录
GaussianGPT(3D 高斯自回归场景生成)复现记录
环境搭建、依赖排错、官方权重、推理测试与生成过程可视化
复现平台:Linux,4× RTX 4090 24 GB(使用第 4 张卡)
整理日期:2026 年 8 月 9 日
1. 复现结论
最终已经完整跑通:
- PyTorch、gsplat、FlashAttention、PyTorch3D、MinkowskiEngine 均可在 RTX 4090 上执行 CUDA 运算。
- 两份官方 3D-FRONT 权重校验一致并能正常加载。
- 单场景自回归采样成功。
- 已额外实现 10%~100% 的生成过程快照和 GIF 动画。
| 项目 | 最终状态 |
|---|---|
| CUDA / PyTorch | CUDA 12.9;PyTorch 2.8.0+cu129;RTX 4090 可用 |
| 核心扩展 | gsplat、FlashAttention 2.8.2、PyTorch3D 0.7.8、MinkowskiEngine CUDA 均通过 |
| 官方权重 | VQ-VAE 约 2.0 GB、GPT 约 3.2 GB;SHA256 与官方一致 |
| 生成测试 | 1 个场景约 72.52 秒;生成长度 3948 tokens |
| 过程可视化 | progress_010.png 至 progress_100.png,并合成为 generation_process.gif |
2. GaussianGPT 原理
GaussianGPT 不是扩散模型。它先把 3D Gaussian 场景离散化,再像语言模型预测下一个词一样,逐 token 生成场景。
| 阶段 | 作用 | 本次对应内容 |
|---|---|---|
| 3D Gaussian 表示 | 用位置、尺度/旋转、透明度和颜色/球谐系数表达场景 | 最终由 Gaussian Splatting 渲染 |
| VQ-VAE 编码 | 把连续高斯原语压缩成离散潜在网格和 token | vqvae_vfront.ckpt |
| 自回归 GPT | 因果 Transformer 根据已有 token 预测下一个 token | gpt_vfront.ckpt;temperature、top_p 控制采样 |
| VQ-VAE 解码 | 把生成 token 还原为显式 3D 高斯 | 生成最终场景或阶段快照 |
| 渲染/导出 | 生成俯视图、GIF 或用于后续 3D 查看 | generate_scene.py 与过程 GIF |
随机性说明
生成过程中会从概率分布中逐 token 采样,但它不是“从纯高斯噪声逐步去噪”。
temperature、top_p 和随机种子会影响生成结果。相同权重和参数也不保证每次完全一致,除非固定随机种子。
3. 服务器与最终环境
| 类别 | 最终配置 |
|---|---|
| 服务器 | anisc01@10.15.0.253:2222 |
| 项目路径 | /mnt/sdb2/liudong/GaussianGPT-main |
| GPU | 4× NVIDIA GeForce RTX 4090 24 GB;本次使用物理 GPU 3 |
| 驱动 | 580.126.09 |
| Conda 环境 | gaussiangpt |
| Python | CPython 3.10,必须确认不是 GraalPy |
| CUDA Toolkit | Conda 环境内 nvcc 12.9;系统 nvcc 原为 11.7 |
| PyTorch | 2.8.0+cu129 |
| torchvision | 0.23.0 |
| torchaudio | 2.8.0 |
| 编译器 | conda-forge GCC/G++ 11.4.0 |
| CUDA 架构 | TORCH_CUDA_ARCH_LIST=8.9 |
| NumPy | 1.26.4 |
| CPU 线程 | OMP_NUM_THREADS=12 |
每次登录后的初始化
cd /mnt/sdb2/liudong/GaussianGPT-main
conda activate gaussiangpt
export CUDA_VISIBLE_DEVICES=3
export OMP_NUM_THREADS=12
export CUDA_HOME="$CONDA_PREFIX"
export PATH="$CUDA_HOME/bin:$PATH"
export TORCH_CUDA_ARCH_LIST="8.9"
export TORCH_LIB="$CONDA_PREFIX/lib/python3.10/site-packages/torch/lib"
export LD_LIBRARY_PATH="$TORCH_LIB:$CONDA_PREFIX/lib:$CONDA_PREFIX/lib64:${LD_LIBRARY_PATH:-}"
export PYTHONNOUSERSITE=1
unset PYTHONHOME
unset PYTHONPATH
设置
CUDA_VISIBLE_DEVICES=3后,程序只能看到第 4 张物理显卡,因此它在 PyTorch 中显示为cuda:0,这是正常映射。
4. 从零搭建的实际过程
4.1 清理旧环境
只删除本项目创建的 gaussiangpt 和 gaussiangpt128,不要删除服务器上其他用户的环境。
conda deactivate
conda env remove -n gaussiangpt -y
conda env remove -n gaussiangpt128 -y
conda env list
4.2 确认 GPU、驱动和系统 CUDA
nvidia-smi --query-gpu=index,name,driver_version,memory.total --format=csv
which nvcc
nvcc --version
conda --version
检查结果:
- 服务器共有 4 张 RTX 4090 24 GB。
- 驱动版本为 580.126.09。
- 驱动足以运行 CUDA 12.9。
- 系统
/usr/local/cuda/bin/nvcc只有 11.7,因此后续使用 Conda 环境中的 CUDA 12.9。
4.3 创建 CPython + CUDA 12.9 环境
核心原则:Python、CUDA 编译工具链、PyTorch wheel 和 C++ 扩展必须互相兼容。
最终组合:
- CPython 3.10
- Conda 环境内 CUDA Toolkit 12.9
- PyTorch 2.8.0+cu129
- GCC/G++ 11.4.0
激活环境后检查:
conda activate gaussiangpt
which python
python --version
which nvcc
nvcc --version
安装目标 PyTorch 版本:
python -m pip install \
torch==2.8.0 \
torchvision==0.23.0 \
torchaudio==2.8.0 \
--index-url https://download.pytorch.org/whl/cu129
曾经失败的路线
pytorch-cuda=12.9和pytorch-cuda=12.8在当时配置的 Conda channel 中不可用。- 后续改为在环境中安装 CUDA Toolkit 12.9,并使用 PyTorch 官方 cu129 wheel。
- 校园网代理曾造成 SSL 证书错误、超时和 wheel hash 不一致。
- 对 hash 不一致不能简单关闭安全检查,应换可信网络,或在 Mac 下载后传到服务器。
4.4 安装并验证核心扩展
| 组件 | 版本/状态 | 验证重点 |
|---|---|---|
| gsplat | 安装成功 | import gsplat |
| FlashAttention | 2.8.2 | 成功编译并 import flash_attn |
| PyTorch3D | 0.7.8 | from pytorch3d import _C;CUDA quaternion 测试 |
| MinkowskiEngine | 0.5.4 源码编译 | 真实 CUDA SparseTensor + MinkowskiConvolution |
统一验证:
python -c "import torch; print(torch.__version__, torch.version.cuda); print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
python -c "import gsplat, flash_attn; from pytorch3d import _C; print('gsplat / FlashAttention / PyTorch3D 正常')"
python -c "import MinkowskiEngine as ME; print('MinkowskiEngine 导入成功')"
5. MinkowskiEngine 编译与兼容修复
MinkowskiEngine 是稀疏 3D 卷积库,只在有内容的体素位置进行计算。它是这次复现中最耗时的依赖,主要问题来自 CUDA 12.9、NVTX3 和旧版第三方代码之间的接口差异。
5.1 源码位置
/mnt/sdb2/liudong/MinkowskiEngine-master
5.2 关键兼容性修复
| 问题 | 处理方式 |
|---|---|
crypt.h / libxcrypt |
确认 $CONDA_PREFIX/include/crypt.h 存在;系统 /usr/include/crypt.h 也存在 |
| NVTX3 头文件 | 把 NVTX include 加入 CPATH、CPLUS_INCLUDE_PATH、C_INCLUDE_PATH |
| NVTX3 include 写法 | ranges.hpp 中改用 #include <nvtx3/nvtx3.hpp> |
| NVTX API 变化 | domain_thread_range 改为 scoped_range_in |
| CUDA 12.9 CCCL 歧义 | concurrent_unordered_map.cuh 中将返回的 unique_ptr 改为 shared_ptr,并保留自定义 deleter |
| OpenBLAS ABI | 旧 OpenBLAS 0.3.4 依赖 libgfortran.so.3;最终链接到 OpenBLAS 0.3.31,使用 libgfortran.so.5 |
5.3 编译环境与命令
cd /mnt/sdb2/liudong/MinkowskiEngine-master
export CUDA_HOME="$CONDA_PREFIX"
export PATH="$CUDA_HOME/bin:$PATH"
export CUDA_VISIBLE_DEVICES=3
export TORCH_CUDA_ARCH_LIST="8.9"
export MAX_JOBS=4
export NVTX_INCLUDE="$CONDA_PREFIX/lib/python3.10/site-packages/nvidia/nvtx/include"
export CPATH="$NVTX_INCLUDE:$CONDA_PREFIX/include"
export CPLUS_INCLUDE_PATH="$NVTX_INCLUDE:$CONDA_PREFIX/include"
export C_INCLUDE_PATH="$NVTX_INCLUDE:$CONDA_PREFIX/include"
export TORCH_LIB="$CONDA_PREFIX/lib/python3.10/site-packages/torch/lib"
export LD_LIBRARY_PATH="$TORCH_LIB:$CONDA_PREFIX/lib:$CONDA_PREFIX/lib64:${LD_LIBRARY_PATH:-}"
python setup.py install \
--blas_include_dirs="$CONDA_PREFIX/include" \
--blas=openblas
5.4 CUDA 稀疏卷积测试
不能只验证 import MinkowskiEngine,还需要进行真实 CUDA 运算。
import torch
import MinkowskiEngine as ME
coords = torch.tensor(
[
[0, 0, 0, 0],
[0, 1, 1, 1],
],
dtype=torch.int32,
device="cuda",
)
features = torch.randn(2, 4, device="cuda")
x = ME.SparseTensor(
features=features,
coordinates=coords,
)
layer = ME.MinkowskiConvolution(
in_channels=4,
out_channels=8,
kernel_size=3,
dimension=3,
).cuda()
y = layer(x)
print("输出形状:", y.F.shape)
print("输出设备:", y.F.device)
print("坐标设备:", y.C.device)
print("MinkowskiEngine CUDA 运算成功")
成功结果:
输出形状: torch.Size([2, 8])
输出设备: cuda:0
坐标设备: cuda:0
MinkowskiEngine CUDA 运算成功
6. 关键故障与解决方案
| 报错或现象 | 根因 | 最终处理 |
|---|---|---|
PyTorch 加载 torch/_C 文件夹而不是 C 扩展 |
环境被意外切换成 GraalPy | 恢复 CPython 3.10;取消 PYTHONHOME、PYTHONPATH;设置 PYTHONNOUSERSITE=1 |
libcusparseLt.so.0 缺失 |
cu129 的 NVIDIA 运行时依赖不完整 | 补齐对应依赖后重新验证 PyTorch CUDA |
NumPy 报 libgfortran.so.3 |
NumPy/OpenBLAS 与 Fortran runtime ABI 混装 | NumPy 固定为 1.26.4;OpenBLAS 链接到 0.3.31 和 libgfortran.so.5 |
PyTorch3D 报 libc10.so 缺失 |
动态链接器找不到 torch/lib |
将 $CONDA_PREFIX/lib/python3.10/site-packages/torch/lib 放到 LD_LIBRARY_PATH 最前面 |
| MinkowskiEngine 提示 features 和 coordinates backend 不同 | features 在 CUDA,coordinates 在 CPU | features 和 coordinates 都创建在 device="cuda" |
| GitHub clone/codeload 证书异常 | 校园网代理、证书替换或访问拦截 | 在 Mac 下载源码后传到服务器;不要使用损坏的 14-byte zip |
6.1 GraalPy 问题
错误环境中曾出现:
python -> ../lib/jvm/languages/python/bin/python
sys.implementation.name = graalpy
这会导致 PyTorch C 扩展无法加载。
最终恢复后:
unset PYTHONHOME
unset PYTHONPATH
export PYTHONNOUSERSITE=1
python -c "import sys; print(sys.implementation.name); print(sys.version); print(sys.executable)"
应输出:
cpython
Python 3.10.x
/home/anisc01/.conda/envs/gaussiangpt/bin/python
6.2 PyTorch3D 的 libc10.so 问题
export TORCH_LIB="$CONDA_PREFIX/lib/python3.10/site-packages/torch/lib"
export LD_LIBRARY_PATH="$TORCH_LIB:$CONDA_PREFIX/lib:$CONDA_PREFIX/lib64:${LD_LIBRARY_PATH:-}"
验证:
python -c "import torch; from pytorch3d import _C; from pytorch3d.transforms import quaternion_to_matrix; q=torch.tensor([[1.,0.,0.,0.]], device='cuda'); print(quaternion_to_matrix(q)); print('PyTorch3D CUDA 扩展正常')"
6.3 NumPy 和 OpenBLAS 问题
错误表现:
ImportError: libgfortran.so.3: cannot open shared object file
最终状态:
- NumPy:1.26.4
libopenblas.so链接到 OpenBLAS 0.3.31- OpenBLAS 0.3.31 使用
libgfortran.so.5
验证:
python -c "import numpy; print(numpy.__version__, numpy.__file__)"
ldd "$CONDA_PREFIX/lib/python3.10/site-packages/MinkowskiEngineBackend/_C.cpython-310-x86_64-linux-gnu.so" \
| grep -E "not found|gfortran|openblas"
7. 官方预训练权重
权重保存目录:
/mnt/sdb2/liudong/GaussianGPT-main/checkpoints
官方下载地址:
wget https://kaldir.vc.cit.tum.de/gaussiangpt/vqvae_vfront.ckpt
wget https://kaldir.vc.cit.tum.de/gaussiangpt/gpt_vfront.ckpt
| 文件 | 大小 | SHA256 |
|---|---|---|
vqvae_vfront.ckpt |
约 2.0 GB | 9f70d0939dc791292be52da6c503bf51b3ac73d9905b51784d0aac81e44faf7a |
gpt_vfront.ckpt |
约 3.2 GB | 203dc730495bf4f21e60280c6152703867f1b81e9c035d110d792e6a87d9313b |
校验命令:
cd /mnt/sdb2/liudong/GaussianGPT-main/checkpoints
sha256sum \
gpt_vfront.ckpt \
vqvae_vfront.ckpt
模型加载结果:
| 模型 | 参数量 | 结果 |
|---|---|---|
| VQ-VAE | 176.20 M | 权重可正常解析 |
| GaussianGPT | 503.10 M | 权重可正常解析;vocab_size 从 12098 pad 到 12160 |
8. 最小生成测试
cd /mnt/sdb2/liudong/GaussianGPT-main
python generate_chunks.py \
checkpoint=checkpoints/gpt_vfront.ckpt \
vqvae_checkpoint=checkpoints/vqvae_vfront.ckpt \
num_samples=1 \
batch_size=1 \
temperature=0.9 \
top_p=0.9 \
render_gifs=false \
store_samples=true \
output_dir=outputs/vfront_test
实测结果:
| 指标 | 结果 |
|---|---|
| 设备 | 单张 RTX 4090 24 GB(物理 GPU 3) |
| 生成场景数 | 1 |
| 最大序列长度 | 16,384 tokens |
| 实际生成长度 | 3,948 tokens |
| 采样速度 | 约 55.37 tokens/s(中途日志) |
| 总耗时 | 约 72.52 秒 |
这一步证明的不只是环境能够 import,而是官方 GPT 和 VQ-VAE 权重能够完成一次真实的自回归场景采样。
9. 生成过程可视化
官方脚本默认主要保存最终结果。为了观察“场景逐步长出来”,对 generate_scene.py 增加了阶段快照功能:每完成 10% token 生成,解码当前稀疏网格并保存一张俯视 PNG。
| 改动点 | 内容 |
|---|---|
| 原文件备份 | generate_scene.py.before_progress |
| 触发开关 | 环境变量 GAUSS_PROGRESS_DIR |
| 保存频率 | 10%、20%……100% |
| 核心调用 | _decode_sparse_rows_grid(...) → _render_topdown_png(...) |
| 显存清理 | 每帧完成后删除临时解码结果并调用 torch.cuda.empty_cache() |
| 语法检查 | python -m py_compile generate_scene.py 通过 |
9.1 生成 4×4 小场景和阶段帧
cd /mnt/sdb2/liudong/GaussianGPT-main
export GAUSS_SHARD_ID=0
export GAUSS_NUM_SHARDS=1
export GAUSS_PROGRESS_DIR="outputs/generate_scene_progress/progress"
export PYTHONUNBUFFERED=1
python generate_scene.py \
checkpoint=checkpoints/gpt_vfront.ckpt \
vqvae_checkpoint=checkpoints/vqvae_vfront.ckpt \
num_scenes=1 \
scene_cols_x=4 \
scene_cols_y=4 \
x_offset=0 \
y_offset=0 \
y_range=1 \
decode_outputs=true \
render_topdown=true \
topdown_resolution=768 \
output_dir=outputs/generate_scene_progress
成功生成:
progress_010.png
progress_020.png
progress_030.png
progress_040.png
progress_050.png
progress_060.png
progress_070.png
progress_080.png
progress_090.png
progress_100.png
保存目录:
outputs/generate_scene_progress/progress/rank_0000/scene_0000000/
9.2 合成为 GIF
from pathlib import Path
from PIL import Image
frame_dir = Path(
"outputs/generate_scene_progress/progress/rank_0000/scene_0000000"
)
frames = sorted(frame_dir.glob("progress_*.png"))
images = [Image.open(path).convert("RGB") for path in frames]
output = frame_dir / "generation_process.gif"
images[0].save(
output,
save_all=True,
append_images=images[1:],
duration=700,
loop=0,
optimize=True,
)
print("生成成功:", output)
print("帧数:", len(frames))
9.3 下载到 Mac
在 Mac 终端执行:
scp -P 2222 \
anisc01@10.15.0.253:/mnt/sdb2/liudong/GaussianGPT-main/outputs/generate_scene_progress/progress/rank_0000/scene_0000000/generation_process.gif \
~/Downloads/
10. 最终验收清单
-
python是 CPython 3.10,而不是 GraalPy。 -
nvcc指向$CONDA_PREFIX/bin/nvcc,版本为 12.9。 - PyTorch 为 2.8.0+cu129。
-
torch.cuda.is_available()返回True。 - 程序能够识别 RTX 4090。
- 设置
CUDA_VISIBLE_DEVICES=3后,程序内部显示cuda:0。 - gsplat、FlashAttention、PyTorch3D 能正常导入。
- PyTorch3D
_CCUDA 扩展正常。 - MinkowskiEngine 能完成真实 CUDA 稀疏卷积,而不只是成功 import。
- 两份权重的 SHA256 与官方 README 完全一致。
-
generate_chunks.py成功生成至少 1 个场景。 - 过程帧包含 010~100 共 10 张图片。
-
generation_process.gif可以正常播放。
11. 复现后的维护建议
-
把第 3 节的初始化变量写入项目专用脚本,避免每次遗漏
TORCH_LIB或LD_LIBRARY_PATH。 -
导出环境清单并备份已经修改的 MinkowskiEngine 源码。
conda list --explicit > gaussiangpt-conda-explicit.txt python -m pip freeze > gaussiangpt-pip-freeze.txt -
不要在已经跑通的环境中随意执行大型
conda install。Conda 重新求解可能把 CPython 替换成 GraalPy,或重新混入旧版 OpenBLAS。 -
如果需要重新安装二进制扩展,先固定 Python、PyTorch、CUDA、GCC 和 NumPy,再依次重新编译 PyTorch3D、gsplat 和 MinkowskiEngine。
-
正式实验应记录随机种子、
temperature、top_p、权重 hash、代码 commit 和 GPU 型号,确保结果可追踪。
附录:关键路径速查
| 内容 | 路径 |
|---|---|
| GaussianGPT 项目 | /mnt/sdb2/liudong/GaussianGPT-main |
| MinkowskiEngine 源码 | /mnt/sdb2/liudong/MinkowskiEngine-master |
| Conda 环境 | /home/anisc01/.conda/envs/gaussiangpt |
| 官方权重 | /mnt/sdb2/liudong/GaussianGPT-main/checkpoints |
| 生成测试输出 | /mnt/sdb2/liudong/GaussianGPT-main/outputs/vfront_test |
| 过程动画目录 | /mnt/sdb2/liudong/GaussianGPT-main/outputs/generate_scene_progress/progress/rank_0000/scene_0000000 |
更多推荐
所有评论(0)