Make a Runway blind-eval round a one-line CLI - #547
Conversation
Without `--pythonpath`, basedpyright resolves imports against the working `.venv`, so whichever extras a contributor last synced decide the result — the drift `.venv-typecheck` exists to rule out
Two deployments of one checkpoint report identical server metadata, so `server.checkpoint_path` cannot tell them apart: `SampledPolicy` refuses the set and the analysis table merges their episodes. `RemotePolicy` takes a `label`, `production` keys on the name each endpoint already has and passes `headers` through to all of them. Key discovery also reads every sub-policy's meta at once, so warmup costs the slowest cold start rather than the sum.
Points at the four curie checkpoints Runway shipped for this round.
|
Closing — half of this is now platform's, and the half that is not travels with the sampler. The presets do not belong here. The mechanics are real and are not lost. Two things here have no equivalent anywhere: Reopen or re-cut against that ticket if the labelling is wanted before the move. |
Summary
Runway ships batches of checkpoints to Modal every few days and asks for blind rollouts on them. This
branch is what makes that round a one-line CLI, and it holds the presets naming the endpoints currently
under eval.
Endpoints are identified by the operator's name, not the checkpoint they serve.
server.checkpoint_pathis identical across two deployments of one checkpoint, soSampledPolicy._get_keysrefused such a set outright ("must be distinguishable by …") and the analysis table would have merged their
episodes into one row.
RemotePolicytakes alabel,productionkeys on the name each endpoint alreadycarries in
endpoints, andanalysis.model()prefers it. The checkpoint stays recorded for provenance.productioncan passheaders. It had no way to, so endpoints behind Modal's proxy were unreachablethrough it — only the single-endpoint
.remoteconfig could carry credentials. One set of credentialsfronts every endpoint, so the headers reach all of them.
Warmup reads every sub-policy's meta at once. Reading a remote sub-policy's meta opens a session and
blocks until the backend has loaded its model, and the reads were sequential, so warmup cost the sum of
the cold starts (measured 270–602 s each on these endpoints). Now it costs the slowest one.
The episode counter is seeded before warmup samples against it. Warmup opens a session, which already
draws a sub-policy, so the draw has to see what the output directory already recorded — otherwise a resumed
run restarts the balance from zero.
Two rolling presets, one per Runway owner —
runway_anton(curie) andrunway_ziyi(gyros). They ship anew batch every few days, so their preset gets repointed rather than a new preset added per batch, and the
operator's command never changes.
Two smaller things: the sampled sub-policy is logged by
SampledPolicyfor every sampler rather than onlyinside
BalancedSampler, and a rejected handshake names the URL it was opening — the whole diagnosis whenseveral endpoints come up at once.
The first commit is unrelated plumbing: the type-check hook builds
.venv-typecheckso the ratchet sees afixed dependency set, but never points basedpyright at it, so imports resolve against the working
.venvandwhichever extras were last synced decide the result. On this machine that was 18 errors on a clean tree; with
the interpreter pinned, 0. It needs no baseline change —
mainalready carries those entries. Happy to splitit out if you'd rather.
Test plan
pytest: 839 passed, 4 skipped.checkpoint_pathstay distinguishable by label, and anunlabelled endpoint carries no
labelfield.metaread blocks on athreading.Barrier(3)— it can only passif the reads overlap. Verified it fails (5.6 s barrier timeout) against the previous sequential comprehension.
positronic-inference phail --policy=.runway_ziyi --policy.headers=… --help.batches), reports delivered.
runway_ziyi's current three endpoints are not yet run — that is tomorrow'sround; their hostnames were probed (401 behind the proxy, vs 404 for a name that does not exist).
Note
Conflicts with
mainafter #505's move of raw metadata keys intopositronic.keys— mechanical, bothconflicts are string literals this branch also touches (
analysis.model,EpisodeCounter.seed_from). Notrebased yet because the rig runs its eval from this branch in the morning.