File size: 8,096 Bytes
c65d575
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
076e185
c65d575
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4e38f5d
 
 
 
 
 
 
 
 
c65d575
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# SimReady Validator β€” HuggingFace Space (Phase-3 Spike)

This directory scaffolds an HF Space that runs the bundled
[`simready-report`](../validation/plugins/simready-report/) validator
against any HF dataset, then opens a verdict PR back on the dataset.

It is the **phase-3 prove-it step** described in [PRD Β§3](../../PRD.md):
move validation execution to where the dataset already lives, so we stop
paying to copy 20 GiB of customer assets onto NVIDIA-controlled
infrastructure on every run.

| | DGXC runner today | HF Space (this dir) |
|---|---|---|
| Asset transfer | 10–20 GiB per submission onto a 49 GiB PVC | None β€” `huggingface_hub.snapshot_download` reads from HF storage directly |
| Cost model | NVIDIA pays for the runner | Customer pays for their Space's hardware hours |
| Concurrency | Single runner, jobs serialized | One Space per dataset β†’ scales linearly |
| Where verdicts land | `dashboard/data/status.json` in this repo | `validation/results.json` in the dataset, via PR |
| Trigger | GitHub Actions `workflow_dispatch` | Gradio UI (spike) β†’ HF Hub webhook (next) |

The Space is **internal pilot scope**: the HF_TOKEN that opens the verdict
PR is the Space's own secret, not the requester's. A customer-facing
end-state would either (a) deploy one Space per partner under their org,
or (b) keep a single multi-tenant Space and have customers pass their own
token explicitly.

---

## What's here

| File | Purpose |
|---|---|
| `Dockerfile` | Docker SDK image: pip-installs the validator runtime, clones `NVIDIA/simready-foundation` for `SIMREADY_FOUNDATIONS_PATH`, bakes in the in-repo `tools/validation/` skill |
| `requirements.txt` | Python deps. Pinned to match `tools/runner/install-simready-sdk.sh` so verdicts are byte-for-byte reproducible across environments |
| `app.py` | Gradio UI. Single form: dataset name + profile + version + open-PR checkbox |
| `runner.py` | Orchestration. `run(dataset, profile, version, open_pr) β†’ RunResult` β€” also the entry point a future webhook handler will call |

The validator engine itself is **unchanged** β€” the Space invokes the same
`tools/validation/plugins/simready-report/skills/simready-report/validate.py`
that Windows users run locally and that the DGXC runner runs in CI.
That's the whole point of phase 3: the verdict logic is portable; only
the trigger surface changes.

---

## Hardware tier choice

The validator's heavy work is USD parsing + composition-arc traversal,
which is CPU-bound. **GPU is only required if a profile re-execs under
Kit (Isaac Sim)**, which the Space's `--no-use-kit` flag explicitly
disables. The validator's P2 patch drops the
`physxschema_unavailable` / `omnipbr_unresolved` issues that the
no-Kit path produces, so PhysX-bearing profiles still report a clean
verdict for everything that can be checked without Kit.

| Tier | $/hr | Verdict |
|---|---|---|
| `cpu-basic` (2 vCPU, 16 GB) | $0.03 | Marginal β€” small datasets OK, 50+ asset bundles will time out |
| **`cpu-upgrade`** (8 vCPU, 32 GB) | **$0.05** | **Recommended for the spike.** Comfortable headroom; the validator's parallel worker pool actually scales here |
| `t4-small` (1 Γ— T4, 4 vCPU, 15 GB) | $0.40 | Only needed once we add Kit; overkill for `--no-use-kit` |
| `a10g-small` (1 Γ— A10G, 4 vCPU, 15 GB) | $1.05 | Future state: enables Kit-rooted PhysX/MDL rules (currently filtered out by the P2 patch) |

Set the tier in the Space's **Settings β†’ Hardware** page (or in
`README.md` frontmatter when the Space repo is created β€” see Deploy).

---

## Deploy

This dance is captured as a Claude Code skill at
[`skills/deploy-hf-space/SKILL.md`](./skills/deploy-hf-space/SKILL.md).
Future operators can run `/deploy-hf-space [<slug>]` instead of
following this README by hand. The README below is the human-readable
mirror.

