Robert Važan

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.