Files
esh-pfi-infrastructure/scripts/r49-corpus/launch-h02-4b-1ep.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

37 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# R49 H02 — rung 3, the last of the planned sweep: Qwen3-4B-Base, 1 epoch.
#
# WHAT THIS RUNG IS FOR. 0.6B transferred the voice and not the sense. 1.7B brought
# back LOCAL coherence -- sequential actions that follow one another -- while
# scene-level continuity still broke mid-passage, and half the seeds on a wholesome
# prompt drifted into Brontë's own preoccupations with death. 4B is the test of
# whether continuity closes with carrier size, which is the question that decides
# whether this regime needs a bigger carrier or a different training shape.
#
# Held from both earlier rungs so carrier size stays the ONLY variable: the unwrapped
# corpus (sha 77f37057b2782e49), seed 4919, rank 32, lr 1e-4, seq 4096, batch 1 x
# accum 8, 1 epoch, eval+save every 25 steps.
#
# ⚠ Expect ~105 min. The carrier bench measured 717 tok/s at 4B against 1415 at 1.7B,
# and the 1.7B rung took 52 minutes.
#
# ⚠ All three rungs plateau within one epoch -- the 0.6B series ends 3.173, 3.172,
# 3.172 and the 1.7B ends 3.019, 3.018, 3.019. One epoch is the right length here, so
# a flat tail is the expected shape and NOT evidence of a stuck run.
set -euo pipefail
OUT=/home/infra-ops/r49-runs/h02-4b-1ep
LOG=$OUT/train.log
apps=$(nvidia-smi --query-compute-apps=pid --format=csv,noheader | tr -d '[:space:]')
[ -n "$apps" ] && { echo "REFUSING: GPU not clear" >&2; nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv >&2; exit 1; }
[ -f "$OUT/run.pid" ] && kill -0 "$(cat "$OUT/run.pid")" 2>/dev/null && { echo "REFUSING: live pid" >&2; exit 1; }
[ -e "$LOG" ] && { echo "REFUSING: $LOG exists" >&2; exit 1; }
mkdir -p "$OUT"
echo "# launched $(date -Is) Qwen3-4B-Base, 1 epoch, seed 4919, unwrapped corpus, eval+save every 25" > "$LOG"
setsid nohup /home/infra-ops/ml/.venv/bin/python /home/infra-ops/r49-prep/train_voice_lora.py \
--corpus /home/infra-ops/r49-corpus-renamed-unwrapped \
--base /home/infra-ops/carriers/Qwen3-4B-Base \
--seed 4919 --epochs 1 --eval-steps 25 --save-steps 25 \
--out "$OUT" >> "$LOG" 2>&1 < /dev/null &
echo $! > "$OUT/run.pid"
echo "launched pid $(cat "$OUT/run.pid") -> $LOG"