Skip to content

Qwen3.5-4B Q4_K_M: F2 guard rejects the CUDA path on GB10 at the first decode position (cosine 0.8675); 0.70.3 too, sm_89 passes #4958

Open

Description

@noahgift

Refs #3719

What fails

On a GB10 (sm_121), the F2 CPU-parity guard rejects the CUDA path for Qwen3.5-4B Q4_K_M at position 64. That is the first decode step after the 64-position batched prefill. The serve then falls back to CPU, so apr code on this model and host runs on CPU.

Backend: GPU (CUDA, NVIDIA GB10, 122502 MB VRAM) [qwen35 hybrid forward, #3090]
F2 guard: validating on this run (no receipt for this model) [source=fresh]
warning: GPU output diverges from CPU at position 64 (argmax 74455 != 74455, cosine 0.8675); min cosine 0.8675, validated via batched prefill — falling back to CPU
warning: GPU (CUDA) qwen35 path rejected, falling back to CPU: the F2 CPU-parity guard rejected the GPU path

Cosine 0.8675 is below F2_CATASTROPHIC_COSINE (0.90), so the guard is right to refuse.

It is not a regression since 0.70.3

serve child host model F2
main-based build c24c648bd GB10, driver 590.48.01 4B reject, pos 64, cos 0.8675
main-based build de984eb49 (earlier) GB10 4B reject, pos 64, cos 0.8675
released 0.70.3 (95f64ba14) GB10 4B reject, pos 64, cos 0.8675
c24c648bd GB10 Qwen3.5-9B Q4_K_M pass, 65 positions
c24c648bd RTX 4090 (sm_89), driver 580.119.02 4B, same file pass, 65 positions
  • The model file is the same on both hosts: sha256 00fe7986ff5f6b463e62455821146049db6f9313603938a70800d1fb69ef11a4.
  • The prompt is the same on every row. It is the exact apr code request (fixture system prompt with APR_CONFIG set to an empty dir), and the driver binary is the same.
  • The swap row changed only the serve child. It is the released 0.70.3 binary, and the GPU line above is its own stderr.
  • F2 runs fresh every time: each run uses an empty APR_F2_RECEIPT_DIR.
  • The failure is deterministic: three runs gave the same position and the same cosine to four digits.
  • It depends on the prompt. A shorter, hand-built prompt passes F2 on the same GB10 and model, so this repro needs the full apr code prompt.

A second, smaller defect: the message

f2_divergence_msg (crates/aprender-serve/src/infer/inference_result.rs) always prints argmax {gpu} != {cpu}. Here both are 74455. The rejection is on cosine alone, but the line reads as an argmax mismatch. When the two match, it should say so, for example argmax 74455 (agrees), cosine 0.8675 < 0.90, and name the floor that fired.

Repro

The harness is on branch fix/3719-apr-code-qwen35-cuda-071. That branch is not yet in a PR, because it waits for a slot.

APR_BIN_REQUIRE=head APR_BIN=<CUDA build> scripts/apr_code_edit_verify.sh \
  --model Qwen3.5-4B-Q4_K_M.gguf --host <name> --out <fresh dir> --gpu-q 1

Read <out>/serve-child.stderr for the F2 lines.

What this blocks

This is the only FAIL cell of #3719 (Qwen3.5 4B/9B × lambda/gx10). The other three cells pass on CUDA.

🤖 Generated with Claude Code

Activity

  1. added this to the 0.71.0 milestone on Oct 9, 2026
  2. modified the milestones: 0.71.0, 0.71.1 on Oct 10, 2026
  3. noahgift commented on Oct 10, 2026

    @noahgift
    MemberAuthor

    Parked at the cop's order (E3 was 10/9): unlinked from E3 #3994, milestone 0.71.0 -> 0.71.1, owner apr-4918 kept. It re-enters E3 when an E3 child closes. GB10-only, idle since 2026-10-09 16:34Z.

    Work not yet on origin: 3 local commits (60c1195, 2ac48d3, 7fb7221) sit on branch fix/4958-gb10-prefill in apr-4918's worktree. apr-4918 is asked to push that branch (branch only, no PR) at its next ticket boundary so the work is not lost.

  4. noahgift commented on Oct 10, 2026

    @noahgift
    MemberAuthor

    Update from apr-4918: the branch push is held until a local gate is green (fmt, clippy cuda, 4B CPU test, queued on intel lane S), ETA 05:30Z. A home path added in a test is fixed in f97f988. The branch will be pushed branch-only, no PR.

  5. 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.

  6. modified the milestones: 0.71.1, 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

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions