以前の投稿では、少し古いゲーミングPCにUbuntu
をインストールし、Dockerコンテナ
を使ってOllama
を起動し、ローカルLLM環境
を構築しました。
PC上でローカルLLM
を動作させていましたが、最近ではモデルサイズが小さく、よりコンパクトなLLM
が登場しています。このようなモデルであれば、RaspberryPi
のようなエッジデバイスでも動作可能です。少し前には、RaspberryPi5
でTinyLlama
というコンパクトなLLM
を動作させる記事が話題になっていました。
参考
恥ずかしながら今回の内容はその何番煎じというものです🫠🫠🫠 作業内容は参考サイトでもかなり記載があるので、こちらではある程度にとどめ、私は使用感など見ていきたいと思います。
- 今回の動作環境
- RaspberryPiにDockerをインストール
- OllamaのDockerコンテナを作成する
- RaspberryPiでローカルLLMを動作させる
- 今回使用したLLMとその起動コマンド
- モデルサイズの限界への挑戦
- おわりに
今回の動作環境
今回の動作環境はRaspberry5(8GB)に最新(2024.08.14時点)のRaspberryPiOS(bookworm)で確認しています。
RaspberryPiにDockerをインストール
PC同様にRaspberryPi
にもDocker
をインストールを行います。RaspberryPi
へのDocker
のインストールに関しては過去にも取り上げました。Docker
のサイトにも作業方法が載っています。
参考
念の為にGist
でコマンドの流れをまとめておきます。
OllamaのDockerコンテナを作成する
こちらの作業は以前のエントリを参考にします。このあたりはDocker
という共通基盤があるので大きくは変わりません。
先日のエントリと大きく異なるのはGPU
がないという点です。そのあたりを気をつけて以下のコマンドを実行してコンテナを構築します。
コンテナの構築(初回)
$ mkdir ~/ollama # ホストとのファイル共有ディレクトリ作成 $ docker run -d -v ~/ollama:/ollama -p 11434:11434 --name ollama ollama/ollama
コンテナの起動(2回目以降)
$ docker start ollama
Docker
を使用することでほとんどの作業はOSに依存することなく作成できますね。
これで準備完了です。
RaspberryPiでローカルLLMを動作させる
あとは、Dockerコンテナ
のOllama
を使用してLLM
を起動していきます。今回はサンプル数の少ない1B~3B程度のモデルを使います。また、別の視点でモデルの限界の大きさにもトライする意味を込めてllama3.1:8B
も起動してみます。
Ollamaをモデル指定して起動する一般的な形
$ docker exec -it ollama ollama run 【モデル名】
Ollamaに対応したモデルの一覧はこちらになります
今回使用したLLMとその起動コマンド
今回使用したのは以下のモデルになります。
- tinyllama:1.1b
- gemma2:2b
- phi3:3.8b
- llama3.1:8b(大きなモデルの実験)
今回の実行では、CPUやメモリの消費量を確認したいこともあったので、実行するTerminalの隣にhtopコマンド
(topコマンドより見やすい)の結果を並列に表示しています。どのモデルを実行してもCPUの4コアあるコアのすべてが100%の使用になり、RaspberryPi
につけたファンも全開で回っています。電源は5V5A出力のACアダプタ、ファン必須と考えたほうが良さそうです。自分はこのためにACアダプタを以下のものに新調しました。
参考
起動コマンド一覧
# tinyllama:1.1b $ docker exec -it ollama ollama run tinyllama:1.1b # gemma2:2b $ docker exec -it ollama ollama run gemma2:2b # phi3:3.8b $ docker exec -it ollama ollama run phi3:3.8b # llama3.1:8b $ docker exec -it ollama ollama run llama3.1:8b
tinyllama:1.1bの使用
後述するllamaモデル
をリファインしたオープンソースモデルになります。
The TinyLlama project is an open endeavor to train a compact 1.1B Llama model on 3 trillion tokens.
他のモデルではプロンプトの日本語化にも対応しているのですが、こちらのモデルでは英語がベースなのでプロンプトも英語に訳してから使用しています。結果としては運が良ければ、唐揚げの作り方知っているような返答は来ますが、運が悪いと全く異なるものとして認識した返答もしばしばあります。プロンプトの工夫を行う必要はあるのかもしれません。
参照
実行例
出力例
>>> How to make fried chicken? Here's how to make fried chicken using an electric frying pan: Ingredients: - 2 lbs boneless, skinless chicken breast (cut into pieces) - Salt and pepper - 1/4 cup cornstarch - 2 tbsp vegetable oil - 2 tbsp flour Instructions: 1. Heat the oil in a large electric frying pan over medium heat. 2. Season the chicken with salt and pepper on both sides. 3. Dredge each piece in cornstarch until lightly coated. 4. Carefully place the chicken into the pan, skin side down. 5. Cook for 2-3 minutes or until golden brown on one side. 6. Using a slotted spoon, transfer the fried chicken to a paper towel-lined plate or clean dish towel. 7. Repeat with the remaining chicken pieces. 8. Drain excess oil and serve hot. Enjoy your homemade fried chicken!
gemma2:2bの使用
Google
が開発するAIオープンソースモデルGemma2
となります。今回はもっとも小さい2Bモデル
を使用しています。2Bのモデル
ですが日本語の対応も素晴らしい結果です。
Google Gemma 2 is a high-performing and efficient model by now available in three sizes: 2B, 9B, and 27B.
参照
実行例
日本語の対応していて、かつかなり早い返答をしてくれるという意味では今回の中では一番優秀な結果だったと思います。 また、かなり情報精度もとてもいい感じです。
出力例
>>> からあげの作り方 ## からあげの作り方 **材料(4人分)** * Chicken (鶏肉) : 500g (約1.1lb) * 片栗粉 : 150g * 塩 : 少々 * 胡椒 : 少々 * 醤油 : 大さじ2 * 酒 : 大さじ1 * みりん : 大さじ1 * 生姜 : 少々 (お好みで) * サラダ油 : 大さじ1 **作り方** 1. **鶏肉の準備:** * 鶏肉の皮と骨を取り除く。 * 厚さ3cm程度に切り、一口大にする。 2. **片栗粉のつけ方:** * フライパンを熱してサラダ油をひく。 * 片栗粉をすべて加えて混ぜる。 3. **から揚げの調理:** * 鶏肉に片栗粉をつけ、塩、胡椒をまぶす。 4. **味付け:** * 醤油、酒、みりん、生姜(お好みで)を加え、よく混ぜ合わせる。 5. **揚げる:** * 熱した油 (170℃程度) で、から揚げを両面を揚げる。(中火~弱火でゆっ くりと揚げる) * 油が飛んでくるまで揚げる。 6. **完成:** * 揚げ上がったら、紙タオルなどで油を拭き取ります。 * からあげを盛り付け、お好みでポン酢やソースをかけて食べましょう。 **ポイント** * 鶏肉は、皮と骨を取り除くのがポイントです。 * 片栗粉のつけ方によって、から揚げがサクサクに仕上がります。 * 醤油、酒、みりんなどを混ぜることで、味が染み込みます。 **その他** * から揚げに使う鶏肉は、皮と骨を取り除くのがポイントです。 * 片栗粉のつけ方によって、から揚げがサクサクに仕上がります。 * 醤油、酒、みりんなどを混ぜることで、味が染み込みます。
phi3:3.8bの使用
Phi3
はMicrosoftで開発している小型のLLM
(小型の場合にはSLM
というらしい)となります。こちらも携帯電話やSBCなどでの活用を視野に開発されたモデルとのこと。Phi3
の第一言語は英語なので、日本語の場合、能力が低下すると書かれていた割にはかなり高性能と感じています。
Phi-3 is a family of lightweight 3B (Mini) and 14B (Medium) state-of-the-art open models by Microsoft.
参照
実行例
日本語にも対応しているモデルではありますが、よくわからない内容や表現もあるみたいです。
モデルサイズの限界への挑戦
llama3.1:8bの使用
Meta
社の作成したLLM
となります。大規模なモデルもありますが、今回は8Bモデル
を使用しています。RaspberryPi5
のメモリが8GBということもあり、このサイズのものが限界に近いかなと感じています。ちなみにメモリが足りないとOllama
の起動に失敗します。
Llama 3.1 is a new state-of-the-art model from Meta available in 8B, 70B and 405B parameter sizes.
参照
実行例
今回は8Bモデル
を動作させていて、メモリの使用量としてはhtopコマンド
の結果では6GB程度使用しているので、RaspberryPi5(8GB)
では、これより大きなモデルの使用は難しいでしょう。文書の生成スピードに関しては結構遅いかなと感じるのですが、かなり読み応えのある文を生成していることにも起因しているのかもしれません。また、日本語に対応しているモデルなのですが、意味不明であったり、わかりにくい表現も含まれているようです。このあたりは今後の期待でしょうか。
おわりに
今回の実験では、RaspberryPi5
という限られたリソースしかないエッジデバイス上で、Docker
を経由してOllama
のLLM
を動作させてみました。LLM
のモデルサイズや性能によっては、RaspberryPi
のような小型デバイスでもある程度動作可能であることが感じられたかなと思います。今後は更に小型や効率的なモデルが登場することで、エッジデバイスでのLLM
利用も可能なのではないかと夢が広がります。この内容がエッジAIの活用におけるヒントとなればと思っています。