| # Small config: fast experiments, single GPU | |
| input: | |
| num_surface_points: 4096 | |
| tokenizer: | |
| latent: | |
| latent_shape: [24, 24, 24] | |
| token_dim: 128 | |
| neighbor: | |
| multiscale_radii: [0.05, 0.1, 0.2] | |
| agno: | |
| num_heads: 4 | |
| processor: | |
| hidden_size: 128 | |
| num_layers: 3 | |
| num_heads: 4 | |
| num_kv_heads: 2 | |
| patch_size: 6 | |
| heads: | |
| embedding_dim: 128 | |
| pooling: attention | |
| symmetry: | |
| hidden_dim: 128 | |
| primitive: | |
| hidden_dim: 128 | |
| part: | |
| hidden_dim: 128 | |
| caption: | |
| hidden_dim: 128 | |
| reduction: | |
| hidden_dim: 128 | |
| train: | |
| epochs: 50 | |
| batch_size: 16 | |
| gradient_accumulation_steps: 2 | |
| mixed_precision: bf16 | |
| num_workers: 4 | |
| pin_memory: true | |
| # Heavy outputs live on /data to keep the root disk free. | |
| # Can also be overridden via SHAPE_CHECKPOINT_DIR / SHAPE_LOG_DIR env vars. | |
| checkpoint_dir: /data/shape-v2/checkpoints | |
| log_dir: /data/shape-v2/runs | |
| optimizer: | |
| lr: 3.0e-4 | |
| warmup_steps: 500 | |
| loss: | |
| inpainting: | |
| enabled: false | |
| # Regression loss used by masked-token reconstruction, inpainting | |
| # reconstruction, and symmetry plane/axis regression heads. | |
| # Classification losses (symmetry class, primitive, part, reduction) | |
| # are unaffected. | |
| regression: | |
| kind: smooth_l1 # "mse" | "smooth_l1" | |
| beta: 1.0 | |
| # Self-supervised only. Supervised heads inherit weight=0.0 from the | |
| # defaults because the stock synthetic labels overfit catastrophically | |
| # (val/symmetry ≈ 2.5 while train/symmetry ≈ 1e-4). Re-enable in a | |
| # follow-up config once the labels in data/synthetic_labels.py are | |
| # fixed to generalize across unseen meshes. | |
| weights: | |
| masked_token: 1.0 | |
| contrastive: 0.2 | |
| inpainting: 0.0 | |
| wandb: | |
| enabled: true | |
| project: shape-foundation | |
| tags: [small, pretrain, v1-fix] | |
| data: | |
| # Deterministic hash-based train/val split applied across every source. | |
| # Every file's assignment is stable across runs and ranks (md5 of path). | |
| # Set to 0.0 to opt out and fall back to per-source `split:` entries. | |
| val_fraction: 0.05 | |
| sources: | |
| - name: thingi10k | |
| root: data_cache/thingi10k/thingi10k | |
| weight: 1.0 | |
| - name: mfcad | |
| root: data_cache/mfcad/mfcad | |
| weight: 1.0 | |
| - name: fusion360 | |
| root: data_cache/fusion360/fusion360 | |
| weight: 0.5 | |