# Running a 35B AI Model on 6GB VRAM, FAST (llama.cpp Guide) **URL:** https://youtu.be/8F_5pdcD3HY **Data:** 2026-05-06 **Durata:** 15:05 **Tags:** @work @tech #llama.cpp #AI #local-AI #hardware --- ## TL;DR Cum rulezi Qwen3 35B (model Mixture of Experts) pe un GPU de 8 ani cu 6GB VRAM la 17 token/s și 256K context — prin 5 flag-uri llama.cpp specifice arhitecturii MoE. Defaulturile sunt bottleneck-ul, nu hardware-ul. --- ## Setup de test (worst-case floor) - GPU: GTX 1060, 6GB VRAM, PCIe Gen3 - CPU: i3 8100, 4 core, fără hyperthreading - RAM: 24GB DDR4 - Model: **Qwen3 35B A3B** — MoE, 35B parametri total, dar doar 3B activi per token (8 experți din 256 per layer) --- ## Cele 5 flag-uri (de la 3 tok/s → 17 tok/s) ### Flag 1: `--n-cpu-moe 41` (+230%) - **Problema:** Split naiv (jumătate GPU, jumătate CPU pe layers) = 3 tok/s. Fiecare layer aduce toți experții cu el pe CPU → PCIe se înfundă. - **Soluția MoE:** Experții stau "adormiți" majoritatea timpului. Pune TOATE expert-blocks pe CPU (RAM), restul pe GPU. - **Rezultat:** 3 → 10 tok/s ### Flag 2: `--no-mmap` (+35%) - **Problema:** llama.cpp face "lazy loading" din disk (mmap). Fiecare expert neîncărcat → page fault → pauză. - **Soluția:** Încarcă toți cei 20GB în RAM la start. Niciun read din disk la inferență. - **Rezultat:** 10 → 13.5 tok/s ### Flag 3: `--n-cpu-moe 35` (ajustare fină, +26%) - 2GB VRAM liberi → readuci 6 layere de experți înapoi pe GPU - Trade-off: context scade 100K → 64K (mai puțin room pentru KV cache) - **Rezultat:** 13.5 → 17 tok/s ### Flag 4: Turbo Quant KV cache (`--cache-type-k q4_0 --cache-type-v q3_0`) - **Problema:** KV cache crește liniar cu contextul → mânâncă VRAM - **Soluția:** Google DeepMind Turbo Quant — rotație aleatoare + quantizare agresivă (4bit keys, 3bit values), fără pierdere vizibilă de calitate - Asimetrie justificată: grouped query attention 8:1 → keys suportă compresie mai mare - **Rezultat:** Context 64K → **256K** la același 17 tok/s (5.9/6GB VRAM) ### Flag 5: `--mlock` (stabilitate pe termen lung) - **Problema:** Kernelul paginează experții din RAM pe disk după ore de idle → stutter la token 1000 - **Soluția:** mlock — spui kernelului "nu atinge RAM-ul ăsta". Necesită 3 locuri: LXC/container permisiuni, Docker `--cap-add IPC_LOCK`, flag llama.cpp - **Rezultat:** mlocked: 12KB → 16GB. Sistem stabil după o săptămână. --- ## Ce NU a funcționat: Speculative Decoding - Idee: draft model mic (Qwen3 0.8B) ghicește 8 token-uri → big model verifică în batch - Rezultat: **17 → 11 tok/s** (mai lent) - De ce eșuează pe MoE: 1. **MoE + batching = memory thrash**: 8 tokeni în batch pot activa 64 experți diferiți/layer → nu mai e batch real 2. **SSM layers (state space)**: 30/40 layers sunt SSM — secvențiale prin definiție, nu se pot paraleliza --- ## Rezultat final ``` Model: Qwen3 35B A3B (MoE) VRAM: 5.9 / 6 GB Context: 256,000 tokens Viteză: 17 tok/s Hardware: GTX 1060, 8 ani vechime ``` --- ## Puncte cheie - **MoE ≠ dense**: Experții "dormiți" sunt mai ieftini în RAM decât pe GPU — inversul intuiției normale - **Defaulturile sunt bottleneck-ul, nu hardware-ul** — 5 flag-uri = 5.6x speedup - **No-mmap e contra-intuitiv**: "lazy loading" sună smart, dar pentru inferență e catastrofal - **Turbo Quant (DeepMind)**: 4bit/3bit KV cache fără pierdere vizibilă — folosește rotație aleatoare înainte de quantizare - **mlock e critic pentru producție** — fără el, sistemul degradează silențios după ore - **Speculative decoding nu merge pe MoE+SSM** — arhitectura contează, nu doar parametrii --- ## Quote-uri > "The hardware isn't the bottleneck anymore. The defaults are." > "Dead weight if you're sitting on the GPU, but cheap rent if you're sitting in RAM." > "Twice the context, twice the memory." — KV cache crește liniar > "No code, no retraining, no quantization tricks, just telling the OS: stop being clever about my RAM." --- ## Relevanță pentru Marius - Rulezi modele mari local pe hardware vechi/modest — **fără cloud, fără cost lunar** - Relevant pentru LXC 104 (Ollama) — flag-urile sunt compatibile și cu Ollama (via GGUF + llama.cpp backend) - Qwen3 35B cu 256K context = poate procesa cod-sursă întreg ca context - Flag-urile `--n-cpu-moe` sunt specifice MoE — nu se aplică la all-minilm (dense, mic)