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

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ΔPSNRPLY saveNotes
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

  1. Browser uploads the archive to Vercel Blob via a presigned PUT.
  2. The worker validates the preset + bundle size cap and forwards { preset: "splatforge-qat-bundle", blob_url, callback_url } to the private Modal endpoint.
  3. The endpoint downloads the bundle, runs extract_and_validate against the layout above, and fails fast with a customer-actionable error if anything is missing.
  4. A 5000-iter int8 QAT finetune runs on A100 against the bundle's own GT cameras. The renderer's generate_neural_gaussians is monkey-patched so gradients flow through the int8 lattice via STE.
  5. The finetuned PLY is run through the canonical render.py + metrics.py pipeline to compute honest PSNR/SSIM/LPIPS on the test cams.
  6. 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