メインコンテンツへスキップ
見出し画像

ラズパイで始めるローカル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つの軽量モデルをインストールして比較テストを行いました。

    テストモデル:

    モデルパラメータ数ファイルサイズqwen2:0.5b0.5B352MBtinyllama1.1B637MBllama3.2:1b1B1.3GB\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モデル完全比較

    qwen2:0.5btinyllamallama3.2:1bパラメータ0.5B1.1B1Bメモリ使用396MB645MB1.4GBSwap使用0B5MB157MB空きメモリ1.1GB911MB165MB問1 日本語△ 暴走△ 暴走+呪文△ 謎人物登場問2 コード△ 分岐漏れ✕ 別物◎ 正解!問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

     
     
    生成AIの感動を共有したいYaroTechです✨ 常識より実験。正解より行動。 生成AI時代を、先に試す傾奇者。 📝 470日間継続投稿中| 🎉 フォロワー1900名突破!🤝 質問大歓迎!みんなで「AIと共に羽ばたく」コミュニティを作りましょう🚀

    あなたへのおすすめ