Messung · 8. September 2026 · ein Durchgang je Engine
Qwen3.8-Flash-Next auf dem HP ZBook Ultra G1a
llama.cpp (rocmfpx-Fork) gegen halogen-flash-server 0.4.4
Autoren
Maschine
HP ZBook Ultra G1a
- SoC
- Ryzen AI Max+ PRO 395
- GPU
- Radeon 8060S, gfx1151, 70 W Budget
- Speicher
- 128 GiB LPDDR5X-8000, verlötet – als Unified Memory von CPU und GPU geteilt
- System
- Ubuntu 24.04,
140-W-Netzteil,
platform_profile=performance
Modell – in beiden Läufen dasselbe
Qwen3.8-Flash-Next
- Größe
- rund 180B – gemessen 176,9 Mrd. Parameter
- Bauart
- „512×56B“, 48 Blöcke, 512 Experten, davon 10 je Token aktiv
- Kontext
- bis 262.144 Token, Vokabular 248.320
- Aufgaben
- 20: 12 × AIME 2024/2025, 4 × Code, 4 × Kontext (~69.000 Token)
Engine A
llama.cpp · rocmfpx-Fork
- Stand
- Commit
e302744, Vulkan/RADV - Gewichte
Q4_0_ROCMFP4_STRIX_LEAN(GGUF), 4,5 bpw- Aufruf
-c 262144 -fa on -ngl 999 -np 1 --cache-ram 0- Budget
- 65.536 Token
Engine B
halogen-flash-server 0.4.4
- Stand
- Image
halogen-flash-server:0.4.4, Podman - Gewichte
w4b.hgn+ Qualitäts-Overlay, 5,53 bpw- Aufruf
HALOGEN_CTX=134400, 4 Slots,HALOGEN_PROMPT_CACHE=0- Budget
- 49.152 Token (zugleich Prefill-Arena)
halogen auf dieser Maschine
886Token/s
Prompt-Verarbeitung bei 69.000 Token Kontext
39,9Token/s
Ausgabe im langen Kontext dieselben 69.000 Token im Vorlauf
39,3Token/s
Ausgabe im Chat kurze Fragen, unter 800 Token Prompt
157Minuten
für alle zwanzig Aufgaben 339.134 Token erzeugt
Mittelwerte über die Aufgaben der jeweiligen Gruppe, gemessen an den Antworten des Laufs selbst – nicht an Füllsätzen. Temperatur 0, Prompt-Cache aus, 70 W GPU-Budget.
01 · Setup und Speicher
Warum ein 180B-Modell auf einem Notebook überhaupt läuft
Ein Modell mit 176,9 Milliarden Parametern auf einem Gerät mit 128 GiB Arbeitsspeicher (125,1 GiB davon nutzbar), dessen dedizierter Grafikspeicher 0,5 GiB beträgt – das geht nur, weil drei Dinge zusammenkommen: die Bauart des Modells, die Speicherarchitektur der Plattform und das, was die Engine daraus macht.
1 · Das Modell
Dünn besetzt statt dicht
- gesamt
- 176,9 Mrd. Parameter, 48 Blöcke
- aktiv
- 10 von 512 Experten je Token
- Folge
- Gerechnet wird je Token ein Bruchteil des Modells – gespeichert werden muss es trotzdem ganz
2 · Die Plattform
Ein Speicher für beide
- VRAM
- nur 0,5 GiB dediziert
- GTT
- 110 GiB des Arbeitsspeichers für die GPU freigegeben (
amdgpu.gttsize) - Folge
- Die GPU rechnet auf demselben LPDDR5X wie die CPU – kein PCIe-Umweg, keine Kopie
3 · Die Engine
Was halogen daraus macht
- laden
- 124,1 GB Checkpoint eingeblendet, davon 65,64 GiB festgepinnt – in 3,6 s bei 19,4 GB/s
- KV
- ein Pool über 134.400 Positionen = 3,7 GiB, rund 28 KiB je Position
- bereit
- nach 15,1 s, 81,1 GiB Arbeitsspeicher blieben frei
Warum der Speicher die erste Frage ist
Bei einem Modell dieser Größe entscheidet der Speicher vor allem anderen. Er ist die harte Grenze: Was nicht hineinpasst, läuft nicht. Und was gerade eben hineinpasst, belegt das Gerät für die Dauer der Rechnung so weit, dass daneben nichts anderes mehr Platz hat – auf einem Notebook, das zugleich Arbeitsgerät ist, ist das der Unterschied zwischen brauchbar und blockiert.
Deshalb stehen hier zwei Angaben nebeneinander: wie viel Speicher im Betrieb gebunden war und auf welche Weise er gehalten wurde. Beides fällt bei diesen beiden Engines auseinander, und die zweite Angabe entscheidet darüber, wie die erste zu lesen ist.
Was der Betrieb an Speicher bindet
Ein Sensor erfasste während beider Läufe alle zwei Sekunden den Speicherstand. Zwei Begriffe aus der folgenden Tabelle sind dabei erklärungsbedürftig.
GTT steht für Graphics Translation Table und bezeichnet den Teil des Arbeitsspeichers, den der Grafiktreiber der GPU zugänglich macht: Seiten des Systemspeichers werden in den Adressraum der GPU eingeblendet, sodass dort ohne Umkopieren in dedizierten Grafikspeicher gelesen und gerechnet werden kann. Auf dieser Plattform ist das der Regelfall, nicht die Ausnahme – dediziert stehen nur 0,5 GiB zur Verfügung, die Obergrenze für die GTT setzt der Kernelparameter amdgpu.gttsize, hier 110 GiB. Was die Tabelle als GTT ausweist, ist also kein zusätzlicher Speicher, sondern der Anteil desselben Arbeitsspeichers, der zum Messzeitpunkt der GPU zugeteilt war.
MemAvailable ist die Schätzung des Kernels, wie viel Speicher einer neuen Anwendung noch zur Verfügung stünde – einschließlich dessen, was er dafür freiräumen könnte. Die Zeile „frei geblieben“ nennt den Tiefstand dieses Werts über den Lauf, also das, was dem übrigen System im ungünstigsten Moment blieb.
| Speicher | llama.cpp | halogen |
|---|---|---|
| Auf der Platte | 98,48 GiB 3 GGUF-Shards |
115,58 GiB + 2,31 GiB Overlay |
| GTT-Spitze im Lauf | 78,7 GiB | 52,7 GiB |
| GTT im Mittel | 77,5 GiB | 41,0 GiB |
| vom System als vergeben geführt | 88,4 GiB | 56,6 GiB |
| frei geblieben, Tiefstand | 36,7 GiB | 68,5 GiB |
5.065 Messpunkte über den vollständigen halogen-Lauf. Für llama.cpp liegen 5.854 Punkte vor, die allerdings nur die letzten drei Aufgaben abdecken: Dieser Lauf wurde in zwei Sitzungen gefahren, und der Sensor lief in der zweiten. Es sind die drei Kontextaufgaben – der speicherintensivste Teil des Satzes.
Zwei Wege, dieselben Gewichte zu halten
Die unteren beiden Zeilen laden dazu ein, sie als Bedarfsangabe zu lesen. Das wären sie nur, wenn beide Engines den Speicher auf dieselbe Weise beanspruchten. Sie tun es nicht:
- llama.cpp legt die Gewichte mit
-ngl 999als GTT-Allokationen an – Gerätespeicher, der aus demselben Arbeitsspeicher stammt. Solche Seiten sind nicht rückholbar; sie senkenMemAvailablein voller Höhe. - halogen blendet den Checkpoint ein (
mapped 124,1 GB). Dessen Seiten sind sauber und dateigestützt. Der Kernel führt sie als verfügbar, weil er sie jederzeit verwerfen und bei Bedarf erneut von der Platte lesen kann.
Im Protokoll der Engine ist das direkt ablesbar: Auf pinned 65,64 GiB folgt wenige Zeilen später host memory left for everything else: 81,1 GiB. Die gepinnten Seiten erscheinen im belegten Speicher also nicht.
Die Tabelle weist damit aus, wie viel Speicher das System als vergeben führt. Das ist die betriebsrelevante Größe – von ihr hängt ab, ob neben dem Modell noch gearbeitet werden kann. Eine Bedarfsangabe im Sinne von „so viel Speicher benötigt die Engine“ ist sie nicht, und ein Vergleich der beiden Spalten misst zu einem Teil die Buchführung des Kernels statt den Bedarf der Engine.
Die Rolle der SSD
Von 115,6 GiB Mapping sind 65,64 GiB festgepinnt; der Rest bleibt als Dateiseiten liegen und kann verdrängt werden. Damit wird die Platte Teil des Speicherpfades: Sie trägt den Kaltstart und fängt auf, was unter Speicherdruck ausgelagert wird. Erst diese Rückfallebene lässt einen Checkpoint dieser Größe auf einem Gerät mit 128 GiB überhaupt zu – und macht die Wahl einer schnellen SSD zu einer Entscheidung über die Startzeit, nicht nur über den Plattenplatz.
Wie groß dieser Unterschied ausfällt, zeigt der Startvorgang selbst. Liegt der Checkpoint noch im Page-Cache, sind die 65,64 GiB in 3,6 Sekunden fixiert – 19,4 GB/s, also gar kein Plattenzugriff. Liegt er nicht dort, liest die Engine ihn tatsächlich vom Laufwerk: 2,1 GB/s, aus 3,6 werden 33,2 Sekunden. Beide Werte stammen von derselben Maschine und demselben Checkpoint; verschieden ist nur der Weg, den die Daten nehmen.
Wie viel im Verlauf der Läufe nachgeladen wurde, weist diese Messung nicht aus: Der Sensor erfasste GPU-Leistung, Takt, Temperatur, GTT und MemAvailable, jedoch keine I/O-Zähler. Eine belastbare Aussage darüber verlangt einen eigenen Lauf mit Blockstatistik.
Die eigentliche Grenze ist das Generierungsbudget
Die Messung lief mit einem Kontextfenster von 134.400 Positionen; das Modell beherrscht 262.144. Auch dieses volle Fenster ist auf dem Gerät fahrbar. Der KV-Speicher kostet rund 28 KiB je Position – die gefahrenen Positionen belegen 3,7 GiB, die vollen 262.144 entsprechend 7,2 GiB. Mit einem Pool dieser Größe und demselben Generierungsbudget von 49.152 Token ist die Engine auf der ansonsten unbelasteten Maschine nach 18,9 Sekunden bereit und beantwortet den längsten Prompt des Aufgabensatzes, 68.801 Token, mit 1.005 Token/s Prompt-Verarbeitung; 76,3 GiB Arbeitsspeicher bleiben frei.
Begrenzend wirkt eine andere Größe: HALOGEN_MAX_TOK bestimmt nicht nur, wie lang eine Antwort werden darf, sondern bemisst zugleich die Prefill-Arena.
| HALOGEN_MAX_TOK | Prefill-Arena | freie 2-MiB-Blöcke danach | Prefill von 60 Token |
|---|---|---|---|
| 32.768 | 16,7 GiB | – | – |
| 49.152 gefahren | ~25 GiB | 2.152 (4,3 GiB) | 2,3 s |
| 65.536 | 33,4 GiB | 184 (368 MiB) | 127 s |
Der Engpass ist dabei nicht die Menge des Speichers, sondern seine Form. Die Engine braucht große zusammenhängende Blöcke; sind nur noch kleine vorhanden, verbringt sie den Start mit Kompaktierung. Bei 65.536 Token Budget bleiben nach dem Start 184 zusammenhängende 2-MiB-Blöcke bei 637 Kompaktierungsläufen allein für die Pool-Reservierung, und ein Prefill von 60 Token dauert dann 127 Sekunden statt 2,3. Der große KV-Pool wirkt in dieselbe Richtung, wenn auch schwächer: Mit 262.144 Positionen verbleiben 275 Blöcke bei 285 Kompaktierungsläufen.
Für die Messung fiel die Wahl deshalb auf 134.400 Positionen: Dieses Fenster deckt den längsten Prompt des Satzes samt vollem Budget ab und lässt der Arena den meisten zusammenhängenden Speicher. Wer den vollen Kontext braucht, bekommt ihn – und bezahlt ihn mit einem knapperen Start.
Einordnung
Der Prefill in Stücken von 32.768 Token, das Pinning und der gemeinsame KV-Pool sind Eigenschaften dieser Engine-Fassung, nicht des Modells. Die Gewichte der beiden Läufe sind nicht dieselben (4,5 gegen 5,53 bpw): halogens Checkpoint ist der genauere und der größere. Und llama.cpp lief mit n_ctx 262.144 gegen halogens 134.400 – ohne Wirkung auf die Ergebnisse, da keine Anfrage darüber hinausgeht, aber ein Teil des Speicherunterschieds geht darauf zurück. Die vollständige Einordnung steht in Kapitel 11.
02 · Und im Vergleich
Dieselbe Maschine, dieselben Aufgaben, die andere Engine
- Trefferquote
- 17 : 18 von 20
- McNemar exakt p = 1,000 – kein messbarer Unterschied in der Fähigkeit.
- Prompt-Verarbeitung
- 7,1 ×
- 126 gegen 886 Token/s bei 69.000 Token Prompt.
- Dauer des Laufs
- 486 → 157 min
- Dieselben zwanzig Aufgaben, hintereinander, ohne Fremdlast.
- Wiederholbarkeit
- 0/18 : 9/9
- Byteweise identische Antwortpaare auf dieselbe Frage bei Temperatur 0.
Was darunter folgt, ist diese Messung in neun Kapiteln: was gefragt wurde, was beide gelöst haben, wo die Zeit hingeht, wie sie an die Aufgaben herangehen – und was die Arbeit nicht zeigt.
03 · Was gemessen wurde
Zwanzig Aufgaben, drei Sorten, zwei Stapel
Zwölf Aufgaben aus den AIME-Wettbewerben 2024 und 2025 – ganzzahlige Lösung, maschinell prüfbar. Vier eigene Codeaufgaben, deren Antwort im rootlosen Sandkasten ohne Netz gegen Testfälle ausgeführt wird. Und vier eigene Kontextaufgaben über eine Messreihe von rund 69.000 Token, die der Prompt vollständig enthält.
Die eigenen Aufgaben sind die kontaminationsfreie Gegenprobe zu den öffentlichen AIME-Sätzen: Sie standen nirgends im Netz, als das Modell trainiert wurde. Beide Engines bekamen exakt dieselben Prompts in derselben Reihenfolge, Temperatur 0, Prompt-Cache aus, am 140-W-Netzteil im Leistungsprofil. Während eines Laufs lief nichts anderes auf der Maschine; der Runner bricht ab, wenn er einen Fremdprozess oder ein anderes Energieprofil vorfindet.
| Aufgabe | Thema | Herkunft | Prompt-Token | llama.cpp | Sekunden | halogen | Sekunden |
|---|---|---|---|---|---|---|---|
c1 | Damerau-Levenshtein-Distanz, unbeschränkt | Code | 222 | gelöst | 2.289 | gelöst | 1.108 |
c3 | Maximaler Fluss im gerichteten Netzwerk | Code | 211 | gelöst | 1.230 | gelöst | 631 |
c4 | Lexikographisch kleinste Topo-Sortierung | Code | 201 | gelöst | 70 | gelöst | 37 |
c6 | Teilmengen mit Zielsumme, auch negative | Code | 188 | gelöst | 2.812 | gelöst | 962 |
k1 | Schneehöhen am Ostgrat unter 0 °C | Kontext | 68.824 | falsch | 1.832 | gelöst | 893 |
k2 | Höchste Windspitze bei Schnee über 300 cm | Kontext | 68.832 | gelöst | 2.284 | gelöst | 495 |
k3 | Messpunkte mit drei Bedingungen | Kontext | 68.845 | Budget erschöpft | 6.394 | gelöst | 822 |
k4 | Zwei Differenzen aus zwei Messzeilen | Kontext | 68.851 | gelöst | 582 | gelöst | 84 |
aime2024-1 | Logarithmensystem, drei Unbekannte | AIME2024 | 287 | gelöst | 76 | gelöst | 37 |
aime2024-2 | Schnittpunkte verschachtelter Beträge | AIME2024 | 219 | Budget erschöpft | 4.905 | Budget erschöpft | 1.302 |
aime2024-3 | Komplexe Zahlen, größter Realteil | AIME2024 | 186 | gelöst | 69 | gelöst | 30 |
aime2024-4 | Zahlentheorie: kleinstes p mit p² | n⁴+1 | AIME2024 | 203 | gelöst | 897 | gelöst | 301 |
aime2024-5 | Zweistellige Zahlen zur Basis b | AIME2024 | 261 | gelöst | 310 | gelöst | 339 |
aime2024-6 | Kreisgeometrie, Tangenten, Potenzsatz | AIME2024 | 492 | gelöst | 2.717 | gelöst | 976 |
aime2025-1 | Teilbarkeit im Stellenwertsystem zur Basis b | AIME2025 | 169 | gelöst | 35 | gelöst | 22 |
aime2025-2 | Gleichschenkliges Trapez mit Inkreis | AIME2025 | 222 | gelöst | 65 | gelöst | 57 |
aime2025-3 | Sägezahnfunktion schneidet Parabel | AIME2025 | 335 | gelöst | 913 | Schleife | 763 |
aime2025-4 | Sechs Punkte auf einer Geraden | AIME2025 | 237 | gelöst | 68 | gelöst | 49 |
aime2025-5 | Zwei Kreise, innere Berührung, Rechteck | AIME2025 | 934 | gelöst | 367 | gelöst | 257 |
aime2025-6 | Reguläres 24-Eck, Matchings gleicher Länge | AIME2025 | 194 | gelöst | 1.232 | gelöst | 267 |
Spaltenkopf anklicken zum Sortieren
Ein Unterschied im Aufbau ist erwähnenswert, weil er sonst wie ein Vorteil aussähe: llama.cpp lief mit einem Token-Budget von 65.536, halogen mit 49.152 – bei halogen ist dieser Wert zugleich die Prefill-Arena und hätte bei 65.536 rund 33 GiB belegt. Ausgewertet wird deshalb auf dem gemeinsamen Budget 49.152. Die Umrechnung nimmt llama.cpp eine gelöste Aufgabe und gibt keiner Engine etwas dazu.
04 · Fähigkeit
In der Fähigkeit trennt sie nichts
17 gegen 18 gelöste Aufgaben von zwanzig. Gepaart ausgewertet: McNemar exakt, p = 1,000. Bei zwanzig Aufgaben und 3 unterschiedlich beantworteten ist ein realer Unterschied dieser Größe vom Zufall nicht zu trennen.
Wer eine der beiden Engines wählt, weil sie bessere Antworten gebe, wählt auf einer Grundlage, die diese Messung nicht hergibt. Das ist keine Schwäche des Vergleichs, sondern sein wichtigstes Ergebnis: Es räumt die Fähigkeitsfrage ab und macht den Weg frei für die Frage, die tatsächlich Unterschiede zeigt.
05 · Prompt-Verarbeitung
Der Vorsprung wächst mit der Länge des Prompts
Bei kurzen Fragen liest llama.cpp den Prompt mit 99, halogen mit 129 Token/s ein – spürbar, aber nicht dramatisch. Bei den vier Kontextaufgaben mit knapp 69.000 Token stehen 126 gegen 886 Token/s: Faktor 7,1 zugunsten von halogen.
Der Grund, warum das wichtig ist, steht nicht in der Zahl, sondern in der Arbeitsweise: Ein langer Prompt ist der Normalfall, sobald ein Modell eine Datei, ein Protokoll oder einen Verlauf lesen soll. Genau dort verlangt llama.cpp gut sieben Minuten für das, wofür halogen eine braucht – bevor das erste Zeichen der Antwort erscheint.
06 · Ausgabetempo
Der eine bricht im langen Kontext ein, der andere nicht
Bei kurzen Fragen erzeugt llama.cpp 21,1, halogen 39,3 Token/s – gut 1,9 × so schnell. Mit 69.000 Token Vorlauf fällt llama.cpp auf 9,7 Token/s – etwa die Hälfte seines eigenen Tempos. halogen bleibt bei 39,9.
Beides zusammen – langsamer eingelesen und danach langsamer geschrieben – ist der Grund, warum sich die Laufzeiten am Ende nicht um Prozente, sondern um einen Faktor unterscheiden.
07 · Warum das zählt
Der Unterschied ist Durchsatz, nicht Geschwätzigkeit
Ein schnellerer Lauf könnte auch schlicht ein kürzerer sein. Ist er nicht: llama.cpp erzeugte über die zwanzig Aufgaben 362.635 Token, halogen 339.134 – halogen also sogar 6,5 % weniger.
Beide denken damit ähnlich lang über dieselben Aufgaben nach. Der Zeitunterschied entsteht nicht daraus, dass einer sich kürzer fasst, sondern daraus, wie schnell dieselbe Menge Text durch die Maschine geht.
08 · Zusammengeführt
Sekunden je gelöster Aufgabe
Trefferquote und Tempo in eine Zahl gebracht: 1.714 gegen 524 Sekunden je gelöster Aufgabe. Faktor 3,3 – bei gleicher Trefferquote. Über den ganzen Lauf: 486 gegen 157 Minuten.
09 · Die blinde Gegenprobe
Sie lösen die Aufgaben nicht nur gleich oft, sondern gleich
Ein Prüfer, der nicht wusste, welche Engine welchen Text erzeugt hatte, bekam zu jeder der zwanzig Aufgaben beide vollständigen Lösungswege vorgelegt. Ergebnis: in 19 von 20 Fällen derselbe Ansatz – dieselbe Substitution, derselbe Satz, derselbe Algorithmus.
Auch das Prüfverhalten unterscheidet sich nicht: Wer nachrechnet, wer eine Probe macht, wer in eine Sackgasse läuft und wie er wieder herausfindet, verteilt sich über beide Stapel gleich. Das stützt den Befund aus Kapitel 04 von einer anderen Seite – nicht über die Trefferquote, sondern über den Weg dorthin.
10 · Der ungeplante Befund
Dieselbe Frage, dieselbe Antwort – oder eben nicht
Bei Temperatur 0 sollte dieselbe Anfrage dieselbe Antwort ergeben. llama.cpp tut das in keinem einzigen Fall: 0 von 18 Antwortpaaren über 18 Durchgänge in zwei Konfigurationen waren byteweise identisch. halogen in allen: 9 von 9, über Neustarts der Engine hinweg.
Bei einer Aufgabe lagen die Antworten auf dieselbe Frage zwischen 1.165 und 36.455 Token. Der naheliegende Verdächtige – llama.cpps Übernahme des Slot-Zustands zwischen Anfragen – wurde durch einen zweiten Durchlauf mit cache_prompt: false ausgeschlossen. Gleich war nur die erste Anfrage nach einem Serverstart, und die über zwei unabhängige Starts hinweg byteweise: Die Streuung sitzt im Zustand zwischen den Anfragen, nicht im Sampling.
Für die Praxis heißt das zweierlei. Erstens: Wer eine Antwort belegen oder eine Regression eingrenzen will, braucht die Wiederholbarkeit – und bekommt sie hier nur von einer der beiden Seiten. Zweitens, und unbequemer: Die llama.cpp-Zeiten in dieser Messung sind eine Stichprobe, keine Konstante. Sie sind mit einer breiten, hier nicht bezifferten Streuung zu lesen.
11 · Was diese Arbeit nicht zeigt
Vier Einschränkungen, die man mitlesen muss
Der wichtigste Vorbehalt
Es sind nicht dieselben Gewichte. llama.cpp lief mit 4,5 bpw (Q4_0_ROCMFP4_STRIX_LEAN, GGUF), halogen mit 5,53 bpw (.hgn w4b plus Qualitäts-Overlay: 12 Tensoren in q8g64, 2,31 GiB). Verglichen wurde der Stapel aus Engine und Quantisierung, nicht die Engine allein.
- Kontamination. AIME 2024 und 2025 sind öffentlich und stehen wahrscheinlich in den Trainingsdaten. Für den Vergleich zweier Quantisierungen desselben Modells ist das tragbar – beide haben dieselbe Erinnerung –, als absolute Fähigkeitsaussage taugt es nicht. Die eigenen Code- und Kontextaufgaben sind die Gegenprobe.
- Ein Notebook mit 70 W GPU-Budget ist kein Desktop. Die absoluten Zahlen gelten für dieses Gerät an diesem Netzteil.
- Ein Durchgang je Engine – und bei llama.cpp ist das nachweislich eine Stichprobe, keine Konstante (Kapitel 10).
- Der Stand von heute ist nicht der Stand der Messung. Der rocmfpx-Fork ist seit dem Messtag dreizehn Commits weiter, mit einer Optimierung genau am hier gemessenen Schwachpunkt; halogen liegt bei 0.5.0. Nachgemessen wurde das nicht – diese Seite gilt für die Fassungen, die sie nennt.