Jde to i jednoduše a spolehlivě. Jsou malé ale velmi dobré modely, a jde je provozovat bez starostí typu CUDA Out of Memory jak píše kolega. I na běžném herním hardwaru.
Typicky se nováčkům doporučuje nainstalovat si Ollama a moc se neptat jak co funguje, ale to úplně nedoporučuji: Ollama je vždy pozadu (je to jen wrapper kolem llama.cpp a dalších, trvá jim měsíc udělat git pull llama.cpp a pak se chlubit cizí prací), má vlastní proprietární storage podobný Dockeru, takže není úplně triviální třeba určit, které soubory patří ke kterému modelu, když je např. chcete odsunout na NAS, a hlavně skrývá před uživatelem všechny páky, kterými z toho jde dostat mnohem vyšší výkon.
"Moje" řešení je sestavit si Llama.cpp s Vulkan backendem, a provozovat to buď přímo, nebo přes swapping proxy. Vulkan oproti CUDA (nvidia) nebo ROCm (AMD) dosahuje nižšího výkonu (o 10-20 % horší), ale je to perfektně stabilní a řeší si to paměť automaticky, takže OOM crash jako kategorie problému prostě neexistuje. Když se rostoucí kontext nevejde do GPU, tak to nehavaruje, jen to zpomalí, protože driver přesouvá buffery mezi VRAM a RAM. Navíc jde měnit backend (Mesa RADV, AMD AMDVLK, ...) a tím třeba nějaký ten extra výkon nahnat, když je potřeba.
Takže jak na to :-)
1) Sestav si llama.cpp s Vulkan backendem.
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# SHARED_LIBS=OFF z toho udělá "semi-static" build: všechny llama.cpp knihovny se linkují staticky, dynamicky se linkují pouze
# systémové knihovny, takže výslednou binárku lze přesouvat, nezávisí na žádném dalším souboru z llama.cpp
cmake -B build -DGGML_VULKAN=1 -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
# uprav počet vláken pokud se na 128 instancí g++ necítíš :-)
cmake --build build --config Release -- -j128
2) Stáhni nějaký model, např. Phi 4 je super. Podle velikosti dostupné VRAM si vyber vhodnou kvantizaci: na
stránce modelu (bartowski je legenda která dělá kvantizace prakticky všeho) je v tabulce srozumitelně popsáno, jak velký je který quant a co za kompromisy nese. Obecně současné modely fungují dobře s nějakými 5-6 bity na parametr, čemuž odpovídají quanty Q4_K_L až Q6_K_L (číslo říká počet bitů, K je typ kvantifikace, S/M/L je small/medium/large a rozlišují se tím mezistupně, kdy se např. kvantifikuje hlavní síť ale embedding síť se nechá ve větším rozlišení).
Případně si můžeš originální *.safetensors model kvantizovat sám, v llama.cpp je na to skript, je to na pár minut pokud se model vejde do RAM (v tomhle GPU nefiguruje).
Mám tady 16GB Radeon 7800XT, tak si volím Q5_K_M s 10.6 GiB velikostí. Kromě statického těla modelu (těch 10.6 G) se do VRAM ještě musí vejít kontext (KV cache), tedy text, na který model vidí. Ten postupně roste, a bývá docela prostorově náročný: každý token textu je (v každé attention head zvlášť) reprezentován dvěma embedding vektory (K pro "otázku", V pro "odpověď"). V případě Phi 4 má embedding vektor 5120 prvků, model má 40 attention heads, a je reprezentován datovým typem F16 (2 bajty). Jeden token má tedy 2 * 5120 * 40 * 2 = 819.2 KiB. V 16GB GPU mi ~11G zabere model, ~2G si chci nechat pro sebe, takže ~3G mám na kontext sotva 3800 tokenů. Pokud mi to nestačí, můžu zvolit menší quant (třeba Q4), snížit rozlišení KV cache, nebo se spokojím se zpomalením, až začne Vulkan swapovat.
cd ..
wget "https://huggingface.co/bartowski/phi-4-GGUF/resolve/main/phi-4-Q5_K_M.gguf?download=true" -O phi-4-Q5_K_M.gguf
3) Spustím jednu z mnoha llama- binárek. Pro první vyzkoušení že mi všechno funguje llama-cli, což je jednoduchý REPL v konzoli. Užitečné parametry jsou:
--ctx-size N omezí velikost kontextu na N tokenů systémem FIFO, tj. nejstarší tokeny začnou odtékat mimo context window
--n-gpu-layers N udává, kolik vrstev neuronové sítě chci přesunout do GPU. Zadáním vysokého čísla řeknu, že chci všechny. Modely mají typicky pár desítek vrstev.
--cache-type-k, --cache-type-v ovlivní datový typ KV cache. Default je f16, pro úsporu VRAM pro kontext můžu zvolit třeba q8_0 nebo q4_1, ale má to velký vliv na kvalitu výstupu i rychlost (pokud se na dané GPU netrefí alignment).
a dále parametry sampleru, které ovlivní chování modelu:
--temp N temperature, zvyšuje náhodnost; blíž k 0 pro technické úkoly, >1 pro prózu nebo ERP :-)
--top-k N omezí počet tokenů, co jdou do sampleru
--top-p N do sampleru půjdou jen tokeny, které mají v součtu tuto pravděpodobnost
--min-p N minimální pravděpodobnost tokenu
V praxi ale krom --n-gpu-layers nic z toho nenastavuju.
./llama.cpp/build/bin/llama-cli --n-gpu-layers 999 --model phi-4-Q5_K_M.gguf
V tuhle chvíli už chatuješ s lokálním LLM a nikdo tě nezastaví.
Další fáze je spustit OpenAI API server, aby jazykový model mohly využívat další aplikace. Jen spustíš jinou binárku:
./llama.cpp/build/bin/llama-server --n-gpu-layers 999 --model phi-4-Q5_K_M.gguf --port 12345
a za pár sekund můžeš prohlížečem na
http://localhost:12345/ do celkem slušného webového chatu, který si pamatuje předchozí konverzace v localStorage. Na tuto URL můžeš nasměrovat i další aplikace, protože tam je endpoint kompatibilní s OpenAI API.
Z aplikací, které používám, jsou to:
-
https://openwebui.com/ - asi nejznámější webové rozhraní pro LLM, integruje pěkně vektorové databáze a agentickou práci, takže umí např. úlohy jako "najdi mi v tomhle PDF jak se konfiguruje baud rate na USART" nebo udělá ozdrojovanou rešerši vyhledáváním na webu
-
https://www.librechat.ai/ - podobné jako Open WebUI, ale umí to pěkně "Artifacts", tj. necháš LLM něco programovat a hned vidíš výsledek v okně... web, webGL, atd.
- smartcat nebo shell_gpt v konzoli, na úlohy typu man ffmpeg | sc sh "convert all videos to h265 and opus, normalize audio in two passes, fix subtitle encoding using iconv"
- automatické klasifikátory v aplikacích typu Hoarder, Linkwarden
- programování v Neovimu s
CodeCompanionem- AI v novém firefoxu, všechny ty kontextové úlohy typu "vysvětli mi toto" nebo "přelož to"
Praktické je před llama-server posadit
llama-swap, což je OpenAI API proxy, která automaticky spustí příslušný llama-server v závislosti na tom, co si klient vybere. Jednak mi potom nesedí v GPU něco, co zrovna nevyužívám, a jednak můžu mít nakonfigurovánu spustu modelů, od malých data minerů (třeba nuextract je super na "tady máš pět let e-mailů, udělej mi z nich CSV s těmito sloupci: ...") přes specialisty na programování (Qwen Coder 2.5) až po větší generalisty (Phi 4, Mistral Small, v EU nelegální Llama 3.3).