Zurück zum Blog

Qwen3.8 27B auf zwei Consumer-GPUs: welche Variante ist die schnellste, und welche taugt als Coding-Agent?

Qwen3.8 27B auf zwei Consumer-GPUs

Welche Variante ist die schnellste, und welche taugt als Coding-Agent? Ein Messbericht

Datum 1. November 2026
Kategorie LLM & Self-Hosting
Lesezeit 10 Minuten

Über 20 Konfigurationen auf Geschwindigkeit gemessen, dann die Kandidaten wochenlang als Coding-Agent gegen verdeckte Tests laufen lassen. Ergebnis: Q4_K_M mit MTP und Tensor-Split liefert 79 Tokens pro Sekunde und hat in den Agententests am Ende auch qualitativ vorne gelegen.

Dieser Bericht fasst die Messungen vom 16. bis 30. Oktober zusammen. Die Einzelheiten zu Testaufbau und ersten Läufen stehen in zwei früheren Beiträgen: Was MTP, Quantisierung und Tensor-Split wirklich bringen und Lokale Coding-Agenten im Härtetest. Dort war die schnellste Variante in den langen Agentensitzungen noch gescheitert. Die Wiederholungsläufe seither haben dieses Bild gedreht.

GPURTX 5060 Ti 16 GB + RTX 4070 Ti 12 GB
Serverllama.cpp b10964 + llama-swap
Kontext64k, 1 Slot
AgentOpenCode
Die Kernzahlen:
  • 79,4 tok/s mit Q4_K_M + MTP (4) + tensor bei kurzen Antworten.
  • +64 % durch -sm tensor statt Schicht-Split (Q4_K_M: 24 → 40 tok/s).
  • ×2,0 durch MTP bei K-Quants; bei IQ3_S kein Gewinn.
  • 21/21 Punkte, die beste Code-Struktur im Reverse-Engineering-Test.

Aufbau

Zwei unterschiedliche Karten in einem Rechner, zusammen 28 GB VRAM. Qwen3.8 27B ist ein dichtes Modell, es muss also komplett in den Grafikspeicher passen, sonst bricht die Geschwindigkeit ein. Jede Messung lief deshalb zu 100 % auf der GPU, andere Modelle und Dienste waren vorher entladen.

Verglichen wurden fünf Quantisierungen, jeweils mit und ohne zwei Beschleuniger:

  • MTP (Multi-Token Prediction): Das Modell bringt eigene Vorhersage-Köpfe mit, die mehrere Token im Voraus raten. Das Hauptmodell prüft sie in einem Durchgang. Ein separates Draft-Modell ist nicht nötig.
  • -sm tensor: Beide GPUs rechnen an jeder Schicht gleichzeitig. Beim normalen Schicht-Split (-sm layer) wartet immer eine Karte auf die andere.

Gemessen wurde die Ausgabegeschwindigkeit (Decode) für drei kurze Aufgaben (Code, JSON, Fließtext) und für einen langen Prompt mit 26k Token.

Geschwindigkeit

Decode, Mittel aus Code / JSON / Prosa, in tok/s. Die Zahl hinter MTP ist die Anzahl der Draft-Token, „+ tensor“ steht für -sm tensor, sonst wurde der Schicht-Split verwendet. Blau = ohne MTP, Orange = mit MTP.

Q4_K_M + MTP 4 + tensor
79,4
UD-Q4_K_XL + MTP 3 + tensor
75,9
Q4_K_M + MTP 3 + tensor
75,1
Q4_K_M + MTP 2 + tensor
72,2
Q4_K_M + MTP 4
50,4
Q4_K_M + MTP 3
49,2
GSQ IQ3_S + tensor
47,5
UD-Q4_K_XL + MTP 3
47,1
Q5_K_M + MTP 3
44,9
Q3_K + MTP 3
41,3
GSQ IQ3_S + MTP 3 + tensor
40,1
Q4_K_M + tensor
39,6
Q5_K_M + tensor
35,5
GSQ IQ3_S
29,2
GSQ IQ3_S + MTP 3
28,9
Q4_K_M
24,1
Q3_K
24,0
UD-Q4_K_XL
23,0
Q5_K_M
21,3
0255075100

Q5_K_M + MTP + tensor passte nicht mehr in den Speicher (OOM). -sm row wird für dieses Modell nicht unterstützt.

Details der wichtigsten Varianten

Variante Code JSON Prosa 26k Decode 26k Prefill VRAM
Q4_K_M + MTP 4 + tensor79,7101,856,765,5107312,2 + 10,9 GB
UD-Q4_K_XL + MTP 3 + tensor78,790,258,862,5108512,4 + 11,2 GB
Q4_K_M + MTP 3 + tensor78,490,057,060,2107212,2 + 10,8 GB
Q4_K_M + MTP 2 + tensor73,881,761,059,3107512,1 + 10,8 GB
GSQ IQ3_S + tensor47,247,847,643,210669,6 + 8,1 GB
Q4_K_M + tensor39,539,639,636,4114411,5 + 10,2 GB
Q5_K_M + tensor35,535,635,432,9112812,7 + 11,4 GB
GSQ IQ3_S (Schicht-Split)29,628,929,026,7136611,3 + 6,7 GB
Q4_K_M (Schicht-Split)24,224,124,122,3139713,3 + 8,7 GB

