plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、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

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、 NetBSD Advent Calendar 2024 の13日目の記事です。 llama.cppを使ってみる 以前に、 NetBSD/amd64でllama.cppを使ってみる という記事で llama.cpp を使ってみていました。 あれか...