3D Gaussian Splatting in Python with NVIDIA Warp

September 5, 2025 Β· View on GitHub

This project reimplements the core ideas of 3D Gaussian Splatting in a clean, minimalist Python codebase using NVIDIA Warp. It runs on both CPU and GPU with no CUDA setup, focuses on clarity and parallelism, and is designed as a practical entry point for learning modern graphics and differentiable rendering.

Why This Implementation?

βœ… CPU & GPU with Zero Hassle

Thanks to Warp, the same kernel code runs seamlessly on both CPU and GPU β€” no need to deal with CUDA setup, driver issues, or device-specific kernels. Just flip one config line.

🧠 Learn Modern Graphics the Easy Way

Explore differentiable rendering and parallel graphics through clean, readable Python β€” no pricey GPUs, complex toolchains, or heavy C++/CUDA boilerplate needed.

πŸ“¦ Minimalist & Educational

This isn’t another massive codebase. It’s designed for clarity and experimentation. Strips away complexity so you can focus on understanding how Gaussian Splatting really works.

The training video

Quick Start

Installation

# Clone the repository
git clone https://github.com/guoriyue/3dgs-warp-scratch.git
cd 3dgs-warp-scratch

# Install dependencies
pip install warp-lang==1.7.0 numpy==1.26.4 matplotlib==3.9.2 imageio==2.34.1 tqdm==4.66.5 plyfile torch==2.6.0

Download Example Data

# Download the Lego dataset
bash download_example_data.sh

Rendering

# Render 3 Gaussian points – a minimalist example
python render.py

You should see 3 Gaussian points like:

this

Training

# Train on Lego dataset (CPU by default)
# For GPU training, change DEVICE in config.py to "cuda"
python train.py

Project Structure

β”œβ”€β”€ forward.py                # 3DGS: Forward pass (reimplementation of graphdeco-inria/gaussian-splatting)
β”œβ”€β”€ backward.py               # 3DGS: Backward pass (reimplementation of graphdeco-inria/gaussian-splatting)

β”œβ”€β”€ train.py                  # Main training loop
β”œβ”€β”€ render.py                 # Rendering script to validate outputs; confirms forward pass correctness
β”œβ”€β”€ config.py                 # Configuration and training parameters


β”œβ”€β”€ loss.py                   # Loss functions for training (includes depth loss, though unused in this repo)
β”œβ”€β”€ scheduler.py              # Learning rate scheduler
β”œβ”€β”€ optimizer.py              # Adam optimizer and densify & prune logic

β”œβ”€β”€ utils/
β”‚   β”œβ”€β”€ camera_utils.py       # Load camera intrinsics and extrinsics from training data
β”‚   β”œβ”€β”€ point_cloud_utils.py  # Point cloud I/O utilities (e.g., saving to .ply)
β”‚   β”œβ”€β”€ math_utils.py         # General math utilities (e.g., transformation matrices)
β”‚   └── wp_utils.py           # Warp utilities for math operations and device transfer

└── data/                     # Contains the NeRF-synthetic 'Lego' dataset

forward.py and backward.py are based on graphdeco-inria/gaussian-splatting. The original pure CUDA version is now reimplemented in Nvidia Warp, easy to understand, set up, and run.

Densification and pruning logic is based on yzslab/gaussian-splatting-lightning, but restructured here with minimal data preparation and simplified training logic.

License

This project is licensed under the GNU Affero General Public License v3.0.
See the LICENSE file for details.