Gemma 4を自分のPCで動かす—Googleの最新オープン・マルチモーダルLLMを試すハンズオンガイド

Dev.to / 2026/5/15

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • Googleのオープン重量マルチモーダルLLM「Gemma 4」は、2026年4月2日にリリースされ、テキストに加えて画像・動画・音声(小型モデル)まで扱えるのが特徴です。
  • Gemma 4はApache 2.0ライセンスを採用し、商用利用の制約が大幅に緩和されたため、プロダクション導入のハードルが下がったとされています。
  • MoE(Mixture-of-Experts)によってトークンあたりに活性化するパラメータ量を抑えつつ、品質と計算コストのバランスを改善し、さらに「thinking mode」やネイティブのファンクションコーリングにも対応します。
  • 本記事は、Ollamaを使って約5分でローカル環境にGemma 4を起動し、ターミナルから会話したり、画像を送って質問したり、Pythonから“APIのように”呼び出したりする手順をハンズオンで案内します。
  • GPUレンタルやAPIキー、テレメトリ不要で始められることが強調され、MLの基礎知識がなくても実行できる構成になっています。

オープンソースのLLM分野をしばらく見ていると、この数年が本当に素晴らしかったことに気づいているはずです。Llama、Mistral、Phi、Qwen——自分のマシンにダウンロードしてそのまま動かせるモデルがずらりと揃っています。その“動物園”へのGoogleの参入がGemmaであり、第4世代のGemma 4(2026年4月2日リリース)は、これまでで最大の飛躍です。Gemini 3の研究を土台に、マルチモーダル(テキスト+画像+動画+音声)、256Kコンテキスト、ネイティブなファンクションコーリング、「thinking mode」(思考モード)を構成可能にし、そしてついにApache 2.0ライセンスをきれいに採用しました。

この記事では次のことを行います:

  1. Gemma 4が実際に何なのかを、アーキテクチャ図とともに理解する
  2. Ollamaで約5分でノートPCに入れて動かす
  3. ターミナルからチャットする
  4. 画像を送って、その内容について質問する
  5. より難しい問題のためにthinking modeを有効化する
  6. 実際のAPIのようにPythonスクリプトから呼び出す
  7. それらをつなげる小さなプロジェクトを作る

GPUレンタル不要、APIキー不要、テレメトリ不要。さあ始めましょう。

注意: このガイドはMLの前提知識がゼロであることを想定しています。ソフトウェアのインストールと、ターミナルコマンドの実行ができれば、できます。

Gemma 4とは?

Gemmaは、Google DeepMindの一連のオープンウェイト言語モデルです。「オープンウェイト」とは、実際のニューラルネットワークの重み——モデルを動かす巨大な数の行列——が自由にダウンロードできる、という意味です。これらを実行したり、改変したり、ファインチューニングしたり、自社製品に組み込んだりできます。

Gemma 4はGemma 3からいくつかの大きな変更をもたらします:

  • Apache 2.0ライセンス。 以前のGemmaリリースは、いくつかのエンタープライズの法務チームを不安にさせる「禁止された利用ポリシー」を含む独自ライセンスでした。Gemma 4は素直なApache 2.0です——商用利用は無制限、MAU(アクティブユーザー)上限なし、特別な許可なし。これだけでも、本番環境への導入における大きな意味があります。
  • Mixture-of-Experts。 新しい26BのMoE(Mixture of Experts)バリアントでは、トークンごとに約4Bのパラメータだけを有効化します。結果として、4B級のコストで13B級の品質が得られます。
  • Thinking mode。 回答する前にステップごとに考えるような、構成可能な推論モードです。難しい問題ではオン、素早いチャットではオフに切り替えます。
  • ネイティブなファンクションコーリング。 構造化されたツール利用のための組み込みサポートを備えています。プロンプトエンジニアリングの“裏技”を必要とせずにエージェントを書けます。
  • より多くのモダリティ。 画像、動画フレーム、(小型のE2B/E4Bモデルでは)ネイティブな音声入力に対応。ネイティブなシステムプロンプトもサポートしています。
  • より大きなコンテキスト。 小型モデルは128K、大型モデルは256K

