Raspberry pi 5 (ラズパイ5)で日本語ローカルLLMを実行



:::note warn
この記事は、[Supershipグループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/supership)の 12日目の記事になります。
:::

## 要約
- ラズパイ5上でOlamaを用いてローカルLLMをいくつか実行

## はじめに
去年は[Snowflakeについての記事](https://qiita.com/suzukitheseventh/items/56141463ba5f8d188718)を作成しましたが、今年はRaspberryPi 5 (ラズパイ5)でローカルLLMを実行したことについての記事にしようと思います。

## 動機
ネットがつながる環境であれば[ChatGPT](https://openai.com/ja-JP/chatgpt/overview/)や[Perplexity AI](https://www.perplexity.ai/) 等、高性能なLLMを利用可能な時代となってきました。
ネットが繋がらない状態となってもLLMを使えるようにしておきたいという考えと、
業務で使うことになってもAPIでの利用で、LLMをローカルPCで構築する機会は少ないと思い、学びのためにもローカルPCで構築してみようという考えからラズパイ5でローカルLLMを動かしてみました。


## ラズパイ5について
ラズパイ5は詳しくは[Wikipediaのページ](https://ja.wikipedia.org/wiki/Raspberry_Pi)等をご確認ください。(「今回の
LLMに聞いてみた結果はこちらです」とかできればよかったですが残念ながら今回実行のLLMでは4までしか知識になかったです)

初めて知った方は小型のPCと認識いただければと思います。
既存PCにあれこれダウンロードして失敗して不具合でるのが嫌だったため、最悪壊れても影響がないように、新規で購入しました。

今回は[こちらのスターターキット](https://www.amazon.co.jp/TRASKIT-Raspberry-Starter-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A45%EF%BC%888GB-RAM%EF%BC%89%E6%8A%80%E9%81%A9%E3%83%9E%E3%83%BC%E3%82%AF%E4%BB%98%E2%80%94%E2%80%94128GB%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4OS%E3%82%92%E3%83%97%E3%83%AA%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%EF%BC%88%E8%B5%A4%E3%83%BB%E7%99%BD%E3%82%B1%E3%83%BC%E3%82%B9%EF%BC%89/dp/B0CZLCHNJ4/ref=asc_df_B0CZLCHNJ4?mcid=65f5a834e65737e7bd24cf4769754b50&tag=jpgo-22&linkCode=df0&hvadid=707464437007&hvpos=&hvnetw=g&hvrand=13714029237932033586&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9168726&hvtargid=pla-2301011590713&psc=1&gad_source=1)をAmazonのセールで購入して用いました。(約2万円。メモリ8GB。マウス、キーボード、モニタは別)

選定理由はラズパイ3は少し触った経験があったのと、[こちらの記事](https://qiita.com/kazuhitoyokoi/items/66e8c9e1b447a2850ba7)でラズパイ5上でローカルLLMが動きそうなことがわかっていたためです。

## ラズパイ5セットアップ
慣れた人であればmicroSDにOSを書き込むところからですが、OS書き込み用のソフトが必要で「既存PCにあれこれダウンロードしたくない」に反するため、SO書き込み済みのスターターキットを購入したためOS書き込みはskipです。

箱からだして、付属のファンを両面テープとビスでくっつけ、ケースにいれてネジで止めます。

マウス、キーボード、モニタに接続し、コンセントにさしたところ...モニタが映りませんでした...
本体のライトはついており、モニタの電源もついているのですが、モニタに何も映りません...
本体ランプは緑なので、本体は正常と信じ、モニタ交換を行いました。2台のモニタを試してみたのですが映らず、3台目のモニタで映りました。

「映らないな」と思った方はモニタを変えてみるのも手です。

映ったあとは画面の表示にしたがってセットアップを完了させました。

セットアップ時日本を選択したため、各種ボタンは日本語なのですが、日本語入力ができなかったため、[こちらの記事](https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-input-japanese/)を参考にして入力可能としました。(ブラウザでの入力はうまくいかなかったため一旦保留して、ブラウザでの日本語入力時は、Mosepadで打ち込んだ日本語をコピペという形で対応しました。)


## まずは動くLLMを確認
まずは[こちらの記事](https://qiita.com/kazuhitoyokoi/items/66e8c9e1b447a2850ba7)を再現するために記事どおりTinyLlamaを動かしたところ無事動きました。

ためしにWhat is LLM?と聞くと、法学修士の学位のLLM(Latin Legum Magister)を答えていそうでした。内容は意図したものではなかったですが英語の文法的には違和感なさそうでした。

## 日本語ローカルLLMの種類について
実際に使いたいのは日本語でやりとり可能なLLMなので、そもそも日本語でやりとり可能なLLMにはどのようなものがあるのだろうと思い検索したところ、[こちらの記事](https://zenn.dev/hellorusk/books/e56548029b391f/viewer/ollama1)がわかりやすかったです。

非GPUで動くためには「[量子化](https://zenn.dev/hellorusk/books/e56548029b391f/viewer/intro3)」されている必要があるということで、公式で量子化されていそうなのがtanukiとELYZAを試すことにしました。

## Ollamaについて
前の項で参考としたHelloRuskさんの記事内ではOllamaを導入していたため、ラズパイでOllamaが動くかを検索したところ[こちらの記事](https://zenn.dev/karaage0703/articles/5fd411a9358898)を見つけたため、記事どおりにDockerを利用してOllamaを導入しました。

記事通りMeta社のLlama3を動くことは確認ができました。


## 日本語ローカルLLMの実行
### tanuki
前の項で参考としたkaraage0703さんの記事内でtanukiの実行までしていたため、記事どおりに、7shiさんの量子化したものを試したところ動かすことができました。


「日本で一番高い山はなんですか？」
と聞くと13秒くらいしてから回答を始めてくれました。
ラズパイと記事を書いているPCの連携ができていないため全文を書くことはしないですが、
```
日本で最も高い山についてお答えします。まず、日本には多くの山々がありますが、その中でも特に高い山として知られるのは富士山です。...
```
と日本語としても違和感なく丁寧に答えてくれました。


ちなみに、公式のGGUF量子化は公式でも非推奨と明記されているため動かないだろうとは思いつつ試してみると、Ollamaにより導入まではエラーなく進んだのですが、「質問しても何も返ってこない」という形で動かなかったです。



### ELYZA
ELYZAに関してもkaraage0703さんの記事を参考に下記を実行することで導入できました。

```
docker exec -it ollama ollama run hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF:latest
```

「日本で一番高い山はなんですか？」
と聞くと5秒くらいしてから回答を始めてくれました。

```
と聞かれたら、多くの人が「富士山」と答えるでしょう。実際に、日本の最高峰は富士山（3,776メートル）です。

ところが、...(中略)...
山脈としての最高峰はどこかというと、実は「北海道本邦離島（りとう）」にあります。
...

```
tanukiと比べて早いのですが、下記はじめが「と聞かれたら、」から始まっているので、Q&Aの形式としては違和感があると思いました。また、最初に「富士山」と回答できたのは良いですが、その後の補足説明で、「北海道本邦離島（りとう）」と説明しており、この山脈？はググってもでて来なかったのでハルシネーションが生じていると思われます。

## WebUI化
[karaage0703さんの別記事](https://zenn.dev/karaage0703/articles/c271ca65b91bdb#ollama-%2B-open-webui%E3%81%A7gui%E4%BB%98%E3%81%8D%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E6%96%B9%E6%B3%95)を参考にWebUI化もすることができました。
「テスト用だしログインアドレスどうしよう」と思ったので少し調べたところ、[こちらの記事](https://qiita.com/jnchito/items/198a2561a36c2c2ef5e3)を見つけましたので、でたらめなアドレスを使うのは避けて`test@example.com`を利用しました。
回答を始めるまで時間がかかり、回答が始まってからはコマンドライン上での回答と同じくらいの速度で回答していました。

## Bitnet(できなかったです...)
「日本語ローカルLLMの種類について」で紹介した記事の量子化の説明で触れられていたBitnetが[使える形で登場](https://qiita.com/2626/items/da7811c8b044f5f04927)という記事を見かけたので試してみました。

[公式github repository](https://github.com/microsoft/BitNet?tab=readme-ov-file#installation)の通りにRequirementsを準備しました。
clangが手こずりまして、
```
sudo apt-get install clang
```
しても、要求されているのは、18なのですが14しか入りませんでした。
>For Debian/Ubuntu users, you can download with Automatic installation script

のリンク先を参考になんとか、18をいれて、その後の手順どおりに行ったのですが、
```
python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s
```
のところでエラーになりました。上記の2626さんの記事どおりdockerでやっても同じ箇所でエラーでした。
[こちらの記事](https://qiita.com/Syn256/items/963fa50e3be3f535458e)の1と同様のものでした。記事どおり`utils/codegen_ti1.py`に追記しましたが、解消はされなかったです。

というところで、本記事の締め切りが迫ってきましたので、
「記事執筆時はラズパイ5ではBitnet(Llama3-8B-1.58-100B-tokens)は、量子化のところで躓いてうまくいかなさそうということがわかった」とさせていただこうと思います。

## 今後
Bitnetができなかった点ですが、他モデルではGGUFの量子化板はhuggingfaceに公開されているため本モデルでも公開されるのを待ってOllamaから導入の方向で行こうと思います。
それまではtanukiと会話していこうと思います。

## 感想
本記事の内容着手前に[東大松尾研のYoutubeチャンネル](https://www.youtube.com/@weblab2121)を見ていたのですが、ちょうどゲストとして呼ばれていたkaraage0703さんの記事がhitして色々つながっているなと思いました。
今回動かしたtanukiの開発報告会の動画も公開されており、どういう思想でどういう手順でtanukiを作成したかも公開されていますので東大松尾研のYoutubeチャンネルおすすめです。

## おわりに
本記事では、「ラズパイ5でローカルLLMを実行という他の方も記事にしている内容について、あまり慣れていない人が実施しても再現できた。」「話題のBitnetも試みたが現時点ではラズパイ5での実行は厳しそう。」という記事になります。

興味を持った方はぜひクリスマスプレゼントとしてラズパイ5を購入しローカルLLMを実行してみてはいかがでしょうか？





:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::

## 参考サイト

https://qiita.com/kazuhitoyokoi/items/66e8c9e1b447a2850ba7

https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-input-japanese/

https://zenn.dev/hellorusk/books/e56548029b391f/viewer/ollama1

https://zenn.dev/karaage0703/articles/5fd411a9358898

https://zenn.dev/karaage0703/articles/c271ca65b91bdb#ollama-%2B-open-webui%E3%81%A7gui%E4%BB%98%E3%81%8D%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E6%96%B9%E6%B3%95

https://qiita.com/jnchito/items/198a2561a36c2c2ef5e3

https://qiita.com/2626/items/da7811c8b044f5f04927

https://qiita.com/Syn256/items/963fa50e3be3f535458e