Alle Werte in tok/s, VRAM als Spitzenwert je Karte.

Was die Zahlen zeigen

  • Tensor-Split ist der einfachste Gewinn. Eine Zeile in der Server-Konfiguration bringt bei zwei GPUs +60 bis 65 %. Im Schicht-Split lag die Auslastung bei etwa 60 % / 40 %, die Karten haben abwechselnd gerechnet.
  • MTP verdoppelt K-Quants. Q4_K_M mit Tensor-Split geht von 39,6 auf 79,4 tok/s. Bei der IQ3_S-Variante (GSQ) bremst MTP sogar: Drei Entwurfs-Token kosten dort das 2,08-Fache der Zeit, bei K-Quants nur das 1,1- bis 1,2-Fache.
  • Der Gewinn hängt vom Text ab. JSON ist gut vorhersagbar (102 tok/s, 89 % der Entwürfe angenommen), Fließtext deutlich weniger (57 tok/s, 36 %). Mehr Draft-Token helfen bei JSON und Code, bei Prosa nicht.
  • Prefill wird etwas langsamer. Mit Tensor-Split und MTP sinkt die Prompt-Verarbeitung von rund 1400 auf rund 1070 tok/s. Ein größerer Micro-Batch (-ub 1024) holt davon nur 4 bis 6 % zurück.
  • Platz ist die Grenze. Mit Q4_K_M + MTP + Tensor-Split bleibt auf der 12-GB-Karte rund 1 GB frei. Q5_K_M passt mit MTP nicht mehr. Ein zweites Modell (hier Whisper für Spracherkennung) daneben hat den Server in der Praxis sehr wahrscheinlich zum Hängen gebracht.

Server-Konfiguration der schnellsten Variante

llama-server -m Qwen3.8-27B-MTP-Q4_K_M.gguf \
  -ngl 99 --device CUDA0,CUDA1 -sm tensor \
  -c 65536 --parallel 1 \
  --spec-type draft-mtp --spec-draft-n-max 4 \
  --jinja --reasoning-format deepseek --reasoning-budget 2048 \
  --temp 0.7 --top-k 20 --top-p 0.8 --min-p 0 \
  --presence-penalty 1.5 --repeat-penalty 1.0
Achtung bei gemischten Karten: In llama.cpp ist CUDA0 die schnellere Karte (hier die 4070 Ti), nvidia-smi zählt nach PCI-Steckplatz. Wer Container auf eine Karte festlegen will, braucht CUDA_DEVICE_ORDER=PCI_BUS_ID.

Testszenarien

Tokens pro Sekunde sagen nichts darüber, ob ein Modell als Agent etwas fertig bringt. Deshalb liefen die Kandidaten in OpenCode gegen Aufgaben mit verdeckten Tests. Der Agent arbeitet in einem abgeschotteten Verzeichnis, sieht weder Tests noch Musterlösung und darf nur ein Prüfskript aufrufen.

minipack (Reverse Engineering)

Ein eigenes C++-Kommandozeilenprogramm (Kompressions-Codecs, abstrakte Basisklasse, Statistik) wird mit MSVC /O2 ohne Debug-Symbole gebaut. Der Agent sieht nur die EXE und rekonstruiert den Quellcode über Ghidra (pyghidra-mcp).

120 Differenzialtests gegen das Original · Strukturbewertung 21 Punkte (für den Agenten unsichtbar) · 120 min + 45 min Abschluss-Sitzung

heatshrink (Reverse Engineering, groß)

Ein LZSS-Packer, leicht verändert, damit das Modell ihn nicht aus dem Training kennt. Encoder, Decoder, Fehlerbehandlung und CLI müssen byte-genau stimmen.

152 Testfälle in 6 Gruppen · Strukturbewertung 15 Punkte · bis 360 min

web-lab (Web-Entwicklung)

Eine FastAPI- und React-App mit LLM-Anbindung wird erweitert: Chat, Streaming per SSE, Verlauf in SQLite, strukturierte Ausgabe, dann Tool-Calling, Kontextbudget, Token-Auth, Verbrauchslimits und UI-Extras.

Stufe 1: 6 Aufgaben, 52 Tests · Stufe 2: 6 weitere Aufgaben quer durch den Bestand, 102 Tests · Mock-LLM und Vitest

Ergebnisse als Coding-Agent

minipack: rekonstruieren und aufräumen

Alle Läufe mit Thinking-Budget 2048 und Tensor-Split, im gleichen Aufbau aus zwei Sitzungen: Erst wird rekonstruiert, bis alle Tests grün sind, dann folgt eine frische Sitzung für Ghidra-Dokumentation und Code-Qualität.

Variante Sitzung 1 Abschluss Tests Struktur
GSQ IQ3_S68 min39 min120/12020/21
Q4_K_M ohne MTP69 min36 min120/12020/21
UD-Q4_K_XL ohne MTP64 min29 min120/12019/21
Q4_K_M + MTP, 1. Lauf44 minTimeoutkompiliert nicht19/21
Q4_K_M + MTP, 2. Lauf69 min10 min120/12021/21

Im ersten MTP-Lauf war die Rekonstruktion nach 44 Minuten fertig, die Abschluss-Sitzung hat den Code dann aber kaputt umgebaut und die Zeit überschritten. Die Wiederholung lieferte die erste volle Punktzahl: unique_ptr statt rohem new, abstrakte Basis mit 12 override, keine Warnungen bei /W4, 22 Funktionen in Ghidra benannt und kommentiert. Zum Vergleich: Claude Sonnet löste dieselbe Aufgabe über ein anderes Ghidra-Werkzeug in 11 Minuten.

heatshrink: nur mit Modulen

Mit GSQ IQ3_S in einer einzigen langen Sitzung: 60/152 nach sechs Stunden. Der Encoder meldete nur „Ausgabe weicht ab“, der Agent hatte nichts, woran er sich entlanghangeln konnte. Mit einer frischen Sitzung pro Modul, der Meldung der ersten abweichenden Byte-Position und automatischem Zurückspielen des besten Stands: 152/152, Struktur 13/15.

web-lab: Stufe 2 mit 102 Tests

Variante GSQ IQ3_S Q4_K_M + MTP 4 + tensor
eine Sitzung je Aufgabe102/102 · 33 min102/102 · 19 min
eine lange Sitzung mit Kompaktierung1× 56/102 (Ausfall), Wdh. 102/102 · 85 min4× 102/102 · 20 / 36 / 23 / 30 min
eine Sitzung ohne Kompaktierung102/102 · 20 min102/102 · 12 min

In Stufe 1 (52 Tests) lagen zum Vergleich Qwen3.6 35B-A3B (52/52, 10 min) und Qwen3.8 GSQ (52/52, 14 min) vorne, dahinter GLM-4.7-Flash (45/52), Qwen3-Coder-30B (41/52) und Devstral Small 2 (40/52).

Was mehr gebracht hat als das Quant

  1. „Code zuerst“ in der Arbeitsanleitung. Ohne diese Vorgabe analysierte auch die beste Variante eine Stunde lang und schrieb keine Zeile.
  2. Thinking begrenzen. Unbegrenztes Thinking frisst das Ausgabelimit, ohne Thinking dreht der Agent nach etwa zwölf Minuten Schleifen. --reasoning-budget 2048 am Server liegt dazwischen.
  3. Kurze Anleitungen. Jede zusätzliche Regel in der AGENTS.md machte die Ergebnisse schlechter. Besser: zwei Sitzungen mit je einer schlanken Anleitung.
  4. Fleißarbeit vorbereiten. „Dokumentiere alle Funktionen in Ghidra“ wurde ignoriert. Eine fertige Liste mit Adresse, Namensvorschlag und Kommentar wurde in 39 Minuten vollständig abgearbeitet.
  5. Feedback, das man verwerten kann. „Datei weicht ab“ führt zu nichts, „erste Abweichung bei Byte …“ führt zum Ziel.

Fazit

Für Qwen3.8 27B auf zwei Consumer-GPUs mit zusammen 28 GB ist Q4_K_M mit MTP (4 Draft-Token) und -sm tensor die schnellste Variante, die noch komplett in den Speicher passt: knapp 80 tok/s bei kurzen Antworten, 65 tok/s bei 26k Kontext. Als Coding-Agent war sie in den Web-Tests klar schneller fertig als GSQ IQ3_S und lieferte im Reverse-Engineering-Test den saubersten Code. GSQ IQ3_S bleibt die sparsamere Wahl (rund 18 GB, 47 tok/s), wenn noch etwas anderes auf den Karten laufen soll.

Einschränkungen: Die meisten Agentenläufe gibt es nur einmal. Die Tests sind selbst gebaut, die Hardware ist eine einzige Kombination, und spätere llama.cpp-Versionen können die Zahlen verschieben. Die Entwürfe und Annahmequoten von MTP hängen stark vom Inhalt ab.

Messungen 16.–30. Oktober 2026 · llama.cpp b10964 · Quants: GSQ-RCO IQ3_S (ISTA-DASLab), Q4_K_M mit MTP-Köpfen (Jackrong), UD-Q4_K_XL (Unsloth)