ラズパイ5(8GB)で、日本語対応の7B(70億)パラメータのLLMを量子化して使ってみる


Appendix にラズパイ4での結果を追加しました。


今までは型落ちといえども一応PCを使ってきましたが、今回はSBC(シングルボードコンピュータ)です。

Raspberry Pi 5(8GB)です。

 

 

 

 

 

 

MicroSDカードは64GBは必要です。できれば128GBを使います。

OSイメージはRaspberry Pi OS 64-bit Bookworm (Debian 12) です。

Python は3.11.2 。

Raspberry Pi Imager

 

 

 

 

 

 

 

 

 

 

OSインストールと環境設定後は、メモリ節約のためCLIモードで再起動します。

 

 

 

 

 

 

 

 

CLI画面からデスクトップ画面を再表示する場合は

startx 

注:デスクトップを使わないという意味でOS Lite (64-bit) という選択もありますが、どっちにしろそんなに差はないようです。

8GBメモリに対して、Lite –> 7329.8 MiB Free , CLI –> 7453.3 MiB Free

 

前回同様にHuggingFaceにアップしてあるcyberagent/calm2-7b-chatをggufに変換後、今度はq4_0型に量子化してから使ってみます。

推論実行中は素のままだとCPU温度が85℃を超える場合もあるので冷却FAN(できればヒートシンクも)は必須です。

Raspberry Pi 5は5V/5A の電源が推奨されていますが、このようなタスクのみなら5V/3A でも問題ありませんでした。

 

 

 

 

 

 

また、同梱されているドキュメントにはオーバークロックはしないでね…..と明記されているので動作周波数は2.4GHzのままです。

 


やってみました、7B(70億)パラメータの量子化モデルがさほどのストレスもなく、何の問題もなしで動きました。

Python仮想空間(venv1)を作ってそこで実行してみます(pip は仮想空間でしか使えないようです)。

必要なライブラリなどをインストール

llama.cpp をインストール

ディレクトリを作ってモデルをHuggingFace からダウンロードします。CyberAgent のcalm2-7b-chat です。

python でvocab.json(頻度の高いトークンのリスト)を作成します。

cd ~/models/hf/models--cyberagent--calm2-7b-chat/snapshots/3e110c7624ff7a940badebfd5f9a91569f98cc56

>python3

pythonコンソールを抜けてvocab.jsonファイルが作成されているのを確認。

 

 

 

 

llama.cppディレクトリのトップに移動

GGUFファイルを作成します。

python3 convert.py --vocabtype bpe --outfile ~/models/gguf/calm2-7b-chat.gguf ~/models/hf/models--cyberagent--calm2-7b-chat/snapshots/3e110c7624ff7a940badebfd5f9a91569f98cc56

q4_0型で量子化。

いつもどおり「日本で一番高い山はどこですか?」と尋ねてみます。

次いで、「雨降りの準備はどうしたらいいですか?」。

 

 


LLMの7BパラメータモデルをWebで使ってみると同様にHTTPサーバーを建てることもできます。

こんな感じ。

さほどのストレス無しで応答が返ってきましたが、最後の質問には何故か30秒以上応答が返ってきませんでした。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Appendix

ラズパイ4(8MG)でも実行可能でした。ただ、応答速度は少々遅いです(5との差は単純に動作周波数の差かも…2.4 : 2 )。

組み合わせはこんな感じ。

Raspberry Pi 4 (8GB)  +  Raspberry Pi OS Lite Bookworm (64-bit)  + オーバークロック(2GHz)

 

以下のライブラリを追加

モデルの読み込みはだいぶ時間がかかりました。

推論に関しては、一瞬「あれ?まだかな?」というタイミングで応答が返ってくる感じです。

ラズパイのオーバークロックについては以下を参照

ラズパイをオーバークロックして使う(メモ)

 


Appendix1

ラズパイ4(8MG)ではオーバークロックしても7Bサイズのモデルは少々苦しいです。サイズを落として3Bではどうでしょう。

日本語対応の3Bモデルでは、CyberAgent のOpenCalm がありました。HuggingFace のmmnga/cyberagent-open-calm-3b-ggufに量子化済のモデルがアップされています。

この中からcyberagent-open-calm-3b-q4_0.ggufを使ってみます。

ディレクトリを作成してダウンロードします。

llama.cpp をクローンしてビルドしますが、他のページで使ったllma.cppではモデルのロードで失敗します。

以下のllama.cppを使えということでした。

このモデルはChatやInstruction のような使い方はできません。得意なのはセンテンスの続きを予測して文章を生成することです。OpenCalm を対話型にする場合はファインチューニングする必要があります。このページ参照

以下のようなプロンプトを実行させてみます。

./main -m '/home/foo3/models/gguf/cyberagent-open-calm-3b-q4_0.gguf' -n 128 -p '晩御飯には何を食べようか、考えていたのだが' --top_p 0.9 --temp 0.7 --repeat-penalty 1.1

こんな感じ。文章の生成自体はスムーズでした。生成文はかなりシュールですが。基本的にOpenCalm-3Bの生成文はかなりです。

 

 

 

 

 

 

 

 

 

 

 


Appendix2

試しに5もオーバークロックして、3GHzでやってみました。

軽快に応答してくれます。ただし、CPU温度は冷却対策してもMaxで84.8度まで上昇していました。

同梱のドキュメントには「オーバークロックをしてはなりませぬ…..」とか記載してますが、公式では否定してないみたいですね。

 


Appendix3

Swap も使われていますが、メモリは8GBギリ消費されています。

 

 

 

 

 

 

 

 

 

 

 

 

 


Appendix4

 

型落ちPCのCPUのみで、日本語対応の7B(70億)パラメータのLLMを量子化して使ってみる

 


Appendix5

HuggingFace Hub リンク

elyza/ELYZA-japanese-Llama-2-7b

量子化済み ELYZA-japanese-Llama-2-7b-fast-instruct

rinna/youri-7b-chat

量子化済み rinna-youri-7b-chat

cyberagent/calm2-7b-chat

量子化済み cyberagent-open-calm-3b

 

日本語LLMまとめ

 


Appendix6

ラズパイ5ではUbuntuをImager からインストールする場合、バージョンはServer  23.10です。

参考 ラズパイ4(4GB) にUbuntu Server 20.04 LTS をセットアップ、GUI追加

venvが入っていないので以下実行

後は同様にやってみましょう。

 


Appendix7

量子化ってどういうことかの説明から、BitNet b1.58って何?まで。

BitNetから始める量子化入門

 


Next

エッジでLLM が使えるかも….となったら、次はLangChain + LlamaIndex でプライベート情報を読み込んでインデックス化して使ってみます。

クラウドのLLMではプライベート情報を載せるわけにはいきませんが、オフラインのエッジデバイスなら問題は起きません。

ただ、結果からいいますと、ラズパイ5(8GB)でELYZA やRinnaの7Bモデルを3GHzにオーバークロックして実行させても応答が返ってくるのに1分30秒弱かかってしまいました。まあ、使えないことはないですが、あまり使いたくないパフォーマンスでした。

BitNet b1.58 が使えるようになるまで待った方がいいのかも….(Jetson Orin NX 16GB は高価すぎるし)。

各種パッケージやライブラリのバージョン合わせが面倒で、動いているllama-index のバージョンは0.6.24です。

 


 

 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*