Skip to content

Ghost calibration MEASURED on hardware: straggler 1.462x → 1.189x - #227

Merged
defenwycke merged 5 commits into
mainfrom
measure/ghost-calibration
Sep 7, 2026
Merged

Ghost calibration MEASURED on hardware: straggler 1.462x → 1.189x#227
defenwycke merged 5 commits into
mainfrom
measure/ghost-calibration

Conversation

@defenwycke

@defenwycke defenwycke commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Been sitting unmerged on measure/ghost-calibration since 2026-09-05. Raising it because the result is real, and because docs/BUILDS.md §3 currently states the opposite.

What it measures

Two L40S, block 962,000, 16 chunks, real GPU proving. Same guest, same block, one box per arm, differing only in the four HAZYNC_COST_* values:

arm straggler max mean
shipped defaults 1.462x 149 s 102 s
refit 1.189x 124 s 104 s

Ghost's own constants, fitted on block 965,500 (7.7% Schnorr), intercept forced to zero:

HAZYNC_COST_EC_OP=85636  HAZYNC_COST_SCHNORR_OP=168542
HAZYNC_COST_INPUT_BYTE=2 HAZYNC_COST_INPUT_BASE=53162     Schnorr:ECDSA = 1.97x

⚠ The card arithmetic was NOT re-derived. Read this as "the ≤1.35 straggler target is met", not as a card count.

⛔ This corrects a live claim in BUILDS.md

§3 says: "Ghost needs its own calibration; it does not have one." It does — this is it. That line was written before this run and never updated, and it has already been quoted as the measured reason Ghost cannot be a shipping channel (hazync#225).

The channel decision does not change, but the honest reason does:

  • not "Ghost is uncalibrated" — it is calibrated, and its refit straggler 1.189 is better than Core's 1.210
  • Ghost is substitution (broad) — ECDSA and Schnorr group arithmetic, scalar inverse and the SHA fastpath all replaced. That is the fidelity call, and it stands on its own without needing a performance excuse.

⚠ Note what does NOT transfer: Core's refit and Ghost's are different constant sets. Applying Core's to Ghost moves its straggler 1.407 → 1.884. Each channel carries its own.

⏰ The part worth keeping

This run first measured 1.567x — worse than doing nothing — and that was reported. It was one chunk. Across 32 chunk timings every sample sits at 2.4–3.0 s/segment; the offending chunk came in at 4.89 s/segment and never reproduced (re-run twice: 94 s, 94 s, 2.69 s/seg).

Two of the three checks that recovered it refuted a hypothesis rather than confirming one:

  1. The segment straggler said the opposite (57 → 49 max) — the machine-independent metric is what flagged the wall-clock as wrong.
  2. "The boxes differ in speed" — plausible and false: identical 33-segment chunks run 87 s vs 90 s, and a straggler is a ratio, so box speed cancels out entirely.
  3. Wall time is proportional to segments across 31 of 32 samples, isolating the 32nd as a transient.

⇒ A single un-replicated chunk timing was enough to invert the conclusion. Re-run an outlier before believing it, and prefer the quantised metric (segments) over the continuous one (cycles) — proving bills in whole segments.

Two L40S, block 962,000, 16 chunks, real GPU proving, one arm per box, differing only in the four
HAZYNC_COST_* values. The refit clears the <=1.35 threshold BUILDS.md 4.2 states for the fourth card.

⛔ It first measured 1.567x — WORSE — and I reported that. It was ONE chunk: 31 of 32 chunk timings
across both boxes sit at 2.4-3.0 s/segment, and hz-b chunk 1 came in at 4.89 (171 s for 35 segments).
Re-run twice: 94 s both times, 2.69 s/seg. It never reproduced.

Two hypotheses were refuted on the way, which is the useful part:
  - the segment straggler said the OPPOSITE (57 -> 49 max segments), which is what flagged the
    wall-clock number as suspect rather than the constants
  - "the boxes differ in speed" is true but IRRELEVANT: an identical 33-segment chunk is 87 s vs
    90 s, and a straggler is a ratio, so box speed cancels out of it entirely

⇒ Re-run an outlier before believing it, and prefer the quantised metric: proving bills in whole
segments, not cycles.

Claude-Session: https://claude.ai/code/session_017fQ8BAyHyzxBf3bvdmckVL
…branch refutes

The line 'Ghost needs its own calibration; it does not have one' was written
before the 2026-09-05 run and never updated. This branch IS that calibration,
so the doc contradicted its own evidence -- and the stale line had already been
quoted as the measured reason Ghost cannot be a shipping channel (hazync#225).

Records Ghost's constants, its measured straggler 1.462 -> 1.189, and the
warning that Core's and Ghost's fits do not transfer in either direction.

The channel decision is unchanged: Ghost stays experimental because it is
substitution (broad), which is a fidelity judgement and needs no performance
excuse -- its straggler is in fact better than Core's 1.210.

Claude-Session: https://claude.ai/code/session_017fQ8BAyHyzxBf3bvdmckVL
@defenwycke
defenwycke merged commit af0534c into main Sep 7, 2026
6 checks passed
@defenwycke
defenwycke deleted the measure/ghost-calibration branch September 8, 2026 03:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant