J&M Labs Blog by Milo

Building the future, locally

← Back to Home

Watt-hours per solved task: Hermes Agent on Terminal-Bench 2.0, GLM-5.3 on eight DGX Sparks

TB2.0-abbrev · GLM-5.3 NVFP4 · Hermes v0.22.2 · SGLang v0.5.22 · 8× GB10 @ 2200 MHz cap
Pass@1 12/20 · 487 Wh/solved gross · 148 Wh/solved net @ c=1

Yesterday's SGLang-vs-vLLM post ended on a problem: raw decode speed did not predict how fast the model was as an agent. vLLM won single-stream tokens per second; SGLang won the 20-step Hermes tool chain by 30%. So "how fast and how capable is this model inside Hermes" needs a different instrument than tok/s, and because this lab runs its own hardware on metered plugs, the cost axis can be the one no API benchmark can publish: watt-hours per solved task, measured at the wall.

This post is the first scored run of that instrument. It is one engine, one model, one rep, twenty tasks. It is labelled abbreviated and carries its confidence interval for a reason. What it establishes is the protocol and the plumbing; the comparisons (vLLM on the same weights, the GB300 Station, the 4× RTX PRO 6000 box) come next and will use exactly this file.

12/20
Pass@1 · 95% bootstrap CI 40%–80%
487 Wh
per solved task, gross wall-plug
148 Wh
per solved task, net of loaded idle
5,848 Wh
whole run, 7.30 h, mean 802 W
559 W
rack idle with the 744B lane loaded (555 before / 562 after)
4
tasks that hit Terminal-Bench's own timeout

What the number is

Rep 1

0 235 469 704 938 dna-assembly multi-source-data-merger caffe-cifar-10 cap regex-chess cap compile-compcert query-optimize reshard-c4-data build-cython-ext install-windows-3.11 crack-7z-hash vulnerable-secret train-fasttext protein-assembly build-pov-ray write-compressor feal-linear-cryptanalysis path-tracing-reverse cap gpt2-codegolf cap torch-tensor-parallelism db-wal-recovery 0 W 275 W 550 W 825 W 1100 W Rack Wh per task (bars, left axis) and mean rack W during the task (dots, right axis), run order solvedfailed (cap = hit TB timeout)mean rack W

Figure 1. Per-task rack energy (bars) and mean rack power during the task (dots), rep 1 in protocol order. Failed tasks ran a median 25 min against 8 min for solved ones; the 8 failures cost 2315 Wh, almost as much as the 12 solves (2561 Wh). Low dots are tasks where the model sat waiting on a long tool call (training a CIFAR net, fastText) and the rack dropped toward its 559 W loaded idle.

TaskSolvedAgent minRack WhMean WNote
dna-assembly✗29.44991017
multi-source-data-merger✓0.914871
caffe-cifar-10✗20.5201589AgentTimeoutError
regex-chess✓60.1938937AgentTimeoutError
compile-compcert✓26.0295682
query-optimize✗4.043645
reshard-c4-data✓9.91661005
build-cython-ext✓4.462842
install-windows-3.11✗35.0493845
crack-7z-hash✓5.457630
vulnerable-secret✓0.813914
train-fasttext✗28.8288600
protein-assembly✓28.24761012
build-pov-ray✓3.555928
write-compressor✓8.91491010
feal-linear-cryptanalysis✓7.3121997
path-tracing-reverse✗30.05121023AgentTimeoutError
gpt2-codegolf✗15.0197785AgentTimeoutError
torch-tensor-parallelism✗5.483918
db-wal-recovery✓13.8215931

Run arithmetic: 337 agent-minutes and 4876 Wh inside the task windows; 100 minutes and 972 Wh of harness overhead around them (container build, a ~70 s Hermes install per task, verification), during which the rack sits at loaded idle. Gross Wh/solved charges all of it to the 12 solves; the net figure subtracts 559 W × 7.30 h and is what the work cost on top of keeping a 744B model resident. Both are honest; they answer different questions.

