Ollama を AMD GPU で動かす on Arch Linux
Linux 機のグラボを Nvidia から AMD にした のグラボを使っているので、nVidia GPU と違って sudo pacman -S ollama-cuda を一発入れて終了!というわけにはいかない。
Update
ROCm のアップデートがあったので特別な自前ビルドは不要となり、pacman -S ollama-rocm すればよくなった。
しかし自分のグラボでは環境変数 HSA_OVERRIDE_GFX_VERSION=10.3.0 をセットして ollama serve する必要があるので、そこは後述の手段を踏襲すること。
古い手順
この辺見ながらやったけど、余分なものがいくつかあったので削ぎ落とした内容としている。
https://github.com/jmorganca/ollama/pull/814#issuecomment-1868472966
ソースから入れる必要があるようだ。
code:sh
# 必要な OS パッケージ
pacman -S rocm-hip-sdk clblast
ghq get git@github.com:jmorganca/ollama.git
cd /path/to/ollama # GHQ のジャンプを使いましょう
# fish を想定した環境変数のセット
env CLBlast_DIR=/usr/lib/cmake/CLBlast env ROCM_PATH=/opt/rocm go generate ./...
go build .
# いざ実行
# この環境変数がないと ollama run したときに serve 側がクラッシュする
env HSA_OVERRIDE_GFX_VERSION=10.3.0 ./ollama serve
# こっちは環境変数いらない あっても困ることはなさそうだが
./ollama run zephyr
無事動いた。
Radeon 系の稼働状況チェックツールを見たところちゃんと GPU を使ってくれてるし、何より GPU なしと比較して速い!
どうでもいいけど実行バイナリが 32GB もある。
えっと、正気かそのインストールサイズ?一方で ollama-cuda はというと
code:shell
paru -Ss ollama-cuda
extra/ollama-cuda 0.1.17-2 256.93 MiB 695.74 MiB
Create, run and share large language models (LLMs) with CUDA
なんだけどな。
まあいいや。
起動を楽にする
さて PKGBUILD を作ってインストールを簡易化してもいいのだが、Ollama に OSS コントリビュートする可能性を考えるとソースからビルドする方式のままの方がむしろ都合がいいと考えた。
ラッパー案
最初にやったのはこれだが、結局後述の systemd 案に変更した。
よってパスの通っているところに以下のスクリプトを設置する。これなら OSS のコードをいじりつつも、パッケージマネージャで入れた場合の使い勝手を維持でき、かつ ROCm 由来の面倒な部分をカットできる。
code:/usr/local/bin/ollama
#!/usr/bin/env bash
export HSA_OVERRIDE_GFX_VERSION=10.3.0
EXECUTABLE="/path/to/ollama/ollama"
"$EXECUTABLE" "$@"
Systemd 案
上記の方針だと ps したときにラッパースクリプトと Ollama 本体の両方のプロセスが見えてしまって何だか邪魔だなと思っていたのでこちらに変更。
環境変数を記述しておける上に、あまりないがダウン時の自動再起動も設定できる。
/usr/local/bin をシンボリックリンクとして用意する。
上記のラッパー案と見せかけは同じになる。
code:shell
$ sudo ln -s /path/to/ollama /usr/local/bin/ollama
シンボリックリンクをわざわざ用意する利点は以下である。
デーモンとは別に ollama run などのコマンドを実行する必要があるのでパスが通った場所に実行ファイルがある必要がある
また ollama serve 以外のサブコマンドにおいては環境変数 HSA_OVERRIDE_GFX_VERSION の指定が不要なのでこれで十分である
実行ファイル本体のパスは開発環境の引っ越しなどにより変わる可能性があるが、それに柔軟に対応できる
続いて user の方に systemd の設定ファイルを記述する。
ollama serve にあたり必要な環境変数はここに書くことになる。
code: /usr/lib/systemd/user/ollama.service
Unit
Description=Ollama
Service
Environment="HSA_OVERRIDE_GFX_VERSION=10.3.0"
ExecStart=/usr/local/bin/ollama serve
Restart=always
RestartSec=10
Install
WantedBy=default.target
最後に user で有効化して終わり。自分はやらなくても上手くいったが ollama.service を検知してくれない場合は $ systemctl --user daemon-reload してみると解消するかも。
code:shell
$ systemctl --user enable ollama.service --now
#Linux