Robert Važan

Lokálne jazykové modely na Linuxe s Ollamou

Konečne som si našiel čas spojazdniť lokálne jazykové modely alias chatboty, takmer rok po tom, čo som vyhlásil, že všeobecná umelá inteligencia je tu. Mám nízkonákladový hardvér a nechcel som sa s tým príliš babrať, tak som sa po chvíli váhania rozhodol pre Ollamu a Open WebUI, ktoré bežia na každom procesore (a teda nepotrebujú grafickú kartu) a dajú sa jednoducho a bezpečne nainštalovať do kontajnera. Ollama má veľkú knižnicu modelov, zatiaľ čo Open WebUI je bohaté na praktické funkcie. Ollama je postavená na intenzívne optimalizovanej knižnici llama.cpp.

Inštalácia

Spojazdnenie je veľmi jednoduché. Nie je potrebná grafická karta. Pre oba projekty je k dispozícii návod na spustenie v dockerových kontajneroch. Pozrite príslušný príspevok na blogu Ollamy, Open WebUI README a podman sekciu v návode na inštaláciu Open WebUI. Tieto návody som trochu upravil, aby namiesto Dockeru používali Podman (mám Fedoru) a aby sa po reštarte systému automaticky spustili:

podman run -d \
    --name ollama \
    --replace \
    --pull=always \
    --restart=always \
    -p 127.0.0.1:11434:11434 \
    -v ollama:/root/.ollama \
    --stop-signal=SIGKILL \
    docker.io/ollama/ollama
podman run -d \
    --name open-webui \
    --replace \
    --pull=always \
    --restart=always \
    -p 127.0.0.1:3000:8080 \
    --network=pasta:-T,11434 \
    -v open-webui:/app/backend/data \
    ghcr.io/open-webui/open-webui:main
systemctl --user enable podman-restart

Teraz môžete otvoriť Open WebUI na adrese http://localhost:3000. Ak chcete aktualizovať svoju inštaláciu, stačí znovu spustiť vyššie uvedené príkazy.

Vytvoril som tiež pár aliasov/skriptov, aby bolo veľmi pohodlné spúšťať Ollamu z príkazového riadku, pretože bez aliasov je kontajnerové CLI rozhranie trochu rozvláčne:

podman exec -it ollama ollama run llama3.2:1b

Prípadne môžete spustiť Ollama CLI v samostatnom kontajneri:

podman run -it --rm \
    --network=pasta:-T,11434 \
    docker.io/ollama/ollama run llama3.2:1b

Načo sú lokálne jazykové modely?

Mal som donedávna predplatné GPT-4, ale sotva sa mi oplatilo. Ušetrílo menej než 10% môjho času a strácal som veľa času tým, že som sa s tým hrajkal. Lokálne jazykové modely sú zadarmo a sú čoraz lepšie. Potom sú tu všetky tie problémy s cloudom. Cloudový jazykový model sa môže kedykoľvek zmeniť, zmiznúť alebo môže zdražieť. Neustále si pýta moju spätnú väzbu a ďalšie dáta, čo slúži len prevádzkovateľovi, zatiaľ čo ja tým strácam kontrolu nad vlastnými dátami. Som dosť háklivý na súkromie a slobodu a hoci na "bezpečnostné" obmedzenia nenarážam často, je to nepríjemné, keď sa tak stane. Aj keď je ChatGPT inteligentný, často je zbytočne kreatívny, keď len chcem, aby sa riadil pokynmi. Lokálne jazykové modely umožňujú väčšiu kontrolu nad výstupom. Aj API ponúka väčšiu kontrolu, ale API sa môže šialene predražiť, ak sa nejaký skript zasekne v slučke.

Výber modelov

Moje momentálne najobľúbenejšie modely sú llama3.1 8B pre všeobecné témy, qwen2.5-coder 7B pre programovanie, a dolphin-llama3 8B ako necenzurovaný model. Ak nemáte dosť pamäte, skúste menšie modely ako llama3.2 3B, llama3.2 1B alebo qwen2.5 0.5B. Necenzurované modely sú slabšie, ale sú užitočné, keď iné modely odmietajú odpovedať.

Predvolená 4-bitová kvantizácia robí modely menšie a rýchlejšie so zanedbateľnou stratou presnosti. 3-bitová kvantizácia citeľne znižuje presnosť, ale stále je to lepšie než sa uchýliť k použitiu menšieho modelu. Modely s viac než 4 bitmi na parameter nemá zmysel používať. Ak máte výkonný hardvér, radšej použite väčší model.

