Skip to content

ops(llm): #2582 has recurred — hp-llm-worker unhealthy for ~11h, and the #1947 phase-2 sweep is running contended, not cold #3023

Description

@Xore

Found while checking on the #1947 phase-2 sweep. Two coupled problems, one live incident and one that affects how a benchmark gets published.

1. #2582 has recurred

hp-llm-worker is unhealthy with FailingStreak=3 and has been unable to get
qwen3:14b resident for about eleven hours:

69 x  msg="Load failed" model=<qwen3:14b blob> error="timed out waiting for llama-server to start: context canceled"
first 2026-09-05T04:04:50Z   last 2026-09-05T14:47:49Z

ghidra-ollama-1 runs OLLAMA_MAX_LOADED_MODELS=1, and the #1947 sweep has the
slot — currently GLM-4.6-REAP-218B-A32B:i1-IQ1_S at 57 GB served, 65%/35%
CPU/GPU
. Every ~4 minutes the worker asks for a different model, cannot get it,
and gives up.

This is #2582 (llm-worker permanently unhealthy: shared ollama is saturated by the ghidra/revdeck eval zoo) reproducing exactly. It closed 2026-08-28.

Mitigated now by stopping hp-llm-worker for the duration of the sweep. It
was producing nothing — eleven hours of consecutive load failures — so stopping
it loses no capability and removes the contention. RestartPolicy=unless-stopped
respects the manual stop, and the autoheal: true label only acts on running
unhealthy containers, so it will stay down until deliberately restarted.
ghidra-revdeck-1 was checked and is idle (healthz only); it was left running.

2. The harder half: phase 2 is not running the cold-slot protocol

sweep_extra.sh does ollama stop "$TAG" before each run, and nothing else. The
cold protocol that #2641 established — and that the whole part-4 re-measurement
rests on — additionally requires hp-llm-worker and ghidra-revdeck-1 stopped
so nothing else touches the GPU
. Phase 2 has been running without that.

The contention is not theoretical. From ghidra-ollama-1's own access log:

14:47:46 | 200 | 3m57s | 172.16.38.1 | POST /v1/chat/completions   <- the benchmark
14:47:49 | 499 | 3m46s | 172.16.3.4  | POST /api/chat              <- hp-llm-worker, cancelled
14:47:59 | 500 | 1m39s | 172.16.3.4  | POST /api/chat              <- hp-llm-worker, failed

Benchmark requests and worker requests are interleaved on the same single slot.

Why this matters for the matrix

#2642/#2644/#2646 established that a warm or contended slot does not
reproduce
while a cold one does: qwen3:14b measured 60/61 warm with 1 of 14
answers byte-identical, and 60/60 cold with 14 of 14. The #1805-c survey had to
be demoted to a survey for exactly this reason, and its uniform ±0 turned out
to be lane contention masquerading as determinism.

Phase 2 has 12 escalations (cells where run1 != run2 and the sweep went to
N=3), against phase 4's cold cells which were ±0 across three runs on four
architectures. That is consistent with contention — though for the
GLM-4.6-REAP-218B rows specifically, 65% CPU offload is an alternative
explanation (float reduction order across threads), so this should not be stated
as proven.

The decision this forces

36 of 52 phase-2 models are already measured under contention. Stopping the
worker now makes the remainder cold, which means phase 2 would span two
regimes
. Options, none free:

Recommendation: decide before the sweep finishes, because C gets cheaper the
earlier it is chosen and the 12 escalations are the only direct evidence either
way. Whatever is chosen, sweep_extra.sh should gain the worker-stop step so
this cannot recur silently — it is the one part of the cold protocol the script
does not implement.

Scope

  • Decide A / B / C for phase 2's regime.
  • Add the live-worker stop/restore to sweep_extra.sh (committed copy at
    analysis/ghidra/benchmarks/corpus/sweep_extra.sh), so the cold protocol is
    enforced by the driver rather than by an operator remembering.
  • Restart hp-llm-worker when the sweep ends, and give llm-worker permanently unhealthy: shared ollama is saturated by the ghidra/revdeck eval zoo (qwen3:14b can't stay resident) #2582 a regression
    guard so an eleven-hour unhealthy streak surfaces on its own rather than
    being found by someone looking at something else.
  • Consider whether OLLAMA_MAX_LOADED_MODELS=1 plus a shared slot is the
    right shape at all while a multi-day benchmark is scheduled.

Refs #1947, #2582, #2641, #2642, #2646, #2644

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingin-progressActively being worked onllmLLM analysis workermlML worker and GPU scoringopsDeployment, runners, observability, host accessregressionA previously working feature now broken

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions