Benchmark · KI-Tooling · Werkstattbericht
DS4 auf DRACO: von 42,64 auf 52,36 %
Nach dem Juni-Lauf sah es zuerst so aus, als läge das lokale DS4 deutlich hinter GPT-5.5. Unter demselben strengen Judge blieben davon aber nur 1,19 Prozentpunkte übrig: 48,18 gegen 49,37 %, allerdings mit einem Judge-Lauf bei DS4 und drei bei GPT-5.5. Damit war für mich die Frage nicht mehr, ob das Modell genug weiß. Ich wollte wissen, wo der Harness die Punkte verliert.
Die Antwort war ziemlich konkret: Ein Tool-Aufruf kippte einmal 15,7 MB in den Kontext. Der KV-Cache kam auf 3.102 Verdrängungen bei nur 76 Treffern. Die höchste Denkstufe war gar nicht erreichbar. Und das Zeitlimit produzierte leere Antworten, obwohl im Sitzungsprotokoll teilweise schon ein brauchbarer Bericht lag.
In den folgenden drei Wochen habe ich diese Stellen repariert und in kontrollierten Läufen gemessen. Der neue Stack lag auf denselben 20 Aufgaben rund 6,8 pp über dem Juni-Wert. Wegen der anderen Pi-Version, der Harness-Änderungen und einem statt drei Judge-Läufen ist das ein Vorher/Nachher-Wert, keine isolierte Kausalwirkung. Die kombinierte Konfiguration aus präziserem Quant und höherem Cap lag weitere 2,9 pp darüber. Insgesamt stieg DS4 auf dem bewusst harten Subset von 42,64 auf 52,36 %.
Das ist kein offizieller DRACO-Wert und kein Vergleich mit dem OpenRouter-Leaderboard. Es ist ein interner Mess-Harness, mit dem ich meine eigenen Konfigurationen vergleichen kann. Alle direkten Vergleiche unten nutzen denselben strengen Judge (Pi openai-codex/gpt-5.5:xhigh, criterion-Modus). Wo sich die Zahl der Judge-Läufe oder der Harness unterscheiden, schreibe ich es dazu.
Wie ich die Zahlen vergleiche
Einige Zahlen sehen ähnlich aus, dürfen aber nicht gegeneinander gerechnet werden. Für die Tabellen gelten deshalb diese Regeln:
- Score: DRACO bewertet jede Antwort gegen eine versteckte Rubrik, im Schnitt mit 39,34 binären Kriterien pro Aufgabe und positiven wie negativen Gewichten. Der Judge entscheidet je Kriterium MET oder UNMET; das Ergebnis wird auf 0 bis 100 % normalisiert. Eine leere Antwort bekommt exakt 0 %.
- Judge: Dieselben GPT-5.5-Antworten erreichen 61,77 % mit gpt-4.1-mini und 49,37 % mit dem strengen GPT-5.5-Judge. Nur der Judge wurde ausgetauscht. Absolute Werte über diese Grenze hinweg vergleiche ich nicht. Die Juli-Arme liefen mit dem strengen Judge im criterion-Modus und drei Judge-Läufen. Die DS4-Zahlen aus dem Juni haben nur einen Lauf und sind entsprechend markiert.
- 20-Aufgaben-Subset: Ich habe es am 2.7. eingefroren: 6 pathologische Aufgaben aus den Juni-Totalausfällen, 4 aus schwachen Domänen, 4 aus starken und 6 aus dem Mittelfeld. Es ist absichtlich härter als der 100er-Schnitt. Ein Subset-Wert ist deshalb nicht mit einem 100-Aufgaben-Wert vergleichbar.
- Cap: Das ist das harte Zeitlimit pro Aufgabe: im Juni 7.200 s, ab 2.7. 2.100 s und ab 8.7. 2.500 s. Läuft eine Aufgabe hinein, bricht der Runner ab und versucht Salvage.
- Salvage: Der Runner sucht zuerst den letzten brauchbaren Bericht im Sitzungsprotokoll. Wenn dort nichts liegt, setzt er die Session einmal mit einer erzwungenen Finalisierung fort. Ein geretteter Bericht zählt als Antwort. Schlägt auch das fehl, bleiben 0 %.
- Bench-Zahlen: Prefill und Decode in t/s stammen aus
ds4-benchmit identischem Prompt und identischen Parametern. Seit dem 6.7. zählen für mich nur noch verschränkt gemessene Arme, also abwechselnde Läufe im gleichen Messfenster und mit möglichst ähnlichem Warmzustand.
Im Juni war der Judge größer als der Modellabstand
Bevor ich am Stack weitergebaut habe, musste ich die Juni-Zahlen erst richtig sortieren:
Score-Übersicht · strenger GPT-5.5-Judge, criterion-Modus (Ausnahme markiert)
Score-Übersicht als Tabelle
| Gruppe | Konfiguration | Score % | Judge-Läufe |
|---|---|---|---|
| 100 Aufgaben | GPT-5.5 direkt, Judge gpt-4.1-mini | 61,77 | 3 |
| 100 Aufgaben | GPT-5.5 direkt, strenger Judge | 49,37 | 3 |
| 100 Aufgaben | DS4-256k unrepariert | 43,05 | 1 |
| 100 Aufgaben | DS4-256k + Empty-Retry | 48,18 | 1 |
| 100 Aufgaben | Fusion DS4/Gemma/Qwen repariert | 48,29 | 3 |
| 20er-Subset | Juni-Stand, dieselben 20 Aufgaben | 42,64 | 1 |
| 20er-Subset | Neuer Stack, 87-GB-Modell (3.7.) | 49,44 | 3 |
| 20er-Subset | Steering aus (ffn=0, 4.7.) | 47,98 | 3 |
| 20er-Subset | 91-GB-Quant, Cap 2100 s (8.7.) | 48,70 | 3 |
| 20er-Subset | 91-GB-Quant, Cap 2500 s (9.7.) | 52,36 | 3 |
Gruppen nicht mischen: 100-Aufgaben-Läufe und Subset-Läufe messen verschiedene Aufgabenmengen. Alle Werte strenger GPT-5.5-Judge außer Zeile 1 (gpt-4.1-mini).
Die beiden GPT-5.5-Balken zeigen das eigentliche Problem: dieselben Antworten, 12,4 pp Unterschied, nur weil der Judge wechselt. Mit dem gleichen strengen Judge lag DS4-256k nach dem Empty-Retry noch 1,19 pp hinter GPT-5.5 direkt und gewann 52 von 100 Aufgaben im direkten Vergleich. Der Vergleich ist wegen eines Judge-Laufs bei DS4 gegen drei bei GPT-5.5 nicht perfekt, aber er war gut genug für die nächste Entscheidung: Der größte sichtbare Verlust lag nicht im Modellwissen. Er lag in 12 leeren Antworten, Tool-Schleifen und Kontextüberläufen.
Am 2. Juli habe ich den Lauf auseinandergenommen
Ich habe Server, Adapter, Ergebnisse, Fusion und Harness parallel von acht Agenten untersuchen lassen: fünf lasen Code und Laufartefakte, zwei prüften die Dokumentation und einer führte die Befunde zusammen. Daraus kam diese Fehlerliste, sortiert nach den wahrscheinlich verlorenen Punkten:
| Befund | Beleg | Kosten |
|---|---|---|
Unbegrenztes get_search_content | ein Aufruf lieferte 15,7 MB in den Kontext; 48/100 Aufgaben hatten ein Tool-Ergebnis >31k Zeichen | Aufgaben im >180k-Kontext-Bereich: im Schnitt 10,2 % |
| Tool-/Fetch-Schleifen bis zum Timeout | Aufgabe 71e3456f: 875 doppelte Fetches derselben URL, 2× 7.200 s, beide Male 0 Byte | 12/100 leere Antworten à 0 % |
| Zeit korreliert negativ mit Score | corr(Dauer, Score) = −0,53; jede Aufgabe >3.600 s blieb unter 27 % | 6 Timeouts verbrannten 12 h für 0 Punkte |
| KV-Cache-Thrashing | 3.102 Verdrängungen vs. 76 Treffer (8-GB-Budget; ein 61k-Checkpoint ≈ 830 MB) | Treffer ~50 ms statt 236 s Re-Prefill |
| Trimmer zerstört den KV-Prefix | gleitendes Trimm-Fenster schrieb alte Nachrichten jede Runde neu | 57-75k-Token-Re-Prefills, ~4 min je Runde |
| Think Max unerreichbar | Server bildet low..xhigh auf dieselbe Stufe ab; nur „max“ + --ctx ≥ 393216 schaltet die Top-Stufe frei | alle bisherigen DS4-Zahlen liefen eine Denkstufe unter Maximum |
| Falsche Antwort-Extraktion | Modell endete mit 486-Zeichen-Statusnotiz, der echte 24k-Bericht lag eine Nachricht davor | diese Antwort: 7,5 % beim Judge |
| Zitierformat | 8 nicht-leere Antworten zitierten nackte Domains statt URLs | diese Aufgaben: im Schnitt 10,6 % |
Ein zweiter Befund kam direkt von der Hardware. Beim Decode liest dieses Quant ungefähr 10,4 GB pro Token, davon rund 83 % aus den Q8-Nicht-Experten-Gewichten. Bei etwa 546 GB/s Speicherbandbreite liegt die theoretische Obergrenze um 52 t/s; frisch gemessen waren 37 t/s. Kleinere Experten-Quants ändern daran kaum etwas. Spekulatives Decoding blieb damit als ein plausibler Weg übrig, mehr als diese 37 t/s zu erreichen.
Ich habe am selben Tag zuerst die Stellen repariert, die Antworten direkt zerstörten: Tool-Ausgaben wurden bei 30k Zeichen gedeckelt und bekamen Paging, das KV-Budget stieg von 8 auf 64 GB und Think Max wurde überhaupt erst erreichbar. Der Trimmer arbeitet seitdem klebrig: Einmal gekürzte Nachrichten bleiben byte-identisch, damit der KV-Prefix erhalten bleibt.
Im Runner kamen Salvage, ein Cap von 2.100 s und ein eigenes Timeout für Fusion-Kinder dazu. Der Systemprompt verlangt klare Struktur, rohe https-URLs, Primärquellen, ein begrenztes Tool-Budget und eine echte Finalisierung. Außerdem blockiert der Harness die Rubrik-Domains. Und dann musste ich noch den Juni-Overflow-Patch wiederherstellen, den das Pi-Update von 0.79.4 auf 0.80.2 still gelöscht hatte. Alle Änderungen stehen mit Datum im Repo.
Steering: Meine Hypothese ließ sich nicht bestätigen
Aus der Rubrik-Analyse hatte ich abgeleitet, dass die „Hedging“-Richtung des Steering-Vektors auf der Faktenachse 2 bis 8 pp kosten könnte. Also habe ich genau diese eine Variable getestet: uncertainty_ablit_imatrix mit ffn = −0,75, dem Default, gegen ffn = 0.
Beide Arme bekamen dieselben 20 Aufgaben, denselben Stack und denselben strengen Judge mit drei Läufen. Zwischen den Armen wurde der Server neu gestartet. Vorher hatte ich festgelegt, dass |Δ| < 2 pp als kein Effekt zählt.
Mit Steering erreichte DS4 49,44 %, ohne Steering 47,98 %. Das sind gepaart +1,46 pp bei einer Streuung von 18,41 und 12 von 20 Siegen. Für die vorhergesagten Hedging-Kosten gab es in diesem Test keinen messbaren Beleg.
Steering-A/B · 20 Aufgaben, sortiert nach Differenz (an − aus)
Steering-A/B als Tabelle
| Aufgabe | Domäne | Steering aus (0) % | Steering an (−0,75) % | Δ pp |
|---|---|---|---|---|
| 2aac5ef3 | Finance | 0,0 | 39,7 | +39,7 |
| b8ff32b6 | Medizin | 41,8 | 76,6 | +34,7 |
| 4b089235 | Shopping | 59,2 | 78,4 | +19,2 |
| 78bfa372 | Shopping | 34,9 | 43,7 | +8,8 |
| 8cf941c5 | Technologie | 40,5 | 47,7 | +7,2 |
| 6b3233e6 | Shopping | 35,1 | 41,0 | +5,9 |
| 72e81ce6 | Finance | 48,5 | 53,9 | +5,4 |
| 49d841f1 | General Knowledge | 54,6 | 59,8 | +5,2 |
| 3b5505fb | Law | 72,4 | 76,7 | +4,3 |
| 1070e6eb | Needle i. Haystack | 76,4 | 80,7 | +4,3 |
| 34e9b780 | Shopping | 47,7 | 51,3 | +3,5 |
| e3734e91 | Academic | 79,1 | 81,0 | +1,8 |
| ebac60ea | Technologie | 23,5 | 22,4 | −1,2 |
| cd680e2e | UX Design | 70,3 | 68,7 | −1,6 |
| 79224558 | Technologie | 19,9 | 17,3 | −2,6 |
| 7e9fa201 | General Knowledge | 35,9 | 24,4 | −11,5 |
| ab17484f | Law | 68,9 | 54,9 | −14,0 |
| 342b15b8 | Finance | 51,3 | 35,7 | −15,6 |
| 71e3456f | Finance | 53,1 | 34,8 | −18,3 |
| 10e75d21 | Finance | 46,3 | 0,0 | −46,3 |
Sortiert nach Differenz (an − aus), größte zuerst. Judge: strenger GPT-5.5, criterion, 3 Läufe je Arm.
Die Laufzeit erklärt den kleinen Unterschied nicht: Beide Arme verhalten sich mit 10,0 gegen 10,5 Stunden Wall-Zeit und 11 gegen 14 Aufgaben am Cap ähnlich. Die großen Ausreißer sind dagegen klar: je ein Salvage-Totalausfall pro Arm. Ohne diese beiden Aufgaben bleiben +1,99 pp, also weiterhin Rauschen.
Ich lasse den Vektor an. Einen messbaren Netto-Schaden sehe ich nicht, und laut Adapter-Dokumentation schützt er die Tool-Grammatik. Wichtiger war etwas anderes: Ein einzelner Salvage-Fehlschlag kostet auf der betroffenen Aufgabe ungefähr 45 pp. Das war der nächste Hebel.
Das 91-GB-Quant brauchte ein anderes Zeitlimit
Am 3.7. veröffentlichte der pi-ds4-Upstream ein neues Standard-GGUF für Macs mit 128 GB RAM. Es nutzt dieselbe abliterierte Modelllinie, quantisiert aber die Routed Experts der Layer 37 bis 42 mit Q4_K statt mit 2 Bit. Damit bekommen sechs späte Expertenschichten mehr Präzision. Das Modell wächst von 87 auf 91 GB und decodiert ungefähr 15 % langsamer. Ich wollte wissen, ob die zusätzliche Präzision diesen Verlust wert ist.
Für den ersten Lauf hielt ich Subset, Stack, Judge und das Cap von 2.100 s konstant. Das ist ein fairer Vergleich der beiden Konfigurationen unter demselben Zeitbudget, aber kein reiner Qualitätstest: Das langsamere Modell kann vor dem gleichen Wall-Time-Limit weniger Tokens erzeugen. Diesen Confound habe ich während des Laufs notiert, bevor die Scores da waren. Meine Entscheidungsregel war ebenfalls vorher klar: Verliert das 91-GB-Quant hauptsächlich auf Aufgaben am Cap, erhöhe ich das Cap, statt das Quant zu verwerfen.
Der Rohwert lag zunächst bei 48,70 % und damit 0,74 pp unter dem 87-GB-Modell. Auf den 17 Aufgaben, in denen beide Arme eine Antwort produzierten, lag das 91-GB-Quant aber 4,41 pp vorn. Auf den fünf Aufgaben ganz ohne Cap-Kontakt waren es 6,94 pp. Zwei Finance-Aufgaben liefen leer ins Cap und danach auch mit der Salvage-Fortsetzung ins Limit. Sie bekamen 0,0 %, wo das 87-GB-Modell 35,7 und 53,9 % erreicht hatte. Gegenüber diesen beiden 87-GB-Scores entstand dadurch ein Defizit von 4,48 pp im Gesamtmittel.
Daraufhin habe ich das Cap von 2.100 auf 2.500 s und das Salvage-Limit von 1.800 auf 2.400 s angehoben. Der Lauf vom 8./9.7. vergleicht deshalb zwei vollständige Betriebskonfigurationen, nicht nur zwei Quants:
Konfigurationsvergleich · 20 Aufgaben, sortiert nach Differenz (91 GB − 87 GB)
Konfigurationsvergleich als Tabelle
| Aufgabe | Domäne | 87 GB, Cap 2100 % | 91 GB, Cap 2500 % | Δ pp | 91 GB, Cap 2100, Score % |
|---|---|---|---|---|---|
| 2aac5ef3 | Finance | 39,7 | 71,5 | +31,9 | 71,9 |
| 7e9fa201 | General Knowledge | 24,4 | 52,2 | +27,7 | 51,9 |
| ab17484f | Law | 54,9 | 81,7 | +26,8 | 85,1 |
| 79224558 | Technologie | 17,3 | 34,3 | +17,0 | 30,2 |
| 6b3233e6 | Shopping | 41,0 | 52,2 | +11,2 | 69,9 |
| 71e3456f | Finance | 34,8 | 44,4 | +9,6 | 32,9 |
| 342b15b8 | Finance | 35,7 | 45,2 | +9,5 | 0,0 |
| cd680e2e | UX Design | 68,7 | 77,1 | +8,4 | 76,8 |
| 49d841f1 | General Knowledge | 59,8 | 66,5 | +6,7 | 58,8 |
| 34e9b780 | Shopping | 51,3 | 57,8 | +6,5 | 48,3 |
| e3734e91 | Academic | 81,0 | 84,1 | +3,2 | 84,4 |
| ebac60ea | Technologie | 22,4 | 24,3 | +1,9 | 20,0 |
| 1070e6eb | Needle i. Haystack | 80,7 | 80,9 | +0,2 | 71,3 |
| 10e75d21 | Finance | 0,0 | 0,0 | +0,0 | 0,0 |
| 72e81ce6 | Finance | 53,9 | 52,5 | −1,5 | 0,0 |
| 8cf941c5 | Technologie | 47,7 | 43,3 | −4,4 | 52,2 |
| 3b5505fb | Law | 76,7 | 72,1 | −4,6 | 80,7 |
| 78bfa372 | Shopping | 43,7 | 33,7 | −10,0 | 36,9 |
| 4b089235 | Shopping | 78,4 | 48,4 | −30,0 | 52,5 |
| b8ff32b6 | Medizin | 76,6 | 25,1 | −51,5 | 50,3 |
Sortiert nach Differenz. Die letzte Spalte zeigt den konfundierten Zwischenlauf vom 8.7. mit demselben 91-GB-Quant und dem alten Zeitlimit.
Diese kombinierte Konfiguration erreichte 52,36 gegen 49,44 %, also +2,92 pp, und lag bei 13 von 20 Aufgaben vorn. Die beiden zusätzlichen Nullen aus dem ersten 91-GB-Lauf verschwanden mit den höheren Limits: 342b15b8 stieg von 0,0 auf 45,2 % und 72e81ce6 von 0,0 auf 52,5 %. Damit waren diese Nullen klar Cap-/Salvage-Artefakte des ersten Laufs. Wie das 91-GB-Modell mit ausreichend Zeit abgeschnitten hätte, lässt sich im Nachhinein aber nicht beobachten. Deshalb kann ich den Anteil des Quants am Endgewinn nicht isolieren.
Mit n = 20 und einer Streuung von 18,9 ist das außerdem kein Beweis auf Aufgabenebene. Neben großen Gewinnen in Finance, General Knowledge und Law gibt es drei Aufgaben, die über beide 91-GB-Läufe hinweg fallen: b8ff32b6 in Medizin von 76,6 über 50,3 auf 25,1 %, 4b089235 in Shopping von 78,4 über 52,5 auf 48,4 % und 78bfa372 ebenfalls in Shopping von 43,7 über 36,9 auf 33,7 %. 10e75d21 blieb in allen drei Läufen bei 0,0. Trotzdem ist die Entscheidung für den Betrieb klar genug: Seit dem 9.7. läuft das 91-GB-Modell mit Cap 2.500 als Standardkonfiguration.
Wie stark das Cap in diese Läufe eingreift, zeigt die Salvage-Übersicht:
| Arm | Am Cap | Salvage versucht | gerettet | Resume/Extraktion | leer geblieben | Wall-Zeit |
|---|---|---|---|---|---|---|
| 87 GB, Cap 2100 (Steering an) | 11/20 | 9 | 8 | 6/2 | 1 | 10,0 h |
| 87 GB, Cap 2100 (Steering aus) | 14/20 | 11 | 10 | 10/0 | 1 | 10,5 h |
| 91 GB, Cap 2100 | 15/20 | 15 | 12 | 12/0 | 3 | 11,0 h |
| 91 GB, Cap 2500 | 11/20 | 13 | 12 | 9/3 | 1 | 12,1 h |
Beim Speed-Benchmark driftete die Maschine
Am 6.7. habe ich zuerst die drei Metal-Modi auf dem alten Server-Pin vermessen. Für den MPP-Fastpath waren auf anderer Hardware 6 bis 19 % mehr Prefill dokumentiert. In meinen drei noch nicht verschränkten Vormittagsläufen war er an jeder der acht Kontexttiefen langsamer. Wegen der später erkannten Messdrift ist das kein sauber isolierter A/B-Beweis.
Prefill-Durchsatz · drei Metal-Modi, alter Pin, Vormittag 6.7. (t/s)
Metal-Modi als Tabelle
| ctx | Standard | Quality-Modus | MPP-Fastpath |
|---|---|---|---|
| 512 | 253,5 | 197,6 | 195,3 |
| 1.024 | 301,3 | 253,7 | 164,5 |
| 2.048 | 355,0 | 290,6 | 218,7 |
| 4.096 | 390,1 | 306,7 | 235,4 |
| 8.192 | 417,9 | 323,7 | 238,3 |
| 16.384 | 366,6 | 247,6 | 230,8 |
| 32.768 | 226,6 | 174,3 | 214,8 |
| 65.536 | 199,1 | 161,0 | 187,0 |
ds4-bench, Prompt promessi_sposi.txt, gen-tokens 128, Pin 97319db8. Alle drei Sweeps am Vormittag des 6.7. hintereinander.
Für den Betrieb habe ich den Modus nach diesem Ergebnis verworfen. Messen schlägt Dokumentation, aber ein sauberer kausaler Nachweis bräuchte hier einen verschränkten Re-Test. Beim anschließenden Server-Update hätte ich die nächste Messung dann fast falsch gelesen.
Drift über den Messtag · gleicher Code, im Mittel −27,9 % Prefill
Messdrift als Tabelle
| ctx | Alt, vormittags | Alt, abends | Neu, Lauf 1 | Neu, Lauf 2 |
|---|---|---|---|---|
| 512 | 253,5 | 143,2 | 154,8 | 132,9 |
| 1.024 | 301,3 | 155,0 | 169,1 | 153,1 |
| 2.048 | 355,0 | 225,2 | 239,3 | 228,2 |
| 4.096 | 390,1 | 252,6 | 282,8 | 246,7 |
| 8.192 | 417,9 | 267,1 | 309,8 | 266,6 |
| 16.384 | 366,6 | 256,1 | 289,8 | 258,2 |
| 32.768 | 226,6 | 236,0 | 255,6 | 238,0 |
| 65.536 | 199,1 | 204,5 | 212,2 | 208,5 |
ds4-bench, identische Parameter in allen vier Läufen. Vormittagslauf 12:36, Abendläufe 17:05-17:19. Alt = Server-Pin 97319db8, Neu = c1f4aa22.
Der erste Vergleich nach dem Pin-Bump auf c1f4aa22 sah bei kurzen Kontexten wie eine Regression von 30 bis 48 % aus. Der Kontrolllauf mit dem alten Code am selben Abend zeigte aber dieselbe Drift: Im Mittel lag er 27,9 % unter seinem eigenen Vormittagslauf. Ich habe keine Temperatur- oder Leistungswerte aufgezeichnet, kann die Ursache also nicht als Thermik beweisen. Gemessen ist nur ein starker Reihenfolge- beziehungsweise Warmzustandseffekt nach mehreren langen GPU-Sweeps.
Verschränkt am selben Abend war der neue Pin im ersten Prefill-Lauf 9,6 % schneller als der alte, in der Wiederholung 0,7 % langsamer. Beim Decode waren es +13,7 und +0,7 %. Das widerlegt die scheinbare 30-bis-48-%-Regression, belegt aber keinen stabilen Speed-Gewinn. Seitdem verschränke ich Bench-Arme und vergleiche sie nicht mehr über mehrere Stunden hinweg.
Das alte KV-Default-Budget von 8 GB stammte aus einer Zeit vor Kontextfenstern mit 400k Tokens. Mein Befund von 3.102 Verdrängungen bei 76 Treffern ging als Issue an den Upstream. Am 7.7. wurde die Änderung „Raise KV disk cache default by RAM tier“ übernommen.
DSpark: Der Basis-Draft brachte keinen Speedup
Nach dem Bandbreitenbefund war spekulatives Decoding der plausibelste verbleibende Kandidat für mehr Decode-Speed. Im besten Fall hätte es auch die ungefähr 15 % Decode-Verlust des 91-GB-Quants zurückgeholt.
Nach dem Pin-Bump war die DSpark-Laufzeit im Server vorhanden und das verlustfreie B2-Rejection-Sampling lag im Engine-Code. Ich habe außerdem das Draft-GGUF aus dem Hugging-Face-Repo gebaut. Praktisch dabei: Alle 4.705 Draft-Tensoren lagen in den letzten 4 von 48 Shards. Damit musste ich ungefähr 16 GB statt 167 GB laden. Vor dem vollständigen Server-Patch blieb nur ein Ein-Zeilen-Gate.
Bevor ich dieses Gate patche und den Pin einfriere, habe ich die billigere Greedy-Probe gemacht: isolierter Server auf Port 8077, eigener Scratch-KV, Temperatur 0 und je ein Lauf mit demselben 500-Token-Prompt.
--mtp-draft 4): null Beschleunigung, −3,3 %.Der Draft lud korrekt (kind=dspark, runtime_mtp=yes), trotzdem fiel der Decode von 37,62 auf 36,37 t/s. Die Probe enthält keinen eigenen Acceptance-Zähler. Der fehlende Speedup und das beobachtete Fortschreiten um jeweils nur ein Token passen aber zu der naheliegenden Erklärung, dass fast keine Draft-Tokens akzeptiert wurden.
Die naheliegende Erklärung liegt in den Gewichten: Der Draft wurde aus der Basis-Variante von DeepSeek-V4-Flash konvertiert, während der Server das abliterierte Quant ausführt. Abliteration verschiebt genau die Ausgabeverteilung, die ein Draft vorhersagen muss. Die vorhandenen Artefakte liefern deshalb keine brauchbare Kombination. Ein passender Draft wäre ein eigenes Trainingsprojekt.
Damit war der Test für mich beendet, für weniger als einen Dollar Strom und bevor ich den Server gepatcht und den Pin eingefroren hätte. Die Skripte bleiben liegen, falls irgendwann ein Draft für die abliterierten Gewichte existiert.
Was mir die Messung unterwegs kaputtgemacht hat
Fast jeder größere Lauf hat noch eine neue Fehlerklasse gefunden. Das waren die wichtigsten:
- 17.6.: Billiges Task-Batch-Judging überbewertete dieselbe Antwort um rund 24 pp (83,79 gegen 59,35 %). Seitdem ist der criterion-Modus Standard.
- 23.6.: Pi erkannte DS4-Kontextüberläufe nicht als solche; dazu ein libmalloc-SIGTRAP nach Aufgabe 55. Patches mitten im Lauf.
- 26.6.: Node/V8-OOM (
Killed: 9) beendete den Retry-Lauf nach drei Aufgaben – der Orchestrator starb, nicht das Modell. - 28.6.:
--no-extensionsdeaktiviert eingebaute Tools nicht: die Fusion-Reparatur recherchierte munter frisch perbash. Methodisch ungültig; Neustart mit--no-tools. - 2.7.: Pi-Update löschte still den Overflow-Patch. Antwort: Patch-System mit Selbstheilung und Preflight-Guard.
- 2.7.: Die Regel „prüfe dich vor dem Abschluss“ im Systemprompt brachte das Modell dazu, mit einer Statusnotiz zu enden. Der Harness speicherte 486 Zeichen Kommentar statt des 24k-Berichts (Judge: 7,5 %). Zwei Fixes: Promptregel und Extraktions-Fallback.
- 6.7.: pi-ds4 v0.4 setzte den Adapter-Checkout hart zurück – alle fünf lokalen Patches weg. Antwort: Patches leben jetzt als idempotenter Applier im eigenen Repo, nicht im fremden Arbeitsverzeichnis.
- 6.7.: Der gleiche Code lag am Abend im paarweisen Mittel 27,9 % unter seinem Vormittagslauf. Ohne Sensorwerte bleibt die Ursache offen; die Messreihenfolge war damit als Vergleich unbrauchbar.
- 6.-7.7.: Der Download wurde ohne Anmeldung auf 0,6 bis 3 MB/s gedrosselt und brach mehrfach mit EOF ab. Ein Quoting-Fehler machte aus dem Auth-Header eine „URI“ (
Unrecognized URI or unsupported protocol: Bearer\), dazu kamen 67 TLS-Handshake-Fehler. Gelöst wurde es mit dem Token in einer 0600-Conf-Datei und Retry-Schleifen. - 7.7.: Ein fremder Prozess hielt Port 8000. Der Server versuchte 40 Starts in 10 Minuten, mappte jedes Mal 93 GB in Metal und scheiterte danach am Bind. Der erste Quant-Arm produzierte nichts Verwertbares. Der Port ist im Adapter hart kodiert.
- 8.7.: Der Cap-Starvation-Confound wurde während des Quant-Laufs notiert, bevor die Scores feststanden.
- 9.7.:
ds4-benchkennt kein--mtp. Speculative Decoding ist ein reines Server-Feature; der geplante Bench-Test war damit nicht möglich. Die Server-Probe lieferte keinen Speedup und stützte die Hypothese, dass Basis-Draft und abliteriertes Modell nicht zusammenpassen.
Vollständige Chronik der drei Wochen
| Datum | Ereignis | Zahl des Tages |
|---|---|---|
| 17.6. | Harness gebaut, Smokes, GPT-5.5-Lauf gestartet | 83,79 → 59,35 % (Judge-Methodik) |
| 18.-19.6. | GPT-5.5 komplett; Judge-Sensitivität etabliert | 61,77 / 49,37 / 47,98 % – gleiche Antworten, drei Judges |
| 20.-22.6. | Fusion-Lauf (49 ok / 51 partial); DS4-Panel-Salvage | 48,21 % auf 52 gültigen; harte Untergrenze 25,07 % |
| 22.-25.6. | Reiner DS4-256k-Lauf inkl. Overflow-Patches, SIGTRAP, Resume | 43,05 % / 41,92 % gewichtet; 12 leere Antworten |
| 26.6. | Empty-Retry in 4 Batches, V8-OOM dazwischen | merged 48,18 % / 46,61 % |
| 28.6. | Fusion-Reparatur (toolless), finaler Fusion-Wert | 48,29 %; Gesamtkosten 348,95 $ |
| 2.7. | 8-Agenten-Studie; 9 von 11 Sofortmaßnahmen + Salvage + Sticky-Trim implementiert; Subset eingefroren; Steering-A/B gestartet | 15,7 MB; 3.102 : 76; Cap 2.100 s |
| 3.-4.7. | Steering-A/B beide Arme gemessen | +1,46 pp = Rauschen; beobachteter Stack-Abstand zum Juni-Subset +6,80 pp |
| 6.7. | Bench-Tag: MPP-Fastpath verworfen, v0.4-Patch-Wipe, Pin-Bump, Messdrift; Downloads gestartet | MPP −29,7 % im paarweisen Mittel; kein stabiler Pin-Gewinn |
| 7.7. | Downloads fertig; Port-8000-Kollision zerstört Arm 1; Quant-Arm läuft; DSpark-Draft gebaut | 16 GB statt 167 GB; 40 Fehlstarts |
| 8.7. | 91-GB-Quant roh 48,70 %; Confound erkannt, Caps angehoben, neuer Lauf gestartet | +4,41 pp auf 17 vergleichbaren Aufgaben |
| 9.7. | Kombinierte 91-GB-/Cap-2500-Konfiguration bei 52,36 %; DSpark-Probe ohne Speedup | +2,92 pp; 37,62 gegen 36,37 t/s |
Kosten der Juli-Validierung
| Validierungslauf (je 20 Aufgaben) | Score | Generierung | Judge-Kosten |
|---|---|---|---|
| Steering an (3.7.) | 49,44 % | 10,0 h | 76,49 $ |
| Steering aus (4.7.) | 47,98 % | 10,5 h | 63,88 $ |
| 91 GB Cap 2100 (8.7.) | 48,70 % | 11,0 h | 67,09 $ |
| 91 GB Cap 2500 (9.7.) | 52,36 % | 12,1 h | 65,22 $ |
| Summe Juli-Validierung | 272,68 $ |
Die Juni-Läufe waren deutlich teurer: Allein das Judging der Fusion-Reparatur kostete 255,42 $, die GPT-5.5-Generierung 612,60 $. Mit dem eingefrorenen 20-Aufgaben-Subset konnte ich im Juli vier kontrollierte Arme für zusammen 272,68 $ Judge-Kosten ausführen.
Was diese Zahlen nicht zeigen
- 52,36 % ist kein offizieller DRACO-Wert und kein OpenRouter-Vergleich. Judge, Tooling und teilweise auch die Modellvariante unterscheiden sich.
- Das Subset ist absichtlich hart; 52,36 % dort entspricht nicht 52,36 % auf allen 100 Aufgaben. Ein voller 100er-Lauf mit der Standardkonfiguration steht aus.
- Bei n = 20 und Streuungen um 18 bis 20 sind einzelne Aufgaben sehr laut. Auch die gepaarten Mittel sind Richtungswerte, kein statistischer Beweis.
- Der Vergleich von Juni zu Juli kreuzt Pi-Versionen (0.79.4 → 0.80.2), die Zahl der Judge-Läufe und mehrere Harness-Änderungen. Am saubersten isoliert ist das Steering-A/B. Die Quant-Läufe bleiben durch das effektive Tokenbudget beziehungsweise den Cap-Wechsel konfundiert.
- Gerettete Antworten haben oft schwächere Zitate. Salvage verhindert 0 %, maximiert aber nicht den Score.
- Eine Medizin-Regression (76,6 → 25,1, monoton) ist unerklärt und für einen Re-Judge vorgemerkt.
Die Konfiguration, die jetzt läuft
Seit dem 9.7. läuft diese Standardkonfiguration: 91-GB-Quant, 400k Kontextfenster mit offenem Think-Max-Gate, 64 GB KV-Budget, klebriges Trimmen, gedeckelte Tool-Ausgaben, Salvage, Cap 2.500 s und Steering an.
Als Nächstes kommen der volle 100-Aufgaben-Lauf, die hartnäckige 0,0-Aufgabe 10e75d21 und der Re-Judge der Medizin-Regression. Ein abliterierter DSpark-Draft wäre später noch interessant, falls ihn jemand trainiert. Decode bleibt bis dahin bandbreitenlimitiert bei 18 bis 37 t/s. Die Physik verhandelt nicht.
Quellen und Artefakte
- Teil 1: DRACO mit pi und pi-fusion (Juni-Werkstattbericht)
- Abgeleitete Daten dieses Berichts als JSON (Arm-Scores je Aufgabe, Bench-Kurven und weitere ausgewählte Messwerte)
- DRACO: Datensatz · Paper
- ds4/pi-ds4: Server · Pi-Extension
- Projektnotizen (lokal): Studien-, Validierungs- und Speed-Vektoren-Notizen mit Änderungs-Manifest, Fehlerindex, Chronik und den Pfaden zu den Rohdaten.