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 pomocou AMD Ryzen 5600G (RX Vega 7, GCN5.0) pod Linuxom a v Podman kontajneri.

Nastavenie samostatnej grafickej karty

Hoci tento článok je o integrovaných grafikách, najprv vysvetlím jednoduchšiu konfiguráciu pre samostatnú grafickú kartu (dGPU), čiastočne ako základ pre konfiguráciu iGPU a čiastočne na demonštráciu, ako by malo nastavenie iGPU vyzerať v budúcnosti, keď sa zlepší podpora iGPU v ROCm a Ollame.

V porovnaní so základnou konfiguráciou pre procesor urobíme dve zmeny:

Kompletný príkaz vyzerá takto:

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

Toto by malo bezproblémovo fungovať s akoukoľvek novšou samostatnou grafickou kartou od AMD. Ak máte starší hardvér, možno budete musieť nastaviť premennú HSA_OVERRIDE_GFX_VERSION, aby ste oklamali ROCm, aby používal grafickú kartu, ktorá nie je na (veľmi krátkom) zozname podporovaných grafických kariet.

Nastavenie integrovanej grafiky

Integrované grafiky používajú tú istú pamäť RAM ako procesor. RAM môže byť pridelená integrovanej grafike dvoma spôsobmi:

Prečo diskutujeme o týchto technických detailoch? Pretože práve v tomto je podpora iGPU rozbitá. Pred jadrom 6.10 ROCm alokoval pamäť len vo vyhradenej VRAM. Po jadre 6.10 alokuje len v GTT. To je zatiaľ v poriadku. GTT je lepšia než vyhradená VRAM, pretože už nemusíme nastavovať BIOS. Problém je v tom, že Ollama zisťuje, či je prítomná vhodná grafická karta, podľa veľkosti vyhradenej VRAM. Ak máte v BIOSe nakonfigurovaných predvolených 512MB VRAM, Ollama odmietne použiť iGPU. Ak zväčšíte VRAM v BIOSe, Ollama použije iGPU, ale všetky alokácie pamäte pôjdu do GTT a vyhradená VRAM zostane nevyužitá, čo je samozrejme extrémne plytvanie.

Aby sme to vyriešili, musíme použiť otvorený pull request pre AMD iGPU. Začnime tým, že tento pull request skompilujeme zo zdrojákov. Aby sme predišli problémom s neaktuálnymi dátami v cache počas kompilácie, nasledujúci skript agresívne čistí všetky cache.

cd ~
mkdir ollama-gtt
cd ollama-gtt
git clone \
    -b AMD_APU_GTT_memory \
    --recurse-submodules \
    https://github.com/Maciej-Mogilany/ollama.git \
    .
podman image prune -f
rm -rf /var/tmp/buildah-cache-1000
podman build \
    -f Dockerfile \
    --no-cache \
    --platform=linux/amd64 \
    --target runtime-rocm \
    --build-arg=OLLAMA_SKIP_CUDA_GENERATE=1 \
    -t ollama-gtt

Toto vytvorí lokálny kontajnerový imidž ollama-gtt, ktorý môžeme teraz použiť na spustenie verzie Ollamy kompatibilnej s iGPU. Príkaz Podman je takmer identický s tým hore pre samostatné grafické karty. Potrebujeme urobiť len dve zmeny:

podman run -d \
    --name ollama \
    --replace \
    --pull=always \
    --restart=always \
    --stop-signal=SIGKILL \
    -p 127.0.0.1:11434:11434 \
    -v ollama:/root/.ollama \
    -e OLLAMA_MAX_LOADED_MODELS=1 \
    -e OLLAMA_NUM_PARALLEL=1 \
    --device /dev/dri \
    --device /dev/kfd \
    -e HSA_OVERRIDE_GFX_VERSION=9.0.0 \
    ollama-gtt

Ak toto všetko urobíte a Ollama nehlási chybu, nespadne ani nezamrzne, mali by ste vidieť, že modely bežia na iGPU. Na sledovanie využitia pamäte a výpočtového výkonu grafickej karty môžete použiť nástroj radeontop.

Rýchlosť

Testoval som Ryzen 5600G s 8B llama3.1 na 2K-tokenovom prompte a 1,3K odpovedi. Na iGPU dosahuje rýchlosť 70/6 PP/TG (spracovanie promptu a generovanie textu, v tokenoch za sekundu) v porovnaní s rýchlosťou 30/8 PP/TG na CPU. Či je to zlepšenie, závisí od toho, či pracujete s dlhými promptami alebo nie. Výkon je však veľmi nespoľahlivý, pretože menšie modely sú paradoxne často oveľa pomalšie. Budete si to musieť otestovať. Výkon sa určite bude značne líšiť aj podľa hardvéru. Treba mať na pamäti, že rýchlejšie bude predovšetkým spracovanie promptu. Rýchlosť generovania je obmedzená rýchlosťou pamäte rovnako ako na procesore. Ollama stále využíva aj procesor, aj keď celý model beží na iGPU, ale zaťaženie procesora by malo byť zanedbateľné.