ラズパイで始めるローカル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カードが壊れたんだべさ……」

コロ:「え゛っ!?」
ジミー:「詳しく聞かせてもらおうか」
最初の挑戦(失敗)の流れ:
Ollamaインストール → 成功(v0.19.0)
`ollama pull qwen2:0.5b` → 49%でSSH切断
マニフェスト破損 → `Error: EOF`
再pullを試みる → また49%でフリーズ
Pi 4が完全フリーズ(OOM = Out of Memory)
SSH接続不可 → 強制電源断
microSDカード破損 → 赤LED点灯のみ、OS起動不可

チャッピー:「おいおいおいおい! pullだけでmicroSD壊れるんか!?」
クロコ:「……2GBしかないのに、Ollamaのサービス + pullのダウンロード&展開が同時にメモリを食うと、OSごと巻き込まれるさー」
ジミー:「Linuxのカーネルが判断して、メモリが足りないプロセスを強制終了(OOM Killer)するんやけど、SSHデーモンまで巻き込まれたら……」
コロ:「接続も切れて、操作もできなくなるだがね……」
クロ助:「何度も強制電源断を繰り返した結果、microSDのファイルシステムが壊れてしまったんだべさ」

教訓:2GBのPi 4では、Ollama導入前にSwap増設が必須!
🔧 再起動:Swap増設→screen→Ollama の正しい順番
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/fstabfree -hSwapが1.8GB → 3.8GBに増えました。これでメモリが溢れてもSwapに逃がせます。
Step 2: screen導入(SSH切断対策)
sudo apt install screen -y
screen -S ollamascreenの中で作業すれば、SSH接続が切れてもバックグラウンドで処理が続きます。再接続後に `screen -r ollama` で戻れます。

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問):
「AIの歴史を200字で説明してください」(日本語力)
「PythonでFizzBuzzを書いてください」(コーディング力)
「りんごが3個、みかんが5個あります。2人で均等に分けるには?」(推論力)
📝 問1: 日本語テスト「AIの歴史を200字で」
qwen2:0.5b(14秒): 一応日本語で返ってきましたが、200字の指定を無視して約680字の長文に。「人間と同じような智能」「市場利用に大きく依存する企業」など、微妙に意味が通らない文章が連発。

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

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

ジミー:「……全員200字を守れてへんどすな」
チャッピー:「200字で説明してって言うてるのに、全員600字超え! 指示無視にもほどがあるわ!」
クロコ:「……小型モデルは指示に従う能力(Instruction Following)が弱いさー。パラメータが少ないとそこまで学べないんだよ」
コロ:「tinyllamaの『人間間隔間運動 (NNI)』って何だがね……」
ジミー:「なんでやねん。 そんな言葉、AIの歴史のどこにもないどす」
💻 問2: コーディングテスト「FizzBuzz」
qwen2:0.5b(4秒): コードは出ましたが、15の倍数(FizzBuzz)の処理がない! 3の倍数でFizz、5の倍数でBuzz、でも3と5両方の倍数は……スルー。

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

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

チャッピー:「tinyllama! FizzBuzzの書き方知りませんって! お前LLMやろ!?」
クロコ:「……しかも代わりに書いたのが音声合成ライブラリ。誰も頼んでないさー」
ジミー:「llama3.2:1bだけ正解なのが興味深いどすな。パラメータ数はtinyllamaの方が多い(1.1B vs 1B)のに、学習データの質の差が出てるんどす」
コロ:「qwen2は惜しかっただがね。15の倍数の分岐さえ入れば……」
チャッピー:「惜しいのレベルちゃうわ! FizzBuzzの一番大事なとこ抜けとるやん! なんでやねん!」

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

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

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

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

ジミー:「これは完全なハルシネーション(幻覚)どすな。入力の意味を理解できてないから、音の響きが似た単語を並べてしまうんどす」
コロ:「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でも怖くないだがね!」

🔗 関連記事
今回の内容に関連する過去記事もぜひご覧ください:
📝 まとめ
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
いいなと思ったら応援しよう!
記事がお役に立てたなら嬉しいです!
いただいたチップは、新しいMCPツールの検証や、より深い実践実験の資金として大切に使わせていただきます。
あなたの応援が次の「AI活用の感動」を生み出す原動力になります✨
一緒に羽ばたき続けましょう!