モデルサイズ概要

モデル ディスク(Ollama) 有効パラメータ 総パラメータ マルチモーダル コンテキスト おすすめ用途
E2B 約7.2 GB 約2B 約2.3B テキスト+画像+音声 128K 携帯電話、エッジデバイス、ブラウザ
E4B 約9.6 GB 約4B 約4.5B テキスト+画像+音声 128K ほとんどのノートPC——ちょうど良いポイント
26B A4B(MoE) 約18 GB 約4B 26B テキスト+画像 256K コンシューマ向けGPU、エージェント系ワークロード
31B Dense 約20 GB 31B 31B テキスト+画像 256K ワークステーション、最高品質の回答

理解しておくとよい命名上のポイントが2つあります:

  • E2B / E4B。 「E」はEffective(有効)パラメータを意味します。これは高密度で、エッジ寄りのモデルです。Per-Layer Embeddings(PLE——後述します)というトリックを使って、有効化するパラメータ数を抑えつつより多くのことができるようにしています。
  • 26B A4B。 これはMixture-of-Expertsモデルです。総パラメータは26Bですが、フォワードパスごとに約4Bだけが“有効化”されます。レイテンシとコストは4Bモデルのように振る舞い、品質は13Bの高密度モデルに近づきます。注意点:それでも26Bすべてをメモリに読み込む必要があります。

ノートPCで使う多くの読者にとっては、E4Bが適切な出発点です。16GBのMacでも、現代的な開発用マシンなら問題なく動きます。

Gemma 4 vs その他のオープンモデル“動物園”(2026年5月)

モデル サイズ マルチモーダル コンテキスト ライセンス
Gemma 4 E2B / E4B / 26B MoE / 31B テキスト+画像+動画+音声(小型) 128K / 256K Apache 2.0
Llama 4 さまざま テキスト+画像 128K+ Llamaコミュニティのライセンス
Qwen 3.5 さまざま テキスト+画像 128K+ Apache 2.0
DeepSeek V4 Flash MoE テキスト 128K MIT

Gemma 4の売りは:Apache 2.0のもとで、携帯端末からサーバーまでをカバーする唯一のファミリーであり、同じリリースにマルチモーダルと音声が入っていることです。

アーキテクチャ(平易な言葉で)

このセクションはGemma 4を使うのに必須ではありません——インストール手順にそのまま進んで構いません。とはいえ、マルチモーダルモデルが「見る」・「聞く」ときに実際に何が起きているのか気になったことがあるなら、これです。
gemma4 description

理解しておくとよい要素がいくつかあります:

  • 3つの入力経路。 テキストはSentencePieceトークナイザを通ります(Geminiと共通)。画像は、アスペクト比や解像度が変わってもネイティブに扱えるビジョンエンコーダを通します(Gemma 3のように正方形のみの入力に縛られません)。E2BとE4Bモデルでは、音声はGemma 3nから借用したUSMスタイルのコンフォーマエンコーダを通ります。この3つの経路すべてが生成するトークンは、単一のストリームにインターリーブされます——そのため、テキスト・画像・音声を任意の順序で、1つのプロンプトに自由に混ぜられます。
  • 交互のローカル/グローバル・アテンション。 多くの層は、直近のトークンに対するスライディングウィンドウだけを見ます(安価)。一部の層は、全コンテキストに対して注意を向けます(高価ですが稀)。これは、256KのコンテキストでKVキャッシュが爆発しないように保つための標準的な工夫です。
  • Per-Layer Embeddings(PLE)——小型モデルの秘密。通常のトランスフォーマでは、各トークンは入力時に1つの埋め込みベクトルを持つだけで、それ以上の“残差ストリームが扱う情報”は実質ありません。PLEは並列の経路を追加します。各トークンについて、各層が参照テーブルからそれぞれ異なる小さなコンディショニングベクトルを受け取ります。埋め込みテーブルは大きい(メモリを多く使う)ものの、トークンごとに“有効化される”パラメータは小さいままです——だからこそ、有効パラメータ4BのE4Bが、その実力以上の結果を出せます。
  • Mixture-of-Experts(26B A4B)。 MoE層には複数の“エキスパート”のフィードフォワードネットワークがあります。小さなルータが、各トークンについて8つのうち2つ(または類似の数)を選びます。総パラメータ=26B(すべてロード)。トークンごとの有効パラメータ=約4B(そのとき発火するものだけ)。品質あたりのFLOPに対して最適な(パレート最適な)設計です。
