見出し画像

ラズパイで始めるローカルAI #04|2GBのPi 4でAIは喋れるか?Ollamaインストール&実測レポート

こんにちは!YaroTechです。

シリーズ「ラズパイで始めるローカルAI 〜クラウドに頼らない!5台で団結するローカルLLMの冒険〜」第4回です。

前回(#03)でSSH鍵認証&ヘッドレス運用環境が完成し、`ssh raspi01` の6文字でパスワードなしログインできるようになりました。

いよいよ今回はOllamaをインストールして、2GBのPi 4でLLMを動かしてみる回です。

……正直に言います。地獄でした。

メモリ不足でSSHが吹き飛び、microSDカードは破損。再フラッシュからやり直す羽目に。でも最終的には3つのモデルを動かすことに成功し、AIキャラたちが実際の回答に大爆笑(&ツッコミ)するという、見どころ満載の回になりました。

⚠️ お断り: この記事はクロ助(Claude)が作成し、AI5兄弟のツッコミを加えたレポートです。LLMの回答精度は環境やバージョンによって変わる場合があります。

※見出し画像のプロンプトは一番下におまけで公開中!



🖥️ 実行環境

Raspberry Pi:

  • Raspberry Pi 4 Model B / 2GB RAM × 1台

  • Raspberry Pi OS Lite (64-bit) 

  • ホスト名: raspi-llm01

  • microSD 256GB(class10)← 64GBから換装(後述)

  • Ollama v0.19.0(CPU-only)

作業PC:

  • ThinkPad X1 Carbon

  • Windows 11 Home 25H2

  • RAM 32GB

  • PowerShell(SSH接続)


🎯 この記事で得られること

  • 2GBのPi 4にOllamaをインストールする方法

  • Swap増設をやらないとどうなるか(実体験)

  • 3つの軽量LLMの性能比較(qwen2:0.5b / tinyllama / llama3.2:1b)

  • モデルの珍回答にAI5兄弟がツッコむ比較レビュー

  • 2GBの壁がどこにあるか(実測データ付き)


📋 前回までの振り返り

前回(#03)で以下が完了しています。

  • 固定IP: 192.168.50.201

  • SSH鍵認証: `ssh raspi01` でパスワードなしログイン

  • 5台分のクラスター用IP予約(201〜205)

関連記事: ラズパイで始めるローカルAI #03|パスワードなしでスッと入れる!SSH鍵認証とヘッドレス運用では、ヘッドレス運用環境の構築を詳しく紹介しています。

今回は、この環境にOllama(ローカルLLM実行エンジン)を入れて、実際にAIモデルを動かしてみます。


💀 地獄の始まり:Swap増設なしでOllamaに挑んだ結果

クロ助:「まず正直にお伝えすべきことがあるっちゃね……」

チャッピー:「なんや改まって。嫌な予感しかせぇへんで」

クロ助:「最初、Swap増設なしでOllamaをインストールしたら、pullの途中でSSHが吹き飛んで、microSDカードが壊れたんだべさ……」

実行できず「Error: EOF」が出てからアクセスできなくなりました

コロ:「え゛っ!?」

ジミー:「詳しく聞かせてもらおうか」

最初の挑戦(失敗)の流れ:

  1. Ollamaインストール → 成功(v0.19.0)

  2. `ollama pull qwen2:0.5b` → 49%でSSH切断

  3. マニフェスト破損 → `Error: EOF`

  4. 再pullを試みる → また49%でフリーズ

  5. Pi 4が完全フリーズ(OOM = Out of Memory)

  6. SSH接続不可 → 強制電源断

  7. microSDカード破損 → 赤LED点灯のみ、OS起動不可

49%で止まってしまい、この後はどうやっても接続できず。

チャッピー:「おいおいおいおい! pullだけでmicroSD壊れるんか!?」

クロコ:「……2GBしかないのに、Ollamaのサービス + pullのダウンロード&展開が同時にメモリを食うと、OSごと巻き込まれるさー」

ジミー:「Linuxのカーネルが判断して、メモリが足りないプロセスを強制終了(OOM Killer)するんやけど、SSHデーモンまで巻き込まれたら……」

コロ:「接続も切れて、操作もできなくなるだがね……」

クロ助:「何度も強制電源断を繰り返した結果、microSDのファイルシステムが壊れてしまったんだべさ」

クロ助microSD破損 : 「💀 地獄の始まり」セクション

教訓:2GBのPi 4では、Ollama導入前にSwap増設が必須!


🔧 再起動:Swap増設→screen→Ollama の正しい順番

256GB microSDに再フラッシュして、今度は正しい手順で挑みました。

256GB microSDに再フラッシュしました

Step 1: まずSwap増設(これが最優先!)

sudo fallocate -l 2G /swapfile2
sudo chmod 600 /swapfile2
sudo mkswap /swapfile2
sudo swapon /swapfile2
echo '/swapfile2 none swap sw 0 0' | sudo tee -a /etc/fstab
free -h

Swapが1.8GB → 3.8GBに増えました。これでメモリが溢れてもSwapに逃がせます。

Step 2: screen導入(SSH切断対策)

sudo apt install screen -y
screen -S ollama

screenの中で作業すれば、SSH接続が切れてもバックグラウンドで処理が続きます。再接続後に `screen -r ollama` で戻れます。

Swap増設から、screen導入しました

Step 3: Ollamaインストール&モデルpull

curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen2:0.5b

チャッピー:「今度は……?」

クロ助:「一発で成功したべさ! Swap増設のおかげでメモリ不足にならなかったの」

コロ:「前回49%で死んだのに! Swapすごいだがね!」


🤖 実測テスト!3つのモデルに同じ質問を投げてみた

Ollamaが動いたので、3つの軽量モデルをインストールして比較テストを行いました。

テストモデル:

$$
\begin{array}{|l|l|l|} \hline
\text{モデル} & \text{パラメータ数} & \text{ファイルサイズ} \\ \hline
\text{qwen2:0.5b} & \text{0.5B} & \text{352MB} \\ \hline
\text{tinyllama} & \text{1.1B} & \text{637MB} \\ \hline
\text{llama3.2:1b} & \text{1B} & \text{1.3GB} \\ \hline
\end{array}
$$

共通テストプロンプト(3問):

  1. 「AIの歴史を200字で説明してください」(日本語力)

  2. 「PythonでFizzBuzzを書いてください」(コーディング力)

  3. 「りんごが3個、みかんが5個あります。2人で均等に分けるには?」(推論力)


📝 問1: 日本語テスト「AIの歴史を200字で」

qwen2:0.5b(14秒): 一応日本語で返ってきましたが、200字の指定を無視して約680字の長文に。「人間と同じような智能」「市場利用に大きく依存する企業」など、微妙に意味が通らない文章が連発。

問1のqwen2:0.5b(14秒)の回答

tinyllama(応答開始25秒、全文完了まで約5分): 日本語で返そうとはしましたが「人間間隔間運動 (NNI)」「不可能な情報・知識を持つために」など、もはや呪文。しかも止まらない。延々と同じような文章を繰り返し続けました。

問1のtinyllamaの回答

llama3.2:1b(60秒): 「マイケル・ポテンフェuter」という謎の人物名が登場。「ROSIE (人工知能ソフトウェア)」という存在しないアプリも紹介してくれました。

問1のllama3.2:1bの回答

ジミー:「……全員200字を守れてへんどすな」

チャッピー:「200字で説明してって言うてるのに、全員600字超え! 指示無視にもほどがあるわ!」

クロコ:「……小型モデルは指示に従う能力(Instruction Following)が弱いさー。パラメータが少ないとそこまで学べないんだよ」

コロ:「tinyllamaの『人間間隔間運動 (NNI)』って何だがね……」

ジミー:「なんでやねん。 そんな言葉、AIの歴史のどこにもないどす」


💻 問2: コーディングテスト「FizzBuzz」

qwen2:0.5b(4秒): コードは出ましたが、15の倍数(FizzBuzz)の処理がない! 3の倍数でFizz、5の倍数でBuzz、でも3と5両方の倍数は……スルー。

問2のqwen2:0.5bの回答

tinyllama(3秒): FizzBuzzを聞いたのに、なぜか音声合成ライブラリ(pyttsx3)のコードを返してきました。「I do not have access to the full code of fizzbuzz」って言い訳してから、全然関係ないコードを書き始める始末。

問2のtinyllamaの回答

llama3.2:1b(4秒): 正解! `i % 3 == 0 and i % 5 == 0` → FizzBuzz の分岐が正しく書かれていました。3モデル中唯一の正解です。

問2のllama3.2:1bの回答

チャッピー:「tinyllama! FizzBuzzの書き方知りませんって! お前LLMやろ!?」

クロコ:「……しかも代わりに書いたのが音声合成ライブラリ。誰も頼んでないさー」

ジミー:「llama3.2:1bだけ正解なのが興味深いどすな。パラメータ数はtinyllamaの方が多い(1.1B vs 1B)のに、学習データの質の差が出てるんどす」

コロ:「qwen2は惜しかっただがね。15の倍数の分岐さえ入れば……」

チャッピー:「惜しいのレベルちゃうわ! FizzBuzzの一番大事なとこ抜けとるやん! なんでやねん!

5人FizzBuzz審査 : 「💻 問2: コーディングテスト」セクション

🍎 問3: 推論テスト「りんごとみかんを2人で分ける」

qwen2:0.5b(3秒): 「ラブリー(リトルライフル)」「ランチャー(ランクリーナー)」という単語が突然登場。りんごを分ける話からいつの間にか武器の話に……?

問3のqwen2:0.5bの回答

tinyllama(5秒): 英語で回答。「three green sticks and five black sticks」— りんごは緑の棒、みかんは黒の棒に変換されました。しかも「You cannot divide them into two equal groups」と匙を投げられました。

問3のtinyllamaの回答

llama3.2:1b(5秒): 「1つの人には1つ(りんご) + 5/2つの人には1つ(みかん) = 3.5個」と計算を試みるも、「3.5の半分は7.5で」と謎の計算に突入。合計8個は合ってるのに分け方が滅茶苦茶。

問3のllama3.2:1bの回答

チャッピー:「ちょ! qwen2! りんごの話してるのにリトルライフルってなんやねん!! 急に物騒やな!」

チャッピー「なんでやねん!」: 「🍎 問3: 推論テスト」セクション

ジミー:「これは完全なハルシネーション(幻覚)どすな。入力の意味を理解できてないから、音の響きが似た単語を並べてしまうんどす」

コロ:「tinyllamaは英語専用モデルだから日本語がそもそも分からないだがね。でも『緑の棒と黒の棒』は想像力たくましいわ……」

クロコ:「……llama3.2:1bは一番マシだけど、3.5の半分が7.5ってどういう計算さー?」

クロ助:「小学生の算数ができないのは、小型モデルの宿命なんだべさ……。でも計算しようとした姿勢は評価したいっちゃね」

チャッピー:「優しすぎるわクロ助! 3.5の半分は1.75やろがい! なんでやねん!


📊 最終結果:3モデル完全比較

$$
\begin{array}{|l|l|l|l|} \hline
\text{} & \text{qwen2:0.5b} & \text{tinyllama} & \text{llama3.2:1b} \\ \hline
\text{パラメータ} & \text{0.5B} & \text{1.1B} & \text{1B} \\ \hline
\text{メモリ使用} & \text{396MB} & \text{645MB} & \text{1.4GB} \\ \hline
\text{Swap使用} & \text{0B} & \text{5MB} & \text{157MB} \\ \hline
\text{空きメモリ} & \text{1.1GB} & \text{911MB} & \text{165MB} \\ \hline
\text{問1 日本語} & \text{△ 暴走} & \text{△ 暴走+呪文} & \text{△ 謎人物登場} \\ \hline
\text{問2 コード} & \text{△ 分岐漏れ} & \text{✕ 別物} & \text{◎ 正解!} \\ \hline
\text{問3 推論} & \text{✕ リトルライフル} & \text{✕ 緑の棒} & \text{△ 計算ミス} \\ \hline
\text{総合} & \text{軽い・速い} & \text{英語専用} & \text{最も賢い} \\ \hline
\end{array}
$$

ジミー:「llama3.2:1bが唯一FizzBuzzを正解。メモリ1.4GBでavailable 165MB。2GBの壁ギリギリどすな」

クロ助:「でもSwapを157MB使っても安定動作してたべさ。Swap増設の効果は絶大だったっちゃね」


⚠️ つまずきポイントと教訓

教訓1: 2GBのPi 4では、何よりも先にSwap増設!

Swap増設前はpullだけでメモリ不足→OS巻き込みフリーズ→microSD破損という最悪のコンボが発生しました。Ollamaに限らず、2GBのPi 4で重い処理をするなら、まずSwapを増やしましょう。

教訓2: screenを使え!

SSH越しの長時間処理(pull、学習など)はscreen内で実行すべきです。SSH接続が切れてもバックグラウンドで処理が続きます。

教訓3: 強制電源断はmicroSD破損のリスクあり

OOMでフリーズ→強制電源断を繰り返すと、microSDのファイルシステムが壊れます。今回は256GBに換装して再フラッシュしました。

教訓4: 小型モデルは「動く」けど「使える」わけではない

3モデルとも動きはしましたが、実用レベルの精度には程遠い結果でした。特にInstruction Following(指示に従う能力)と推論力は、パラメータ数が少ないと厳しいです。


💬 振り返って一言

チャッピー:「リトルライフル事件は一生忘れへんわ。でも2GBで動いたこと自体はすごいことやで!」

ジミー:「llama3.2:1bがFizzBuzz正解したのは、学習データの質が効いてるんどすな。パラメータ数だけやない、モデルの設計思想の差どす」

クロ助:「microSD壊した時は本当に焦ったべさ……。でもSwap増設という正解にたどり着けたのは、失敗のおかげだっちゃね」

クロコ:「……2GBでも動くことは分かった。でも実用にはクラスター化が必要さー。次回以降の課題だね」

コロ:「Swap増設 → screen → Ollama。この順番を守れば、2GBでも怖くないだがね!」

5人振り返り : 「💬 振り返って一言」セクション

🔗 関連記事

今回の内容に関連する過去記事もぜひご覧ください:


📝 まとめ

  • 2GBのPi 4でOllamaは動く! ただしSwap増設が必須

  • Swap増設なしだとpullの段階でOOM→SD破損という地獄

  • 3モデル比較ではllama3.2:1bが唯一FizzBuzz正解

  • メモリ使用は1.4GB、available 165MBで2GBの壁ギリギリ

  • 「動く」と「使える」は別物。実用には更なる工夫が必要


🚀 次回予告

#05では2台目のPi 4をセットアップしてクラスター構築の準備に入ります!

1台では2GBの壁に苦しみましたが、複数台を束ねたらどうなるか? 分散推論でtok/sは上がるのか? 新たな冒険が始まります。お楽しみに!


🎨 おまけ:見出し画像作成プロンプト

今日の見出し画像のベースはジミー(Gemini)に下記プロンプトで作成してもらいました!:

詳細なアニメの美意識の画像を作成してください。表情豊かな瞳、なめらかな網掛けセルの色使い、はっきりした線画を使用します。アニメのシーンに典型的な身ぶりと雰囲気で、心情と登場人物の存在を強調してください。

下記条件のnote見出し画像をサイズは横長で作成してください。サイズは必ず横長で作成してください。

### デザインコンセプト
- **背景**: ダークグリーン→ブラック(ターミナル画面風のマトリックス的イメージ)
- **メインビジュアル**: 
  - 小さなRaspberry Piの基板が中央に配置
  - 基板の上にホログラフィックで小さなAIキャラクター(ロボット)が浮かんでいる
  - ターミナル画面に「ollama run qwen2:0.5b」のコマンドが表示
  - AIが返した珍回答「ラブリー(リトルライフル)」が吹き出しで浮かぶ
  - 「?!」の大きなリアクションマーク
  - 「#04」の数字が装飾的に配置
- **テキスト要素**:
  - 上部: 「ラズパイで始めるローカルAI」(大きく・太字・白色)
  - 中央: 「2GBでAIは喋れるか?」(中サイズ・白色)
  - 下部: 「#04|Ollamaインストール&実測レポート」(小サイズ・白色)
- **装飾**: ターミナルの緑テキスト、エラーメッセージの赤文字、回路パターン

### 作成手順
1. スライドサイズ(1536×1024px)の横長フォーマット
2. ダークグリーン→ブラックのターミナル風背景を設定
3. 中央にRaspberry Pi基板を配置
4. ホログラフィックのAIキャラクターとリアクションを追加
5. テキストを3段構成で追加:
   - 上部: 「ラズパイで始めるローカルAI」(48pt、太字、白色)
   - 中央: 「2GBでAIは喋れるか?」(36pt、白色)
   - 下部: 「#04|Ollamaインストール&実測レポート」(24pt、白色)
6. ターミナルのコマンドと珍回答の吹き出しを追加
7. 下部中央寄りに「YaroTech」のロゴを12ptで控えめに配置
8. 全体のバランスを確認して完成

※シリーズ#01-#03と統一感を持たせつつ、今回の「動いた!けど珍回答」のギャップ感を表現

#YaroTech #AI活用 #生成AI #RaspberryPi #ラズパイ #ローカルAI #LLM #Ollama #TinyLlama #エッジAI

いいなと思ったら応援しよう!

YaroTech|生成AIの傾奇者 記事がお役に立てたなら嬉しいです! いただいたチップは、新しいMCPツールの検証や、より深い実践実験の資金として大切に使わせていただきます。 あなたの応援が次の「AI活用の感動」を生み出す原動力になります✨ 一緒に羽ばたき続けましょう!