Gemma 4 26B ohne GPU auf einem 13 Jahre alten Xeon mit 5 Tokens pro Sekunde ausführen
(neomindlabs.com)- Auf einem Server mit dualem Xeon E5-2690 v2 aus dem Jahr 2013 und DDR3 wurde Gemma 4 26B-A4B Q8_0 rein auf der CPU betrieben und erreichte beim Dekodieren etwa 5,2 Tokens/s sowie bei der Prompt-Evaluierung etwa 16 Tokens/s
- Der schnelle Pfad von
ik_llama.cppsetzt AVX2 und FMA3 voraus, doch Ivy-Bridge-CPUs unterstützen nur AVX1; daher waren Compiler-Anpassungen und Rechen-Fallbacks für einen Build ohne AVX2 nötig - Der Graph Builder erzeugte
MOE_FUSED_UP_GATEundFUSED_UP_GATEbedingungslos, während der Dispatcher ohne AVX2 keinen Verarbeitungspfad dafür hatte; dadurch blieben pro Forward Pass etwa 240 Tensoren unberechnet, was zu wirrer mehrsprachiger Ausgabe führte - Claude fand den Fehler durch Logit-Instrumentierung und Codeanalyse und ersetzte die fusionierte Operation durch zwei
ggml_mul_mat_id-Aufrufe undggml_fused_mul_unary; der Nutzer führte die Experimente aus und beurteilte den Maßstab für korrekte Ergebnisse - Alte Enterprise-Server können bei Ausfällen kostenpflichtiger APIs als lokale Alternative oder für langsame Batch-Jobs dienen;
--run-time-repack, das ein AVX2-spezifisches Layout erzeugt, darf jedoch nicht verwendet werden
Laufzeitumgebung auf einem 13 Jahre alten Storage-Server
- Die wiederverwendete HP-StoreVirtual-Hardware nutzt einen dualen Xeon E5-2690 v2 aus dem Jahr 2013 und DDR3-Speicher und hat keine GPU
- Da sie zur Ivy-Bridge-Generation gehört, unterstützt sie nur AVX1 und kein AVX2 und FMA3
- Ursprünglich wurde sie für Festplattenspeicher gebaut; der Kaufpreis lag unter 300 US-Dollar
- Das ausgeführte Modell ist Googles Gemma 4 26B-A4B, ein Open-Weight-Mixture-of-Experts(MoE)-Modell mit 26 Milliarden Parametern
- Beim Q8_0-quantisierten Modell wurden für das Dekodieren etwa 5,2 Tokens/s und für die Prompt-Evaluierung etwa 16 Tokens/s gemessen
Ausgangspunkt: ein Xeon-Beispiel aus dem Jahr 2016
- Der auf Hacker News geteilte Beitrag A 10 year old Xeon is all you need beschreibt, wie Gemma 4 ohne GPU auf einem einzelnen Xeon aus dem Jahr 2016 mit 128 GB DDR3 ausgeführt wurde
- Diese Konfiguration nutzt ik_llama.cpp und rund 25 fein abgestimmte Laufzeit-Flags
- Spekulatives Dekodieren
- CPU-bewusstes MoE-Routing
- Flash Attention für CPUs
- Laufzeit-Repacking der Gewichte
- Derselbe Ansatz wurde auf den Ivy-Bridge-Server übertragen, brach aber bereits beim Start ab
- Anders als der Broadwell-Prozessor aus dem Jahr 2016 verfügt der E5-2690 v2 nicht über AVX2 und FMA3
- Diese Befehlssätze gibt es seit Haswell im Jahr 2014, also Intels v3-Generation, und die schnellen Kernel waren darauf ausgelegt
Diagnose und Patch mit Claude
- Nachdem Claude die Startfehlerinformationen erhalten hatte, identifizierte es den Unterschied im CPU-Befehlssatz als Ursache
- Aufbauend auf einem zuvor mit einem kostenlosen Modell versuchten, unvollständigen Ansatz passte es performancekritische C++-Pfade so an, dass sie auf CPUs vor AVX2 korrekt auf Fallbacks zurückfallen
- Die Arbeit war nicht mit einer einzelnen
fix it-Anfrage erledigt- Es las performanceorientierten C++-Code, der von anderen Entwicklern geschrieben wurde
- Es analysierte, warum Kernel auf einer bestimmten Mikroarchitektur nicht gültig waren
- Es umging nicht unterstützte Pfade, ohne bestehende Optimierungen des Forks aufzugeben
- Statt C++-Kernel-Fallbacks selbst zu schreiben, führte der Nutzer Experimente aus, las die Ausgaben, legte die nächsten Fragen fest und beurteilte den Maßstab für korrekte Ergebnisse
- Diagnose und Patch wurden von einer Claude-Instanz durchgeführt, die auf diesem Server lief
Defekter Rechenpfad im Build ohne AVX2
- Das für die Gemma-4-MoE-Inferenz verwendete
ik_llama.cppist ein Fork vonllama.cppund geht standardmäßig von AVX2 als Mindestvoraussetzung aus - Wenn
GGML_USE_IQK_MULMATbeim Build deaktiviert wird, werden die meisten schnellen Pfade ausgeschlossen und es wird auf allgemeine Skalar-/SSE-Operationen zurückgegriffen- Für übliche Q8_0-Matrixmultiplikationen funktionierte dieser Fallback
- Für zwei Graph-Operationen griff der Fallback jedoch nicht
- Das MoE-Feedforward-Netzwerk von Gemma 4 erzeugt folgende Operationen
MOE_FUSED_UP_GATE: eine Operation, die Gate-/Up-Matrixmultiplikationen pro Experte mit SwiGLU kombiniertFUSED_UP_GATE: die dichte Operationsvariante für Nicht-MoE-Schichten
- Die beiden Operationen im Compute Dispatcher waren durch
GGML_USE_IQK_MULMATgeschützt, doch der Graph Builder erzeugte die Operationen ohne Bedingung- Im Dispatcher des Builds ohne AVX2 gab es keinen
case, der das entsprechende Enum behandelte - Die Operation fiel in den Default-Zweig, wodurch die Ziel-Tensoren aller Experten-Feedforward-Netzwerke stillschweigend unberechnet blieben
- Im Dispatcher des Builds ohne AVX2 gab es keinen
- Gemma 4 26B nutzt über 30 Schichten hinweg 8 aktive Experten pro Token, sodass pro Forward Pass etwa 240 Tensoren verbraucht wurden, die noch alte Werte aus Speicherpuffern enthielten
Hinweise aus der wirren Ausgabe
- Die fehlerhafte Ausgabe wirkte flüssig, bestand aber aus sinnlosen mehrsprachigen Zeichenfolgen
- Token-IDs verteilten sich gleichmäßig über das gesamte Vokabular von 262.000 Einträgen
- Thai, Koreanisch,
<unused>-Sentinels und englische Fragmente wurden mit ähnlicher Häufigkeit erzeugt
- Bei Temperatur 0 war die Ausgabe deterministisch, die Ergebnisse von Single-Thread- und Multi-Thread-Ausführung waren bytegenau identisch, und es traten keine NaNs auf
- Es zeigte sich ein Muster, bei dem große Konstanten in jeder Schicht den Hidden State verschoben und das finale Softmax abflachte
- Claude instrumentierte die rohen Logits vor dem Sampling und gab die Top-5-Tokens, den Bereich, den Mittelwert und die Anzahl der NaNs aus
- Der mittlere Logit des ersten vorhergesagten Tokens lag nicht nahe 0, sondern bei +16
- Rund 80 % des gesamten Vokabulars hatten positive Logits
- Da die Verzerrung im Gegensatz zu zufälliger Beschädigung konstant war, wurde der Verdacht darauf eingegrenzt, dass ein großer Teil des Hidden State nicht initialisierten Speicher mit kleinen positiven Floating-Point-Werten verwendete
Korrektur in drei Schritten
- Der Patch besteht aus drei Commits auf dem
maindes Forks -
Compile-Fix ohne AVX2
- Die skalaren
#else-Zweige inquantize_row_q8_0_x4undquantize_row_q8_1_x4_Tiniqk_quantize.cppverwiesen tatsächlich auf AVX2-Helper wiehsum_i32_8 - Diese Zweige wurden als portable skalare Schleifen neu geschrieben
- Einige IQK-Aufrufe, die nach
ggml.cundggml-quants.cdurchgerutscht waren, erhielten Schutzbedingungen mit#if GGML_USE_IQK_MULMAT - Fehlende Includes wurden ergänzt, damit
iqk_cpu_ops.cppunabhängig kompiliert - Ohne diese Korrektur lässt sich der Fork selbst auf Hardware ohne AVX2 nicht bauen
- Die skalaren
-
Laufzeit-Graph-Fallback
- Statt den Dispatcher zu korrigieren, wurde der Graph Builder so geändert, dass er in diesem Build Operationen erzeugt, für die bereits Rechenpfade existieren
- In
ggml_moe_up_gatewerden die kombiniertenup_gate_exps-Gewichte verarbeitet, wennGGML_USE_IQK_MULMATdeaktiviert ist - Die Tensorform ist
[n_embd, 2*n_ff, n_experts]; die vordere Hälfte ist gate, die hintere up - Sie wird in zwei
ggml_view_3d-Slices aufgeteilt - Auf jedem Slice wird
ggml_mul_mat_idausgeführt - Die beiden Ergebnisse werden mit
ggml_fused_mul_unary(gate, up, SILU)kombiniert - Wenn Gate- und Up-Gewichte bereits getrennt sind, werden ohne Slicing zwei
ggml_mul_mat_id-Aufrufe sowie die fusionierte Multiplikation und unäre Operation verwendet - Derselbe Fallback wurde auch auf
ggml_fused_up_gateangewendet, das in Nicht-MoE-Schichten genutzt wird mul_mat_idnutzt die Standard-ggml-Implementierung, undfused_mul_unaryverarbeitet SILU und Multiplikation in einem Schritt; für alle Bestandteile existiert daher bereits eine Nicht-IQK-Implementierung- Die gesamte Änderung liegt hinter
#if !GGML_USE_IQK_MULMAT, sodass AVX2-Builds bitgenau dieselben Ergebnisse wie zuvor liefern
-
Aufräumen der CI-Stubs
- Die
#else-Stubs in den IQK-Quellen unterschieden sich voniqk_mul_mat.h, sodass auchci/run.shauf Hardware ohne AVX2 nicht baute - Ein
<cstdint>-Include fehlte - Einige Stubs hatten andere Signaturen, etwa unnötige führende Parameter oder fehlende
sinks-Parameter - Für einige Funktionen gab es gar keinen Stub, was beim Linken zu undefinierten Referenzen führte
- Durch Abgleich der Stubs mit dem Header kann die Testsuite nun auch in Umgebungen ohne AVX2 ausgeführt werden
- Die
Performance-Kosten des Fallbacks und Repacking-Fehler
- Der Fallback verursacht zusätzliche Kosten, weil er statt eines einzelnen fusionierten Kernels zwei
mul_mat_id-Aufrufe ausführt - Diese CPU ist bereits durch die Speicherbandbreite begrenzt, und der ursprüngliche fusionierte Kernel war ohnehin AVX2-spezifisch; in dieser Umgebung gab es also keinen bestehenden Ausführungspfad, auf den verzichtet wurde
- Die finale Performance liegt bei etwa 5,2 Tokens/s beim Dekodieren und etwa 16 Tokens/s bei der Prompt-Evaluierung für das 26B-A4B-MoE
--run-time-repackordnet die quantisierten Gewichte beim Start in das AVX2-spezifische interleaved FormatQ8_0_R8um- In einer AVX1-Umgebung ist das ein separater Bug, der die Ausgabe erneut beschädigt
- Der aktuelle Patch behebt dies nicht; das Flag wurde aus dem Ausführungsskript entfernt
Wie die Ursache eingegrenzt wurde
- Der Befehlssatz-Mismatch war leicht zu bestätigen, doch das Problem, dass der Dispatcher ohne Fehler in den Default-Zweig fiel, war schwerer zu finden
- Durch Code-Review wurden mehrere Kandidaten ausgeschlossen
- Der RMSNorm-Helper sah korrekt aus
- Auch der AVX1-Fallback von
ggml_vec_dot_q8_0_q8_0wirkte korrekt - Da das Single-Thread-Ergebnis bitgenau identisch war, wurden Threading-Fehler ausgeschlossen
- Dass der Logit-Mittelwert konstant bei +16 lag und Tokens im Long Tail ähnliche Werte hatten, deutete darauf hin, dass große Teile des Residual Stream nicht initialisiert waren
- Nach einer Suche nach
#if GGML_USE_IQK_MULMATim Dispatcher wurden die zwei fehlenden Operationspfade in etwa einer Minute gefunden
Reproduktionsbedingungen und Einsatzbereich
- Die Reproduktionsbedingungen für Geräte vor AVX2 sind wie folgt
- Hardware: Dual Xeon E5-2690 v2, Ivy Bridge, AVX1, DDR3, keine GPU
- Build:
ik_llama.cppaus dem Patch-Branch ohneGGML_USE_IQK_MULMATkompilieren - Modell: Gemma 4 26B-A4B Q8_0
- Ausführung: Übliche
ik_llama.cpp-CPU-Flags verwenden, aber--run-time-repackweglassen
- Die genauen Änderungen sind in ikawrakow/ik_llama.cpp PR #2138 zu sehen
- Zum Zeitpunkt der Erstellung war der PR noch offen und wartete auf Maintainer-Review, daher muss direkt vom Branch ausgeführt werden
- Bugs, die auf derselben Hardware auftreten, können im PR-Thread gemeldet werden
- Ein lokales Modell auf alten Enterprise-Servern vorzuhalten, kann als Alternative dienen, wenn kostenpflichtige APIs ausfallen, oder langsame Batch-Jobs übernehmen, bei denen Abrechnung pro Token nicht passt
- Der Schwerpunkt liegt weniger auf der Nutzung von Abo-Diensten als auf der Fähigkeit, sich selbst in fremden Code und alte Systeme einzuarbeiten; derselbe Ansatz gilt auch für die Wartung einer 15 Jahre alten Rails-Anwendung oder einer Datenbank, deren Verantwortliche nicht mehr da sind
1 Kommentare
Hacker-News-Kommentare
Es wird erwartet, dass man bis Mitte 2027 MoE-Modelle mit über 200 Milliarden Parametern auf gewöhnlicher Consumer-Hardware betreiben kann
Auf einem 16-GB-Mac läuft Qwen3.6-35B-A3B lokal mit 7–9 Token pro Sekunde: https://github.com/deepanwadhwa/samosa-chat
Das entspräche also einem lokal laufenden Modell auf GPT-4-Niveau auf einem MacBook Air mit 16 GB RAM in dieser Geschwindigkeit
Das liegt schon in einem ähnlichen Bereich wie die Zahl aktiver Parameter der meisten Modelle mit über 200 Milliarden Parametern, daher könnte Prism so ein Modell vermutlich veröffentlichen, wenn man es wollte. Allerdings benötigen rekursive neuronale Netze wie HRM nicht so viele Parameter, weshalb diskutierbar ist, ob diese Größenordnung überhaupt wirklich nötig ist: https://huggingface.co/sapientinc/HRM-Text-1B
Wenn man etwa pro Schicht nur einen 256-Bit-Seed speichert und diesen in eine Rauschfunktion einspeist, um daraus 16K reale Gewichte zu erzeugen, könnte man die gespeicherte Größe auf weniger als 1 Bit pro Gewicht senken
Ich freue mich darauf, dass diesen und nächsten Monat neue Modelle erscheinen dürften, die alles verändern könnten. Ornith sollte man unbedingt ausprobieren
Manche wollen es nicht hören, aber ich glaube, dass die Token-Kosten von Inferenzanbietern niedriger sind als die Stromkosten für den lokalen Betrieb
Wenn man der Einfachheit halber nur die Ausgabeerzeugung betrachtet, entsprechen 5 Token pro Sekunde 18.000 Token pro Stunde, was beim Anbieter etwa 0,005 Dollar kostet. Nimmt man an, dass der Server während der Inferenz rund 500 W verbraucht, und legt Deutschland mit 0,3 Dollar pro kWh zugrunde, dann kostet dieselbe Menge lokal 0,15 Dollar und ist damit 30-mal teurer
Wenn Datenschutz wichtig ist, ist lokales Ausführen weiterhin sinnvoll, aber man sollte wissen, dass es deutlich ineffizienter ist als bei Inferenzanbietern. Neue GPUs werden die Inferenz noch effizienter machen und diese Lücke weiter vergrößern
Anfangs hatte ich fälschlich mit 180.000 Token gerechnet, tatsächlich sind es aber 18.000 Token; solange Strom nicht fast gratis ist, wird es schwer, konkurrenzfähig zu sein. Die Anbieter nutzen für kleine Modelle wohl immer noch H200/H100, aber wenn sie auf GB300 oder im nächsten Jahr auf Ruby-GPUs umsteigen, dürften die Inferenzkosten auf ein Dreißigstel fallen, sodass der Hauptwert lokaler Modelle wohl im Datenschutz liegen wird
In einer Stunde lassen sich damit 3,6 Millionen Eingabetoken verarbeiten oder 144.000 Token erzeugen, bei Stromkosten von etwa 0,15 Dollar. Mit Sonnet würde dieselbe Menge 7,2 Dollar für Eingabe und 1,4 Dollar für Ausgabe kosten, also ist die Cloud bei der Generierung 10-mal und bei der Verarbeitung fast 50-mal teurer
Inferenzanbieter tragen enorme Schulden und liefern sich einen Kampf um Marktanteile, deshalb werden die Preise sicher steigen
Wenn man AI so weit demokratisiert, dass die Gemeinschaft sie selbst kontrolliert, könnte das auch das Datacenter-Problem lösen, und selbst das Maß an Zensur und Alignment ließe sich demokratisch in der Gemeinschaft festlegen. Das ist eine ähnliche Vorstellung wie in manchen Texten von Geohotz
Open-Source-Modelle werden bald gut und effizient genug sein, um günstig auf gebrauchter Hardware betrieben zu werden. Wenn es in jeder kleinen Gemeinschaft eine technikaffine Person gibt, die ein paar Hundert Dollar Startkosten einsammelt, könnte das danach nahezu gratis und ohne laufende Stromkosten betrieben werden
https://solar.lowtechmagazine.com/
Ohne die lokale Alternative wären die Preise für Cloud-Modelle deutlich höher
Diese Generation von Dual-Xeons dürfte unter Last mehr als 300 W verbrauchen. Beim durchschnittlichen US-Strompreis sind das 1,35 US-Dollar pro Tag, und wenn man im Sommer den Raum kühlen muss, kommt noch mehr dazu
Selbst wenn man die Prompt-Verarbeitungszeit ignoriert und das System 24 Stunden laufen lässt, sind das nur etwa 400.000 Token pro Tag, also rund 0,30 US-Dollar pro 1 Million ausgegebener Token. Zufälligerweise entspricht das dem aktuellen Preis dieses Modells bei OpenRouter, aber die Generierungsgeschwindigkeit von OpenRouter ist 8-mal höher
Es gibt viele Gründe, mit lokalen LLMs zu experimentieren, etwa damit die Daten das Haus nicht verlassen, aber finanziell lohnt es sich kaum. Als jemand, der deutlich mehr Geld in lokale Inferenz-Hardware zu Hause investiert hat, würde ich sagen: Es macht Spaß, ist aber kein Mittel zum Sparen
Ich habe Ergebnisse dazu zusammengestellt, wie verschiedene Modelle ohne GPU auf Dual-Xeons mit 256 GB DDR4 laufen
https://gist.github.com/hparadiz/f3596d00a62d8ebb2dadcc46ee5822c7
Das ist ziemlich langsam. Ich erreiche selbst mit einer 13 Jahre alten CPU 8 bis 12 Token pro Sekunde, je nach Kontextgröße und anderen Einstellungen
https://news.ycombinator.com/item?id=48354801
Ich bin der Autor des ursprünglichen Beitrags. Mein ursprünglicher Kommentar wurde aus irgendeinem Grund offenbar gemeldet. Die Korrekturen habe ich als PR #2138 im Upstream-Projekt eingereicht: https://github.com/ikawrakow/ik_llama.cpp/pull/2138
Diese StoreVirtual-Hardware scheint keine brauchbaren Ports für die Installation von Software zu haben. Es gibt wohl nur USB-Ports, daher frage ich mich, ob die Installation über eine serielle Konsole erfolgt
Ich betreibe Gemma 4 26B mit derselben Konfiguration auf einem Mac Pro von 2013 und erhalte etwa 5 Token pro Sekunde. Die beiden Grafikkarten bringen hier nichts, aber für manche Aufgaben ist das durchaus praktisch
Er kommt am Freitag an, und ich freue mich darauf, es selbst auszuprobieren
https://echalupa.com/blog/mac-pro-6-1-llama-cpp-firepro-d300-vulkan-ubuntu
https://matthewgribben.com/blog/mac-pro-6-1-llama-cpp-firepro-d700-vulkan-ubuntu
Ich habe mir das Setup im Keller selbst angesehen, und es ist wirklich beeindruckend. Beim nächsten Mal wäre es schön, wenn du auch den 3D-Drucker vorstellen könntest
Als lose verwandtes Video: Jemand betreibt ein LLM auf einem Pentium 4 und hat ihm den Spitznamen NetburstGPT gegeben. Natürlich ist es extrem langsam
https://www.youtube.com/watch?v=ILV-eu90te8