返却形式: {"translated": "翻訳されたHTML"}
  • 思考モード。 システムプロンプトの先頭に特別な <|think|> トークンを含めると、モデルは最終回答の前に <|channel>thought ...<channel|> のマーカーの間に内部推論を出力します。高速なチャットには無効化し、数学・コード・複数ステップの推論には有効化してください。
  • 以上が、知っておく価値のあるほとんどすべてです。では実際に動かしてみましょう。

    ステップ 1: Ollama をインストール

    Gemma 4 をローカルで動かす方法はいくつかありますが、飛び抜けて簡単なのが Ollama です。これは「LLM 用の Docker」だと思ってください。モデルのダウンロード、メモリ管理、GPU の加速、そしてローカル API の公開をすべて面倒見てくれます。CUDA のバージョンや PyTorch を意識する必要はありません。

    インストールします:

    • macOS / Windows: ollama.com/download からインストーラーをダウンロードして実行します。
    • Linux:
      curl -fsSL https://ollama.com/install.sh | sh
    

    確認します:

    ollama --version
    

    バージョン番号が表示されるはずです。Gemma 4 には Ollama v0.20.0 以降が必要です。古いバージョンの場合は、先にアップデートしてください。

    ステップ 2: Gemma 4 のモデルをプルする

    デフォルトをダウンロード(E4B、約 9.6 GB):

    ollama pull gemma4
    

    これは約 9.6 GB をダウンロードします。コーヒーでもどうぞ。☕

    他のサイズも必要なら:

    ollama pull gemma4:e2b   # 約7.2 GB — 最小、低RAMマシン向け
    ollama pull gemma4:e4b   # 約9.6 GB — デフォルト; `gemma4` と同じ
    ollama pull gemma4:26b   # 約18 GB  — MoE; 256K コンテキスト
    ollama pull gemma4:31b   # 約20 GB  — 最大の密モデル
    

    ハードウェアの現実チェック: Apple Silicon では、16 GB のユニファイドメモリで E4B は問題なく扱えます。NVIDIA ユーザーは、GPU 加速の推論のためにモデルが VRAM にすべて収まる必要があります。26B モデルは 24 GB には収まりますが、余裕はほとんどありません。上限として扱い、目標にしないようにしてください。

    手元にあるものを一覧表示します:

    ollama list
    

    ステップ 3: ターミナルでチャットする

    最も簡単なテスト:

    ollama run gemma4
    

    インタラクティブなプロンプトが表示されます:

    >>> 私がジュニア開発者だと思って、ハッシュマップとは何か説明して。
    

    Enter を押して、回答がストリーミングされるのを見てください。終了するには /bye と入力します。

    以上です。クラウドへの依存ゼロで、最先端の LLM をローカルで動かしています。試してみてください:

    • 「リスト内の重複を見つける Python 関数を、3 つの異なるアプローチとそれぞれのトレードオフ付きで書いて。」
    • 「TCP と UDP の違いは?たとえ話を使って説明して。」
    • 「『最寄りの駅はどこ?』を日本語・スペイン語・ヒンディー語に翻訳して。」

    ステップ 4: 画像を送る

    Gemma 4 は 見ることができます。現在のディレクトリに任意の画像ファイルを置き、その後:

    ollama run gemma4
    >>> この画像に何が写っているか説明して: ./screenshot.png
    

    Ollama は画像を読み込み、ビジョンエンコーダに通し、モデルが回答します。Gemma 3(すべてを 896×896 にリサイズする)と違って、Gemma 4 はアスペクト比と解像度をネイティブに扱えます。背の高いスクリーンショット、ワイドな図、高解像度の写真でも、手作業のトリミングなしでそのまま動きます。

    試してみてください:

    • 「このスクリーンショットに表示されているエラーは何?」 (スタックトレースを貼り付けて)
    • 「この UI にある『submit』ボタンのバウンディングボックスは?」 (Gemma 4 は JSON で答えます — ネイティブに!)
    • 「このメモの手書き文字を読み取り、書き起こして。」

    ステップ 5: 思考モードをオンにする

    難しい問題 — 複数ステップの数学、複雑なコード、ロジックパズル — には思考モードをオンにします。システムプロンプトの最初に <|think|> トークンを含めます:

    ollama run gemma4
    >>> /set system "<|think|>You are a careful, methodical assistant."
    >>> 3 人の友人が $73.42 のディナービルを分ける。アリスは $12 の前菜を食べ、ボブは $9 のドリンクを飲んだ。残りは折半する。みんなはいくら払う?
    

    モデルは最終回答の前に <|channel>thought ...<channel|> ブロックで推論を出力します。素早いチャットのためにはトークンを外し、モデルは直接回答します。

    いつ使うべきか: コード生成、数学、マルチホップ推論、エージェント的な計画 — はい。1 回で完結する事実質問、要約、翻訳 — いいえ、単にレイテンシが増えるだけです。

    ステップ 6: Python から Gemma 4 を呼び出す

    チャットプロンプトもいいですが、あなたは開発者です。コードからこの仕組みを呼び出したいはずです。Ollama が動作していると、http://localhost:11434 でローカルの REST API が公開されます。さらに、公式の Python クライアントもあります。

    インストールします:

    pip install ollama
    

    基本的なチャット

    import ollama
    
    返却形式: {"translated": "翻訳されたHTML"}
    response = ollama.chat( model="gemma4", messages=[ {"role": "system", "content": "あなたはシニアのコードレビュアーです。簡潔で直接的にしてください。"}, {"role": "user", "content": "このコードをレビューしてください: def add(a, b): return a+b"}, ], ) print(response["message"]["content"])

    ストリーミングレスポンス(ChatGPTスタイル)

    import ollama
    
    stream = ollama.chat(
        model="gemma4",
        messages=[{"role": "user", "content": "デバッグについて俳句を書いてください。"}],
        stream=True,
    )
    
    for chunk in stream:
        print(chunk["message"]["content"], end="", flush=True)
    

    画像を送信する

    import ollama
    
    response = ollama.chat(
        model="gemma4",
        messages=[{
            "role": "user",
            "content": "この画像には何が写っていますか?",
            "images": ["./my_photo.jpg"],
        }],
    )
    
    print(response["message"]["content"])
    

    Thinkingモード + 関数呼び出し(エージェント的コンボ)

    ここからGemma 4は、実際に「本物の」エージェントらしさを感じさせ始めます。ツールをJSONスキーマとして宣言すると、モデルが呼び出すべきタイミングを判断し、あなたはその呼び出しを実行して結果をモデルに返します。プロンプトエンジニアリングの小細工は不要です。

    import ollama
    
    tools = [{
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "都市の現在の天気を取得します。",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "都市名(例: ' Tokyo '"},
                },
                
    
    返却形式: {"translated": "翻訳されたHTML"}
                ""required"": [""city""],
            },
        },
    }]
    
    def get_weather(city: str) -> str:
        # 実在するAPIにアクセスすると仮定します。
        return f"{city}: 22°C, 晴れ時々くもり"
    
    response = ollama.chat(
        model="gemma4",
        messages=[
            {"role": "system", "content": "<|think|>あなたは役に立つ天気アシスタントです。"},
            {"role": "user",   "content": "今日の東京で傘を持っていったほうがいいですか?"},
        ],
        tools=tools,
    )
    
    # モデルがツールを呼び出したい場合は、それを実行して結果をモデルに返します:
    for tool_call in response["message"].get("tool_calls", []):
        name = tool_call["function"]["name"]
        args = tool_call["function"]["arguments"]
        if name == "get_weather":
            result = get_weather(**args)
            # 結果をモデルに送り、モデルが回答を仕上げられるようにします
            followup = ollama.chat(
                model="gemma4",
                messages=[
                    {"role": "user", "content": "今日の東京で傘を持っていったほうがいいですか?"},
                    response["message"],
                    {"role": "tool", "content": result, "name": name},
                ],
            )
            print(followup["message"]["content"])
    

    生のHTTP(Pythonクライアント不要)

    その他の任意の言語の場合:

    curl http://localhost:11434/api/chat -d '{
      "model": "gemma4",
      "messages": [{"role": "user", "content": "こんにちは!"}],
      "stream": false
    }'
    

    同じJSONの形は、Node、Go、Rust、あなたのシェルなど、HTTPリクエストを作れるものであればどれでも動きます。

    小さなプロジェクト:フォルダー監視の画像記述ツール

    こちらは便利な約30行のスクリプトです。フォルダーを監視し、そこに新しい画像が投下されると、Gemma 4が自動的に説明文を生成します。アクセシビリティのためのツール、コンテンツモデレーションの試作、あるいは学習目的に最適です。

    import os, time
    import ollama
    
    WATCH_DIR = "./inbox"
    os.makedirs(WATCH_DIR, exist_ok=True)
    SEEN = set(os.listdir(WATCH_DIR))
    
    返却形式: {"translated": "翻訳されたHTML"}print(f" Watching {WATCH_DIR}/ — 画像をドロップして説明してください。")
    print("   (Ctrl+Cで停止)
    ")
    
    IMAGE_EXTS = (".png", ".jpg", ".jpeg", ".webp", ".gif")
    
    try:
        while True:
            current = set(os.listdir(WATCH_DIR))
            new_files = sorted(current - SEEN)
    
            for filename in new_files:
                if not filename.lower().endswith(IMAGE_EXTS):
                    continue
    
                path = os.path.join(WATCH_DIR, filename)
                print(f" 新しい画像: {filename}")
    
                response = ollama.chat(
                    model="gemma4",
                    messages=[{
                        "role": "user",
                        "content": (
                            " この画像を2〜3文で説明してください。 "
                            " 見えている文字があれば言及してください。具体的に。"
                        ),
                        "images": [path],
                    }],
                )
    
                print(f"{response['message']['content']}}
    ")
    
            SEEN = current
            time.sleep(2)
    except KeyboardInterrupt:
        print("
     停止しました。")
    

    実行して、画像をinbox/フォルダにドラッグすると、説明が表示されます。これは、実際に役立つ、完全にローカルのAIツールです——30行で書かれています。

    何か本格的なものを出荷する前に知っておくべきこと

    いくつか正直な注意点があります:

    注意点 なぜ重要か
    ハルシネーション ローカルのモデルでも、断言する形でそれっぽいことを作り出します。検証なしに事実の主張を信じないでください。思考モードは推論タスクに対してそれを減らせますが、完全にはなくしません。
    CPUレイテンシ E4Bを使ったCPUのみのラップトップでは、1〜3トークン/秒程度を想定してください。GPUなら3〜10倍高速化します。
    コンテキストコスト(RAM) 256Kコンテキストは実在しますが、実際にはそれを埋めるだけでメモリを消費します。ほとんどのユースケースでは<16Kトークンで十分です。
    MoEメモリ 26BのMoEは、(トークンごとに有効になるのが4Bだけなので)高速に動きますが、それでも26BすべてをRAMに読み込む必要があります。有効パラメータとメモリ使用量を混同しないでください。
    オーディオは小規模モデルのみ E2B/E4Bにはネイティブのオーディオ入力があります。26Bと31Bのモデルにはありません。
    Apache 2.0 は「責任ゼロ」ではない ライセンスは寛容ですが、出荷するものについて、安全性・バイアス・コンプライアンスの面であなたが責任を負うことに変わりはありません。

    参考資料 & 追加で読む