QAT-Bundle format (premium)
The splatforge-qat-bundle preset is the
full-retrain recipe behind the SplatBench QAT-Scaffold
column (37.25% aggregate PLY save, +0.17 dB mean PSNR across 6
Mip-NeRF 360 scenes). It needs a Scaffold-GS bundle that includes
GT cameras + images so the int8 finetune can absorb feature-quant
noise via L1+SSIM loss on your own captures.
Price: ~$0.50 per scene (Modal A100 pass-through). Wall-clock: ~10 min end-to-end (5000-iter finetune dominates). Output: a smaller Scaffold-GS PLY plus int8 sidecars; the saved PLY decodes against any Scaffold-GS-aware renderer that honors the canonical loader patch.
Required layout
Pack a Scaffold-GS training output (the directory that contains
point_cloud/iteration_30000/) plus the Mip-NeRF-360-style
GT scene root (the images/ + optional COLMAP
sparse/0/ + input.ply) into a single tar
archive. Files may be at the archive root OR one level down inside
a single top-level subdirectory (so tar -czf bonsai.tar.gz
bonsai/ works without flattening).
bundle.tar.gz
├── point_cloud.ply # Scaffold-GS anchor PLY (~130 MB for bonsai)
├── color_mlp.pt # TorchScript color MLP
├── cov_mlp.pt # TorchScript covariance MLP
├── opacity_mlp.pt # TorchScript opacity MLP
├── cfg_args # Scaffold-GS Namespace dump (feat_dim, n_offsets, ...)
├── cameras.json # Scaffold-GS Scene cameras (training views)
├── input.ply # COLMAP sparse points (Scaffold-GS init)
├── images/ # GT images referenced by cameras.json
│ ├── DSCF0001.JPG
│ └── ...
└── sparse/0/ # OPTIONAL: COLMAP sparse model
├── cameras.bin
├── images.bin
└── points3D.bin Pack from a Scaffold-GS output directory
From the trainer output (the one that contains
point_cloud/iteration_30000/ and a sibling
scene/ source):
cd /path/to/scaffold_30k
tar -czf bonsai_bundle.tar.gz \
point_cloud/iteration_30000/point_cloud.ply \
point_cloud/iteration_30000/color_mlp.pt \
point_cloud/iteration_30000/cov_mlp.pt \
point_cloud/iteration_30000/opacity_mlp.pt \
cfg_args \
cameras.json \
input.ply \
-C /path/to/scaffold_30k/scene images \
-C /path/to/scaffold_30k/scene sparse \
--transform 's,.*/,,' # flatten paths to the archive root
Then drop bonsai_bundle.tar.gz on the
Try-it surface with QAT-Bundle
selected.
Constraints
- Max bundle size: 1 GB total (compressed). Most Mip-NeRF 360 scenes pack to ~400-800 MB with images included.
- Min GT images: 8. The trainer's train/test split needs both halves; bundles below this floor are rejected with a clear error before any compute spend.
- Free tier: 1 bundle per month per account. The retrain is expensive — we gate generously rather than charging by surprise.
- Paid tier: $0.50 per bundle flat. Billed via
the existing Stripe meter (
splatforge_repack_runs+splatforge_repack_seconds); no new product needed.
Per-scene expectations
These numbers come from the public bench column at
/bench (commit c3387b3). Your
capture may land anywhere on this distribution — we report the
honest measured delta in the API callback so you can verify
before downloading.
| Scene | ΔPSNR | PLY save | Notes |
|---|---|---|---|
bonsai | +0.58 dB | 40.5% | best-case (indoor, dense cams) |
garden | +0.19 dB | 40.5% | high-quality outdoor |
bicycle | +0.09 dB | 40.5% | challenging outdoor |
stump | +0.04 dB | 33.9% | outdoor with sky |
treehill | +0.07 dB | 33.7% | outdoor foliage |
flowers | +0.03 dB | 33.8% | worst-case (close-up, low cam count) |
Individual scene results vary. The trainer reports
delta_psnr_db and ply_save_pct in the
job callback — if your scene returns numbers more than 0.3 dB
worse than the bench expectation, please file an issue with the
bundle hash so we can investigate.
What happens server-side
- Browser uploads the archive to Vercel Blob via a presigned PUT.
-
The worker validates the preset + bundle size cap and forwards
{ preset: "splatforge-qat-bundle", blob_url, callback_url }to the private Modal endpoint. -
The endpoint downloads the bundle, runs
extract_and_validateagainst the layout above, and fails fast with a customer-actionable error if anything is missing. -
A 5000-iter int8 QAT finetune runs on A100 against the bundle's
own GT cameras. The renderer's
generate_neural_gaussiansis monkey-patched so gradients flow through the int8 lattice via STE. -
The finetuned PLY is run through the canonical
render.py+metrics.pypipeline to compute honest PSNR/SSIM/LPIPS on the test cams. - The lossless constant-strip transform is applied on top of the finetuned PLY, then the result is uploaded to Vercel Blob and returned via the callback.
API callback shape
{
"status": "done",
"output_url": "https://...vercel-storage.com/jobs/<id>/scaffold_qat_bundle.ply",
"size_bytes_in": 134217728,
"size_bytes_out": 79847936,
"ply_save_pct": 40.51,
"projected_ply_save_pct": 40.51,
"delta_psnr_db": 0.581,
"psnr_baseline": 32.83,
"psnr_canonical": 33.41,
"feat_compress_x": 4.0,
"finetune_iters": 5000,
"train_wall_secs": 312.4,
"constants_detected": ["nx", "ny", "nz", "opacity", "rot_0", "rot_1", "rot_2", "rot_3"],
"constant_strip_bitexact": true
} ← back to Try it · QAT-Scaffold (single-PLY tier) · SplatBench