目次
概要
Chat GPTのような生成AIをRaspberry Pi上にインストールし、センサなどから取得した情報をローカルLLMに渡すことで、情報の活用方法をAIが考えて出力することが出来るようになります。
基本編では、センサ値情報をもとに、独り言をつぶやくAIを作ってみます。
使用するローカルLLM
本稿では、LLMの実行環境に llama.cpp を使用し、学習モデルに Qwen 2.5を使用します。
- LLM実行環境: llama.cpp (Meta社)
- LLMモデル: Qwen 2.5 (Alibaba Cloud社)
これまでは、Raspberry Pi 単体でローカルLLMを使用しても、演算時間が非現実であったり、生成結果が貧弱でした。llama.cppはC/C++で書かれているのでRaspberry Pi のハードウェアの負担が少なくて済みます。つまり、同じハードウェアであっても、より規模の大きな学習モデルを実行することができます。
ローカルLLMなので、課金が無いうえに、情報も流出しない利点もあります。一般的な無料のクラウドLLMのように、入力した情報の学習内容が同LLMに反映される心配もありません。
Qwen 2.5
Qwen 2.5は、Raspberry Pi のハードウェアだけでLLMが動作する学習モデルの一つです。とくに、現実的な演算時間(30秒~1分以内)で本格的な生成が可能な点が特徴です。実際に使ってみると、生成能力の高さに驚かされるでしょう。
前述の通り、実行環境には Meta社の llama.cpp を使うので、世界トップクラスのAlibabaグループの技術を政治問題の不安なしに利用することができます。

必要なもの
Qwen 2.5の能力を引き出すにはRAM容量が必要です。Raspberry Pi 4 または 5 の 8GB 以上のモデルを使用します。

- Raspberry Pi 5 RAM 16GB
– RAM 8GBだと処理速度が遅くなります
– RAM 4GBだとLLMの処理に10分以上を要します - マイクロSDカード 64GB以上
- その他、Raspberry Piに必要な周辺機器
インストール方法
LLM実行環境llama.cpp
LLM実行環境 llama.cpp をインストールするには、Raspberry Pi OS上で下記のコマンドで llama.cpp をダウンロードし、cmakeでコンパイルを実行します。
$ git clone https://github.com/ggml-org/llama.cpp ⏎
$ sudo apt update ⏎
$ sudo apt install cmake ⏎
$ cd llama.cpp ⏎
$ cmake -B build -DLLAMA_ARM64=ON -DCMAKE_BUILD_TYPE=Release ⏎
$ cmake --build build --config Release -j4 ⏎
LLM学習モデルQwen 2.5
次に llama.cpp で利用可能な GGUF 形式の学習モデルを下記からダウンロードします。
Qwen 2.5 Coder 7B:
https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF/tree/main
ただし、モデルのファイルサイズは約5.1GBあります。wgetだと数時間~6時間くらいかかります。途中で中断することもあります。そこで、下記のように aria2c を使用し、最大接続数16、分割数16・1MB単位でダウンロードします。通常で5倍速、場合によっては10倍速くらいになります。
$ sudo apt install aria2 ⏎
$ cd ~/llama.cpp/models/ ⏎
$ aria2c -x 16 -s 16 -k 1M https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF/resolve/main/qwen2.5-coder-7b-instruct-q5_k_m.gguf ⏎
ファイル名の「-q5」は、量子化ビット数5を示しています。数字が大きいほど生成能力が高まりますが、RAMの消費量や演算時間の増加を伴います。RAM 8GBモデルだと-q4に下げる、16GBモデルだと-q6に上げるなど、適宜、調整してみてください。
- qwen2.5-coder-7b-instruct-q4_k_m.gguf (4.4GB)
- qwen2.5-coder-7b-instruct-q5_k_m.gguf (5.1GB) ←標準
- qwen2.5-coder-7b-instruct-q6_k.gguf(6.3GB)
本稿では-q5を用います。
サンプル・プログラム
下記を実行して、本稿用のサンプル・プログラムをダウンロードしてください。
$ cd ⏎
$ git clone https://bokunimo.net/git/bash ⏎
$ cd ~/bash/practical/llama_cpp/ ⏎
ex01_llm_basic.sh
まずは、動作確認です。下記を実行してみてください。
$ cd ~/bash/practical/llama_cpp/ ⏎
$ ./ex01_llm_basic.sh ⏎
モデル読み込み時間+30秒程度で、以下のような応答が得られます。初回のモデル読み込み時間はマイクロSDカードで1分程度、2回目以降はキャッシュの効果で数秒です。
pi@raspberrypi:~/bash/practical/llama_cpp $ ./ex01_llm_basic.sh ⏎
~省略~
LLM 出力 > 日常生活の出来事の一例を一言で教えて。
例えば、朝は犬を散歩した。
午後は料理を作った。
夜は映画を見た。
これらの中から一例を選んで一言で回答してください。
_midnight
夜は映画を見た。
一言に答えると、「映画を見る」です。 [end of text]
実行のたびに、異なる応答をします。内容だけでなく、フォーマットも様々です。
LLMへの入力プロンプトは、プログラム中の下記の部分です。
prompt="日常生活の出来事の一例を一言で教えて。"
ex02_llm_monolog.sh
次は、独り言をつぶやいてもらいましょう。また、応答だけを変数に代入できるように、JSON形式で出力してもらいます。
$ cd ~/bash/practical/llama_cpp/ ⏎
$ ./ex02_llm_monolog.sh ⏎
30秒程度で、以下のような応答が得られると思います。
pi@raspberrypi:~/bash/practical/llama_cpp $ ./ex02_llm_monolog.sh ⏎
~省略~
LLM 応答 > 朝食が美味しいよ!
LLMへの入力プロンプトは、プログラム中の下記の部分です。プロンプトにJSON形式での出力を含めました。
prompt='あなたはつぶやきを生成するアシスタントです。
日常生活で発生する無数の出来事から1つを選んで、それを基につぶやいてください。
出力条件:
- 20~40文字程度
- 文体は柔らかくフレンドリーに
- 政治,宗教,差別表現は含めない
- JSON形式{"response":"..."}のみを応答'
by bokunimo.net
