この記事は、NetBSD Advent Calendar 2024の13日目の記事です。
llama.cppを使ってみる
以前に、NetBSD/amd64でllama.cppを使ってみるという記事でllama.cppを使ってみていました。 あれから、llama.cppはバージョンアップを繰り返し、様々なLLMも公開されました。 それほど頻繁ではないものの、私もllama.cppを使ってみています。 今回はb4333にアップデートするに当たって気付いたpkgsrcでのBLASサポートについて書きたいと思います。
シングルスレッドでしか動いていない
簡単ではない、例えば数百字以上の出力を求めるプロンプトを与えると、何も返事か返って来ない事象が発生していました。 また、以前も書いたようにプロンプトのテンプレートの問題なのかと思っていたのですが、とても長く待つと、ちゃんと返事が返って来ました。 そこで、処理中にtop(1)コマンドで状況を確認すると、1CPUしか使っていませんでした。 実行しているラップトップには8コア16スレッドを内蔵したCPUが搭載されています。 ログを見てみると、8スレッド以上は使ってくれそうです。 そこで、どのようになっているのか調べてみることにしました。
BLASバックエンドのソースコードを確認する
BLASサポートは、b4333だと、ggml/src/ggml-blas
というディレクトリー内に格納されているようです。
このディレクトリー内のファイルを読んでも、マルチコア/マルチスレッドサポートの記述はなさそうです。
となると、BLASライブラリーがマルチコア/マルチスレッドサポートをしていると考えるのが適切そうです。
pkgsrcでのBLASサポート
pkgsrcには、いくつもBLASに相当するライブラリーのパッケージがあります。以下に挙げてみます。
- math/blas
- math/blas64
- math/openblas
- math/openblas64
- math/openblas_openmp
- math/openblas64_openmp
- math/openblas_pthread
- math/openblas64_pthread
これらは直接利用するのではなく、mk/blas.buildlink3.mk
を経由して使うことで、
切り替えてビルド時に利用することができます。
mk/blas.buildlink3.mk
で設定できるのは、まずは3つのBLAS_ACCEPTED
です。
- netlib
- openblas
- openblas_pthread
- openblas_openmp
- accelerate.framework
ここで、accelerate.frameworkはNetBSDでは利用できないmacOSの機能ですので、除外して考えると、さきほどのパッケージとの関係は以下のようです。
- netlib → math/blas、math/blas64
- openblas → math/openblas、math/openblas64
- openblas_pthread → math/openblas_pthread、math/openblas64_pthread
- openblas_openmp → math/openblas_openmp、math/openblas64_openmp
でもこれだけでは、例えばmath/blasとmath/blas64を区別できません。これを区別するのがBLAS_INDEX64
です。
これをyesに設定することで64付きのパッケージを選択できます。
pkgsrc/wip/llama.cppをマルチスレッド対応にする
と言うことで、llama.cppで使えるCPUで演算するBLASライブラリーを調べてみると、BLAS_ACCEPTED
で言うと、netlibとopenblas64ということがわかりました。
netlibはこれまで使って来て、マルチコアを活用できないものでした。活用できそうなmath/openblas64_pthread、math/openblas64_openmpを使えるようにしてみます。
pkgsrc/wip/llama.cppl/Makefileに以下のように追記してみます
BLAS_INDEX64= yes BLAS_ACCEPTED= openblas_pthread openblas_openmp
ビルドして動作確認をしてみる
結果から言うと、openblas64_openmpは私の環境では正常にllama.cppを動かしてはくれませんでした。 全てのコアを使い切ってはくれますが、openblas_pthreadのように速やかに演算をしてはくれませんでした。 openblas_pthread、openblas_openmpそれぞれを使ったllama.cppをビルドするには、以下のようにします。
# make PKGSRC_BLAS_TYPES=openblas_openmp install または # make PKGSRC_BLAS_TYPES=openblas_pthread install
動作確認には、以前はllama-cliを使っていましたが、llama-serverとウェブブラウザーを使うのが良さそうです。
ChatGPT的なウェブページが提供されます。
IPv6で自ホスト以外からもアクセスできるようにする例です。
http://localhost:8080/
をwww/firefox等で開くと利用できます。
$ llama-server --host :: --port 8080 -m ./models/gemma-2-2b-jpn-it-Q4_K_M.gguf