Skip to content

Commit b4f07e7

Browse files
varunursekarclaude
andcommitted
Add a credential-file template and document how to run benchmarks concurrently
Concurrency has two independent constraints and separate keys only address one of them. Provider capacity is the one that bites, since the evaluation scope is nearly all the traffic (~2.9M metered TPM per run against the optimizer's ~4k). Three benchmarks share fireworks_ai/deepseek-v4-flash, swe-atlas-qna is Fireworks on a different model, and gaia is the only non-Fireworks target -- so gaia pairs with anything at near-zero contention while the deepseek trio stacks on one provider. The single 502 upstream_error observed so far (1 in 4750 requests at 24 slots) was Fireworks. Per-key limits are the other: a distinct --env-file per concurrent run keeps a per-key TPM/RPM throttle on one from starving another and keeps spend attributable. Separate keys against the same provider account create no new provider capacity. Modal sandbox capacity is a third ceiling again. secrets.env.example documents the naming trap: the root .gitignore covers secrets.env and *.secrets.env, so `fireworks-a.secrets.env` is protected but `secrets.2.env` is not -- verified both ways. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 8c81082 commit b4f07e7

2 files changed

Lines changed: 53 additions & 1 deletion

File tree

harness-engineering-bench/CONFIGURATION.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,27 @@ share a pool. `max_requests` is 200 000 on both everywhere (a full officeqa
281281
finalize needs ~12 000, so this is not the binding constraint either). Sizing is
282282
per benchmark from its own case counts; see each `build.yaml` for the arithmetic.
283283

284-
§ `max_concurrency` is cases in flight per evaluation, raised 8 → 24 across the
284+
§ **Running benchmarks concurrently: pair them by target provider, and give each
285+
run its own credential file.** These are two different constraints and each
286+
solves a different problem.
287+
288+
*Provider capacity* is the one that actually bites, because the evaluation scope
289+
is the overwhelming majority of traffic (~2.9 M metered TPM per run vs the
290+
optimizer's ~4 k). Three benchmarks share `fireworks_ai/deepseek-v4-flash`
291+
(officeqa, tau3, browsecomp-plus), swe-atlas-qna is Fireworks-but-a-different-model
292+
(`gpt-oss-120b`), and gaia is the only non-Fireworks target (`gpt-5.4-mini`). So
293+
**gaia pairs with any of the others at near-zero contention**, while running the
294+
deepseek trio together stacks demand on one provider. The one `502 upstream_error`
295+
we have observed (1 in 4 750 requests at 24 slots) came from Fireworks.
296+
297+
*Per-key limits* are separate: a distinct `--env-file` per concurrent run means a
298+
per-key TPM/RPM throttle on one cannot starve another, and per-workstream spend
299+
stays attributable. Copy `secrets.env.example` to a `*.secrets.env` name (that
300+
glob is gitignored; `secrets.2.env` is **not**). Separate keys against the same
301+
provider account do **not** create new provider capacity — only the pairing above
302+
does that. Modal sandbox capacity is a third, independent ceiling.
303+
304+
`max_concurrency` is cases in flight per evaluation, raised 8 → 24 across the
285305
board. It is the throughput lever: finalize wall time is
286306
`ceil(trials / max_concurrency) × mean case wall`, so officeqa's ~4.1 h finalize
287307
becomes ~1.4 h. Headroom is measured, not assumed — officeqa run #2 sustained
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Template for a run's credential file. Copy to a name matching *.secrets.env
2+
# (root .gitignore covers `secrets.env` and `*.secrets.env`; a name like
3+
# `secrets.2.env` would NOT be ignored) and fill in real values:
4+
#
5+
# cp harness-engineering-bench/secrets.env.example vero/fireworks-a.secrets.env
6+
# vero harbor run ... --env-file fireworks-a.secrets.env
7+
#
8+
# Why more than one: a distinct file per concurrent run gives each its own
9+
# upstream key, so a per-key TPM/RPM limit on one run cannot throttle another,
10+
# and per-workstream spend stays separately attributable. Note what it does NOT
11+
# buy: separate keys against the same provider account do not create new provider
12+
# capacity. Use the target-model split for that — see the concurrency note in
13+
# CONFIGURATION.md.
14+
#
15+
# Never commit a filled-in copy. Every value here is a live credential.
16+
17+
# Upstream inference the gateway proxies to. The optimizer and the target agent
18+
# never see this key; the gateway mints per-scope tokens instead.
19+
OPENAI_API_KEY=
20+
OPENAI_BASE_URL=
21+
22+
# Modal runs the inner evaluation sandboxes. Parallel runs share one Modal
23+
# workspace unless these differ, and sandbox capacity is its own ceiling
24+
# separate from any inference quota.
25+
MODAL_TOKEN_ID=
26+
MODAL_TOKEN_SECRET=
27+
28+
# Telemetry. One key is fine across concurrent runs — they are distinguished by
29+
# `--param wandb_run=`, all landing in the shared harness-engineering-bench
30+
# project.
31+
WANDB_API_KEY=
32+
WANDB_BASE_URL=

0 commit comments

Comments
 (0)