S23DR_solution_2026 / REPRODUCE.md
donquicode's picture
Upload folder using huggingface_hub
f2e158e verified
|
Raw
History Blame Contribute Delete
5.09 kB
# Reproducing the 8k Perceiver (private HSS 0.5388, 5th place)
The submitted entry is `checkpoint_8192.pt`, the raw 8k Perceiver. It is the end
of a resolution curriculum: the organizers' 2048 β†’ 4096 baseline produces
`checkpoint.pt`, which we then fine-tune at 8192 points to produce
`checkpoint_8192.pt`. The architecture is identical at every stage β€” only the
input point budget grows.
The Perceiver training code is the organizers' package, bundled here under
`s23dr_2026_example/` (`train.py`, `tokenizer.py`, `model.py`, `losses.py`).
## Inference
```bash
pip install -r requirements.txt
python script.py
```
`script.py` loads `checkpoint_8192.pt`, fuses and priority-samples each scene to
8192 points (6144 COLMAP + 2048 depth), runs the Perceiver, and writes
`submission.json` (`{order_id, wf_vertices, wf_edges}` per scene). No seam, no
augments (`CONF_THRESH=0.5`).
## Architecture
Every stage shares one config (`configs/base.json`):
```
Perceiver: hidden=256, ff=1024, latent_tokens=256, latent_layers=7
encoder_layers=4, decoder_layers=3, cross_attn_interval=4
num_heads=4, kv_heads_cross=2, kv_heads_self=2
qk_norm=True (L2), rms_norm=True, dropout=0.1
segments=64, segment_param=midpoint_dir_len, segment_conf=True
behind_emb_dim=8, vote_features=True, activation=gelu
```
## Curriculum
The Perceiver is trained by a staged resolution curriculum: from scratch at
2048 points, then fine-tuned at 4096 and 8192. Each resolution step adds 45k
fine-tuning steps, the last 20k a linear cooldown, at a gentle learning rate
(3e-5) that preserves the lower-resolution representations. Stages A and B are
the organizers' baseline; stage C is ours. The generic invocation is:
```bash
python -m s23dr_2026_example.train \
--cache-dir hf://usm3d/s23dr-2026-sampled_<N>:train \
--seq-len <N> [--resume <previous_checkpoint>] --aug-rotate --aug-flip
```
### Stage A β€” 2048, from scratch *(organizers)*
```
Data: sampled_2048_v2:train
Steps: 0 -> 125,000 LR: 3e-4, warmup 10,000 Batch: 32
Loss: sinkhorn (eps=0.1, iters=20, dustbin=0.3) + conf (weight 0.1)
Seed: 353
```
Trains the Perceiver from random init. The 2048 budget keeps the train/val gap
low; training directly at high resolution overfits. **Public test HSS 0.4273.**
### Stage B β€” 4096 fine-tune + cooldown *(organizers)* β†’ `checkpoint.pt`
```
Resume: Stage A Data: sampled_4096_v2:train
Steps: 125,000 -> 170,000 (45k; last 20k linear cooldown)
LR: 3e-5 Batch: 64
```
Switches the input to 4096 points; the gentle LR adapts without disturbing the
learned representation (LR > 1e-4 forgets it). The result is the organizers'
released 4k checkpoint, `checkpoint.pt` β€” **public test HSS 0.4470**.
### Stage C β€” 8192 fine-tune + cooldown *(ours)* β†’ `checkpoint_8192.pt`
```
Resume: checkpoint.pt Data: organizers' released 8k samples
Input: 8192 points = 6144 COLMAP + 2048 depth
Steps: 170,000 -> 215,000 (45k; last 20k linear cooldown)
LR: 3e-5 Batch: 64
```
Resumes the 4k checkpoint and continues the same gentle fine-tune at 8192 points.
This is the only stage we contribute, and the single largest gain in the system:
doubling the input from 4096 to 8192 points lifts the raw model from 0.4470 to
**0.5004** public HSS (a +0.053 jump, larger than the entire hand-crafted hybrid
contributes at 4k). Retuning the confidence threshold from 0.5 to 0.65 reaches
our public best of 0.5009; the submitted entry uses 0.5. This is
`checkpoint_8192.pt` β€” **public test HSS 0.5004, private 0.5388 (5th place)**.
## Data
The organizers publish pre-sampled point clouds (`sampled_2048` / `sampled_4096`
/ `sampled_8192`) on the Hugging Face Hub; the curriculum above trains directly
on them. `training/gen_sampled_16384.py` regenerates a sampled set at an
arbitrary `--seq-len` from the organizers' `cached_full_pcd_v2` cache, in the
same format β€” we used it to try a 16384 budget (see below).
## Negative results (kept for the record, not on the inference path)
- **16384 resolution** regressed relative to 8192. The generator is
`training/gen_sampled_16384.py`; the model was not shipped.
- **Per-scene router** (`training/train_routing_gbt.py` with
`training/oracle_sources_{train,validation}.json`): a gradient-boosted router
choosing 4k / 8k / hand-crafted per scene recovered only ~4.5% of the
per-scene oracle ceiling.
- **Point Transformer V3 encoder** (`experiments/ptv3/`): a stronger encoder,
too slow for the T4 2-hour budget. Trained checkpoint, logs, and code are
archived there.
## Evaluation sets
Two splits matter for the numbers above:
- **Public test** β€” the competition harness scores `submission.json` against the
hidden test set and posts to the leaderboard. Every HSS in this document
(4k 0.4470, 8k 0.5004, private 0.5388) is a public/private test number.
- **Dev val** β€” the tail of the published training set, used during development
to pick checkpoints. We do not quote dev-val numbers here, since the
leaderboard scores are the ones that decide the entry.