Messung · 9. und 10. Oktober 2026 · sechs Engines
Qwen3.8-27B als Agent auf dem Mac Studio M1 Ultra
Rapid-MLX, oMLX, MTPLX, mlx-dspark, llama.cpp, mlx-lm mit Agentenverläufen bis 98.000 Token
Autoren
Maschine
Mac Studio M1 Ultra
- SoC
- Apple M1 Ultra, 20 CPU-Kerne (16 Leistung, 4 Effizienz), 64 GPU-Kerne
- Speicher
- 64 GiB Unified Memory, davon 56 GiB für die GPU freigegeben
- System
- macOS 26.2 (25C56), am Netz
Modell
Qwen3.8-27B
- Bauart
- dicht, hybrid: Gated-DeltaNet-Schichten mit rekurrentem Zustand und klassische Attention
- Gewichte
- je Engine ihre eigene 4-Bit-Fassung, mit Entwurfskopf, wo die Engine einen nutzt
- Kontext
- 262.144 Token Fenster auf jeder Engine
Engines
Stand und Gewichte
- Rapid-MLX
0.15.7·Qwen3.8-27B-4bit-MTP-fp16-MLX- oMLX
0.7.0·Qwen3.8-27B-oQ4e-fp16-mtp- MTPLX
2.12.2·Qwen3.8-27B-MTPLX-Optimized-Speed-FP16- mlx-dspark
0.20.3·Qwen3.8-27B-4bit-MTP-fp16-MLX- llama.cpp
0.6.0·Qwen3.8-27B-UD-Q4_K_M.gguf- mlx-lm
0.32.0·Qwen3.8-27B-4bit
Messung
Wie OpenCode arbeitet
- API
- OpenAI-kompatibel, gestreamt, mit Werkzeugen
- Prompts
- Verläufe eines echten Coding-Agenten, 2.300 bis 98.000 Token
- Einstellung
- Temperatur 0, Denkaufwand low, bis 1.024 Token Ausgabe
- Ablauf
- eine Engine zur Zeit, Vorprüfung vor jedem Start, Sensoren alle 2 s
Bewertung auf einen Blick
gut mittel schwach
| EngineStand, Gewichte, Einsatz | Verlauf haltennach Nebenfrage, zweiter Sitzung | NeustartVerlauf danach | Einlesenkalt, 13k | AusgabeAgent, 13k | Langer Kontextrichtig, Folgefrage | Ausgabe treumit Spekulation, ohne Cache |
|---|---|---|---|---|---|---|
| Rapid-MLX0.15.7 · 4bit-MTP-fp16-MLXAgent bis 52k | gut: 1,3 s | gut: 1,2 s | gut: 300 Token/s | gut: 31,5 Token/s | schwach: liest neu ein32k: Folgefrage 116 s | gut: gleichin allen Läufen |
| oMLX0.7.0 · oQ4e-fp16-mtpAgent bis 98k; bricht abgeschnittene Werkzeugaufrufe ab | gut: 2,3 s | gut: 6,6 s | gut: 293 Token/s | mittel: 29,5 Token/s | mittel: bis 64k23/24 · 18 s | gut: gleichin allen Läufen |
| MTPLX2.12.2 · MTPLX-Optimized-Speed-FP16schnellste Ausgabe, mit Spekulation aber eine andere | gut: 1,5 s | gut: 5,9 s | gut: 285 Token/s | gut: 37,3 Token/s | schwach: bis 32k24/24 · 7,3 s | schwach: weicht abTempo 2,0-fach |
| mlx-dspark0.20.3 · 4bit-MTP-fp16-MLXAgent ohne Neustart; Cache wird nicht wiedergefunden | gut: 1,3 s | schwach: 3,6 min | gut: 301 Token/s | mittel: 27,6 Token/s | mittel: bis 64k23/24 · 26 s | mittel: längernur an der Token-Grenze |
| llama.cpp0.6.0 · UD-Q4_K_M.ggufDokumente über 64k | gut: 1,0 s | schwach: 4,4 min | mittel: 232 Token/s | schwach: 20,2 Token/s | gut: bis 128k24/24 · 1,8 s | gut: gleichin allen Läufen |
| mlx-lm0.32.0 · 4bitReferenz; verliert den Verlauf bei jeder Nebenfrage | schwach: 4,7 min | schwach: 4,7 min | schwach: 214 Token/s | schwach: 23,4 Token/s | schwach: liest neu ein32k: Folgefrage 2,6 min | gut: gleichin allen Läufen |
Stufen nach festen Schwellen. Verlauf halten und Neustart: erstes Token im 52k-Verlauf, gut bis 5 bzw. 10 s, mittel bis 30 bzw. 60 s. Einlesen und Ausgabe: Anteil am besten Wert, gut ab 90 bzw. 80 %, mittel ab 75 bzw. 65 %. Langer Kontext: größte Länge mit höchstens einer falschen Antwort und einer Folgefrage bis 30 s, gut ab 128k, mittel ab 64k. Ausgabe treu: byteweise gleich gegenüber dem Lauf ohne Spekulation und ohne Cache. Alle sechs lösten außerdem jede Werkzeugaufgabe.
01 · Aufbau
Sechs Server, ein Modell, dieselben Verläufe
Qwen3.8-27B passt mit 4 Bit in die 64 GiB des Mac Studio und lässt daneben Platz für einen langen Verlauf. Auf dem Mac gibt es dafür sechs Server mit OpenAI-kompatibler Schnittstelle: mlx-lm als Referenz von Apple, die Ableger Rapid-MLX, oMLX, MTPLX und mlx-dspark, und llama.cpp mit Metal. Jede Engine lief mit den Gewichten, für die sie gebaut ist, und mit ihrem Cache so, wie man ihn im Alltag einschaltet.
Gemessen sind vier Dinge. Erstens eine Sitzung: ein Agentenverlauf von 52.000 Token, der Turn um Turn wächst, unterbrochen von einer Nebenfrage, einer zweiten Sitzung und einem Neustart des Servers. Zweitens acht einzelne Agentenschritte von 2.300 bis 98.000 Token, jeder kalt, für das reine Einlese- und Ausgabetempo. Drittens Folgefragen an ein Dokument von 32.000 bis 128.000 Token mit geprüften Antworten. Viertens, ob die Spekulation, mit der vier der Engines werben, die Ausgabe verändert.
Die Agentenverläufe sind aus der Aufzeichnung eines echten Coding-Agenten (mini-swe-agent) geschnitten; derselbe Satz lief schon auf dem HP ZBook Ultra G1a. Alle Zeiten sind auf der Uhr des Messskripts genommen, nicht aus den Angaben der Server. Vor jedem Start prüfte ein Skript, dass kein anderer Server, kein Download und kein Build lief. Werkzeugaufrufe beherrschen alle sechs: jede Engine löste die fünf Werkzeugaufgaben in drei Runden ohne formalen Fehler.
02 · Sitzung
Wer den Verlauf hält, antwortet in einer Sekunde
Den ersten Turn liest jede Engine kalt ein: 3,5 bis 4,7 Minuten bei 52.000 Token. Danach beginnt der nächste Turn bei allen nach 1,0 bis 3,0 Sekunden. Den Unterschied machen die Unterbrechungen: Nur Rapid-MLX bleibt in jeder Lage bei höchstens 1,3 Sekunden.
Der Grund liegt im Modell. Seine DeltaNet-Schichten tragen einen Zustand, der den ganzen Verlauf zusammenfasst und sich nicht auf eine frühere Stelle zurückschneiden lässt. Eine Engine kann einen gespeicherten Verlauf deshalb nur wiederverwenden, wenn der neue Prompt ihn genau fortsetzt, oder wenn sie unterwegs Schnappschüsse des Zustands abgelegt hat. Agentenschritte setzen den Verlauf fort; das gelingt allen.
Eine Nebenfrage oder eine zweite Sitzung schiebt einen anderen Verlauf dazwischen. mlx-lm hält nur einen Eintrag dieser Größe und liest danach 4,7 min neu ein. Über einen Neustart retten den Verlauf nur die Engines, die ihn auf die SSD schreiben: Rapid-MLX (1,2 s), oMLX (6,6 s) und MTPLX (5,9 s). llama.cpp hält den Verlauf im Arbeitsspeicher, mlx-dspark legt zwar einen Plattencache an, findet ihn nach dem Neustart aber nicht wieder.
03 · Turns
Kalt einlesen kostet bei 52k dreieinhalb bis knapp fünf Minuten
Ohne Cache liest der M1 Ultra einen Agentenverlauf von 13.000 Token mit 214 bis 301 Token je Sekunde ein. Bei 52.000 Token wartet man 3,5 bis 4,7 Minuten auf das erste Token.
Das Einlesen bestimmt die Wartezeit eines Agenten, sobald der Cache den Verlauf verliert. Die Ausgabe bestimmt die Zeit danach: Ein Schritt mit 1.000 Token Denken und Werkzeugaufruf dauert bei 37,3 Token je Sekunde rund 27 Sekunden, bei 20,2 rund 50. Während der Schritte zog der Chip 95 bis 102 Watt bei 71 bis 74 °C; der GPU-Takt blieb bei allen Engines auf 1.296 MHz.
04 · Langer Kontext
Bei 128k antwortet nur llama.cpp sofort und fehlerfrei
Fragen an ein langes Dokument verzweigen: Jede Folgefrage setzt hinter dem Dokument neu an, nicht hinter der letzten Antwort. Für den rekurrenten Zustand des Modells ist das schwerer als ein Agentenschritt.
Bei 32k lösen alle sechs Engines alle 24 Aufgaben aus drei Fassungen des Dokuments. Bei 128k bleibt llama.cpp fehlerfrei, oMLX löst 22 von 24 und schreibt dann nur noch 10,5 Token je Sekunde. MTPLX liest 128k in 19 Minuten ein und scheitert danach an Speicherfehlern: 3 von 24. mlx-dspark lief bis 64k; bei 128k leerte sein Speicherwächter den Cache, und eine Folgefrage brauchte 16 Minuten.
05 · Spekulation
Spekulation lohnt nur bei MTPLX und ändert dort die Ausgabe
Spekulative Dekodierung lässt einen kleinen Entwurfskopf mehrere Token vorschlagen, die das Modell in einem Schritt prüft. Richtig gebaut ändert sie kein Token, nur das Tempo. Geprüft ist das je Engine mit zwei frischen Servern ohne Cache, einmal ohne und einmal mit Spekulation, je zweimal dieselben vier Prompts.
Mit Volltext nachgeprüft weicht MTPLX im Prosa-Prompt ab Zeichen 712 des Denkens ab, in der Agentenaufgabe A03 ab Zeichen 856; dort schreibt es danach eine andere Antwort und ruft die Shell mit anderen Befehlen auf. Das Ergebnis ist nicht falsch, aber nicht das des Modells ohne Entwurf. mlx-dspark schreibt mit Spekulation dieselben Token und hängt nur an der Grenze von 512 oder 1.024 Token noch angenommene Entwurfstoken an. Rapid-MLX, oMLX, llama.cpp und mlx-lm geben in allen Läufen byteweise dieselbe Ausgabe.
oMLX schaltet die Spekulation nur in den Modelleinstellungen, nicht beim Start; dort lief sie in beiden Armen. llama.cpp und mlx-lm haben für dieses Modell keine.
06 · Wahl
Rapid-MLX für den Agenten, llama.cpp für lange Dokumente
Für OpenCode mit Verläufen bis 52k, so weit gemessen: Rapid-MLX. Es hält den Verlauf über Nebenfragen, eine zweite Sitzung dazwischen und Neustarts, antwortet dabei in höchstens 1,3 Sekunden, gibt mit und ohne Spekulation dieselben Token aus und schreibt bei 13k 31,5 Token je Sekunde. Das Zeitlimit des Clients muss trotzdem den ersten Turn aushalten: Ein neuer Verlauf von 52k braucht auch hier 3,6 min.
Für Fragen an Dokumente über 64k: llama.cpp. Es ist beim Schreiben das langsamste, aber das einzige, das bei 128k fehlerfrei und sofort antwortet. Einen Neustart übersteht sein Cache nicht.
MTPLX schreibt am schnellsten und hält den Verlauf ebenfalls, ändert mit Spekulation aber die Ausgabe, schickt Werkzeugaufrufe in wenigen großen Stücken und stößt ab 52k an seinen Speicherwächter. oMLX hält den Verlauf und reicht bis 98k, bricht einen an der Token-Grenze abgeschnittenen Werkzeugaufruf aber mit einem Fehler ab. mlx-lm ist als Referenz gemessen; für einen Agenten verliert es den Verlauf zu leicht.
07 · Alle Zahlen
Die Ergebnisse je Engine
Aus diesen Werten sind alle Grafiken dieses Berichts gerechnet; die Werte je Anfrage stehen in docs/m1-ultra-werte.json, die Rohdaten unter laeufe/m1-ultra/.
| Schritt | Rapid-MLX | oMLX | MTPLX | mlx-dspark | llama.cpp | mlx-lm |
|---|---|---|---|---|---|---|
| erster Turn, kalt | 216,1 | 212,3 | 240,1 | 216,3 | 263,4 | 283,5 |
| Folgeturn | 1,3 | 3,0 | 1,1 | 1,3 | 1,0 | 1,2 |
| nach Nebenfrage | 1,3 | 2,3 | 1,5 | 1,3 | 1,0 | 279,3 |
| nach zweiter Sitzung | 1,3 | 2,2 | 0,8 | 1,3 | 1,0 | 279,6 |
| nach Neustart | 1,2 | 6,6 | 5,9 | 217,3 | 264,9 | 283,7 |
| zweite Sitzung nach Neustart | 0,9 | 1,3 | 2,5 | 45,3 | 57,8 | 67,2 |
| Schritt | Rapid-MLX | oMLX | MTPLX | mlx-dspark | llama.cpp | mlx-lm |
|---|---|---|---|---|---|---|
| A01 2k | 9 / 36,1 | 12 / 31,5 | 9 / 45,4 | 8 / 32,1 | 10 / 21,6 | 11 / 26,1 |
| A02 5k | 17 / 31,8 | 17 / 31,0 | 19 / 48,2 | 17 / 32,1 | 21 / 21,0 | 23 / 25,3 |
| A03 13k | 44 / 31,5 | 45 / 29,5 | 47 / 37,3 | 43 / 27,6 | 56 / 20,2 | 61 / 23,4 |
| A04 13k | 45 / 30,6 | 46 / 29,5 | 48 / 41,7 | 45 / 27,1 | 58 / 20,2 | 63 / 23,4 |
| A05 52k | 216 / 20,7 | 208 / 23,1 | 239 / – | 215 / 27,7 | 264 / 17,4 | 282 / 18,1 |
| A06 53k | 221 / 24,3 | 213 / 23,0 | 231 / 28,4 | 220 / 25,6 | 269 / 17,4 | 293 / 18,1 |
| A07 97k | – | 453 / 15,0 | – | – | 581 / 15,4 | – |
| A08 98k | – | 464 / – | – | – | 597 / 14,9 | – |
| Engine | Länge | richtig | Einlesen (s) | Einlesen (t/s) | Folgefrage (s) | Ausgabe (t/s) |
|---|---|---|---|---|---|---|
| Rapid-MLX | 32k | 24 / 24 | 116 | 276 | 116,4 | 27,3 |
| oMLX | 32k | 24 / 24 | 119 | 269 | 16,6 | 26,3 |
| oMLX | 64k | 23 / 24 | 268 | 239 | 18,0 | 19,9 |
| oMLX | 128k | 22 / 24 | 657 | 195 | 14,2 | 10,5 |
| MTPLX | 32k | 24 / 24 | 122 | 264 | 7,3 | 37,1 |
| MTPLX | 64k | 24 / 24 | 340 | 189 | 57,9 | 28,5 |
| MTPLX | 128k | 3 / 24 | 1.142 | 112 | – | 18,4 |
| mlx-dspark | 32k | 24 / 24 | 118 | 273 | 5,1 | 33,3 |
| mlx-dspark | 64k | 23 / 24 | 294 | 218 | 26,5 | 28,5 |
| llama.cpp | 32k | 24 / 24 | 151 | 214 | 1,0 | 18,7 |
| llama.cpp | 64k | 24 / 24 | 342 | 188 | 1,3 | 16,7 |
| llama.cpp | 128k | 24 / 24 | 854 | 150 | 1,8 | 13,7 |
| mlx-lm | 32k | 24 / 24 | 159 | 202 | 157,8 | 21,1 |
| Engine | Prosa | Code | A01 | A03 | Chip (W) | °C |
|---|---|---|---|---|---|---|
| Rapid-MLX | gleich | gleich | gleich | gleich | 101 | 73,2 |
| oMLX | gleich | gleich | gleich | gleich | 100 | 74,2 |
| MTPLX | anders | gleich | gleich | anders | 102 | 73,8 |
| mlx-dspark | anders | anders | gleich | anders | 99 | 73,8 |
| llama.cpp | gleich | gleich | gleich | gleich | 95 | 72,2 |
| mlx-lm | gleich | gleich | gleich | gleich | 97 | 70,8 |
08 · Grenzen
Was diese Arbeit nicht zeigt
Eine Sitzung, ein Durchgang. Die Sitzung lief je Engine einmal. Bei Temperatur 0 wiederholt sich die Ausgabe; ob ein Cache trifft, kann aber vom Zustand des Speichers abhängen und ist nicht wiederholt gemessen.
Rapid-MLX im langen Kontext ohne Spekulation. Aus einem lokalen Snapshot gestartet, schaltet Rapid-MLX die Spekulation nur mit ausdrücklicher Angabe des Entwurfskopfs ein, und bei der Messung zum langen Kontext fehlte diese Angabe. Kapitel 05 zeigt, dass sie auf dieser Maschine weder Tempo noch Ausgabe ändert.
Verschiedene Gewichte. Jede Engine lief mit der 4-Bit-Fassung, für die sie gebaut ist. Tempo und Antworten vergleichen deshalb Engine samt Gewichten, nicht die Engine allein.
Gekappte Ausgabe. Jeder Agentenschritt endete spätestens nach 1.024 Token. Einige Schritte erreichen die Grenze. Für das Tempo spielt das keine Rolle; ob sie fertig geworden wären, misst der Bericht nicht.
Eine Maschine, ein Stand. Gemessen sind die genannten Fassungen am 9. und 10. Oktober 2026. Die MLX-Ableger erscheinen fast wöchentlich neu; ein späterer Stand kann sich anders verhalten.