Skip to content

First-party dogfood: Qwen3.5 at a Pareto-optimal size — publish the selection rule and the evidence a consumer re-derives it from #3558

Open

Description

@noahgift

Operator requirement (2026-09-20): first-party internal projects — arbiter, RAH, apex — dogfood aprender Qwen3.5 from here on. This issue states what aprender must provide. The consuming projects are internal, this repository is public, and their internal details are deliberately not reproduced here; they are irrelevant to what we owe.

The requirement

  1. Qwen3.5 is the dogfood model family for first-party internal consumers. Not "a Qwen model" — Qwen3.5, the family 0.68.2 shipped on CPU and CUDA for 0.8B/2B/4B/9B/27B.
  2. Size selection is Pareto-optimal: prefer the smallest size that works, where "works" is measured, not assumed. Bigger is not safer; a larger model that clears the bar with headroom nobody needs costs VRAM, latency and fleet time that other work needs.
  3. The selection must be reproducible from committed evidence, so a consumer can re-derive "which size should I use" without asking a person.

What "Pareto-optimal" has to mean to be checkable

A size is admissible when it clears the capability bar for the task class, and selected when no smaller admissible size exists. The frontier is over:

Any size on that frontier is defensible; a size above the frontier — a larger one where a smaller admissible size exists — must be justified in writing or replaced.

Acceptance

Priority

