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.pngprogress_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.ckpttemperaturetop_p 控制采样
VQ-VAE 解码 把生成 token 还原为显式 3D 高斯 生成最终场景或阶段快照
渲染/导出 生成俯视图、GIF 或用于后续 3D 查看 generate_scene.py 与过程 GIF

随机性说明

生成过程中会从概率分布中逐 token 采样,但它不是“从纯高斯噪声逐步去噪”。

temperaturetop_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 清理旧环境

只删除本项目创建的 gaussiangptgaussiangpt128,不要删除服务器上其他用户的环境。

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.9pytorch-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 加入 CPATHCPLUS_INCLUDE_PATHC_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;取消 PYTHONHOMEPYTHONPATH;设置 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 _C CUDA 扩展正常。
  • MinkowskiEngine 能完成真实 CUDA 稀疏卷积,而不只是成功 import。
  • 两份权重的 SHA256 与官方 README 完全一致。
  • generate_chunks.py 成功生成至少 1 个场景。
  • 过程帧包含 010~100 共 10 张图片。
  • generation_process.gif 可以正常播放。

11. 复现后的维护建议

  1. 把第 3 节的初始化变量写入项目专用脚本,避免每次遗漏 TORCH_LIBLD_LIBRARY_PATH

  2. 导出环境清单并备份已经修改的 MinkowskiEngine 源码。

    conda list --explicit > gaussiangpt-conda-explicit.txt
    python -m pip freeze > gaussiangpt-pip-freeze.txt
    
  3. 不要在已经跑通的环境中随意执行大型 conda install。Conda 重新求解可能把 CPython 替换成 GraalPy,或重新混入旧版 OpenBLAS。

  4. 如果需要重新安装二进制扩展,先固定 Python、PyTorch、CUDA、GCC 和 NumPy,再依次重新编译 PyTorch3D、gsplat 和 MinkowskiEngine。

  5. 正式实验应记录随机种子、temperaturetop_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

更多推荐