A performance-oriented reimplementation of DiffDRR with the following improvements:
- Optimized, pure PyTorch implementation (~5× faster than
DiffDRRat baseline) - Fused Triton rendering kernel, used by default on CUDA (~40× faster than
DiffDRR) - Fused Metal shader (experimental), used by default on MPS (~4× faster than PyTorch)
- Modular design (freely swap subjects, extrinsics, and intrinsics during rendering)
- Compatibility with
torch.compileand mixed precision - Extensive type hints with
jaxtyping - Runs on CUDA, Apple silicon (MPS), and CPU
- Standard Python package structure managed with
uv
All projective geometry is implemented internally using the standard Hartley and Zisserman pinhole camera formulation.
Note
MPS-accelerated differentiable rendering requires pytorch>=2.13, which is the first release with native MPS kernels for grid_sample backwards and 3D nearest-neighbor sampling.
To strictly install the renderer:
pip install nanodrr
To install the optional plotting or 3D visualization module:
pip install "nanodrr[plot]" # 2D visualization (matplotlib, opencv)
pip install "nanodrr[scene]" # 3D visualization (VTK, PyVista)
pip install "nanodrr[all]" # All extras
Important
- ~5× faster than
DiffDRRwith the pure PyTorch backend (1,048 FPS vs 226 FPS) - ~39× faster with the fused Triton kernel, without compilation (8,717 FPS vs 226 FPS)
- ~40× faster with
torch.compileandbfloat16(9,008 FPS vs 226 FPS) - ~4× less memory than
DiffDRR(276 MB vs 1,092 MB peak reserved withbfloat16+ compile)
FPS computed from per-frame GPU kernel time (
torch.profiler); median wall-clock timings are also recorded intests/benchmark/benchmark.csv. Benchmarked by rendering 200×200 DRRs on an NVIDIA RTX 6000 Ada (48 GB) with Python 3.12. Compile representstorch.compile(mode="reduce-overhead", fullgraph=True). Full experiment attests/benchmark/.
To test the docs locally, run
uv run --group docs jupyter nbconvert --to markdown tutorials/*.ipynb --output-dir docs/tutorials/
uv run --group docs zensical serve
- Implement a fully optimized renderer
- Port strictly necessary modules from
DiffDRR(e.g., SE(3) utilities, loss functions, and 2D plotting) - Migrate 3D plotting functions to an optional module
- Integrate with
xvrto speed up network training and registration - Integrate with
polyposeto speed up registration - Release as
v1.0.0ofDiffDRR!