Files
esh-pfi-infrastructure/docs/runbooks/gx10-run-05.md
T
vh 265357efb2 ops(erp-tune): stage + launch R47 ERP-seat SFT run 5 on pfi-gx10
Run 5 = the dependency-forcing corpus arm: airoboros-3.2 OUT of the 20% slot,
govreport/clean-v1 (496) + qmsum/clean-v1 (97) IN, at run 4's lr 2e-04 with
everything else held. kvasir byte-identical (survivors-r5 = survivors-r4 minus
airoboros plus the two new roots whole). Operator authorized the launch to
infra-ops directly; grant operator-2026-09-07-rnd-run5.

Canonical copies of the config, launcher and survivors builder; runbook
docs/runbooks/gx10-run-05.md. Launch gates all passed (7/7 root shas + shard
hashes, survivor join 8,212 = recipe, holdout disjoint, window_count==1 on all
593 slot rows, realized [mix] slot loss 3.46% vs preregistered 3.4%). 524 steps.
persistent-memory current-state updated: run 5 LAUNCHED + training.
2026-09-07 09:33:03 -07:00

90 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# pfi-gx10 — ERP-seat SFT run 5 (dependency-forcing slot)
Launched 2026-09-07 09:05 PDT on pfi-gx10, pid 3311780. Operator authorized the
launch to infra-ops directly (the run-scoped training-eligibility override
`operator-2026-09-07-rnd-run5` was granted to Brokkr; the relay caveat was
closed with the operator directly in-session before launch, as it was for run 4).
## What run 5 is
The **third** R47 corpus-gate run. Single variable vs run 4: the 20% context
slot's **composition**. Run 4 put an airoboros-3.2 instruct root in that slot;
run 5 removes it and puts in two **dependency-forcing** roots —
`govreport/clean-v1` (496 reports) + `qmsum/clean-v1` (97 transcripts), where
the loss turn is determined by distant context (document first, query/instruction
last). Everything else is held from run 4: dialogue survivors and the
impersonation loss-mask byte-identical, fireball whole, kvasir at run 4's exact
1,613-sample prefix cut (NOT re-cut), base, lr 2e-04, max_seq_len 16384, rank 64,
alpha 128, batch 2 × accum 8, cosine, warmup 0.1, wd 0.01.
The slot's ctx share reproduces run 4's 20%, but its **loss** share is 3.4% (run
4's was 20.6%) — preregistered in `SFT-RECIPE-run5-SCOPE.md §4`. **INERT is a
live verdict**, not a build error.
Machine-readable source of truth: `brokkr-smithy`
`research/R47-premium-corpus-gate/recipe-erp-seat-sft-r5.json` (f49994b, tag R49.4).
## Layout on the box
/home/infra-ops/models/gemma4-26b-a4b-it-bf16 49 GB base (byte-identical to run 4)
/home/infra-ops/erp-tune/
eitri-smithy/ harness, git 0a6bd2e
recipe-r5/
recipe-erp-seat-sft-r5.json from brokkr-smithy, verbatim
survivors-r5.jsonl 8,212 rows, sha256 a25169a6...
datasets/derived/govreport/clean-v1/ copied from /mnt/smithy (no NFS on box)
datasets/derived/qmsum/clean-v1/ copied from /mnt/smithy
datasets/holdout/ run-1 8,404-sample holdout (disjointness check)
run-05-gx10.json the config
launch-run-05.sh the launcher (pidfile-guarded, GPU-clear-asserting)
build_r5_survivors.py how survivors-r5 was built
run-05/ output: adapter/, checkpoints/, encode-cache/, truncation-report.json
Canonical copies of the config, launcher and survivors builder are in this repo
under `scripts/erp-tune-gx10/`. `survivors-r5 = survivors-r4 minus airoboros
plus govreport + qmsum whole` — deriving from run 4's survivors is what keeps
kvasir's cut byte-identical.
## Gates that passed at launch (all before / at encode, no GPU sunk on a bad build)
- **Preflight** (also run standalone, no GPU): 7/7 root shas verified, each shard
re-hashed against its CLEANROOT (govreport `d533a5cd`, qmsum `c0269d69`,
byte-identical after the NFS→box copy). Survivor→root join = 8,212 samples,
composition exactly the recipe (c2-logs 301 / cwm 183 / bluemoon 126 /
fireball 5396 / kvasir 1613 / govreport 496 / qmsum 97).
- **Holdout disjoint:** 8,212 training vs 8,404 holdout ids, 0 overlap.
- **window_count belt-and-suspenders** (`SFT-RECIPE-run5-SCOPE.md §7.1`): every
slot row must render window_count == 1. `truncation-report.json` showed
**govreport fit_whole=496 / chunked=0 / trunc=0** and **qmsum fit_whole=97 /
chunked=0 / trunc=0**. Any chunked/truncated slot row is a BUILD DEFECT → kill
before training. It passed.
- **Realized `[mix]` loss shares** reproduce the recipe's preregistered shares to
<0.1%: kvasir 0.3369, fireball 0.3042, c2-logs 0.1153, bluemoon 0.1066,
cwm 0.1022, govreport 0.0291, qmsum 0.0055. Slot subtotal 3.46% (pred 3.4%),
slot ctx 0.20.
Encode: 8,197 samples → 8,370 records (15 unfittable dropped, same as run 4),
ctx 18,598,779 / loss 9,935,076 tok. **524 optimizer steps** (÷ effective batch
16). ~52 s/it on this box → ~7.5 h. Checkpoints every 50 steps.
## Launch / watch / stop
ssh infra-ops@10.100.50.60 '~/erp-tune/launch-run-05.sh'
ssh infra-ops@10.100.50.60 "tr '\r' '\n' < ~/erp-tune/run-05.log | tail"
ssh infra-ops@10.100.50.60 'kill $(cat ~/erp-tune/run-05.pid)' # by PID — never pkill -f over ssh
The launcher refuses if the GPU is not clear, if `run-05.pid` names a live
process, if `run-05.log` exists, if any input is missing, or if under 40 GB free.
It detaches with `setsid nohup` and logs on the box.
## After the adapter lands — the gate choreography (with brokkr-smithy-dev)
Same as run 4, coordinated on the althing **cc channel** (Brokkr is armed there):
serve the **base** on this box/stack → Brokkr locks `FLOOR-LOCKED.json` and has
already committed the four-cell verdict evaluator (`tools/verdict_run05.py`:
RESCUED / STILL-COUPLED / OVER-CORRECTED / INERT) before any tuned figure exists
→ send the **swap cue** → serve the **tuned** artifact. T4 is the headline
must-not-harm (per-item, never pooled); refusal is telemetry; CSAM measurement
fail-closed stays. The override id + both blockers + all substitute controls are
in `run-05-gx10.json`, so they ride into the adapter's provenance manifest.