Žiaden lokálny model momentálne nevie hovoriť pekne po slovensky. Najbližšie má k tomu gemma2 9B. Preklad zo slovenčiny do angličtiny je takmer perfektný. Preklad z angličtiny do slovenčiny je zrozumiteľný, ale je písaný lámanou slovenčinou. Komunikáciu v slovenčine definitívne vyrieši až špecializovaný model pre slovenčinu, ktorý nemusí byť veľký, aby produkoval kvalitný výstup. Češtinu pomerne dobre ovláda multilingválny aya-expanse 8B. Ten nebol trénovaný pre slovenčinu, ale aj tak vie vyprodukovať slovenský preklad porovnateľný s gemma2.

Nastavenie modelov

Open WebUI poskytuje pohodlné používateľské rozhranie pre vyladenie parametrov Ollamy. Existuje aj staršie rozhranie na vytváranie vlastných modelových súborov, ale to má len limitované využitie odkedy existuje niekoľko spôsobov úpravy parametrov. Parametre možno nastaviť globálne (Settings / General) a osobitne ich vyladiť pre každý model (Workspace / Models). Dočasné zmeny parametrov možno aplikovať na aktuálnu konverzáciu po otvorení Chat Controls. Predvolené hodnoty parametrov temperature, top_k a top_p zužujú výstupnú distribúciu pravdepodobnosti (rozdelenie pravdepodobnosti), čo pomáha menším modelom hovoriť k veci, tak som sa týchto parametrov nechytal. Občas používam greedy sampling (top_k = 1), keď chcem predvídateľný, robotický výstup bez akejkoľvek kreativity. Okrem toho konfigurujem len kontextové okno pre každý model. Môžete tiež upraviť systémový prompt, ale to zvyčajne poškodí kvalitu modelu, ak na to model nebol trénovaný.

Modely používajú kontextové okno (nazývané aj KV cache alebo kontextová pamäť), aby si zapamätali, čo už bolo povedané. Kontext si vyžaduje veľa pamäte, čo je dôvod, prečo Ollama má predvolený len 2048-tokenový kontext. Ak máte dostatok pamäte, pravdepodobne budete chcieť upraviť parameter num_ctx, pretože Ollama nezvláda dobre konverzácie presahujúce kontextové okno. Najnovšie modely podporujú pôsobivo veľký kontext: llama3.1 8B až 128K tokenov pri 8K tokenoch na GB, qwen2.5-coder 7B 128K pri 18K/GB, dolphin-llama3 8B 256K pri 8K/GB, llama3.2 3B 128K pri 9.3K/GB, llama3.2 1B 128K pri 32K/GB a qwen2.5 0.5B 128K pri 85K/GB. Hoci RULER test ukazuje, že reálna veľkosť kontextu je často oveľa menšia ako deklarovaná, taktiež ukazuje, že 32K+ reálny kontext je bežný v novších modeloch a že väčší kontext stále pomáha, len v menšej miere.

Aké výsledky môžete očakávať?

Vo všeobecnosti sú platené špičkové modely lepšie než bezplatné cloudové modely (nerátajúc verzie platených modelov s obmedzením počtu dotazov), ktoré sú zas lepšie než lokálne modely. Môžete to vidieť v rebríčku Chatbot Areny. Táto hierarchia sa komplikuje dvoma spôsobmi. Po prvé, ak máte výkonný hardvér, môžete sa vyrovnať výkonu bezplatných cloudových modelov. Po druhé, pribúdajú špecializované modely, ktoré sa vedia vo svojej oblasti špecializácie priblížiť (ale nie celkom vyrovnať) najväčším všeobecným cloudovým modelom. V prípade modelov určených na programovanie to možno vidieť v LiveCodeBench, BigCodeBench, a v rebríčku Aider.

V praxi lokálne modely zachytia približne 50% mojich otázok a zvyšok ide cloudovým modelom. Zvyčajne si poradia so všetkými ľahkými otázkami a slúžia ako sprievodca ktoroukoľvek populárnou témou. Môžete ich požiadať o prepísanie (anglického) textu, aby vychytali štylistické a gramatické chyby. Lokálne modely môžu spoľahlivo poslúžiť na skriptovanie v prirodzenom jazyku, ak je úloha dostatočne jednoduchá a model má jasné inštrukcie a má k dispozícii príklady. Verím, že s lepším hardvérom a softvérom sa odomknú ďalšie možnosti, ako lokálne modely využiť.

