inspect-robots-dropbear
(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/:
a complete evaluation script and a YAM embodiment skeleton, in two variants —
native-30hz/
and
reduced-15hz/
— both adapted from runs 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 Dropbear to an evaluation that is not yet working makes the first failure much harder to attribute. You also need a Dropbear API key and an entitlement for the model you intend to call. Some models, including DreamZero-YAM, are granted per organization.1. Install
dropbear[dreamzero] for you. Confirm the policy registered
without opening a cloud session:
dropbear.
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 dropbear -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 at a native 30 Hz.control_hz sets the
rate you execute them at — any whole rate from 5 to 30:
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 a real monotonic capture time;- 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 Dropbear 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. dropbear 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["dropbear_telemetry"]:
env_step; use join_key for Dropbear 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 exceeded the chunk horizon. Lowering the command rate
lengthens the horizon and can absorb it — but only if your embodiment actually
slows to match. Changing the parameter alone just makes the scheduler wrong.
Two production runs from Sydney, same code and same input, show the size of the
effect:
Latency barely moved — that is distance and GPU, and the rate touches neither.
What changed is that a chunk now covers 1.6 s of wall clock against a ~600 ms
round trip, so the buffer stops draining. Note the cost: the arm sees a fresh
observation half as often, which matters for contact-rich or fast motions. Treat
a high hold fraction as the reason to drop the rate, not as the default.
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 margin at 30 Hz 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 15 Hz when the margin is not comfortable.