Merge pull request 'fix(qwen38): calib rides the shared step; the wide one cost the container its cache' (#80) from feat/qwen38-w5nl64 into main

This commit was merged in pull request #80.
This commit is contained in:
dank committed 2026-10-29 11:18:36 -07:00
commit b4d7f6e7fe
2 files changed
+40 -12

No files matched your search

+27 -8
View File
@@ -94,9 +94,10 @@
# bf16 container, kldref only), FRANK_QWEN38_CAMPAIGN (holds kld-ref/ and # bf16 container, kldref only), FRANK_QWEN38_CAMPAIGN (holds kld-ref/ and
# calib/), FRANK_QWEN38_KLD_CORPUS, FRANK_QWEN38_TPL (the template copy # calib/), FRANK_QWEN38_KLD_CORPUS, FRANK_QWEN38_TPL (the template copy
# the container reads through /models), FRANK_QWEN38_LOG_DIR, and # the container reads through /models), FRANK_QWEN38_LOG_DIR, and
# FRANK_QWEN38_MNBT — the step size shared by kldref and score (default # FRANK_QWEN38_MNBT — the step size every mode boots at (default
# 1,024: the file tier's ceiling is 2,048 and production runs there, but on # 1,024: the file tier's ceiling is 2,048 and production runs there, but on
# this payload the arena charged for a wider step is taken from the cache), # this payload the arena charged for a wider step is taken from the cache),
# the slot count inherited as FRANK_ARCHON_MAX_SEQS — no per-mode literals —
# and FRANK_QWEN38_MAX_MODEL_LEN — the window every mode boots at (32,768; # and FRANK_QWEN38_MAX_MODEL_LEN — the window every mode boots at (32,768;
# see the corpus census above, and raise it together with the corpus). # see the corpus census above, and raise it together with the corpus).
# kldref refuses (exit 2) when the longest record of the corpus it is about to # kldref refuses (exit 2) when the longest record of the corpus it is about to
@@ -162,6 +163,15 @@ SERVICE=frank-archon
# here once starved the recorder. The `:?` guards keep an empty env fatal. # here once starved the recorder. The `:?` guards keep an empty env fatal.
HOST_POOL_MIB="${FRANK_ARCHON_HOST_POOL_MIB:?FRANK_ARCHON_HOST_POOL_MIB must be set}" HOST_POOL_MIB="${FRANK_ARCHON_HOST_POOL_MIB:?FRANK_ARCHON_HOST_POOL_MIB must be set}"
GPU_HEADROOM_MIB="${FRANK_ARCHON_GPU_HEADROOM_MIB:?FRANK_ARCHON_GPU_HEADROOM_MIB must be set}" GPU_HEADROOM_MIB="${FRANK_ARCHON_GPU_HEADROOM_MIB:?FRANK_ARCHON_GPU_HEADROOM_MIB must be set}"
# The slot count, from the same file that owns the card split: production runs
# four slots and every mode measures at production's geometry. A per-mode
# literal here is what let calib ask for eight slots and then starve its own
# cache. The `:?` guard keeps an empty env fatal, as for the card split.
MAX_SEQS="${FRANK_ARCHON_MAX_SEQS:?FRANK_ARCHON_MAX_SEQS must be set}"
if ! [[ "$MAX_SEQS" =~ ^[0-9]+$ ]]; then
echo "REFUSED: FRANK_ARCHON_MAX_SEQS must be a slot count (got: $MAX_SEQS)" >&2
exit 2
fi
# ONE step size for both logits modes. The file tier streams only at <=2,048 and # ONE step size for both logits modes. The file tier streams only at <=2,048 and
# the gate scores file-tier payloads (the served iq4r, the arms) against the # the gate scores file-tier payloads (the served iq4r, the arms) against the
@@ -232,7 +242,7 @@ case "$MODE" in
# room the corpus needs. Corpus read-only, record dir rw. # room the corpus needs. Corpus read-only, record dir rw.
ARGS+=(--model "$MODEL_IN" ARGS+=(--model "$MODEL_IN"
--kld-record /data/kld-ref --kld-corpus /data/kld.jsonl --kld-record /data/kld-ref --kld-corpus /data/kld.jsonl
--max-num-seqs 4 --max-num-batched-tokens "$MNBT") --max-num-seqs "$MAX_SEQS" --max-num-batched-tokens "$MNBT")
MOUNTS+=(-v "$KLD_CORPUS:/data/kld.jsonl:ro" MOUNTS+=(-v "$KLD_CORPUS:/data/kld.jsonl:ro"
-v "$KLD_REF_DIR:/data/kld-ref") -v "$KLD_REF_DIR:/data/kld-ref")
;; ;;
@@ -247,17 +257,26 @@ case "$MODE" in
fi fi
ARGS+=(--model "$MODEL_IN" ARGS+=(--model "$MODEL_IN"
--kld-ref /data/kld-ref --kld-out "/data/out/$(basename "$SCORE_OUT")" --kld-ref /data/kld-ref --kld-out "/data/out/$(basename "$SCORE_OUT")"
--max-num-seqs 4 --max-num-batched-tokens "$MNBT") --max-num-seqs "$MAX_SEQS" --max-num-batched-tokens "$MNBT")
MOUNTS+=(-v "$KLD_REF_DIR:/data/kld-ref:ro" MOUNTS+=(-v "$KLD_REF_DIR:/data/kld-ref:ro"
-v "$OUT_DIR:/data/out") -v "$OUT_DIR:/data/out")
;; ;;
calib) calib)
# Calibration is exempt from the shared step: the tap counts pooled # Calibration rides the shared step like every other mode. The old
# positions and nothing downstream is compared against a step size, so the # exemption — eight slots at MNBT 65,536 for "free throughput", because
# wide step is free throughput (a disk-tier step costs the same at 1 token # "a disk-tier step costs the same at 1 token as at 64k" — is false: the
# as at 64k). # step's activation arena is billed on the card, not on the disk. The
# engine's own ledger for this container: at MNBT 1,024 the arena is
# 504 MiB and the card claims 30.87 GiB (weights 28.90 GiB of it); at
# 65,536 the arena is 10.65 GiB (fixed region 1.25 GiB), the claim falls
# to 16.85 GiB, the experts shrink to 10.98 GiB and the KV to 271 MiB —
# one slot's worth of cache for eight slots, and the boot dies at
# "startup stopped: out of memory" (measured 2026-10-29). A wide step
# buys throughput with the expert slab, so price it like any other
# VRAM knob. The slots follow frank-archon.env's FRANK_ARCHON_MAX_SEQS
# through MAX_SEQS, exactly as kldref and score do.
ARGS+=(--model "$MODEL_IN" --port 7770 ARGS+=(--model "$MODEL_IN" --port 7770
--max-num-seqs 8 --max-num-batched-tokens 65536) --max-num-seqs "$MAX_SEQS" --max-num-batched-tokens "$MNBT")
MOUNTS+=(-v "$CALIB_DIR:/data/calib") MOUNTS+=(-v "$CALIB_DIR:/data/calib")
TAPENV=(-e RADIANCE_CALIB_DIR=/data/calib TAPENV=(-e RADIANCE_CALIB_DIR=/data/calib
-e RADIANCE_CALIB_TOKENS=12000000) -e RADIANCE_CALIB_TOKENS=12000000)
+13 -4
View File
@@ -247,16 +247,19 @@ flag_value() {
[ ! -d "$L" ] [ ! -d "$L" ]
} }
@test "the reference and a score pass ride ONE step size, legal on the file tier" { @test "every mode rides ONE step size and ONE seat count, legal on the file tier" {
# The gate's claim is one shape; that shape's ceiling is set by the tightest # The gate's claim is one shape; that shape's ceiling is set by the tightest
# payload it boots, and the served iq4r and every arm are file-tier # payload it boots, and the served iq4r and every arm are file-tier
# containers, which stream only at <=2048. A reference recorded above that is # containers, which stream only at <=2048. A reference recorded above that is
# a KL between two shapes, not two weights. # a KL between two shapes, not two weights. Calib used to exempt itself from
# the shared step; the exemption cost the container its own cache, so the
# test now holds every mode to the same two numbers.
M="$BATS_TEST_TMPDIR/models" M="$BATS_TEST_TMPDIR/models"
C="$BATS_TEST_TMPDIR/campaign" C="$BATS_TEST_TMPDIR/campaign"
run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" bash "$RUNNER" kldref --dry-run run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" bash "$RUNNER" kldref --dry-run
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
ref_step="$(flag_value --max-num-batched-tokens <<< "$output")" ref_step="$(flag_value --max-num-batched-tokens <<< "$output")"
ref_seats="$(flag_value --max-num-seqs <<< "$output")"
[ -n "$ref_step" ] [ -n "$ref_step" ]
[ "$ref_step" -le 2048 ] [ "$ref_step" -le 2048 ]
run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" \ run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" \
@@ -271,10 +274,16 @@ flag_value() {
run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" FRANK_QWEN38_MNBT=1024 \ run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" FRANK_QWEN38_MNBT=1024 \
bash "$RUNNER" score "$M/rad/arm-w5nl64.rad" "$C/scores/arm1.json" --dry-run bash "$RUNNER" score "$M/rad/arm-w5nl64.rad" "$C/scores/arm1.json" --dry-run
[ "$(flag_value --max-num-batched-tokens <<< "$output")" = "1024" ] [ "$(flag_value --max-num-batched-tokens <<< "$output")" = "1024" ]
# calibration is exempt: grams are not logits, so the tap keeps the wide step # calibration rides the shared step too. Its old exemption (8 seats at
# MNBT 65,536, "free throughput") is what made the container refuse to
# boot: at that step the engine charges a 10.65 GiB activation arena to
# the card, the experts fall to 10.98 GiB and the KV to 271 MiB —
# "0.0 full-length sessions", "startup stopped: out of memory", measured
# 2026-10-29 while kldref on the shared step ran 16 hours without fault.
run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" FRANK_QWEN38_MNBT=1024 \ run env FRANK_QWEN38_MODELS="$M" FRANK_QWEN38_CAMPAIGN="$C" FRANK_QWEN38_MNBT=1024 \
bash "$RUNNER" calib --dry-run bash "$RUNNER" calib --dry-run
[ "$(flag_value --max-num-batched-tokens <<< "$output")" = "65536" ] [ "$(flag_value --max-num-batched-tokens <<< "$output")" = "1024" ]
[ "$(flag_value --max-num-seqs <<< "$output")" = "$ref_seats" ]
# a step size that is not a token count is refused, never handed to the engine # a step size that is not a token count is refused, never handed to the engine
run env FRANK_QWEN38_MNBT=broad bash "$RUNNER" kldref --dry-run run env FRANK_QWEN38_MNBT=broad bash "$RUNNER" kldref --dry-run
[ "$status" -eq 2 ] [ "$status" -eq 2 ]