Agent handoff β continuing this work on the AMD workstation
Companion to README.md (the public model card, which holds the results, method,
literature, and traps). Read that first. This file is the operational half: environment, layout,
and what to actually do next.
Written 2026-08-04, at the migration off the Gilbreth cluster.
1. The machine changed, and it is AMD
| CPU | AMD Ryzen AI Max+ 395 (Strix Halo), 16C/32T |
| GPU | Radeon 8060S iGPU β gfx1151, RDNA 3.5 |
| memory | 128 GB unified (61 GB system + 64 GB VRAM carve-out), 8 GB swap |
| disk | 1.9 TB NVMe, ~1.4 TB free |
| OS | Ubuntu 26.04 |
Everything before this ran on an A100 80GB with CUDA 12.6. The port was assessed by reading imports, not by assumption:
β What is fine
scripts/train_vecset.pyimports only numpy / torch / h5py + project modules. Training does not need pytorch3d.- No custom CUDA kernels anywhere in project code β no
CUDAExtension, nocpp_extension.load. - No flash-attn, xformers, deepspeed, apex, or bitsandbytes. The usual ROCm blockers are all absent.
- π The ~40 hard-coded
.cuda()/device='cuda'call sites are NOT a problem. ROCm PyTorch keeps thetorch.cudanamespace and maps it onto HIP. Do not "fix" them β rewriting them todevice_typestrings is churn that buys nothing and risks breaking the CUDA path.
β οΈ The one real blocker β pytorch3d
- No ROCm wheels exist. Needed by
utils/util_3d.pyandscripts/foundations/eval_massing_arms.py(the harness) forMeshRasterizer/MeshRenderer. - Build it CPU-only (
FORCE_CUDA=0). At n=48 buildings the rasterisation cost is tolerable. - If the CPU build also fights you, the rendering is separable from the metrics β
fp_iou,missing,extra,vol_iouare voxel operations and do not need pytorch3d. Only the montages do.
β οΈ Do NOT pip install -r requirements-frozen.txt verbatim. It pins 14 nvidia-*-cu12 packages,
torch==2.8.0+cu126, torchvision==0.23.0+cu126, and triton==3.4.0. Install ROCm torch wheels first,
then the non-torch remainder. Note ROCm's official Ubuntu support may lag 26.04; gfx1151 support is
recent (ROCm 6.4+).
β οΈ Expect materially slower training. The denoiser is only 49M params and fits the 64 GB carve-out with enormous headroom, but an integrated GPU is not an A100. Budget accordingly before planning a 240k-step run β the runs behind this work were ~10β11 GPU-hours each on A100.
2. What to bring over
Do not copy the cluster tree. It is 1.4 TB: data/ 493 GB, logs_building/ 406 GB, legacy/
369 GB. Roughly 700 GB of that is superseded dense-grid snapshots β delete, don't copy.
| item | how |
|---|---|
| code, docs, results, montages | git clone, branch massing-solid-gate-retrain |
| the corpus | regenerate β 25 MB in git rebuilds 35 GB SDF + 17.4 GB latents (REPRODUCING.md Β§4) |
| model weights | this folder β 945 MB for the five vecset checkpoints |
stage3a_lod2_deployed.pth |
7.2 GB, optional β superseded baseline, comparison arm only |
Dora-VAE (dora_vae_1_1.ckpt) |
2.1 GB, re-download from Hugging Face |
Regenerated data/ lands near ~55 GB, not 493 β REPRODUCING.md Β§4d notes nrw.h5 and plateau.h5
are intermediate staging nothing current uses.
Verify after transfer: sha256sum -c SHA256SUMS.
3. Where things are
| what | path |
|---|---|
| THE harness β 48 pinned ids, all arms, one pass | scripts/foundations/eval_massing_arms.py |
| cheap tracker (has a no-op detector; not authoritative) | scripts/foundations/probe_vecset_checkpoint.py |
| training | scripts/train_vecset.py (--resume, --surf_weight, --surf_t_center, --archive_every) |
| the model | models/networks/vecset_denoiser.py |
| the gradient path | DoraCodec(differentiable=True).freeze() β off by default |
| corpus loading | load_surfaces β β οΈ never read the h5 directly, it is inward-wound |
| frame conversion | scene.surface_sampling.to_array_frame, guarded by verify_frame |
| results artifacts | execution/artifacts/massing_arms_eval_*.json |
| reasoning trail | docs/wayfinding/vecset-convergence/ |
--ids_from replays a pinned id set so runs stay comparable. Use it. Every number in the model
card is on the same 48 ids; a number from a different sample is not comparable to any of them.
4. What to do next
The open question: what separates the 29 solid buildings from the 19 hollow ones?
This is the first specific investigation this project has had β every prior step was a blind lever pull. If the split correlates with something legible, it is a targeted fix rather than a sweep.
- β Building size is ruled out (tested 2026-08-04). Median GT volume 50,515 (solid) vs 43,554 (hollow), Mann-Whitney p=0.246, point-biserial r=0.186 (p=0.204). Not significant at n=48.
- β¬ Untested: footprint complexity (vertex count, concavity, aspect ratio), source corpus (3DBAG / NRW / PLATEAU), height, roof-form class.
Secondary, cheaper: lower --surf_weight at the same band β the collapses may simply be the term
overshooting on harder cases.
Then, in priority order:
- Criterion 2 β footprint fidelity 0.962 β 1.000. This is the hard, non-negotiable gate and it was under-weighted for a whole cycle in favour of 3D IoU, which the specification marks diagnostic-only. Weight it first.
- Add a collapse rate to the harness. It reports medians, which is correct for unimodal noise and actively misleading here. The bimodality was caught by eye, from a render β not by the metrics.
- #79 β SNE (sharp-normal-error). The only proposed instrument that might separate crisp from
melted, and still absent from the harness. β οΈ
guard_roughnessis not cross-arm comparable β do not use it to compare models. - #82 β footprint-only height inference. Until this lands, the claim is "footprint + height β mass", not "footprint alone". Keep that exact wherever the work is written up.
5. Read this before trusting any number
The full list is in the model card's Measurement traps section. The three that will actually cost you time:
- Never extrapolate the training curve. It went 0.719 β 0.657 β 0.532 β 0.840. Two separate runs were nearly killed during multi-checkpoint collapses that recovered. A 30,000-step window of garbage output is not evidence of a dead run in this model.
- Always report
vs inputbeside any quality number. The generator scores well by declining to act β at s=0.45 it returned its input at 99.9% and inherited its score. A model that does nothing looks excellent on every aggregate metric here. - Render before you conclude. The aggregate went 0.195 β 0.200 ("better") while a building went from a box to a shredded cage. Both bimodality and the cage failure were caught by eye, never by a scalar. This project is judged visually and the metrics have repeatedly failed to see what mattered.
β οΈ One historical correction to be aware of: a "beat 0.840 3D IoU" bar appears throughout older documents. It is retired. The criteria are: (1) human visual judgement β primary, (2) footprint match β hard gate, (3) 3D IoU β diagnostic only. A retired criterion was re-imposed and dominated the framing of two tickets before this was caught.