RaspberryPi5で挑む!DockerとOllamaを活用したローカルLLM環境の構築と実験

以前の投稿では、少し古いゲーミングPCにUbuntuをインストールし、Dockerコンテナを使ってOllamaを起動し、ローカルLLM環境を構築しました。

PC上でローカルLLMを動作させていましたが、最近ではモデルサイズが小さく、よりコンパクトなLLMが登場しています。このようなモデルであれば、RaspberryPiのようなエッジデバイスでも動作可能です。少し前には、RaspberryPi5TinyLlamaというコンパクトなLLMを動作させる記事が話題になっていました。

参考

qiita.com

zenn.dev

kotamorishita.com

恥ずかしながら今回の内容はその何番煎じというものです🫠🫠🫠 作業内容は参考サイトでもかなり記載があるので、こちらではある程度にとどめ、私は使用感など見ていきたいと思います。

今回の動作環境

今回の動作環境はRaspberry5(8GB)に最新(2024.08.14時点)のRaspberryPiOS(bookworm)で確認しています。

RaspberryPiにDockerをインストール

PC同様にRaspberryPiにもDockerをインストールを行います。RaspberryPiへのDockerのインストールに関しては過去にも取り上げました。Dockerのサイトにも作業方法が載っています。

参考

uepon.hatenadiary.com

docs.docker.com

念の為にGistでコマンドの流れをまとめておきます。

RaspberryPiにDockerをインストール

OllamaのDockerコンテナを作成する

こちらの作業は以前のエントリを参考にします。このあたりはDockerという共通基盤があるので大きくは変わりません。 先日のエントリと大きく異なるのはGPUがないという点です。そのあたりを気をつけて以下のコマンドを実行してコンテナを構築します。

uepon.hatenadiary.com

コンテナの構築(初回)

$ 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に対応したモデルの一覧はこちらになります

ollama.com

今回使用したLLMとその起動コマンド

今回使用したのは以下のモデルになります。

  • tinyllama:1.1b
  • gemma2:2b
  • phi3:3.8b
  • llama3.1:8b(大きなモデルの実験)

今回の実行では、CPUやメモリの消費量を確認したいこともあったので、実行するTerminalの隣にhtopコマンド(topコマンドより見やすい)の結果を並列に表示しています。どのモデルを実行してもCPUの4コアあるコアのすべてが100%の使用になり、RaspberryPiにつけたファンも全開で回っています。電源は5V5A出力のACアダプタ、ファン必須と考えたほうが良さそうです。自分はこのためにACアダプタを以下のものに新調しました。

参考

ja.wikipedia.org

起動コマンド一覧

# 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.

他のモデルではプロンプトの日本語化にも対応しているのですが、こちらのモデルでは英語がベースなのでプロンプトも英語に訳してから使用しています。結果としては運が良ければ、唐揚げの作り方知っているような返答は来ますが、運が悪いと全く異なるものとして認識した返答もしばしばあります。プロンプトの工夫を行う必要はあるのかもしれません。

参照

ollama.com

実行例

www.youtube.com

出力例

>>> 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.

参照

ollama.com

実行例

www.youtube.com

日本語の対応していて、かつかなり早い返答をしてくれるという意味では今回の中では一番優秀な結果だったと思います。 また、かなり情報精度もとてもいい感じです。

出力例

>>> からあげの作り方
## からあげの作り方 

**材料(4人分)**
* Chicken (鶏肉) : 500g (約1.1lb)
* 片栗粉 : 150g 
* 塩 : 少々
* 胡椒 : 少々
* 醤油 : 大さじ2
* 酒 : 大さじ1
* みりん : 大さじ1
* 生姜 : 少々 (お好みで)
* サラダ油 : 大さじ1

**作り方**
1. **鶏肉の準備:** 
    * 鶏肉の皮と骨を取り除く。
    * 厚さ3cm程度に切り、一口大にする。
2. **片栗粉のつけ方:** 
    * フライパンを熱してサラダ油をひく。
    * 片栗粉をすべて加えて混ぜる。
3. **から揚げの調理:** 
    * 鶏肉に片栗粉をつけ、塩、胡椒をまぶす。
4. **味付け:** 
    * 醤油、酒、みりん、生姜(お好みで)を加え、よく混ぜ合わせる。
5. **揚げる:** 
    * 熱した油 (170℃程度) で、から揚げを両面を揚げる。(中火~弱火でゆっ
くりと揚げる)
    * 油が飛んでくるまで揚げる。
6. **完成:** 
    * 揚げ上がったら、紙タオルなどで油を拭き取ります。
    * からあげを盛り付け、お好みでポン酢やソースをかけて食べましょう。

**ポイント**
* 鶏肉は、皮と骨を取り除くのがポイントです。
* 片栗粉のつけ方によって、から揚げがサクサクに仕上がります。
* 醤油、酒、みりんなどを混ぜることで、味が染み込みます。

 **その他**
* から揚げに使う鶏肉は、皮と骨を取り除くのがポイントです。
* 片栗粉のつけ方によって、から揚げがサクサクに仕上がります。
* 醤油、酒、みりんなどを混ぜることで、味が染み込みます。

phi3:3.8bの使用

Phi3Microsoftで開発している小型のLLM(小型の場合にはSLMというらしい)となります。こちらも携帯電話やSBCなどでの活用を視野に開発されたモデルとのこと。Phi3第一言語は英語なので、日本語の場合、能力が低下すると書かれていた割にはかなり高性能と感じています。

Phi-3 is a family of lightweight 3B (Mini) and 14B (Medium) state-of-the-art open models by Microsoft.

参照

ollama.com

実行例

www.youtube.com

日本語にも対応しているモデルではありますが、よくわからない内容や表現もあるみたいです。

モデルサイズの限界への挑戦

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.

参照

ollama.com

実行例

www.youtube.com

今回は8Bモデルを動作させていて、メモリの使用量としてはhtopコマンドの結果では6GB程度使用しているので、RaspberryPi5(8GB)では、これより大きなモデルの使用は難しいでしょう。文書の生成スピードに関しては結構遅いかなと感じるのですが、かなり読み応えのある文を生成していることにも起因しているのかもしれません。また、日本語に対応しているモデルなのですが、意味不明であったり、わかりにくい表現も含まれているようです。このあたりは今後の期待でしょうか。

おわりに

今回の実験では、RaspberryPi5という限られたリソースしかないエッジデバイス上で、Dockerを経由してOllamaLLMを動作させてみました。LLMのモデルサイズや性能によっては、RaspberryPiのような小型デバイスでもある程度動作可能であることが感じられたかなと思います。今後は更に小型や効率的なモデルが登場することで、エッジデバイスでのLLM利用も可能なのではないかと夢が広がります。この内容がエッジAIの活用におけるヒントとなればと思っています。

/* -----codeの行番号----- */