The Space is currently live at
[`nvidia/simready-validator`](https://huggingface.co/spaces/nvidia/simready-validator).
To re-stand it up from scratch:

### 1. Create the Space `[BROWSER]`

1. Sign in at https://huggingface.co with an account that has write
   access to wherever the Space will live (an NVIDIA org for the
   internal pilot).
2. New β†’ Space.
3. Name: `simready-validator` (or any name).
4. SDK: **Docker**.
5. Hardware: **CPU upgrade** (~$0.05/hr) for the spike.
6. Visibility: **Private** while internal-pilot.

### 2. Set the HF_TOKEN secret `[BROWSER]`

The Space needs a write-scoped token to open the verdict PR on customer
datasets.

1. https://huggingface.co/settings/tokens β†’ New token β†’ **Write** scope.
2. Space β†’ Settings β†’ Variables and secrets β†’ New secret.
3. Name: `HF_TOKEN`. Value: paste the token.

Tokens are not exposed in the build log. The `runner.py` code reads it
via `os.environ["HF_TOKEN"]` (with `HUGGING_FACE_HUB_TOKEN` as a
fallback for compatibility with the HF SDK's standard env name).

### 3. Push the code `[LOCAL]`

The Space is a git repo of its own. From this checkout:

```bash
# Replace <space-name> with the Space you created (e.g. nvidia/simready-validator)
hf auth login   # one-time
git clone https://huggingface.co/spaces/<space-name> /tmp/space
cp -r tools/hf_space/* /tmp/space/
# Important: the Dockerfile COPYs tools/validation/ from the repo root,
# so we have to vendor that subtree into the Space repo too.
mkdir -p /tmp/space/tools
cp -r tools/validation /tmp/space/tools/
cd /tmp/space
git add .
git commit -m "Initial Space scaffold from simready-oem-library-pm@main"
git push
```

The Space will start building automatically. First build takes ~5 min
(usd-core + omniverse-asset-validator wheels + the foundation clone).
Subsequent builds reuse Docker layer cache and finish in ~1 min if only
`app.py` or `runner.py` changed.

### 4. Smoke-test `[BROWSER]`

Open the Space's URL. Enter a known-good dataset (the foundation
clone's bundled examples work well β€” point at something small like a
single-asset dataset first), pick **Robot-Body-Runnable**, leave
**Open PR** unchecked, click **Validate**. Watch the log stream.

Expected output ends with:

```
  PASS: 1/1 assets passed
```

…and a downloadable `index.html` report.

If the verdict makes sense, re-run with **Open PR** checked against a
dataset you have write access to. A new PR appears on the dataset under
`https://huggingface.co/datasets/<dataset>/discussions` with the
verdict body + the `validation/` subtree.

---

## What this spike intentionally does NOT do

To stay scoped to "prove the engine works on HF":

- **No HF Hub webhook.** Triggering is Gradio-only. Phase 3.2 wires
  `https://<space>/api/run` to `dataset.commit.push` events.
- **No status callback into this repo.** The DGXC dashboard's
  `hf-watch.yml` already polls dataset commits β€” once the Space lands
  verdicts as `validation/results.json` on the dataset, the existing
  watcher picks them up. No new integration needed.
- **No Kit re-exec.** Profiles requiring PhysX/MDL rules currently
  report partial verdicts (the P2 patch drops env-blocked rules). A
  future iteration with an `a10g-small` tier + Isaac Sim wheels in the
  Dockerfile unlocks these.
- **No multi-tenant token isolation.** The Space's own `HF_TOKEN` opens
  every PR. Fine for internal pilot; needs rework before exposing the
  Space outside NVIDIA.

These are tracked in [PRD Β§7 β€” roadmap](../../PRD.md).

---

## Cutover criteria (when do we retire the DGXC runner?)

Stop using `hf-validate.yml` once **all three** are true:

1. The Space verdict matches the DGXC verdict on the same dataset for
   the top three onboarded clients (imagineio kitchens, plus two TBD).
   Byte-for-byte equality on `results.json` is the bar.
2. The HF Hub webhook handler (phase 3.2) is in place and a customer
   can open a dataset PR and see a verdict comment without anyone at
   NVIDIA pressing a button.
3. The PRD Β§7 roadmap items 3.3 (auto-merge on pass) and 3.4 (block-on-fail
   gate at the GitHub side) are wired through, so the GitHub coordinator
   only deals with state β€” never validation.

Until then both paths coexist; the DGXC runner is the source of truth.