Skip to content

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

Description

@noahgift

P0 on the dogfood critical path. apr serve cannot load a Qwen3.5 model at all — the architecture the last release shipped, and the path goal A's floor names.

Measured 2026-09-20, published 0.68.2 built from crates.io with --features cuda

$ apr serve run ~/models/Qwen3.5-0.8B-Q4_K_M.gguf --gpu --port 18742
=== APR Serve ===
Detected format: GGUF
GGUF loaded: 320 tensors, 46 metadata entries
Building quantized inference model...
error: Model load failed: Failed to build quantized model: Format error:
  Architecture 'qwen35' is the Qwen3.5 hybrid (Gated Delta Net, detected tensor 'blk.0.ssm_a'):
  it runs through `Qwen35Model` (re…

The file loads and the architecture is correctly detected; the serve path does not route to Qwen35Model. apr run does — 20/20 cells correct across 0.8B/2B/4B/9B/27B on two GPU hosts, CPU and CUDA. So this is a routing gap in one verb, not a model defect.

Why this is P0 rather than a missing feature

Three things on the critical path assume apr serve works for this model:

  1. Goal A's floor is "≥3 internal consumers on apr serve for 7 consecutive days". Today that floor is unreachable for Qwen3.5 by construction.
  2. The recommended P0 architecture — run the apr engine as a long-lived apr serve unit declared in forjar with its own resource budget, so the model loads once and the lane is an HTTP client. That design is right (a run-per-call lane pays model load on every decision, and arbiter's 5% cgroup would never finish a 9B) and it is not buildable today.
  3. Verb set V (Name the Qwen model 0.69 blesses and commit its parity receipt at the SERVING shape — our gates are all single-stream #3555) includes apr serve single-stream.

Why nothing caught it

#3555 recorded that every gate we own is single-stream apr run — grep -nE 'batch|serve' scripts/check_model_parity.sh and check_model_ladder.sh both return nothing. The model-capability ladder proves apr run; no rung, no parity record and no dogfood row has ever asked apr serve to load a model. The one verb our own consumers are told to use is the one verb nothing exercises.

Acceptance

  • apr serve run <qwen3.5 gguf> --gpu starts, reports the real CUDA backend, and answers a /v1/chat/completions request correctly, on both GPU host classes, for every size the ladder covers.
  • The same on --no-gpu.
  • A ladder rung or parity row that exercises apr serve, not only apr run — otherwise this regresses silently the next time. That is the durable half of the fix.
  • Positive control: point the rung at a model the serve path genuinely cannot support and require RED.

Consequences to record now

Refs #3080, #3555, #3558, #3568

Activity

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

    P0Critical prioritybugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions