Real-time priorita pre Ollamu
Rozchodiť Ollamu na Linuxe je jednoduché, ak nepotrebujete akceleráciu grafickou kartou, ale llama.cpp, ktorý je pod kapotou Ollamy, ide až 2x pomalší, ak musí súťažiť o procesor s inými procesmi v systéme. Ja mám neustále spustené nejaké procesy na pozadí, ktoré vyťažujú procesor, tak som si dal tú námahu nakonfigurovať pre Ollamu real-time prioritu. V tomto článku používam Podman namiesto Dockeru, pretože mám Fedoru.
Samozrejme, prvá vec, ktorú som skúšal, je depriorizovať problematický proces na pozadí umiestnením do cgroupy s nízkym CPU podielom. To však nefunguje. Uvedené 2-násobné spomalenie Ollamy som nameral, keď už bol proces na pozadí obmedzený na 10% podiel procesora.
Najpravdepodobnejšou príčinou je, že konkurenčné procesy občas zdržiavajú vlákna llama.cpp, čo spôsobuje, že niektoré vlákno zaostáva a ostatné vlákna naň potom musia čakať. Toto je ťažké odstrániť na úrovni llama.cpp, prinajmenšom pre architektúru transformátora, ktorá vyžaduje, aby implementácia opakovane paralelizovala malé bloky výpočtov a synchronizovala vlákna po každom bloku.
Ak to chceme napraviť na úrovni systému, môžeme sa pohrať s konfiguráciou schedulera, konkrétne s real-time prioritami. Štandardnú inštaláciu Ollamy som upravil tak, aby Ollama bežala s real-time prioritou:
sudo podman run -d --name ollama --replace --pull=always --restart=always \ -p 127.0.0.1:11434:11434 -v ollama:/root/.ollama --stop-signal=SIGKILL \ --cap-add=SYS_NICE --entrypoint=/bin/sh \ docker.io/ollama/ollama \ -c chrt 1 /bin/ollama serve sudo systemctl enable podman-restart
Bezrootový Podman ignoruje SYS_NICE, tak ho spúšťajte so sudo
.
Vyskúšal som round-robin scheduler (predvolený v chrt
) aj FIFO scheduler, ale nevidím medzi nimi žiadny rozdiel.
Zaujímavé je, že na nezaťaženom systéme sú procesy s real-time prioritou o 10-20 % pomalšie ako tie s normálnou prioritou.
Pravdepodobne je to tak preto, že scheduler pre procesy s normálnou prioritou je o niečo inteligentnejší,
pokiaľ ide o rovnomerné rozloženie záťaže na všetky jadrá procesora.
Masívne zrýchlenie na vyťaženom systéme však stojí za to.
S real-time prioritou dosahuje Ollama takmer rovnaký výkon ako na nezaťaženom systéme.
Systém zostáva stabilný, pretože mám procesor s hyperthreadingom,
ktorý Ollama nepoužíva, takže zdanlivé využitie procesora je len 50%
a systém má naďalej kapacitu na spúšťanie ostatných procesov.
Napriek tomu som zaznamenal citeľné rušenie ostatných real-time procesov, najmä audio subsystému.
Upozorňujem, že bez hyperthreadingu Ollama s real-time prioritou pravdepodobne spôsobí pád systému.