Files
..
2026-10-04 12:49:43 +02:00
2026-10-04 12:49:43 +02:00
2026-10-04 12:49:43 +02:00
2026-10-04 12:49:43 +02:00

Issue 104: retire the Qwen AR pipeline

The Qwen AR driver now samples every token through sample_from_logits and the request's PCG64 stream, following MTPLX 9882703f3105363ddc37eca9f97aa09a1d387112. The obsolete pipeline option, admission, keyed decode loop, cached speculative tail, model mode and compile-policy lane are removed. Classic tail capture forwards the final sampled token before banking its state.

The server no longer supplies or reads MTPLX_AR_PIPELINE. The installed-model reference harness cannot enable it either. Generic PLE staging/resident-table fields remain for their independently tested callers. Their classic defaults are preserved. The historical lazy sampling primitive and its scalar keyed categorical wrapper are test-only, retained to reproduce the original sampling law receipt and exercise the existing RNG fixtures.

Baseline and oracle

Pre-fix production revision: 5773942c8ffe41352104d673ff0eef949df10c71, with only the installed-model diagnostic added. Model: unchanged Bare-Speed revision 74559cdf34fbfc0b593de72d17e93f37fd4f9ea7; MLX 0.32.2; Apple M5 Max / 128 GiB. Each model process ran serially under test-supervisor 114688 60 120.

Configuration Actual old lane Temperature .6, p .95, k 20, seed 0, eight tokens
SSD, pipeline disabled Classic 314, 279, 198, 2, 20732, 198, 2, 198
SSD, pipeline enabled Classic Same tokens and every final-state hash
Full resident table, pipeline disabled Classic Same tokens and every final-state hash
Full resident table, pipeline enabled Keyed pipeline 314, 279, 35067, 82, 13, 220, 19, 15

The temperature-1 control also diverged at token 3 only with the resident pipeline. Its classic tokens were 314,279,198,2,20732,20086,198,2053; pipeline tokens were 314,279,695,47,4920,82,5212,2502. Full resident attachment was asserted, and the old driver's actual Decoded::pipeline was recorded, rather than inferring engagement from an environment flag.

tools/issue104-reference.py runs the pinned original generate_ar and SessionBank against the installed artifacts. The checked-in tests/fixtures/issue104-ar-model.json contains cold and warm token IDs, final logits and every trunk-state array's shape/hash. Cold receipts equal both pre-fix native classic baselines in full. The warm turn restores all 11 committed tokens and adds suffix [1075] before decoding eight more tokens.

Native regression issue104_installed_ar_stream_and_state checks those complete receipts with synchronous and asynchronous evaluation. It also cancels a warm turn after three callbacks, checks that the saved state is intact, and retries from that state. Every completed turn asserts that PLE staging remains enabled and resident preference remains in classic mode. Run with MTPLX_AR_PIPELINE=1 to exercise an explicit obsolete flag without recreating the removed lane.

Scope review

The checked route is request/session ownership → Execution::decode_ar → ar::decode → classic sampling → final-token capture. No production AR caller can reach the lazy primitive. Every former admission and mode call in policy, model, decoder, binding and installed reference tests was removed. GDN compilation still obeys its two existing environment gates, including explicit-off precedence. Normal prefill and MTP retain their compilation/staging paths. DS4/GLM sampling, RNG, inference and Metal kernels have no changes.

The 1,120 fresh MTPLX orchestration fixtures cover both obsolete flag values, sync/async evaluation, official .6/.95/k20, 1/.95/k20, .5/k2, p=0/1, greedy, presence penalty, zero/one/two/three/twelve-token limits, stops and final capture. Existing sampler fixtures additionally exercise tied logits, frequency penalties and exact PCG64 continuation. The historical primitive-law receipt remains in docs/issue103-analysis/native-sampling-final.log.

The server-policy oracle's --server-only mode compares all existing native defaults and verifies pipeline removal across 268 environment/MTP cases. Current upstream additionally supplies defaults for other, unported features and has replaced its old boundary-count diagnostic API; this scoped check does not claim those unrelated policy extensions are implemented.

Timing interpretation

receipts.jsonl records measured decode seconds separately from state equality and process memory peaks. These are bounded eight-token correctness probes, including first-use and memory-pressure effects, not steady-state throughput claims. Old resident classic/pipeline times at .6 were 7.576/17.518 seconds; at 1.0 they were 1.332/5.452 seconds. SSD classic repeated at .6 took 0.649/1.120 seconds and at 1.0 took 1.280/1.273 seconds. No overlap is retained to preserve these old timings.

After removal, synchronous SSD decode took 0.642/1.309 seconds at temperatures .6/1.0; synchronous resident decode took 0.813/1.427 seconds. Async controls took 1.182/1.298 seconds (SSD) and 1.435/1.426 seconds (resident). All produce the classic stream and state. Peak process physical footprint was 72.5 GB for the SSD regression and 104.5 GB for the resident regression.

Completed validation

  • Both installed-model regressions passed with the obsolete flag explicitly on, including warm state, cancellation/retry, sync/async and pre-fix equality.
  • All 1,120 AR orchestration fixtures, 1,080 sampler-entry fixtures, the penalty and distribution/RNG fixtures, the original sampling-law diagnostic, and the connected decoder/cache control passed under the supervisor.
  • The scoped 268-case current server-default comparison passed. The ordinary suite includes DS4's 64 exact token/RNG fixtures and compile-policy controls.
  • cargo fmt --all -- --check, warnings-denied Clippy, make bundle including signing, and cargo test --all-features passed (308 application tests plus two tool suites of four tests each; 211 opt-in application tests ignored).
  • Every artifact SHA256 was re-read and matched the unchanged revision; see environment.json. Compact run results are in checks.json and receipts.jsonl. Source review found no DS4/GLM changes and no remaining production AR-pipeline admission or mode path.

Reproduction

Build the test executable with cargo test --all-features --bin ds4-server --no-run; pass that executable, not Cargo, to the supervisor. Set DS4_QWEN38_ARTIFACTS to the installed artifact directory, and set MTPLX_COMPILED_GDN=1 MTPLX_QWEN4EXP_COMPILE=1. Run issue104_installed_ar_stream_and_state --ignored --nocapture --test-threads=1 once with default SSD policy and once with MTPLX_NGRAM_RESIDENT=1 and adequate RAM. Set MTPLX_AR_PIPELINE=1 on both runs. Optional DS4_ISSUE104_BASELINE compares the cold records to a separately saved pre-fix classic receipt.

For the isolated Python oracle, point PYTHONPATH at pinned MTPLX, use the MLX-0.32.2 environment, the same compilation flags, and MTPLX_SUSTAINED_PREFILL=1 MTPLX_PREFILL_CHUNK_SIZE=2048. Run tools/issue104-reference.py MODEL_DIRECTORY under the same supervisor.