splax
Differentiable 3D gaussian splatting for JAX, with rasterization kernels written in NVIDIA Warp.
splax renders and trains 3D gaussian splats inside JAX. Batched rendering and training run through jax.vmap, jax.grad, and jax.jit, with no system CUDA toolchain needed.
Installation
pip install splax
splax needs an NVIDIA GPU and requires CUDA-enabled JAX. No system CUDA toolchain is required.
Examples
Render a .ply scene from one camera.
import jax.numpy as jnp
import splax
splats = splax.io.load_ply("scene.ply") # means, log_scales, quats, sh_colors, logit_opacities
img, _ = splax.render(
*splats, viewmat=viewmat, background=jnp.ones(3), img_shape=(H, W), f=(fx, fy)
) # (H, W, 3)
Batch over a stack of camera poses with jax.vmap, rendered in one go rather than in a Python loop.
import jax
frames = jax.vmap(
lambda vm: splax.render(
*splats, viewmat=vm, background=jnp.ones(3), img_shape=(H, W), f=(fx, fy)
)[0]
)(viewmats) # (B, H, W, 3)
Take gradients through the renderer with jax.grad. splax.render differentiates with respect to means, log scales, quats, SH colors, logit opacities, the camera pose, and per-object rigid transforms.
import jax
def loss(means, log_scales, quats, sh_colors, logit_opacities):
img, _ = splax.render(
means,
log_scales,
quats,
sh_colors,
logit_opacities,
viewmat=viewmat,
background=jnp.ones(3),
img_shape=(H, W),
f=(fx, fy),
)
return jnp.mean((img - target) ** 2)
grads = jax.grad(loss, argnums=(0, 1, 2, 3, 4))(*splats)
To edit .ply scenes, we recommend superspl.at.
Documentation
Full documentation lives at learnsyslab.github.io/splax: installation, a quickstart, a user guide for rendering, training, batching, and IO, and the API reference.
Why
Gaussian splatting lives mostly in PyTorch and hand-written CUDA. splax puts it inside JAX so splat rendering composes with jax.vmap, jax.grad, and jax.jit and drops into research pipelines that already run on JAX, without leaving the ecosystem for the render step.
Architecture
Splatting does not map onto XLA primitives, so projection, rasterization, and their backward passes are Warp kernels called from JAX. Rendering therefore composes with jax.vmap, jax.grad, and jax.jit, and a batch renders in one go rather than looping in Python.
Relation to jaxsplat
splax started from jaxsplat as the reference and parity baseline. The rasterizer was rewritten from CUDA to Warp to drop the system toolchain, then extended with the feature and performance work below.
Improvements
Ported from gsplat and the papers behind it, which inspired most of the performance work (credit per item).
- Native multi-camera batched rendering (gsplat)
- Opacity-aware tight tile intersection (StopThePop, Speedy-Splat, gsplat #927)
- Packed 32-bit sort keys with quantized depth
- Persistent sort and bin scratch across frames (gsplat caching allocator design)
- Cooperative shared-memory tile blending with block-vote early exit (3DGS, gsplat)
- Fixed-budget MCMC training with static shapes, relocation plus covariance noise (gsplat MCMCStrategy, Kheradmand et al. 2024)
- Opacity and scale regularizers (gsplat mcmc preset)
- Progressive resolution fine-tuning (coarse-to-fine, 3DGS)
- Per-parameter Adam learning-rate schedules (gsplat, 3DGS)
- L1 plus D-SSIM photometric loss (3DGS, gsplat, via dm-pix)
- Camera pose gradients (gsplat projection backward)
- Brown-Conrady lens distortion applied inside the projection
- Batch-native backward passes under
jax.vmap(jax.grad(render))(gsplat) - Batched training steps with sqrt-batch learning-rate scaling (gsplat
batch_sizeandsteps_scaler) - View-dependent color from spherical harmonics up to degree 3 (3DGS, gsplat)
- Anti-aliased opacity compensation (Mip-Splatting, gsplat), depth regularization from COLMAP points (gsplat
depth_loss), per-image exposure correction (gsplat appearance optimization), all opt-in
Development
Developer setup with pixi, which installs splax editable with the dev tooling:
git clone https://github.com/learnsyslab/splax.git
cd splax
pixi shell
Run the test suite with pixi run -e tests tests. The suite also runs against any splax installation that includes the tests extra. Checking a built distribution before a release therefore is:
pixi run -e dist build
uv venv /tmp/splax-check
source /tmp/splax-check/bin/activate
uv pip install "dist/splax-0.1.0-py3-none-any.whl[tests]"
cd tests && pytest .
The gsplat reference tests JIT-compile a CUDA extension on first use, which needs a CUDA 12.8 compiler toolchain that pip cannot provide. Run the commands inside pixi shell -e tests to use the toolchain from the tests environment, or provide a system CUDA 12.8 install.
License
MIT (see LICENSE). gsplat-derived portions are under Apache-2.0 (licenses/Apache-2.0.txt).
Metadata
Release files for splax 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| splax-0.2.4.tar.gz | 60.5 kB | Without provenance | Details for splax-0.2.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| splax-0.2.4-py3-none-any.whl | Python 3 | none | any | Details for splax-0.2.4-py3-none-any.whl |
Total release size: 122.1 kB
Release files / splax-0.2.4.tar.gz
| Download URL | splax-0.2.4.tar.gz |
|---|---|
| Size | 60.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8d82e1e9bed75a85e32c55342262c1673afdc7edf1fa449ea89e734b3e54f21f
|
|
BLAKE2b-256 checksum How to use checksums |
ede3640abbb2d9f61dce3f27f867db8585d636b40a8452a39358f6a7aefba054
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|
Release files / splax-0.2.4-py3-none-any.whl
| Download URL | splax-0.2.4-py3-none-any.whl |
|---|---|
| Size | 61.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c373617b6fee506f19104683dd94b0640dc6f5a6ce81a1ca615aeec9e39d6fcc
|
|
BLAKE2b-256 checksum How to use checksums |
f987bae665a5cd428af36e9f1aeb66b267f1cb1c2de52d973556e39de850267b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|
Security for splax 0.2.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.