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:
- Použijeme kontajnerový tag
:rocm
namiesto:latest
. Je to oficiálny Ollama imidž, ktorý obsahuje ROCm, čo je AMD platforma pre spúšťanie všeobecných výpočtov na grafických kartách. Je to samostatný imidž, pretože ROCm je veľký. - Vyzdieľame do kontajnera zariadenia
/dev/dri
a/dev/kfd
, aby mal kontajner prístup ku grafickej karte. 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í týchto zariadení.
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:
- Vyhradená "VRAM" pre iGPU: Je to časť systémovej RAM vyčlenená pre iGPU pri štarte systému. Používa ju len iGPU a nemôžu ju využívať aplikácie. Veľkosť vyhradenej VRAM sa konfiguruje v BIOSe. Predvolených je zvyčajne biednych 512MB, ale mnohé BIOSy umožňujú zväčšiť VRAM až na 16GB.
- GTT: Graphics Translation Table, nazývaná aj Unified Memory Architecture (UMA) alebo GART, umožňuje dynamickú alokáciu systémovej RAM pre iGPU počas behu systému. Linux štandardne umožňuje použiť ako GTT pamäť až polovicu systémovej RAM. Ak iGPU túto pamäť nepoužíva, môžu ju namiesto toho využiť aplikácie.
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:
- Nahradiť verejný imidž
ollama:rocm
našim novo skompilovaným imidžomollama-gtt
. - Nastaviť
HSA_OVERRIDE_GFX_VERSION
, pretože ROCm nemá absolútne žiadnu podporu pre iGPU. Pre môj Ryzen 5600G funguje dobre verzia9.0.0
. Pre vašu iGPU budete pravdepodobne musieť hodnotu tejto premennej upraviť.
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é.