Equal to the ontology/SHACL work (see #3080). Both are release-blocking for 0.69.

Refs #3080, #3555, #2753, #2770


Measured facts for whoever takes this, so the selection starts from evidence

Added by the cop 2026-09-20. All measured today on noah-Lambda-Vector (RTX 4090, sm_89) with GPU occupancy recorded at start, unless stated.

1. Every validated Qwen3.5 rung is Q4_K_M. 0.8B / 2B / 4B / 9B / 27B, sha256 in contracts/model-capability-ladder-v1.yaml. The "20/20 CPU+CUDA correct" behind 0.68.2 is a Q4_K_M result and it was published without that qualifier.

2. The GPU quant whitelist is exactly F32, Q4_0, Q4_1, Q5_0, Q8_0, Q4_K, Q5_K, Q6_K (crates/aprender-serve/src/gguf/dtype.rs:46). Every IQ* type, plus F16, Q2_K, Q3_K and BF16, is gated to CPU. Unsloth UD-* builds are mixed-precision and keep sensitive tensors at F16, so they run CPU-only — silently. A user hit this today and concluded his own files were wrong (#3077, raised to P1 on that evidence).

3. Decode is ~370 tok/s against llama.cpp's 179–189 on the same box and file — roughly 2× faster. The published parity headline understates it.

4. Time-to-first-token is 14–16 s against llama.cpp's 1.8–2.9 s, and 67 % of that is one guard. f2_validate_qwen35 runs a full CPU reference forward before the user's first token, on every invocation, saturating at ~9.5 s because QWEN35_F2_PROBE_MAX = 64. Split measured: 90–93 % CPU reference, 6–9 % GPU probe. #3604 caches it per (model sha256, apr version, device).

5. On the dense path, --gpu is currently 2–3× SLOWER than --no-gpu — the GPU result fails its own cosine check (0.4153@1) and falls back to CPU after the user has paid for the attempt (#3602, P0).

The constraint that matters most to a Pareto selection, and it is not parameter count

Say which TTFT regime you measured in. "Smallest that works" chosen against a 14 s TTFT is a different answer than against a 2 s one, and #3604 moves that number by ~9 s without touching a kernel. A size selected today inverts when it lands.

That is the difference between a selection rule and a snapshot, and it will be invisible to a fresh reader six weeks from now unless the receipt states the regime explicitly. The rule should be expressed so it survives #3604 — e.g. against decode throughput and quality at a stated TTFT budget, not against measured wall clock.

Ownership

Not apex. Routed there on 2026-09-20 and correctly declined on a fact: apex runs no local model — its only aprender dependency is aprender-viz, a plotting crate, and APEX-001 §1 states "Not an LLM wrapper. The LLM writes one file (study.toml) and is absent from the derive, adjudicate and render paths." The qualification this row needs — a consumer that runs the model in anger — is the one apex most clearly lacks.

This needs arbiter or RAH. Still unassigned.

Refs #3604, #3602, #3077, #3596, #3080.

Activity

  1. added this to the 0.69.0 milestone on Sep 20, 2026
  2. noahgift commented on Sep 20, 2026

    @noahgift
    MemberAuthor

    Goal A's floor is unreachable today, and the cause is #3571. The floor names apr serve — and apr serve cannot load Qwen3.5 at all (measured 2026-09-20: Architecture 'qwen35' … runs through Qwen35Model, with CUDA built in, on a file apr run answers correctly on 20/20 cells across two GPU hosts).

    Two consequences for the Pareto selection rule this issue defines:

    1. The rule must be evaluated on the serving path, not the run path. A size chosen by apr run latency and memory is a size chosen on a path no consumer uses. Peak VRAM under a long-lived server with a KV cache is a different number from a one-shot run, and the frontier moves with it.
    2. Pre-register the axes before apr serve cannot load Qwen3.5 at all — 'Architecture qwen35 … runs through Qwen35Model'; goal A's floor and the P0 decide-lane design both name apr serve #3571 lands, exactly as this issue says — otherwise the first serve measurements will be read as confirming whichever size we already guessed.

    Provisional pick from the P0 chain is Qwen3.5-9B-Q4_K_M; that remains provisional until the rule runs, and it should run on apr serve.

  3. noahgift commented on Sep 20, 2026

    @noahgift
    MemberAuthor

    Correction to my note above (operator, 2026-09-20). I wrote that goal A's floor is unreachable today because it names apr serve. True, and it must not be read as permission to wait: consumers adopt the CLI now. The Pareto selection rule should be exercised against apr run immediately — with the axes pre-registered as this issue requires — and re-run on the serving path when #3571 lands, because peak VRAM and latency under a resident server differ from a one-shot run and the frontier moves with them.

    First receipted cell exists as of today: Qwen3.5-9B-Q4_K_M on the agent host, min cosine 0.9986588, PASS (#3574 / PR #3575). The provisional pick now has one measured cell behind it instead of none.

  4. modified the milestones: 0.69.0, 0.70.0, 0.71.0 on Sep 20, 2026
  5. noahgift commented on Sep 23, 2026

    @noahgift
    MemberAuthor

    milestone → 0.71.0 per docs/roadmaps/milestone-triage-2026-09-23.md (#4024), operator approval 2026-09-23 (relayed by aprender-cf). Reason: first-party Qwen3.5 selection + evidence: part of the certified matrix (#3994)

  6. noahgift commented on Sep 25, 2026

    @noahgift
    MemberAuthor

    MRS-08 (paiml/infra MRS-001 §4, epic paiml/infra#1083): the selection rule should include Qwen 3.6.

    Falsifiable ask: the selection evidence for this issue names every candidate size tested. It must include Qwen3.6-27B and Qwen3.6-35B-A3B beside the Qwen 3.5 sizes (4B, 9B, 27B, 35B-A3B, and larger where the hardware allows).

    For each candidate, record:

    1. Does apr load it? Yes or no, with the exact version and weights sha. MRS-001 G9 marks this unknown [U].
    2. Measured on the fleet's own planted-defect corpora, not vendor benchmarks. MRS-001 §7 is a non-goal: "Qwen 3.6 adoption decided by vendor benchmarks [X]". Vendor agentic-coding scores are design input only, never a threshold.

    This is why it matters: tier L (local apr serve) is the start tier for mechanical and triage phases under the routing cascade. The quorum's third lineage (R-5) also depends on the model this issue selects.

  7. 1 remaining item

  8. added
    P1High priority
    and removed
    P0Critical priority
    on Oct 14, 2026
  9. noahgift commented on Oct 14, 2026

    @noahgift
    MemberAuthor

    P0 to P1 (2026-10-14 P0 triage): P0 now means it blocks the next release or carries the operator's own words on it; this issue does neither, so it stays on the 0.71.0 milestone at P1.

  10. noahgift commented on Oct 14, 2026

    @noahgift
    MemberAuthor

    merged into #5317 (master ticket for epic #4381; triage rule 7b, 2026-10-14). It is a checklist row there; reopen this issue when work on it starts or its PR opens.

  11. modified the milestones: 0.71.0, 0.73.0 on Oct 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High priorityowner:la-0.71Owned by the 0.71 look-ahead slotsize:MK̂ 3-4 h

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions