llama+gemma2 o/w vulkan on FreeBSD  

# 昨日からの続きですが・・・
llama.cpp で gemma2 が動くという記事を見かけた 
→ https://zenn.dev/syoyo/articles/c19df2d06bbe02
ので、有り難く頂戴してFreeBSDでもウゴクのかみてみます。
* この「ウゴクのか」というのは、日々刻々コードが変わってしまう世界ではやってみないとわからないのがあります（特にFreeBSDでLinux界隈で普通に動くものについては）

# （余談）GPUの件
* CPUベースはまあ動くのわかったと、もう少しサクサク遊べるGPUがほしいので、とりあえず貧乏でも手近なサーバに突っ込める Kepler-core の K80が送料込み７０ドルくらいなもんで思わず eBayでポチってしまいました。来月には届くでしょうが、今更ねぇという気もしてきます（本当にブームが去ったところでやるのがオレの趣味ですが・・）
*　以前 買ってあって箱に入れてある AMD RX460 も ROCmで動かせるのを知りましたが、記事を書いている ubuntuマシンの 
ﾎﾟﾝｺﾂ
  Quadro K4000 を差し替えて色々するのもどうなのかな？というところですね。 K4000 も　ドライバが　470.256.02　以後のサポートがないので、10年を越えると流石に駄目なんですね。

## ベンチマークしてみる　・・・
* 今 テストしているサーバは、コアはトータルで40はあるが、シングルコアの性能がちょっと・・・
* Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz
<pre> 
Launching APs: 1 3 5 10 11 4 7 6 19 29 31 28 13 25 20 26 18 8 36 30 24 23 35 33 12 9 32 21 2 22 27 14 39 38 34 17 37 16 15
</pre>
* とりあえず　llama-bench カマしてみます。 ELYZAのほう。7Bのモデルです。

<pre>
# llama-bench -m models/ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf 
| model                          |       size |     params | backend    | threads |          test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | ------: | ------------: | -------------------: |
| llama 7B Q4_K - Medium         |   3.80 GiB |     6.74 B | CPU        |      20 |         pp512 |         36.48 ± 0.37 |
| llama 7B Q4_K - Medium         |   3.80 GiB |     6.74 B | CPU        |      20 |         tg128 |          3.74 ± 0.01 |

build: unknown (0)
</pre>
* genmma2 を試してみました。　2.5B。
<pre>
# llama-bench -m models/gemma-2-2b-it-Q8_0.gguf 
| model                          |       size |     params | backend    | threads |          test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | ------: | ------------: | -------------------: |
| gemma2 2B Q8_0                 |   2.59 GiB |     2.61 B | CPU        |      20 |         pp512 |         66.44 ± 0.64 |
| gemma2 2B Q8_0                 |   2.59 GiB |     2.61 B | CPU        |      20 |         tg128 |          4.88 ± 0.04 |

build: unknown (0)

</pre>
* パラメータ量 → O(N) と考えるのが妥当でしょうか。モデルの嵩を削れば「拙速な答え」が出る。


* もう一世代前のサーバ HP ML110G9 はメモリが64G　ですが　24コア。
<pre> CPU: Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz </pre>

* gemma2 ２Bです。
<pre>
# llama-bench -m gemma-2-2b-it-Q8_0.gguf 
| model                          |       size |     params | backend    | threads |          test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | ------: | ------------: | -------------------: |
| gemma2 2B Q8_0                 |   2.59 GiB |     2.61 B | CPU        |      12 |         pp512 |         58.56 ± 7.05 |
| gemma2 2B Q8_0                 |   2.59 GiB |     2.61 B | CPU        |      12 |         tg128 |         16.25 ± 0.53 |

build: unknown (0)


</pre>

* ELYZA-japanese-Llama-2-7b-instruct-q4_K_M です。
<pre>
 # llama-bench -m ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf 
| model                          |       size |     params | backend    | threads |          test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | ------: | ------------: | -------------------: |
| llama 7B Q4_K - Medium         |   3.80 GiB |     6.74 B | CPU        |      12 |         pp512 |         25.28 ± 0.73 |
| llama 7B Q4_K - Medium         |   3.80 GiB |     6.74 B | CPU        |      12 |         tg128 |         11.92 ± 0.08 |

build: unknown (0)

</pre>

## ベンチマークの結果に関しての感想
* ざっくりのベンチマークなので、「ふーんこんなものか」程度で。
* 果たして、Raspi3B+(＝手持ちが古すぎる） よりは性能は出る・・・のか？　要検証。
* CUDA/OpenBLAS なんかと比較したいのだが、普段使いの ubuntuデスクトップとでは新旧の違いも大きいので、どうみるか。あとQuadraを FreeBSD サーバに 持ってって　CUDA あたりが 動かせるものか？
* 指定しなければ、サーバのコア数の1/2をベンチマークに使うので、40コアのサーバなら、 20コアでテスト
* サーバの空きメモリ量は余り効いてない。L2/L3キャッシュのほうが効いているかもしれない。
* Xeon /Core N世代の性能差はあるのかもしれないが、コア数が12/20 でも gemma2/2Bの応答性は劣化しないのが印象的。

## 追記： 比較対象の機材１

* 一昨年から使ってる ubuntuのデスクトップ：一般（not 逸般)生活には困らない程度の性能で、とりあえず BLASを入れてみる（CUDAのテストはドライバ問題で生活に支障が出るので延期）
-- ”AMD Ryzen 7 5700G with Radeon Graphics”
-- "  Max Speed: 4650 MHz "
* ↑ ROCm 動くのかしらん？    
<pre>
# >>> ~strnh/llama/llama.cpp/build/bin/llama-bench -m gemma-2-2b-it-Q8_0.gguf
| model                          |       size |     params | backend    | threads |          test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | ------: | ------------: | -------------------: |
| gemma2 2B Q8_0                 |   2.59 GiB |     2.61 B | BLAS       |       8 |         pp512 |         90.00 ± 3.74 |
| gemma2 2B Q8_0                 |   2.59 GiB |     2.61 B | BLAS       |       8 |         tg128 |          9.00 ± 0.79 |

build: 924518e2 (4466)
ryzen5700-pc [~strnh/llama/models ]
# >>> ~strnh/llama/llama.cpp/build/bin/llama-bench -m ELYZA-japanese-Llama-2-7b-instruct-q4_K_M.gguf          [16:15:38]
| model                          |       size |     params | backend    | threads |          test |                  t/s |
| ------------------------------ | ---------: | ---------: | ---------- | ------: | ------------: | -------------------: |
| llama 7B Q4_K - Medium         |   3.80 GiB |     6.74 B | BLAS       |       8 |         pp512 |         32.96 ± 1.68 |
| llama 7B Q4_K - Medium         |   3.80 GiB |     6.74 B | BLAS       |       8 |         tg128 |          6.84 ± 0.35 |

build: 924518e2 (4466)

</pre>

* サーバで使ったモデルは多分K4000を使わないものだと思われるので、BLASで速くなることはない（当然か）
* Ryzen 7/5700G は 16 core なので　8 core で ベンチしている。
* gemma 2B の応答性能がよくなるのは、駆動周波数依存で core数には依存してない模様。