Measured · 11 October 2026 · 54 runs
Long context on the HP ZBook Ultra G1a
halogen-flash-server 0.18.0 from 32,000 to 990,000 tokens
Authors
Machine
HP ZBook Ultra G1a
- SoC
- Ryzen AI Max+ PRO 395
- GPU
- Radeon 8060S, gfx1151
- Memory
- 128 GiB LPDDR5X-8000, soldered – shared by CPU and GPU as unified memory
- SSD
- Samsung 990 PRO, 4 TB, NVMe on PCIe 4.0 x4
- OS
- Ubuntu 24.04,
140 W power supply,
platform_profile=performance
Model
Qwen3.8-Flash-Next
- Size
- about 180B – measured at 176.9 billion parameters
- Build
- “512×56B”, 48 blocks, 512 experts, 10 of them active per token
- Context
- native up to 262,144 tokens, beyond that YaRN with factor 4
Engine
halogen-flash-server
- Version
- image
0.18.0, Podman - Weights
v2.hgnwithout sidecar, 4.2 bpw over the 125.7 billion parameters outside the n-gram table; the table (51.2 billion entries, 8 bit) is a file of its own, read from the SSD- Flags
HALOGEN_CTXper length up to 1,048,576,HALOGEN_ROPE_YARN=4beyond 262k- Budget
- 3,072 output tokens per task, temperature 0, a fresh container per run
Tasks
Eight questions about a weather log
- Text
- 651 lines of weather-station readings, the same at every length
- Length
- padded with an unrelated maintenance journal
- Kind
- look up, compare, count, sum
- Scored
- six; the two arithmetic tasks test sums, not context
1,440tokens/s
Prompt processing on the first question about a text
22seconds
Reading the whole text once, on the first question
0.4seconds
Reading a follow-up the text itself is already processed
61.6tokens/s
Output when answering follow-up questions
86.2GiB
Memory held of 125.1 GiB; left afterwards: 31.5 GiB
984tokens/s
Prompt processing on the first question about a text
16.8minutes
Reading the whole text once, on the first question
0.8seconds
Reading a follow-up the text itself is already processed
55.1tokens/s
Output when answering follow-up questions
99.7GiB
Memory held of 125.1 GiB; left afterwards: 19.0 GiB
Medians over all runs at the given length. On the first question about a text the machine reads all of it. On every follow-up question it is already processed, and only the new question is added. Chapter 02 shows the lengths in between.
01 · Setup
The same task at every length
To find out whether a model understands a long context, you have to change the length and hold the task still. So the questions always concern the same weather log: 651 lines of weather-station readings, about 32,000 tokens, with eight questions that each have one unambiguous answer. An unrelated maintenance journal before and after it brings the text to each length, with 957,999 tokens at 990k. If the result changes, it can only be the length.
Up to 245k three versions of the weather log with different random values ran per step, one beyond: 21 runs for understanding. For speed, all 54 scored runs of those days count, including those with other documents of the same length; how fast the machine reads and answers depends on the number of tokens, not on their content. Discarded are the warm-up run, the repeat of the same document and the comparison runs with YaRN below 262k that chapter 06 shows. Which run is missing and why is in the evaluation in the repository.
02 · Speed
Read once, then it answers in seconds
On the first question about a text the machine reads 1,440 tokens per second at 32k and 984 at 990k. Every follow-up on the same text then takes at most 0.8 seconds, at every length.
For work on a long document this means: you wait once, 3.3 minutes at 245k, and then keep asking in conversation. An agent that extends its history pays for reading only what is new.
03 · Memory
The pool sets the memory, not the prompt
At startup halogen reserves a pool for a fixed number of positions and holds all of it, however long the text turns out to be. Up to 262k every run used the same pool: 86.2 GiB, whether the prompt had 32,000 or 245,000 tokens. For 990k it is 99.7 GiB of 125.1 GiB.
Beyond 262k halogen ran with a generation budget of 16,384 instead of 32,768 tokens. That lowers the working memory from 12.5 to 8.0 GiB, which is why the pool for 396k holds less than the native one.
At 990k it gets tight. After startup the machine had 19.0 to 19.2 GiB left for everything else, and while reserving the pool the kernel already had to compact memory 378 to 6,192 times depending on the start; with the smaller pools not once. Next to a pool this size nothing large should run on the notebook.
04 · Understanding
Up to 245k, 2 of 108 missing; beyond, it slips
Up to 245k the model solves 106 of 108 scorable tasks.
Within the native limit, length is hardly an obstacle for this model. The two missing answers lie at 128k and 245k, not piled up at the top end: at 128k the model overlooks the location condition of the maximum in one version, at 245k it reads the peak wind from a wrong row in one version.
05 · Beyond 262k
The first thing to fail is the look-up
Beyond the native limit the result slips. The same weather log solves 5 of 6 scorable tasks at 396k, 5 of 6 at 594k and 3 of 6 at 990k.
The pattern is not an even decline. The model names real values from the same log, only from the wrong row: at 396k and 594k the sensor ID of the neighbouring row, at 990k a peak wind of 23 km/h instead of 81. For the maximum it picks the reading point with the highest peak wind but overlooks that it lies at the wrong location. So it does not lose the text but the exact place in it.
Reading also gets more expensive beyond the limit: at 990k every token costs 26 percent more time than at 245k. Output is almost untouched by it.
06 · YaRN
At equal length, YaRN changes single answers
Beyond 262,144 tokens the model only gets there with YaRN, a stretch of the position encoding. Whether it costs answers itself shows in a comparison at 245k, where both work: the same document once native and once with YaRN.
Behind this are a block of four runs in alternating order on a long weather log of 4,993 lines, whose repeats give the same answers, and one run with the short weather log inside the maintenance journal. In the long log YaRN finds the unique combination that the model reports as absent natively, and measures the distance between two entries correctly. In the short one the same scorable tasks are right; only on the two arithmetic tasks do native and YaRN swap the correct answer.
Two documents are not enough to credit YaRN with an advantage. They are enough to conclude that YaRN does not cause the model to look up worse beyond 262k: at equal length it looks up at least as well with YaRN as without.
07 · Every figure
Results per length step
Understanding: the weather log inside the maintenance journal, the six scorable tasks across all runs of the step. Speed: medians across all scored runs of the step. Every chart in this report is computed from these values.
| Length | Scaling | Runs | correct |
|---|---|---|---|
| 32k | native | 3 | 18 / 18 |
| 64k | native | 3 | 18 / 18 |
| 96k | native | 3 | 18 / 18 |
| 128k | native | 3 | 17 / 18 |
| 192k | native | 3 | 18 / 18 |
| 245k | native | 3 | 17 / 18 |
| 396k | YaRN 4 | 1 | 5 / 6 |
| 594k | YaRN 4 | 1 | 5 / 6 |
| 990k | YaRN 4 | 1 | 3 / 6 |
| Length | Runs | Reading (s) | Reading (t/s) | Output (t/s) | Follow-up (s) |
|---|---|---|---|---|---|
| 32k | 4 | 22.3 | 1,440 | 61.6 | 0.4 |
| 64k | 6 | 47.3 | 1,357 | 61.2 | 0.4 |
| 80k | 3 | 58.6 | 1,368 | 60.6 | 0.4 |
| 96k | 6 | 72.0 | 1,335 | 61.2 | 0.4 |
| 112k | 3 | 83.9 | 1,337 | 60.5 | 0.3 |
| 128k | 6 | 97.5 | 1,315 | 60.8 | 0.4 |
| 144k | 3 | 111.3 | 1,295 | 59.1 | 0.4 |
| 160k | 3 | 126.3 | 1,268 | 60.5 | 0.5 |
| 176k | 3 | 139.5 | 1,263 | 60.3 | 0.4 |
| 192k | 6 | 151.8 | 1,266 | 59.8 | 0.5 |
| 229k | 1 | 187.0 | 1,225 | 58.7 | 0.5 |
| 245k | 4 | 197.8 | 1,239 | 58.3 | 0.5 |
| 396k | 2 | 343.9 | 1,152 | 56.8 | 0.5 |
| 594k | 2 | 553.5 | 1,074 | 56.8 | 0.7 |
| 990k | 2 | 1,006.0 | 984 | 55.1 | 0.8 |
| Pool | Budget | Starts | Weights | KV-Pool | Working | total | left |
|---|---|---|---|---|---|---|---|
| 393,216 | 32,768 | 53 | 62.9 | 10.8 | 12.5 | 86.2 | 31.5–32.4 |
| 425,984 | 16,384 | 2 | 62.9 | 11.7 | 8.0 | 82.6 | 35.3–35.3 |
| 622,592 | 16,384 | 2 | 62.9 | 17.1 | 8.0 | 88.0 | 29.8–29.9 |
| 1,048,576 | 16,384 | 2 | 62.9 | 28.8 | 8.0 | 99.7 | 19.0–19.2 |
08 · Limits
What this work does not show
One version beyond 262k. Above the native limit one version of the weather log ran per length. At temperature 0 the same document repeats the same answer; the spread lies between documents and is not measured there. What holds is the course across all steps, not the single point.
One pool for every length up to 262k. Up to 262k every run used the everyday pool of 393,216 positions. How much memory a smaller pool would save for short texts is not measured.
The smaller arena. From 396k halogen works with a generation budget of 16,384 instead of 32,768 tokens. That changes together with the length and is not measured separately.
One kind of document. The tasks ask about a tabular measurement log. For source code, prose or conversations the limit may lie elsewhere.
One engine, one machine. What is measured is halogen 0.18.0 with checkpoint v2 on the HP ZBook Ultra G1a. The speed holds for this stack; whether llama.cpp understands the same at the same lengths is not measured here.