4.8 KiB
name, description
| name | description |
|---|---|
| radiance-calibration-tap-latest | Capture radiance calibration Grams for GPTQ (RADIANCE_CALIB_DIR) on the R9700 rig: the tap only arms on latest, the fitting shape, the 12M floor rule, and how to read a run that looks hung. |
Friction-earned 2026-10-30 on dank/serverAppConfigs (qwen38-w5nl64 campaign, 2×R9700 TP=2).
The tap arms only on the latest radiance image
A 17-hour calib run on the production pin (1.8.1) wrote zero bytes into RADIANCE_CALIB_DIR
while /health, /stats and the pusher all reported healthy. The tap's arming code is byte-identical
in both trees — the shipped 1.8.1 build drops it. The tell is the boot line:
I[0] recorded passes: off, the program accumulates calibration Grams (gram_accum)
Present on latest (v1.14.0 = :latest 2026-10-30), absent on 1.8.1. Verify with
podman inspect IMG --format '{{json .Labels}}' → org.opencontainers.image.version /
revision, and pin the index digest, not the tag: :latest moves under you, and a local stale
:latest can be a 3-week-old dev build (check .Created).
Run the tap from a report container of the same model, but the tap needs --ngram-placement disk
for a calibration boot: the n-gram table pinned to RAM (ram) OOMs the rig's boot
(startup stopped: out of memory) while kldref/score boots succeed at the same pool.
The fitting shape (vendor recipe does not boot 2×32 GiB)
The vendor's calibration line (--max-num-batched-tokens 65536 --max-num-seqs 64, ~930 tok/s)
assumes a bigger box: the activation arena alone is 12.83 GiB of 27.95 GiB claimable and every
variant stops in the VRAM resolver (short 3.19 GiB → 279 MiB → 59 MiB → 86 MiB → cache starved).
Wider steps are refused by the arch itself, pre-allocation:
qwen4exp: the QSA score plane would be 3125 MiB -- 16384 rows (--max-num-batched-tokens 16384)
by --max-model-len 200000 / compress ratio 4. Lower either.
What boots and seals: 4 slots, --max-num-batched-tokens 2048 (the file-tier ceiling),
--kv-cache-dtype fp8, --weights-disk-tier, --placement expert_tiered,
--ngram-placement disk, --max-model-len 200000, --num-speculative-tokens 0, --deterministic.
Ledger at that shape: elastic 22.8 GiB — experts first, kv cache 1.50 GiB … 1.0 full-length
(pool ≈ 199,948 tokens). On 1.8.1 the same payload's pool was 7,436 tokens — the resolver, not the
window, is what changed.
Floor
RADIANCE_CALIB_TOKENS is a pooled token floor. Engine default 65,536. Fleet rule (Frank,
2026-10-30): 12,000,000, because the served quant this arm competes with was calibrated on a
10 M-token set. The vendor's "10 M beats 1 M by under 1 %" measures their plate, not ours.
Consequence: a ~9.3 M-token corpus round seals in round 1 plus part of round 2, and a round that
seals nothing is NORMAL (round_verdict → continue, never failure).
Reading a run (the trap that cost two cycles)
- Throughput is streaming-bound, ~60–70 tok/s whatever the slot count; concurrency only lengthens each request (2-way ≈ 4 min per 7.5 K-token prefill, 4-way ≈ 8).
- The engine logs one line per completed request. A log quiet for 8 minutes is therefore normal;
W step: nothing has been logged for 21 sis step-level silence. Liveness = completed-request count, never log mtime. A watchdog on mtime kills healthy cycles and every false positive throws away accumulated tap tokens. - One seal writes ~43 GB (24,768
gram.r<rank>.blk.<l>.ffn_down_exps.<e>.bin) and the engine then exits by itself; a mid-flight client gets429 rate_limit_error: the server is shutting down— success, not failure. - A port that answers is not the rig: after the runner stops production the dying process answers
:7770briefly. Gate onpodman psnaming the rig container, and on the.rig-bootmarker.
Orchestration and space
Use the repo's orchestrator, never a hand-rolled driver:
bash scripts/qwen38-calib-window.sh (gates: reference present, .rad present, tap dir ≥ 60 GiB,
healthy rig, marker, then push; banks the reference container only on success). Knobs:
FRANK_QWEN38_CALIB_TOKENS, Q38_WINDOW_CALIB_CORPUS, Q38_WINDOW_ROUNDS,
Q38_CALIB_MIN_FREE_MIB, Q38_WINDOW_KEEP_RAD.
A hand-rolled driver skips the space preflight; on this host the tap dir sat on / with 35 G free
while one seal writes 43 GB — the orchestrator refuses that, which is the point. Frank's rule: keep
artifacts on /, never /mnt/entropy.
Then
gram_files → scripts/grams-to-imatrix.py DIR -o imatrix.gguf (stdlib-only, skips non-gram names
like .rig-boot) → scripts/convert-qwen38-w5nl64.sh --plan-only (space bill, --plan-only first)
→ convert (card-less, CPU BLAS) → score each arm + the served payload at the production shape →
scripts/kld-gate-qwen38.sh (mean KL ≤ 0.03, p99.9, top-1 ≥ 95 %, every by_source slice).