🤖

Raspberry Pi で LLM推論やってみた

2023/05/02に公開1

はじめまして、テラーノベルでサーバーサイドを担当している@manikaです。
先月3月にLLaMaの推論をローカルPCでも動作させられるようにしたLLaMa.cppが公開されました。重みを4bitに量子化する事でローカルPCでも動作させられるようにしたもののようです。

テラーノベル社内でも、機械学習チームが自然言語に関する R&D を日々進めていますが、今回はLLM初心者の私がLLaMa.cppをラズパイで動かしてみようと思います!

使用環境

Raspberry Pi 4 (4GB)
Raspberry Pi OS Lite(64-bit) bullseye
SDカード 32GB

llama.cppのビルド

コンパイルの為事前にg++をインストールおきましょう。

sudo apt-get install g++

githubからLLaMa.cppのソースを取得。

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

ビルド

cd llama.cpp
make

少し待てば完了します。

モデルを配置

実際にはfinetuningされたモデルを使用する事が多いと思いますが、今回は推論を動作させる事が目的のため公開されているものを使用します。
https://huggingface.co/Pi3141

モデルはllama.cpp/models内に配置をします。
ディレクトリが作成されていなければ事前に作成しておきましょう。

mkdir models

今回はPi3141/alpaca-lora-7B-ggmlを使用します。
ダウンロードしてmodelsの中にモデルデータを入れておきます。

models/7B/ggml-model-q4_1.bin

これで準備は整いましたので早速実行してみます!
-p がプロンプト=質問内容です。 質問は「日本の首都を教えてください」。
日本語に対応していないので英語で。

./main -m ./models/7B/ggml-model-q4_1.bin -t 4 -n 128 -p "Please tell me the capital of Japan"

推論がはじまりましたが…遅い…!!

main: seed = 1682397937
llama.cpp: loading model from ./models/7B/ggml-model-q4_1.bin
llama_model_load_internal: format     = ggjt v1 (latest)
llama_model_load_internal: n_vocab    = 32000
llama_model_load_internal: n_ctx      = 512
llama_model_load_internal: n_embd     = 4096
llama_model_load_internal: n_mult     = 256
llama_model_load_internal: n_head     = 32
llama_model_load_internal: n_layer    = 32
llama_model_load_internal: n_rot      = 128
llama_model_load_internal: ftype      = 3 (mostly Q4_1)
llama_model_load_internal: n_ff       = 11008
llama_model_load_internal: n_parts    = 1
llama_model_load_internal: model size = 7B
llama_model_load_internal: ggml ctx size =  59.11 KB
llama_model_load_internal: mem required  = 6612.57 MB (+ 1026.00 MB per state)
llama_init_from_file: kv self size  =  256.00 MB

system_info: n_threads = 4 / 4 | AVX = 0 | AVX2 = 0 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 0 | NEON = 1 | ARM_FMA = 1 | F16C = 0 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 0 | VSX = 0 |
sampling: temp = 0.800000, top_k = 40, top_p = 0.950000, repeat_last_n = 64, repeat_penalty = 1.100000
generate: n_ctx = 512, n_batch = 512, n_predict = 128, n_keep = 0


 Please tell me the capital of Japan.
What is the official language spoken in Japan?
When was the Japanese Constitution adopted?
Which type of government does Japan have? [end of text]

llama_print_timings:        load time = 175889.53 ms
llama_print_timings:      sample time =   396.83 ms /    30 runs   (   13.23 ms per run)
llama_print_timings: prompt eval time = 105482.86 ms /     8 tokens (13185.36 ms per token)
llama_print_timings:        eval time = 3247046.39 ms /    29 runs   (111967.12 ms per run)
llama_print_timings:       total time = 3423387.17 ms

回答を得るのに約57分。1トークンに2分程度かかりました。

最終回答はこの部分。

What is the official language spoken in Japan?
When was the Japanese Constitution adopted?
Which type of government does Japan have?

google翻訳
日本で話されている公用語は?
日本国憲法が採択されたのはいつですか.
日本にはどのような政府がありますか?

質問が悪かったのか、教えてくれるどころか逆に質問攻め。
(ちゃんと目的沿ってチューニングしたモデルを使わないとダメですね)

まとめ

簡単にラズパイでもLLMの推論を実行する事が出来ました。
ただこちらの記事[1]では10秒/トークンで実行出来たという情報もあるので私もpromptを変更して何回か試してみましたが全て2分/トークンだったのが何故なのかまではわかりませんでした…。

まだまだ低速すぎるので実用には遠いですが、ラズパイでLLMを動かせたという事には夢が広がりますね。今後ラズパイの新しいバージョンやLLaMa.cpp自体が最適化されてくれば実用レベルになる日も遠くはないかもしれません。(LLaMaは商用禁止なので気をつけましょう。)

脚注
  1. 参考記事 https://www.itmedia.co.jp/news/articles/2303/18/news059.html ↩︎

テラーノベル テックブログ

Discussion

nonannenonanne

初めまして、こんにちは。
記事を参考にさせて頂いているのですが、Pi3141/alpaca-lora-7B-ggmlが見つからず、
似ているPi3141/alpaca-lora-30B-ggmlがあったので代用してみたのですがファイルが足りないとエラーが出てしまいました。
Pi3141/alpaca-lora-7B-ggmlはもう無いということでしょうか?