Files
esh-pfi-infrastructure/scripts/r49-corpus/chain-4b-voicetest.sh
T
vh 4cee4b179d Launch the 4B rung and record that voice transfer carries subject matter
Rung 3 of the sweep is training: Qwen3-4B-Base, one epoch, seed 4919, the same
unwrapped corpus, 159 steps at roughly 37.8 s/it for about 100 minutes. Carrier
size remains the only variable across the three rungs. A two-arm voice test is
chained behind it, gated on the adapter existing, so the rung is readable when it
lands rather than needing a second round trip to become informative.

The finding worth keeping came from an operator prompt rather than from my test
set. Asked for a wonderful story about a stray dog licking a calico kitten, framed
as reported speech, the 1.7B adapter held the frame across all four seeds and was
unmistakably Victorian throughout -- and two of the four turned the premise into
animal death, with the cat licking the puppy to death and the narrator's
interlocutor answering that he wished they were all dead.

That is not a coherence failure. It is Charlotte Brontë's preoccupations arriving
alongside her sentences: Jane Eyre opens on a beaten child, Helen Burns dies, and
Villette is saturated with grief. Train 680k words of that into a small carrier
and a request for something wholesome reaches for mortality.

My nine test prompts were all emotionally neutral and structurally could not have
surfaced this. The operator's prompt found it on the first try, which is worth
recording as a property of the test set rather than of the adapter.

The implication for the regime is that "voice transfer" includes tone and subject,
so wanting the voice without the gloom is a corpus-selection or prompt-framing
problem rather than a training-length one.

Also observed: one seed closed its anecdote and began "CHAPTER XIX. THE CHILD'S
CLOSET", having learned book structure unprompted. The base control on the same
prompt went modern and essayistic, so the shift is the adapter rather than the
carrier.
2026-09-10 22:58:10 -07:00

31 lines
1.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Chained after the 4B rung: generate its voice arms so the rung is readable the
# moment it lands, rather than needing a second round trip to become informative.
#
# Two arms, because the base control is what earns the claim: at 1.7B the adapter
# took curly quotes from 0/18 to 15/18 and that number only means something because
# the 0/18 came from the SAME carrier. Same nine prompts, same two seeds, same
# sampler as both earlier rungs, plus the operator's own Abernathy frame prompt.
#
# ⚠ Gated on the 4B run having actually produced an adapter -- a chain that fires on
# failure turns one lost run into two.
set -uo pipefail
PREV=/home/infra-ops/r49-runs/h02-4b-1ep
OUT=/home/infra-ops/r49-runs/voice-test-4b
V=/home/infra-ops/ml/.venv/bin/python
exec >> /home/infra-ops/r49-runs/chain-4b-voicetest.log 2>&1
echo "=== $(date -Is) armed, waiting on $PREV"
while [ -f "$PREV/run.pid" ] && kill -0 "$(cat "$PREV/run.pid")" 2>/dev/null; do sleep 60; done
echo "=== $(date -Is) 4B run finished"
[ -f "$PREV/adapter/adapter_model.safetensors" ] || { echo "=== REFUSING: no adapter, the 4B run did not succeed"; exit 1; }
cd /home/infra-ops/r49-prep
for spec in "4b-base::" "4b-tuned::--adapter $PREV/adapter"; do
arm="${spec%%::*}"; extra="${spec##*::}"
for pf in voice_prompts.json abernathy.json; do
tag=$([ "$pf" = "abernathy.json" ] && echo "-abernathy" || echo "")
$V gen_voice_test.py --base /home/infra-ops/carriers/Qwen3-4B-Base $extra \
--arm "$arm" --prompts "$pf" --out "$OUT/${arm}${tag}.jsonl"
done
done
echo "=== $(date -Is) voice arms written to $OUT"