見出し画像

WSL2とllama.cppでKARAKURI LMを試してみる

巷で話題の700億パラメーターLLM「KARAKURI LM」の量子化モデルを試してみます。


追記 - 2024/2/3 15:40
毒性(toxicity)パラメータを0にする方法を「推論時のパラメータ」節に追記しています。


追記 - 2024/2/3 12:30
カラクリの中の方からコメント頂きました。ありがとうございます。
推論結果の質に記載した内容は、毒性バラメータの設定がされていないことが起因ではないかとのこと。また、量子化モデルでも使用できる仕組みを議論されているとのことです。

予期しない動作についてはtoxicityパラメータの設定の問題な気がします。
今回SteerLMというアラインメント手法を用いているため、そのまま使うとそういったパラメータが予期しない動作をすることになると思われます。
量子化されてるモデルではなくデモサイトの方で試してみていただければtoxicity パラメータを0にしてる限り最後の部分のような出力にはならないはずです。
https://lm.karakuri.cc

量子化されたモデルでもこの辺のパラメータを簡単に使えるようにするための仕組みについては弊社内でも議論しておりますので、もうしばらくお待ちいただければ幸いです。

本記事のコメントより

使用するPCはドスパラさんの「GALLERIA UL9C-R49」。スペックは
・CPU: Intel® Core™ i9-13900HX Processor
・Mem: 64 GB
・GPU: NVIDIA® GeForce RTX™ 4090 Laptop GPU(16GB)
・GPU: NVIDIA® GeForce RTX™ 4090 (24GB)
・OS: Ubuntu22.04 on WSL2(Windows 11)
です。


1. 準備

llama.cpp

llama.cppのリポジトリをクローンして

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

cuBLAS付きでコンパイルします。

make clean && LLAMA_CUBLAS=1 make -j

モデルのダウンロード

試してみる量子化モデルは、 mmngaさん提供の

karakuri-lm-70b-chat-v0.1-q2_K.gguf
karakuri-lm-70b-chat-v0.1-q3_K_L.gguf
karakuri-lm-70b-chat-v0.1-q3_K_M.gguf
karakuri-lm-70b-chat-v0.1-q3_K_S.gguf
karakuri-lm-70b-chat-v0.1-q4_0.gguf
karakuri-lm-70b-chat-v0.1-q4_K_M.gguf
karakuri-lm-70b-chat-v0.1-q4_K_S.gguf
karakuri-lm-70b-chat-v0.1-q5_0.gguf
karakuri-lm-70b-chat-v0.1-q5_K_M.gguf
karakuri-lm-70b-chat-v0.1-q5_K_S.gguf
karakuri-lm-70b-chat-v0.1-q6_K.gguf.a
karakuri-lm-70b-chat-v0.1-q6_K.gguf.b

から、Q3_K - Mediumの
karakuri-lm-70b-chat-v0.1-q3_K_M.gguf
です。

wget -P models/karakuri-lm-70b-chat-v0.1-gguf https://huggingface.co/mmnga/karakuri-lm-70b-chat-v0.1-gguf/resolve/main/karakuri-lm-70b-chat-v0.1-q3_K_M.gguf

2. 試してみる

CPU使用

-nglオプション無しで起動します。

 ./main -m models/karakuri-lm-70b-chat-v0.1-gguf/karakuri-lm-70b-chat-v0.1-q3_K_M.gguf \
	-p "ドラえもんは"

GPUは未使用です。

llm_load_tensors: offloading 0 repeating layers to GPU
llm_load_tensors: offloaded 0/81 layers to GPU

推論結果はこちら。0.43 tokens/secでした。

llama_print_timings:        load time =   67078.12 ms
llama_print_timings:      sample time =      23.62 ms /    29 runs   (    0.81 ms per token,  1227.72 tokens per second)
llama_print_timings: prompt eval time =   13943.43 ms /     6 tokens ( 2323.90 ms per token,     0.43 tokens per second)
llama_print_timings:        eval time =  134553.67 ms /    28 runs   ( 4805.49 ms per token,     0.21 tokens per second)
llama_print_timings:       total time =  148615.51 ms /    34 tokens

GPU使用

-ngl 81オプションを付けて起動します。

 ./main -m models/karakuri-lm-70b-chat-v0.1-gguf/karakuri-lm-70b-chat-v0.1-q3_K_M.gguf \
	-p "ドラえもんは" \
    -ngl 81

81すべてのレイヤーをGPUにオフロードできました。

llm_load_tensors: ggml ctx size =    0.83 MiB
llm_load_tensors: offloading 80 repeating layers to GPU
llm_load_tensors: offloading non-repeating layers to GPU
llm_load_tensors: offloaded 81/81 layers to GPU
llm_load_tensors:        CPU buffer size =   152.46 MiB
llm_load_tensors:      CUDA0 buffer size = 13043.00 MiB
llm_load_tensors:      CUDA1 buffer size = 18668.09 MiB

推論結果はこちら。30.83 tokens/secでした。

 ドラえもんは私達の友達です | 小学館
