Upload GB10_EVAL_PIPELINE.md with huggingface_hub
Browse files- GB10_EVAL_PIPELINE.md +88 -0
GB10_EVAL_PIPELINE.md
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# GB10 RoboPRO / DA3-XVLA Eval Pipeline — Issues & Fixes (canonical)
|
| 2 |
+
|
| 3 |
+
> Consolidated reference for running the RoboPRO / DA3-XVLA evaluation on the **GB10** cluster.
|
| 4 |
+
> Supersedes `GB10_ISSUES.txt`. Companion docs: `SAPIEN_B1_ATTEMPT.md` (full b1 build log),
|
| 5 |
+
> `DEBUG_OFFICE.md` (the office-SR root-cause hunt). Last updated 2026-06-25.
|
| 6 |
+
|
| 7 |
+
## Environment
|
| 8 |
+
- 15-node **NVIDIA Grace-Blackwell (GB10)**, **1 GPU/node** (Blackwell **sm_120/121**, ~119 GB unified LPDDR5X).
|
| 9 |
+
- **aarch64**, **CUDA 13**, **glibc 2.39**. Node 1 = NFS/login head; nodes 1–2 reserved (Mark).
|
| 10 |
+
- `/shared_work` = plain **ext4 on one 3.7 TB NVMe on the head**, NFS-exported (sync) — NOT pooled/BeeGFS.
|
| 11 |
+
Each compute node has its own ~3.6 TB local disk → stage to `/tmp/dxvla_local`.
|
| 12 |
+
|
| 13 |
+
## TL;DR — config for a correct, comparable eval
|
| 14 |
+
| knob | value | why |
|
| 15 |
+
|---|---|---|
|
| 16 |
+
| `DXVLA_SAPIEN_B1=1` | SAPIEN **3.0.0b1** | 3.0.3 is an office/kitchen regression (§2) |
|
| 17 |
+
| `WORKERS_PER_GPU=1` | one CUDA context/GPU | MPS broken; sharing corrupts the sim (§1) |
|
| 18 |
+
| `DXVLA_DENOISER=optix` | OptiX denoiser | OIDN is a silent no-op on Blackwell (§3) |
|
| 19 |
+
| node-local staging | `/tmp/dxvla_local` | NFS mmap fan-out stalls (§4) |
|
| 20 |
+
| `CACHE_LIMIT_GB=999999` | LRU off | LRU was evicting staged giant weights (§5) |
|
| 21 |
+
| reserve nodes | exclude from POOL | nodes 1,2 reserved |
|
| 22 |
+
|
| 23 |
+
---
|
| 24 |
+
|
| 25 |
+
## 1. GPU concurrency — the big correctness trap
|
| 26 |
+
**1a. CUDA MPS is broken on this Blackwell GPU.** Enabling it → CUDA **Error 807** (MPS server-not-ready) then **700** (illegal memory access); corrupted an overnight run. → **MPS disabled** (`ENABLE_MPS=0`); workers go straight to the GPU.
|
| 27 |
+
|
| 28 |
+
**1b. `WORKERS_PER_GPU>1` corrupts the simulation (no MPS to fall back on).** With 4 sim+render+curobo workers sharing one GPU, episodes go "shakey" — objects jitter/move *before* contact, noisy arm/proprio, precise grasps/inserts fail. **Same seed succeeds at WPG=1, fails at WPG=4 (deterministic flip, not noise).** Concurrent CUDA contexts time-slicing one GPU trigger sporadic memory/compute corruption; the closed perception→action loop amplifies a corrupted RT frame into bad actions. Damage concentrates on precise-insertion tasks (drawers/cabinets); robust pick-place absorbs it. **Impact:** degraded a whole run (office 5%→35% instead of ~58%). → **Run `WORKERS_PER_GPU=1`.** Throughput doesn't scale linearly with WPG anyway (eval is ~half CPU-bound on physics/curobo).
|
| 29 |
+
|
| 30 |
+
## 2. SAPIEN on aarch64
|
| 31 |
+
**2a. No aarch64 SAPIEN wheels on PyPI.** `pip install sapien` pulls unrunnable x86_64. aarch64 wheels exist only as haosulab GitHub-release assets, only for 3.0.3 + a nightly. → installed 3.0.3 cp310 aarch64 wheel (`/shared_work/jack/wheels/`).
|
| 32 |
+
|
| 33 |
+
**2b. SAPIEN 3.0.3 is a REGRESSION vs the reference's 3.0.0b1 (office/kitchen broke).** Office SR 5% / kitchens 11% vs reference ~40–90% / ~58%, *same checkpoint* — model never descends, closes gripper early. The reference numbers were made on **3.0.0b1**; the 3.0.0b1→3.0.3 delta (79 commits: PhysX defaults + camera/render + 85 Vulkan shaders) makes office/kitchen scenes OOD. `study` (flat) tolerated it; deep shelves/drawers + specular did not. → **Built 3.0.0b1 from source for aarch64 (§3)**, deployed via `DXVLA_SAPIEN_B1=1`. A/B: milktea 0/55 (3.0.3) → 5/6 (b1). **Lesson: pin the simulator version when comparing to reference numbers.**
|
| 34 |
+
|
| 35 |
+
**2c. librt / GLIBC_PRIVATE** (3.0.3 wheel): vendored librt wants a GLIBC_PRIVATE symbol absent on glibc 2.39. → symlink bundled librt → system `/usr/lib/aarch64-linux-gnu/librt.so.1`.
|
| 36 |
+
|
| 37 |
+
## 3. Building SAPIEN 3.0.0b1 from source (aarch64) — blockers
|
| 38 |
+
- **3a. CUDA 13 dropped old archs** (`Unsupported gpu architecture 'compute_60'`). → set `CUDA_ARCHITECTURES=75;80;86;90;120;121` in CMakeLists, `3rd_party/simsense/CMakeLists.txt`, and the OIDN arch list.
|
| 39 |
+
- **3b. PhysX5 prebuilt is x86_64-only.** → repoint `cmake/physx5.cmake` at the aarch64 PhysX asset (105.1-physx-5.3.1) + fix the MD5.
|
| 40 |
+
- **3c. KTX astc-encoder NEON fails on gcc13/aarch64.** → `-DISA_NONE=ON` (scalar astcenc).
|
| 41 |
+
- **3d. GL/EGL/GLU/DRM dev headers missing, no sudo.** → `apt-get download` + `dpkg-deb -x` the arm64 `*-dev` debs into a local sysroot; point `C(PLUS)_INCLUDE_PATH`/`LIBRARY_PATH` at it.
|
| 42 |
+
- **3e. pybind11 smart_holder branch deleted upstream.** → pin to archive/smart_holder commit `68a11bb`.
|
| 43 |
+
- **3f. No auditwheel.** → manually bundle `libsapien/libsimsense/libsvulkan2.so` into the wheel, set `$ORIGIN` RUNPATHs via patchelf, add OIDN soname symlinks.
|
| 44 |
+
- **Output:** `/shared_work/jack/sapien_b1_build/dist_bundled/sapien-3.0.0b1-cp310-...whl`; env at `envs/robotwin_b1`. Deployed by the `DXVLA_SAPIEN_B1=1` slurm hook (rsyncs the b1 pkg into node-local robotwin; the env has no pip so it's a file copy, not pip install).
|
| 45 |
+
|
| 46 |
+
## 4. Rendering (ray tracing / OptiX / OIDN)
|
| 47 |
+
- **4a. OIDN (Intel Open Image Denoise) CUDA backend is a SILENT NO-OP on Blackwell.** `DXVLA_DENOISER=oidn` → frames identical to no-denoise, no error → noisier RT than reference if relied on. → **Use `DXVLA_DENOISER=optix`** (slurm default).
|
| 48 |
+
- **4b. RT render is GPU-heavy** and is the main victim of WPG>1 contention (§1b): under sharing it degrades/corrupts → noisy observations → failed precise tasks.
|
| 49 |
+
- **4c. Vulkan ICD / RT setup:** `VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json`, `unset DISPLAY`, `LD_LIBRARY_PATH` includes `/shared_work/jack/vklib`. `DXVLA_RT_SPP=32` (samples/pixel) matches the reference render quality.
|
| 50 |
+
|
| 51 |
+
## 5. Node-local staging & giant-checkpoint staging
|
| 52 |
+
**5a. NFS mmap fan-out stalls.** Loading envs/checkpoints from NFS via mmap across many nodes at once is catastrophically slow. → stage envs+code+ckpt to node-local `/tmp/dxvla_local` (self-staging in `slurm_eval_node.sh`); only bulk one-time rsyncs touch NFS.
|
| 53 |
+
|
| 54 |
+
**5b. (NEW 2026-06-25) The node-local 50 GB LRU evicted staged giant WEIGHTS.** Running 5 different giants, `stage_giants_node.sh`'s `CACHE_LIMIT_GB=50` LRU evicted a giant's checkpoint *after* staging → at load: `OSError: no file named pytorch_model.bin/model.safetensors found in .../checkpoints/<ckpt>`. → **Disabled the LRU: `CACHE_LIMIT_GB=999999`** in `stage_giants_node.sh` and `slurm_eval_node.sh` (node disk is 3.6 TB; the 50 GB cap was needless).
|
| 55 |
+
|
| 56 |
+
**5c. (NEW) Giant model code not importable node-local → `ModuleNotFoundError: No module named 'models'`.** The giant's bundled code (`models/modeling_xvla.py`) wasn't reliably present node-local (staging gap / eviction). → **Point `GIANT_CODE_DIR` (→ `DA3_XVLA_ROOT`) at the NFS path** `ablation_ckpts/<ckpt>/{code|overlay}` (dptfused→`code`, spatialexpert→`overlay`). The code is small `.py` — imports fine from NFS; only the *weights* need node-local. Both subdirs are self-sufficient (have `models/` + `datasets/`).
|
| 57 |
+
|
| 58 |
+
**5d. (NEW) Self-stage skipped refilling evicted/partial weights.** The giant self-stage gate checked only *directory presence* (`[ ! -d $L/checkpoints/$CKPT ]`), so a dir with evicted weights was treated as "staged." → made the giant ckpt self-stage **always run an idempotent rsync** (runs whenever `ablation_ckpts/<ckpt>` exists; rsync `--update` refills missing shards). Giant weights are **sharded** `pytorch_model-0000N-of-0000M.bin` + `index.json`.
|
| 59 |
+
|
| 60 |
+
**5e. Giant launch env** (per model): `GIANT_CODE_DIR=<nfs code dir>`, `XVLA_DA3_NATIVE_INPUT=1`, `XVLA_DA3_INPUT_HW=252x336` (native aspect), `DXVLA_SKIP_RELOAD=1` (DA3 weights baked into the ckpt — no `reload_pretrained_weights`), `XVLA_SKIP_GEOMETRY_REINIT=1`, `EVAL_FAST_CTRL=1` (else rollouts crawl ~3.6 s/step).
|
| 61 |
+
|
| 62 |
+
## 6. Motion planning (curobo)
|
| 63 |
+
On cluttered/complex scenes `plan_path` is slow and can stall a worker; some scene seeds are physically unstable. → `STALL_TIMEOUT=900` + `CUROBO_IK_FAIL_RETURN=1`; eval seed-advances past unstable seeds (frozen pre-validated seed bank). curobo built node-local against robotwin torch (2.9.1+cu130).
|
| 64 |
+
|
| 65 |
+
## 7. Node hardware / ops
|
| 66 |
+
- **7a.** A node went unresponsive (ssh froze, SLURM showed down) → physical/power-cycle restart (a `sudo reboot` is insufficient when ssh hangs).
|
| 67 |
+
- **7b.** Cold/new nodes self-stage base env+code+ckpt from NFS on first job (slurm_eval_node.sh).
|
| 68 |
+
|
| 69 |
+
## 8. Eval-ops gotchas (not GB10 hardware, but bit us)
|
| 70 |
+
- **8a. `queue.txt.leases` is a DIRECTORY** (per-cell lock files). `rm -f queue.txt.leases*` does NOT clear it → stale locks make a re-run SKIP "done" tasks (0 new episodes). → **`rm -rf queue.txt.leases`** before re-running in an existing run dir.
|
| 71 |
+
- **8b. Self-kill → exit 144.** `pkill -f <pat>` / `pgrep -f <pat> | kill` where `<pat>` is in the command's OWN command line kills your shell. → **kill drivers by explicit PID; cancel SLURM by `--name`/`--jobid`; never `-f` patterns matching your own command.** (Hit this repeatedly.)
|
| 72 |
+
- **8c. slurm exports override passed env** unless made `${VAR:-default}` → per-knob A/B tests were silent no-ops. → make all tunables `${VAR:-default}`.
|
| 73 |
+
- **8d. A running orchestrator bakes its node POOL at start.** Editing the script doesn't change the live driver. → stop by PID + relaunch with `POOL` override.
|
| 74 |
+
- **8e. Fast cancel→relaunch loses sruns.** Relaunching immediately after `scancel` fails most sruns (nodes still COMPLETING). → poll until jobs=0 AND nodes idle before relaunching.
|
| 75 |
+
|
| 76 |
+
## 9. Pipeline feature knobs (added during this work)
|
| 77 |
+
- `DXVLA_EXEC_ACTIONS=20` — receding-horizon: generate a 30-action chunk, execute the first 20, re-query (0 = full chunk).
|
| 78 |
+
- **cross-chunk EMA smoothing** — seeds each chunk's first action from the previous chunk's last *executed* action (fixes the visible chunk-boundary jerk). `DXVLA_ACTION_SMOOTH=0.7`, `DXVLA_SMOOTH_ROT=1`, with `DXVLA_FAKE_PROPRIO=1`.
|
| 79 |
+
- `XVLA_VIDEO_FPS=18` — recorded-video playback FPS (default 12).
|
| 80 |
+
- `XVLA_POSED_DA3=1` — feed camera extrinsics/intrinsics into the DA3 path (posed depth). Verified the pose comes live from the SAPIEN camera (`extrinsic_cv`), not identity.
|
| 81 |
+
|
| 82 |
+
## Key takeaways for a correct, comparable GB10 eval
|
| 83 |
+
1. **SAPIEN 3.0.0b1** (`DXVLA_SAPIEN_B1=1`), not 3.0.3.
|
| 84 |
+
2. **WORKERS_PER_GPU=1** (no MPS; sharing corrupts).
|
| 85 |
+
3. **OptiX denoiser** (OIDN is a no-op here).
|
| 86 |
+
4. **Node-local staging**, LRU **off** for multi-giant runs; giant **code from NFS**, weights node-local (idempotent rsync).
|
| 87 |
+
5. Reserve nodes by **excluding from the POOL** (1 & 2 reserved).
|
| 88 |
+
6. Kill by **PID**, cancel by **`--name`** — never `-f` patterns.
|