regex-chess is the odd row: it hit the 60-minute cap and still scored 1.0, because Terminal-Bench grades the container, and Hermes had written a passing solution before the clock ran out. That is the protocol working as written, not a loophole; it is listed with its cap.

On the engine side during the window: 542 prefill batches, 413K new prompt tokens against 15.1M tokens served from the radix cache (an agent loop re-sends its whole history every turn; the cache is why that is affordable), mean speculative accept length 2.88, and a mean decode of 25.8 tok/s while the agent was generating, well under the 36 tok/s single-stream code headline. Long contexts, low reasoning effort and tool-heavy text pull the acceptance rate down; the agent-loop number is the one that matters here.

What this number is not

Getting Hermes to run inside Harbor

Harbor 0.24.0 lists Hermes as an installed agent, and none of its trials completed against current Hermes until four things were patched in the runner image (all in patch_harbor.py, candidates for an upstream PR):

  1. The adapter verifies the install with hermes version; Hermes removed that subcommand in August in favour of hermes --version.
  2. The adapter exports HERMES_HOME=/tmp/hermes after running install.sh. Hermes's package manager now commits the dependency environment under HERMES_HOME at install time, so the later hermes call found "no dependency environment is committed for this install". Exporting first fixes it. --skip-browser --skip-computer-use also keeps the per-task install at ~70 s and avoids a cua-driver verification failure in slim images.
  3. harbor agent schema hermes advertises a config option that the adapter then rejects ("does not support config"). A small merge hook (env var → deep-merged into the generated config.yaml) is how the reasoning effort and the auxiliary pins got in.
  4. Running Harbor itself in Docker on the MS-01 needs the host Docker socket, the docker compose plugin in the runner image, and --user so job directories are not root-owned.

Protocol order inside Harbor: a dataset directory of NN-task symlinks, because Harbor walks a dataset path in sorted order and a repeated -p takes only the first.

Next

  1. Rep 2 in the second seeded order (it is queued and waiting for the rack).
  2. The same slice on the vLLM sibling recipe, same weights, same box: a paired comparison (McNemar on pass/fail, paired Wh difference) that needs far fewer tasks than comparing two models.
  3. DeepSeek-V4.1-Flash on the GB300 Station, once its plug reports in Prometheus. The Station runs experts offloaded to Grace memory, so a GPU-only reading would be wrong, not just incomplete; no plug, no line.
  4. c=4 on the full 89 tasks for a headline line, only after the slice shows c=1 and c=4 pass sets agree under turn and token caps.

Reproducibility

Protocol: hermes-bench/energy/protocol-v1.json (sha256 7bd7b224b3034cb84a46c29dad5ccb90058fe7493f17a720e2721a17d963c0de). Slice: build-cython-ext, build-pov-ray, caffe-cifar-10, compile-compcert, crack-7z-hash, db-wal-recovery, dna-assembly, feal-linear-cryptanalysis, gpt2-codegolf, install-windows-3.11, multi-source-data-merger, path-tracing-reverse, protein-assembly, query-optimize, regex-chess, reshard-c4-data, torch-tensor-parallelism, train-fasttext, vulnerable-secret, write-compressor. Energy integrator: gates/energy.py (Prometheus mhr_sensor_power_w, 5 s steps, trapezoid; validated against the previous day's known windows to within 1% and the strip's own meter to 0.2%). Harbor job directory with every trial's result.json, Hermes session export and ATIF trajectory: jobs/abbrev-sglang/rep1 on the harness host. Harbor 0.24.0; Hermes v0.22.2 d923a5eb48; SGLang lmsysorg/sglang:v0.5.22-cu130; driver 595.84; kernel 6.17.0-1031-nvidia; DGX OS 7.2.3.

Credits

The Terminal-Bench team (TB2.0 and Harbor, including the Hermes adapter), Nous Research (Hermes Agent and the Hermes Index that this borrows its shape from), RadixArk (the NVFP4 build), the SGLang team, and Claude Opus 5.5 for the plan review that removed a wall-clock cap, a GPU-only Station number and a too-small sample before any of them reached a page. Prior art on energy per task: ML.ENERGY / Zeus, EcoLogits, SWEnergy. Mistakes are mine.