カテゴリー
Raspberry Pi

ローカルLLM生成AIで考えるRaspberry Pi [基本編]

Raspberry Pi で動作化可能なローカルLLMを利用し、センサなどの情報から分かる内容を生成AIに考えてもらって出力するシステムを構築してみます。

概要

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グループの技術を政治問題の不安なしに利用することができます。

llama.cpp上でQwen 2.5とのチャット例

必要なもの

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

Raspberry Pi 5 RAM 16GB
  • 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es