The GCP path is a thin VM lifecycle wrapper around the same schema-2 Python CLI used locally. Shell does not contain decoder matrices, dataset-specific branches, or result semantics.
- Build and publish the dataset package.
- Generate pinned workload plans from the package descriptor with
plan instantiate. - Validate and expand the plan locally.
- Confirm the target service account can read the private dataset prefix, create result/cache objects, and delete its own VM.
For example:
uv run imread-benchmark plan instantiate \
examples/fodb-experiment.template.yaml \
--package-descriptor /data/packages/PACKAGE_ID/package.json \
--output-dir plans/fodb \
--workload fodb-native \
--workload fodb-mixedFor the first real-cloud gate, use
examples/fodb-smoke.template.yaml
against fodb-native. It expands to nine runs: Pillow and OpenCV under both
protocols, with loader workers 0 and 2.
./gcp/run.sh \
--plan experiment.yaml \
--dataset-store gs://YOUR_BUCKET/imread \
--dataset-descriptor datasets/<package-id>/package.json \
--results-store gs://YOUR_BUCKET/imread-results \
--environment-store gs://YOUR_BUCKET/imread-cache \
--machine-type c4-standard-16 \
--zone us-west4-a \
--groups mainstream \
--no-waitUse --groups mainstream,tensorflow only when the plan contains configurations
for both dependency groups. Each group gets its own frozen environment and
campaign pass; stable run keys prevent overlap.
- Install minimal system libraries and
uv. - Download and checksum the exact source snapshot and plan.
- Install a small non-editable control environment with
uv sync --frozen. - Download the dataset package components, verify every hash and tar member, and atomically publish a read-only local cache entry.
- Capture platform identity and runtime metadata.
- Restore a content-addressed normalized
tar.zstfrozen worker environment from GCS, or build it withuv sync --frozen --no-editableand publish the cache. - Run pre-timing support audits in fresh processes.
- Pull already committed run bundles, execute only missing run specs in fresh processes, and publish each successful bundle immediately.
- Upload logs/attempt status, write
DONE.jsonlast, and delete the VM.
On failure the script uploads FAILED.json last and deletes the VM by default.
--keep-on-failure retains it for SSH diagnosis and therefore requires manual
cleanup.
The launcher computes runner_revision from sorted source paths and their file
hashes. It does not use a timestamped tar checksum. Repacking unchanged source
therefore preserves run keys.
A timestamp appears only in the job/attempt name. Canonical bundles live at stable remote keys:
artifacts/bundles/<bundle-id>/<payload files>
artifacts/runs/<run-key>/COMMITTED.json
The commit marker is uploaded with an object-generation create-only precondition. On restart, only markers with available bundles and valid hashes count as done. Incomplete prefixes are ignored.
./gcp/run-many.sh \
--machine-types "c4-standard-16 c3d-standard-16 c4d-standard-16 c4a-standard-16" \
--plan experiment.yaml \
--dataset-store gs://YOUR_BUCKET/imread \
--dataset-descriptor datasets/<package-id>/package.json \
--results-store gs://YOUR_BUCKET/imread-results \
--environment-store gs://YOUR_BUCKET/imread-cacheThe wrapper tries fallback zones only for capacity errors and runs machine types sequentially. Zone is recorded in each bundle as execution provenance, while the canonical platform identity uses the captured machine and CPU properties that determine comparability. This lets a capacity retry reuse the same platform group without hiding where each run executed.
Before the evidence campaign:
- launch a smoke plan with at least three run specs;
- terminate the VM after K committed runs;
- relaunch the identical source and plan on the same machine type; use a different zone if capacity requires it;
- verify the new campaign reports K skipped and N−K completed runs;
- validate all local or downloaded bundles with
artifacts validate.
The test suite exercises the same remote commit, corruption, timeout, process tree termination, and N−K resume semantics against real subprocesses and a fake object store. A real x86 and ARM GCP smoke remains a release/evidence gate.