← All posts

Where the decoys win: Qwen3.5-4B multikey needle from 128K to 512K, plus Qwen3.5-9B at 480K

Same decoy passcode test as the last round, run on the 4B at shorter contexts to find where it starts picking the wrong vault. It was right at 128K and 384K and in 2 of 3 runs at 256K, but wrong in both runs at 512K. The 9B answered correctly at 480,544 tokens, its longest multikey run so far.

ExperimentE21J
Date2026-10-29
BenchmarkRULER-style multikey needle: one target passcode sentence at 10%, 50% or 90% depth plus three decoy passcodes for other vault colors (near 25%, 60% and 80% depth), in shuffled paragraphs from the MATH training set. Greedy decoding, 512-token answer limit. A run passes only if the first code in the final answer, after any thinking block, is the target code.
ModelQwen3.5-9B and Qwen3.5-4B, Q4_K_M GGUF, flash attention on, q4_0 K and V cache, ubatch 64
HardwareOne of my dedicated test rigs: RTX 3080 10 GB
VerdictBASELINE

What I tested

My build of upstream llama.cpp PR 29827, "CUDA: cap FA convert buffer for quantized KV" (not my work, unmerged when tested). 4B at 128K and 256K (native), 384K with YaRN x1.5 and 512K with YaRN x2. 9B at 480K with YaRN x1.875. Prompts were filled to the context size minus 1,500 tokens.

Pass bar, set before the run

None. Supporting measurement, plan written down before the run. A run passes if the target code is the answer; decoy picks are recorded.

Result

ModelContextDepthPrompt tokensAnswerPeak VRAMSharedPrefillTime
4B128K (native)50%129,329green code (pass)4,514 MiB98 MiB1,969 tok/s1.3 min
4B256K (native)10%256,534asked blue, gave the green decoy (fail)5,686 MiB114 MiB1,361 tok/s3.5 min
4B256K (native)50%254,587green code (pass)5,686 MiB114 MiB1,370 tok/s3.3 min
4B256K (native)90%255,925orange code (pass)5,686 MiB114 MiB1,364 tok/s3.5 min
4B384K (YaRN x1.5)50%384,466green code (pass)6,858 MiB130 MiB1,048 tok/s6.5 min
4B512K (YaRN x2)10%513,414asked blue, gave the red decoy (fail)8,026 MiB146 MiB851 tok/s10.5 min
4B512K (YaRN x2)90%514,162asked orange, gave the green decoy (fail)8,026 MiB146 MiB850 tok/s10.5 min
9B480K (YaRN x1.875)50%480,544green code (pass)9,876 MiB264 MiB808 tok/s10.3 min

Counting the last round too, the 4B is now 0 of 3 at 512K and 1 of 3 at 704K on this test, against 4 of 5 at 384K and below. The one failure below 512K was at 256K with the target near the start of the prompt.

All three 4B failures in this round happened when the target was at 10% or 90% depth; every 50% run passed. Seven runs are too few to call that a pattern.

The 9B at 480K used 9,876 MiB of the 10 GB card and 264 MiB of shared memory, the most so far and close to the 300 MiB line I use for counting a run as on the GPU. That is about as far as the 9B goes on this card with this setup.

After answering, both models kept writing extra question and answer pairs or copied math text from the haystack. The grader only reads the first code.

Next round: the same failing 4B configs with the question also stated before the long document (a known prompting technique), to see if that stops the decoy picks.

What happened

This round mapped where the 4B stops being able to pick the right fact out of a long prompt full of similar facts. Up to 384K it mostly could. At 512K it failed both times, each time giving a decoy's passcode. So the 4B fits 704K on the card but only uses roughly 384K reliably on this test. The 9B kept passing at 480K, near the limit of what fits on the card. The memory saving that makes these runs fit is upstream PR 29827, so credit goes to its authors.

How to rerun

powershell -ExecutionPolicy Bypass -File e21j_chain.ps1

Code

All code for E21J: README.md, e21j_chain.ps1, results.jsonl.

Prior work

No novelty claim. This measures an existing upstream llama.cpp pull request with a standard RULER-style multikey needle test.

Written by Andrew Rose with help from AI tools. Every number comes from the run logs.

Questions or ideas? me@andrewroseit.com or @AndrewRoseIT.