Optimalizácia rýchlosti

Hardvér je mimochodom veľký problém. Ako väčšina ľudí, ktorí kupovali pred rozkvetom lokálnych jazykových modelov, aj ja som kúpil hardvér žalostne nedostatočný na prevádzku jazykových modelov. Modely sa stávajú sotva použiteľnými pri rýchlostiach okolo 10 tokenov za sekundu, čo je približne toľko, čo môžete očakávať od 7-9B modelov bežiacich na procesore s 2-kanálovou DDR4-3200. Aplikácie s dlhým kontextom, ako je napríklad programovanie, potrebujú rýchle spracovanie dotazu, čo žiadny procesor nedokáže (môj dosahuje maximálne 20 t/s). Nie som fanatik do jazykových modelov ako niektorí z /r/LocalLLaMA, ktorí si stavajú počítače s viacerými grafickými kartami len preto, aby mohli používať tie najväčšie jazykové modely, ale určite si do ďalšieho počítača zadovážim aspoň 16GB grafickú kartu a vy by ste mali tiež.

Okrem kupovania nového hardvéru môžete Ollamu zrýchliť viacerými spôsobmi:

Nestrácal by som čas nastavovaním počtu vlákien (parameter num_thread). Ollama automaticky alokuje jedno vlákno na každé fyzické jadro procesora, čo je optimálne, pravdepodobne preto, že paralelelné spracovanie inštrukcií v procesore plne vyťaží všetky jadrá a ďalšie vlákna len spôsobujú problémy s koordináciou vlákien.

Čo môžeme očakávať v budúcnosti

Hardvér sa bude určite zlepšovať. Lokálna umelá inteligencia, vrátane jazykových modelov, mení zloženie záťaže na osobných počítačoch a hardvér sa ešte len začína tomuto trendu prispôsobovať. Najrýchlejšie zmeny prídu od spotrebiteľov, ktorí si jednoducho kúpia vhodný hardvér, predovšetkým grafické karty s veľkou a rýchlou VRAM pamäťou. Nie som odborník na hardvérový trh, ale môj odhad je, že výrobcovia najprv rozšíria existujúce funkcie, ktoré vyhovujú jazykovým a iným lokálnym modelom, následne začnú pridávať nové primitívy navrhnuté špeciálne pre kvantizované lokálne modely a napokon sa dostanú k zásadnejším architekturálnym zmenám, ako je napríklad integrovaná pamäť priamo na čipe.

Existuje tiež veľa možností pre optimalizáciu softvéru a modelov a práve tu vidím príležitosť pre výrazné zvýšenie výkonu v najbližšom roku alebo dvoch. Dopĺňanie kódu a textu je zjavnou aplikáciou pre lokálne jazykové modely, ale podpora editorov je stále nedostatočná a často ťažkopádna. Doménové modely by mohli vo svojej oblasti prekonať oveľa väčšie všeobecné modely, ale v súčasnosti neexistujú takmer žiadne špecializované modely. Na obzore je niekoľko architekturálnych zlepšení: ternárne siete, Diff Transformer, YOCO, viac-tokenové modely, Mamba, RWKV. Ak má jazykový model prístup k zdrojom (dokumenty a zdrojový kód, vyhľadávanie na internete, API, vykonávanie kódu), môže to pomôcť prekonať veľkostné obmedzenia lokálnych jazykových modelov, ale súčasná implementácia v Open WebUI a Ollame je obmedzená a nepraktická. Špekulatívne vykonávanie jazykových modelov môže zvýšiť rýchlosť, ale žiadne populárne inferenčné jadro ho zatiaľ nevyužíva. Integrované grafiky a samostatné grafické karty od AMD a Intelu by mohli pomôcť pri multimodálnych modeloch, dlhých dotazoch a energetickej efektívnosti, ale väčšina z nich zostáva nevyužitá pre nedostatočnú softvérovú podporu.

Som presvedčený, že lokálne jazykové modely budú vytrvalo a pomerne rýchlo napredovať, ale cloudové modely nezmiznú. Vysoká riedkosť (sparsity) a ďalšie optimalizácie nakoniec umožnia cloudovým modelom dosiahnuť veľkosť vyhľadávačov. Namiesto nahradenia cloudových modelov budú lokálne modely skôr hľadať alternatívne uplatnenie, predovšetkým fine-tuning a kontinuálne trénovanie na lokálnych dátach.