Teams, die Generierung mit Retrieval kombinieren, sollten Indexierungs- und Chat-Last entkoppeln: unsere Matrix zu Chunking, Embedding-Batches und Vektor-Kontingenten beschreibt die RAM-Spitzen, die sonst mit dem KV-Cache kollidieren. Produkt- und Regionskontext liefert die Startseite; für dedizierte Knoten ohne Login-Zwang vor dem Vergleich reicht die Kauf-/Mietseite.
Typische Engpässe
1. Speicherillusion. Die GGUF-Dateigröße auf der Platte ist nicht identisch mit dem Arbeitsgedächtnis zur Laufzeit: KV-Cache, kurzfristige Aktivierungen und parallele Anfragen skalieren zusätzlich.
2. Batch-Knie. Größere Micro-Batches verbessern oft das Prefill-Tempo, bis der Speichercontroller oder die Kompression einsetzt — dann gewinnt ihr Mikrosekunden und verliert Stabilität.
3. Versionsdrift. Unterschiedliche llama.cpp-Commits, Ollama-Releases oder Chat-Templates erzeugen reproduzierbare „Gestern lief es“-Effekte; Manifeste sind Pflicht.
Hardwaregrenzen
Mac mini M4 nutzt Unified Memory: GPU, Neural Engine und CPU teilen sich denselben physischen Pool. Das reduziert Kopien, macht aber Kontext, KV-Cache und Batch zu einem gemeinsamen Budget. Die Last skaliert grob mit aktiven Tokens in der Luft — längere Prompts, breitere Batches und mehr gleichzeitige Chats vergrößern die Arbeitsmenge, die der Speichercontroller „warm“ halten muss.
Marketing-Zahlen zu TFLOPS täuschen häufig über nachhaltiges Decode hinweg: Gewichte und KV-Bytes müssen pro Schritt gestreamt werden. Verdoppelt ihr das Kontextfenster bei gleichem Modell, ändert ihr nicht nur den RAM-Fußabdruck, sondern auch die Residenz der KV-Tensoren und die Auslastung der Metal-Kernel. Steigt der Speicherdruck in der Aktivitätsanzeige, während Tokens noch fließen, seid ihr typischerweise über dem Knie: Quant-Stufe senken, num_ctx kürzen oder Parallelität reduzieren, bevor ihr neue Kernel-Builds jagt.
Thermik im Mini-Gehäuse ist kein Showstopper für Einzelplatz-Inferenz, aber Zehnminuten-Soaks sind aussagekräftiger als ein einminütiger Leaderboard-Lauf. Lüftergeräusch ist ein Signal: Dauerlast mit großen Batches drosselt früher als Kurztests vermuten lassen.
GGUF- und Quantisierungswahl
GGUF bleibt das Austauschformat für llama.cpp-Stapel; Ollama konsumiert kompatible Gewichte intern. Für mehrsprachige oder code-lastige Workloads ist 2026 häufig Q4_K_M oder Q5_K_M der pragmatische Kompromiss zwischen Qualität und Bytes pro Parameter. IQ-Varianten können bei knappem Unified Memory gewinnen, verlangen aber gezielte Evals — JSON, Tabellen und Tool-Aufrufe zeigen Regressionen zuerst.
MoE-Modelle verschieben die Rechnung: aktiv sind weniger Parameter als im Gesamtmanifest, dennoch können Routing-Spitzen Expertenblöcke in den Cache holen. Modellrevision, Quant-Typ und Template gehören unmittelbar neben den Startbefehl ins Runbook.
# llama.cpp (Beispielgerüst; Pfade/Build anpassen)
./llama-cli -m ./models/modell.Q4_K_M.gguf -c 8192 -b 512 -ngl 99Parallelität und Batchgröße
llama.cpp führt Batch und Offload explizit: Kontext via -c / --ctx-size, Batch via -b / --batch-size (ggf. -ub), GPU-Layer mit -ngl. Höhere Batches beschleunigen oft das Prefill, erhöhen aber Spitzenlast; zu kleine Werte unterfüllen den Beschleuniger. Pragmatischer Zyklus: Zielkontext fixieren, Batches {128, 256, 512, 1024} sweepen, größten Wert wählen, der unter einer RSS-Komfortgrenze bleibt — auf 24 GB bleiben typischerweise 8–12 GB Puffer, wenn Desktop-Apps parallel laufen.
Ollama tauscht einen Teil der Flags gegen Betriebssicherheit. Defaults im Modelfile setzen (PARAMETER num_ctx, num_batch, wo unterstützt num_gpu); Parallelität steuert u. a. OLLAMA_NUM_PARALLEL. Jeder Slot multipliziert KV-Residenz — rechne ihn wie einen zusätzlichen Server auf derselben GPU. Für API-Bursts Parallelität deckeln und in Clients queuen, statt den Daemon so zu füttern, dass sofort Speicherkompression greift.
Fünf Schritte zur belastbaren Baseline
- Zielkontext und Parallelitäts-Obergrenze pro Umgebung festlegen und clientseitig hart begrenzen.
- Quant-Manifest wählen, GGUF hashen, Template-Version dokumentieren.
- Batch-Sweep mit gemessener Prefill-Latenz p95; Gewinnerwert im Runbook speichern.
- Zehnminuten-Soak mit erwarteter Parallelität; Peak-RSS, Swap und thermische Tendenz loggen.
- Fallback definieren: bei anhaltendem Speicherdruck automatisch kürzeren Kontext oder kleinere Quant-Stufe wählen.
| Aspekt | llama.cpp (CLI / Server) | Ollama (Daemon / API) | M4-Hinweis |
|---|---|---|---|
| Kontextfenster | -c / --ctx-size; lange Kontexte ggf. splitten |
PARAMETER num_ctx im Modelfile |
KV-Bytes steigen ~linear; Unified-Memory-Druck beobachten, nicht nur GGUF-Größe |
| Prefill / Micro-Batch | -b / --batch-size |
PARAMETER num_batch |
Bis zum Knie erhöhen; danach RSS-Spitzen dominieren |
| GPU-Offload | -ngl Layer auf Metal |
überwiegend automatisch; Hinweise via num_gpu |
Teil-Offload verschiebt Engpässe — End-to-End-Tokens/s messen |
| Parallelität | mehrere Prozesse nur bei RAM-Reserve; eigene Ports | OLLAMA_NUM_PARALLEL; Client-Queues |
Jede Sitzung ≈ zusätzliches KV-Budget im Worst Case |
| Bandbreiten-Proxy | Tokens/s vs. Speicherdruck; Kernel-Build vergleichen | gleiche Signale; stärker vom Release abhängig | Decode stockt bei „leeren“ GPU-Lücken oft durch Bandbreite oder Batchwahl |
Go-Live-Checkliste (lokal)
- Manifest: GGUF-Name, Quant, SHA-256, Template, llama.cpp-Commit bzw. Ollama-Version.
- Speicherumschlag: Kaltstart, erster Request, Soak mit realistischer Parallelität.
- Kontextpolitik: max.
num_ctxpro Stage und harte Prompt-Cap in Clients. - Batch-Dokumentation: Sieger-
-b/num_batchinkl. p95-Prefill notieren. - Beobachtbarkeit: zeitgestempelte Logs unter kontrolliertem Pfad rotieren.
Stabilität: FAQ
Warum bricht der Durchsatz nach wenigen Minuten ein? Oft thermisches Mittel, Hintergrundkompression oder konkurrierende Hintergrundjobs. Parallelität senken, Kontext kürzen, Spotlight- und Indexierungslast temporär begrenzen.
Ollama hat aktualisiert — wer hat die Latenz verschoben? Daemon und Modell-Blobs ändern sich gemeinsam. Versionen und Pfade im Runbook pinnen; bei Compliance interne Mirrors nutzen.
Ist größerer Batch immer besser? Nein. Nach dem Knie steigt der Speicherbedarf im Prefill überproportional. Begrenzte Batches plus Chunking riesiger Systemprompts sind robuster.
Metal kurz deaktivieren? Nur zum Debug numerischer Pfade. CPU-Pfade täuschen über Kapazität — nicht für Lastprognosen verwenden.
Einen Mac mit mehreren Personen teilen? Kontexte nicht willkürlich stapeln; lieber Warteschlangen oder zweiten Knoten — Remote-Miete skaliert oft günstiger als Debug-Zeit.
Kurz: Kontext, Batch, Quantisierung und Parallelität sind gekoppelte Regler auf einem Bandbreiten- und Speicherbudget. Stationäre Messungen statt Spitzen-Screenshots; Manifeste versionieren; Retrieval-Indexer nicht blind parallel zum Chat fahren.