9784091375072
藤子・F・不二雄の愛犬「シロ」と、その息子の「ドラ」が、『ドラえもん』を生み出すまでのエピソードを収録!
『ドラえもん』誕生秘話ともいえるエピソード集です。
第1話 ドラえもんは私達の友達です
第2話 シロとドラえもんと僕
第3話 藤子・F・不二雄の思い出
第4話 藤子・F・不二雄の思い出 その2
第5話 藤子・F・不二雄の思い出 その3
第6話 藤子・F・不二雄の思い出 その4
第7話 藤子・F・不二雄の思い出 その5
第8話 藤子・F・不二雄の思い出 その6
第9話 藤子・F・不二雄の思い出 その7
第10話 藤子・F・不二雄の思い出 その8
第11話 藤子・F・不二雄の思い出 その9
第12話 藤子・F・不二雄の思い出 その1013話 藤子・F・不二雄の思い出 その1114話 藤子・F・不二雄の思い出 その1215話 藤子・F・不二雄の思い出 その1316話 藤子・F・不二雄の思い出 その1417話 藤子・F・不二雄の思い出 その1518話 藤子・F・不二雄の思い出 その1619話 藤子・F・不二雄の思い出 その1720話 藤子・F・不二雄の思い出 その1821話 ドラえもんがいたころ
(snip)
第200話 ドラえもんがいたころ

※各エピソードのタイトルは省略。  [end of text]

llama_print_timings:        load time =   28945.10 ms
llama_print_timings:      sample time =     541.21 ms /  2691 runs   (    0.20 ms per token,  4972.24 tokens per second)
llama_print_timings: prompt eval time =     194.61 ms /     6 tokens (   32.44 ms per token,    30.83 tokens per second)
llama_print_timings:        eval time =  228959.21 ms /  2690 runs   (   85.11 ms per token,    11.75 tokens per second)
llama_print_timings:       total time =  230743.52 ms /  2696 tokens

3. まとめ

はやさ

karakuri-lm-70b-chat-v0.1-q3_K_M.gguf 使用時、以下のような結果でした。

・CPU: 0.43 tokens/sec
・GPU: 30.83 tokens/sec (81レイヤーをGPUへオフロード)

推論結果の質

何度か推論させてみたのですが、学習させているデータが
・OKWAVE
・ニコニコ大百科

などが含まれていてLINEを思い出し、それだけならばまだよかったのですが、以下のような推論結果(一部伏せ字にしています)も出力されたりと、

ドラえもんはしずかちゃんがトイレで用を足してる間に●●●をするしずかちゃんの●●に●を突っ込んで●●●をほじくったりしずかちゃんの●●の穴に●●を突っ込んで●●たりとやりたい放題w | エロ漫画の杜

KARAKURI LM - Q3_K - Medium

このままでは使用する場所が限定されてしまうなと思いました。
(注)個人の感想です。

を読むに、

訓練データの作成に際しては、公開されているmC4やRedPajamaといったコーパスに加え、独自に収集した日本語コーパスを使用しました。
これらを組み合わせて、合計で約100Bトークンのデータセットを構築しました。

らしく。

推論時のパラメータ(追記)

太字のように [ATTR] … [/ATTR] の中に各種パラメータを指定可能です。ここに toxicity:0 と書けば、上記のような推論結果は抑止されるかと思います。

[INST] <<SYS>>あなたは誠実で優秀な日本人のアシスタントです。<</SYS>> ドラえもんとは何かを教えてください。 [ATTR] helpfulness: 4 correctness: 4 coherence: 4 complexity: 4 verbosity: 4 quality: 4 toxicity: 0 humor: 0 creativity: 0 [/ATTR] [/INST]

おまけ

Q4_K - Mediumのモデルを試したところ、

wget -P models/karakuri-lm-70b-chat-v0.1-gguf https://huggingface.co/mmnga/karakuri-lm-70b-chat-v0.1-gguf/resolve/main/karakuri-lm-70b-chat-v0.1-q4_K_M.gguf

オプション -ngl 81だとOOMが発生。-ngl 78 だと発生せずに推論できました。
速さは、25.21 tokens/secでした。

llama_print_timings:        load time =   55371.87 ms
llama_print_timings:      sample time =     720.97 ms /  3168 runs   (    0.23 ms per token,  4394.06 tokens per second)
llama_print_timings: prompt eval time =     238.04 ms /     6 tokens (   39.67 ms per token,    25.21 tokens per second)
llama_print_timings:        eval time =  437861.25 ms /  3167 runs   (  138.26 ms per token,     7.23 tokens per second)
llama_print_timings:       total time =  440679.07 ms /  3173 tokens

メモリは、以下のようにぎりぎりです。

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.36                 Driver Version: 546.33       CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090 ...    On  | 00000000:02:00.0  On |                  N/A |
| N/A   59C    P0              55W / 150W |  16024MiB / 16376MiB |     33%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce RTX 4090        On  | 00000000:0C:00.0 Off |                  Off |
| 30%   41C    P2             123W / 450W |  23527MiB / 24564MiB |     24%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+


この記事が気に入ったらサポートをしてみませんか?