inspect-robots-dreamscale
(source, Apache
2.0). It changes one thing in your evaluation: which policy is selected. Your
registered task and embodiment stay exactly as they are.
Runnable reference code for everything below lives in
examples/native-30hz/:
a complete evaluation script and a YAM embodiment skeleton, adapted from a run
that completed against production. Copy from there rather than retyping this
guide.
Before you start
You need an Inspect Robots evaluation that already runs on your hardware with some other policy — a scripted or teleop baseline is ideal. Bring up the robot, the cameras, and the task first, and confirm trials complete end to end. Adding Dreamscale to an evaluation that is not yet working makes the first failure much harder to attribute. You also need a Dreamscale API key and an entitlement for the model you intend to call. Some models, including DreamZero-YAM, are granted per organization.1. Install
dreamscale[dreamzero] for you, including the dreamscale
command used below. Adapter 0.1.18 pins dreamscale[dreamzero]==0.1.0a26;
confirm that is the SDK your environment resolved:
dreamscale.
2. Authenticate
status confirms the credential is accepted and reports whether the model has
capacity, before you spend a session finding out.
3. Select the policy
Change only the policy selection in your existing evaluation command:--task and --embodiment;
--policy dreamscale -P model=dreamzero-yam is the entire edit. Everything else —
epochs, scorer, logging — is unchanged.
Parameters
async_latest is the qualified default: inference is single-flight and
latest-only, so the robot always acts on the freshest available chunk. Use
async_8 only as an explicit compatibility or rollback path, and
upstream_eval only for an agreed open-loop dataset evaluation — it blocks at
each replan and is not intended for hardware.
The first connection is slow on purpose. A cold model loads weights and warms up
before it serves, which is why startup_timeout_s defaults to 30 minutes. Later
trials in the same run reuse the open connection.
Skipping the cold start while you iterate
A cold start is roughly two minutes, paid once per connection — every trial in one evaluation shares it. It only hurts when you are iterating: fixing a camera mapping, re-running, fixing the next thing, and paying two minutes each time.keep_warm_s holds the session after close so the next run reclaims it instead
of starting cold:
The reclaim is matched on your organization, user, model, region mode, and
optimization settings, so a later
inspect-robots run with the same policy
arguments picks up the session you left warm.
Control rate, and who owns the clock
DreamZero-YAM emits 24 actions per chunk on a 30 Hz action timebase, so one chunk covers 0.8 s. The model is qualified at exactly 30 Hz. You can pass the rate explicitly:4. Run the evaluation
What your embodiment must provide
On every policy step, the task and embodiment must supply:top_cam,left_cam, andright_camuint8 images, each with its own real capture time in Unix-epoch seconds (not a process-monotonic clock, and not one synthetic time shared across cameras);- finite packed
joint_posstate with shape(14,), ordered left arm, left gripper, right arm, right gripper; and - Inspect’s integer
extra["env_step"], starting at zero and advancing once per delivered action.
act() call, while Dreamscale owns the
action buffering behind it. See Model contracts for the
full DreamZero-YAM contract, including gripper conventions.
Capture times must be real. The model reasons over a short history of frames, so
a fabricated or stale clock silently degrades its output rather than raising.
The whole script
The shape of a full run, with the hardware halves stubbed. The complete versions arerun_eval.py
and
yam_embodiment.py.
Closing
Confirm nothing is still running:close(), and it cannot help if the machine loses
power. uv run dreamscale sessions stop --all clears a zombie lease.
If you construct the policy object yourself rather than naming it in the
registry, you own its lifecycle. Inspect closes what it resolved from a
registry name; it does not close objects you passed in. The script above
resolves the policy itself, so the explicit
close() is required.5. Diagnostics
The adapter writes one atomic sidecar per trial and records its relative path atTrialRecord.metadata["dreamscale_telemetry"]:
env_step; use join_key for Dreamscale chunk-level diagnostics.
Sidecars never contain action vectors, images, credentials, or endpoints, so
they are safe to attach to a bug report.
The two numbers worth reading first are the observation-to-action round trip and
action_source, which records for every step whether the robot executed a
model action or held its previous position.
A high but non-zero hold fraction means the action buffer drained, usually
because the round trip came close to the 0.8 s chunk horizon. Treat it as a
diagnostic to investigate, not a reason to change the rate. A production run
from Sydney shows the size of the effect:
Most of that round trip is distance and GPU.
obs_to_action_ms minus
server_inference_ms is network, encode, decode, and scheduling combined, and it
is dominated by distance to the serving region, us-west-2. Running the client
closer to the region reduces it far more than any client-side tuning.
Once the round trip exceeds the chunk horizon, the hold fraction does not
degrade gracefully — it goes to 100%. No chunk can ever land before the buffer
it was meant to refill has drained, so every step holds and the model
contributes nothing. Re-running the same 30 Hz configuration from a tethered
mobile connection instead of fixed broadband, with nothing else changed, the
round trip rose from 644 ms to 945 ms — past the 800 ms horizon — and
model-sourced actions went from 39/120 to 0/120. The run still reported
success.
That makes the horizon a threshold worth knowing: the observation-to-action
round trip must stay under about 800 ms. The margin is thin if you are far from
the serving region: a few hundred milliseconds of extra round trip is the
difference between a working run and an empty one. Anything shared, metered, or
wireless — a hotspot, a busy lab network, a VPN — can cost you that much on its
own. Check action_source rather than trusting the status, and prefer a fixed,
wired connection close to the region.