Robert Važan

Ollama na AMD iGPU

Rozchodiť Ollamu na procesore (CPU) je jednoduché a bezproblémové riešenie, ale všetky počítače bez samostatnej grafickej karty majú integrovanú grafiku (iGPU) v procesore, ktorá je napriek svojej malej veľkosti a nízkej spotrebe energie rýchlejšia než všetky jadrá procesora dokopy. S trochou šikovnosti a šťastia môžete integrovanú grafiku využiť na zvýšenie výkonu. Tu sú moje skúsenosti s akceleráciou Ollamy na integrovanej grafike v AMD Ryzen 5600G procesore pod Linuxom a v Podman kontajneri.

Hoci integrovaná grafika môže dynamicky alokovať pamäť v počítači prostredníctvom UMA/GTT/GART a llama.cpp to podporuje skrz parameter pri kompilácii, v súčasnosti nie je v Ollama žiadna podpora UMA. Jedinou možnosťou je alokovať časť pamäte RAM ako vyhradenú VRAM v BIOSe, ak to váš systém podporuje (niektoré notebooky to nepodporujú). V mojom prípade je vyhradená VRAM prednastavená na mizerných 512MB, ale BIOS ju umožňuje nakonfigurovať na ľubovoľnú mocninu dvojky až do 16GB. Ja som sa rozhodol pre 8GB VRAM, čo postačuje pre kvantizovaný 7-8B model (4GB), kontextovú a vyrovnávaciu pamäť (1GB), pracovnú plochu a aplikácie (1-2GB) a nejakú rezervu (1GB). Multimodálny llava 7B je o niečo väčší (5GB), ale stále sa zmestí. Ak chcete spustiť 13-20B modely, budete musieť vyhradiť 16GB pamäte RAM ako VRAM.

Spôsob spustenia Ollamy s podporou integrovanej grafiky závisí od výrobcu procesora. Ja mám procesor AMD, takže tieto inštrukcie sú len pre AMD. Ak chcete, aby Ollama používala integrovanú grafiku na procesoroch AMD, budete potrebovať variant docker imidžu, ktorý obsahuje ROCm, čo je AMD platforma pre spúšťanie všeobecných výpočtov na grafických kartách. Samostatný docker imidž je potrebný, pretože ROCm zväčšuje Ollamu o 4GB (nerobím si srandu). Kontajner, v ktorom beží Ollama, budete musieť spustiť s niekoľkými parametrami navyše oproti tomu, čo potrebuje Ollama na procesore:

podman run -d --name ollama --replace --pull=always --restart=always \
    -p 127.0.0.1:11434:11434 -v ollama:/root/.ollama --stop-signal=SIGKILL \
    --device /dev/dri --device /dev/kfd \
    -e HSA_OVERRIDE_GFX_VERSION=9.0.0 -e HSA_ENABLE_SDMA=0 \
    docker.io/ollama/ollama:rocm

ROCm má veľmi krátky zoznam podporovaných grafických kariet. Použité premenné (HSA_OVERRIDE_GFX_VERSION a HSA_ENABLE_SDMA) slúžia na oklamanie ROCm, aby bol ochotný pracovať s nepodporovanou integrovanou grafikou v mojom Ryzene 5600G. Pre iné nepodporované grafické karty možno budete premenné a verzie Ollama/ROCm musieť upraviť. Podľa toho, čo som čítal na tému prístupu ku grafickým kartám v kontajneroch, kontajner zostáva riadne sandboxovaný aj po zdieľaní /dev/dri a /dev/kfd.

Ak toto všetko urobíte a Ollama nehlási chybu, nespadne ani nezamrzne, mali by ste dosiahnuť príjemné zvýšenie výkonu. V mojom prípade pozorujem viac ako dvojnásobne rýchlejšie spracovanie dotazov, ktoré sa blíži k 40 tokenom za sekundu pre 7B model na nezaťaženom systéme. Čas potrebný na spracovanie obrázku v moondreame klesol na 6 sekúnd. Rýchlosť generovania textu je naďalej obmedzená rýchlosťou pamäte na 10 tokenov/sekundu, ale už ju neovplyvňuje konkurencia od iných procesov, čo je pre mňa zásadná výhoda integrovanej grafiky. Ollama stále využíva procesor, aj keď celý model beží na integrovanej grafike, ale zaťaženie procesora je teraz zanedbateľné.

Celá vec je však trochu vratká. Absencia podpory v ROCm znamená, že sa to môže pokaziť pri ktorejkoľvek budúcej aktualizácii. Modely bežiace na integrovanej grafike sa občas úplne vykoľaja a produkujú odpad, kým Ollamu nereštartujem. Aj keď to celé funguje, výstup sa trochu líši od toho, čo produkoval procesor (s top_k = 1) a prvé spustenie dotazu na integrovanej grafike produkuje mierne odlišný výstup od druhého a nasledujúcich spustení. Ollama niekedy nedokáže pri prepínaní modelov presunúť všetky vrstvy modelu na grafiku, hlásiac málo VRAM, ako keby časti predchádzajúceho modelu boli stále vo VRAM. Poškodzuje to výkon a časom sa to zhoršuje, ale reštartovanie Ollamy problém na chvíľu vyrieši. Presúvanie vrstiev Mixtralu na grafiku nefunguje. Model jednoducho zamrzne.

Napriek tomu som s týmto riešením spokojný. Vďaka vyššej rýchlosti a nezávislosti od zaťaženia systému je Ollama praktickejšia. Toto riešenie si nechám, kým nebudem mať samostatnú grafickú kartu.