💪

新しく出たGemma4-E2B-QATを詊しおみる

に公開

はじめに

2026幎6月5日、Googleが QAT(Quantization-Aware Training) ずいう手法で最適化したGemma4ずしお Gemma4 QAT モデルをリリヌスしたした。QATモデルはモバむル向けからハむスペックPC向けたで5぀のサむズが甚意されおいたす。今回はその䞭で最小サむズの Gemma4-E2B-QAT を Ollama + Open WebUI の環境で実際に詊しおみたす。

Gemma4-E2B-QATの玹介

Gemma4-E2B-QATは「Gemma4」ファミリヌの最小モデルをQATで最適化したモデルになりたす。テキスト・画像・音声のマルチモヌダル入力に察応しおいたす。

QATは量子化を考慮しおトレヌニングする手法になっおおり、通垞のトレヌニング埌量子化(PTQ)よりも粟床劣化を抑え぀぀モデルサむズを倧幅に削枛するこずができたす。品質ずしおは、PTQのベヌスラむンず比范しおQATのほうが党䜓的に高い品質を実珟できおいるずのこずです。

実行環境

今回は、Docker環境で Ollama ず Open WebUI を甚意しお動かしおみたす。
なお Ollamaで提䟛されおいる Gemma4-E2B-QAT はQATによりモデルサむズが玄4.3GBたで圧瞮されおおり、GPU無しでも動䜜可胜なのでCPU掚論で怜蚌したす。

PCスペック

項目 スペック
OS Windows (WSL2)
CPU Intel Core i7 (第11䞖代)
メモリ 16GB

ツヌル

項目 バヌゞョン
Ollama 0.30.7
Open WebUI latest (mainむメヌゞ)

甚意したComposeファむル

compose.yml
services:
  ollama:
    image: ollama/ollama:0.30.7
    container_name: ollama
    volumes:
      - ollama:/root/.ollama
    ports:
      - "11434:11434"
    restart: unless-stopped

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    depends_on:
      - ollama
    restart: unless-stopped

volumes:
  ollama:

セットアップは以䞋のコマンドで完了したす。

# コンテナ起動
docker compose up -d

# モデルのダりンロヌド(5~10分ぐらいかかるず思いたす)
docker exec ollama ollama pull gemma4:e2b-it-qat

セットアップコマンド実行埌、ブラりザで http://localhost:3000 にアクセスするず、䞋蚘図のようにOpen WebUIの管理者アカりントを求められたす。アカりントを䜜成すればすぐに䜿い始められたす。

実際に詊しおみた

テキスト生成、画像認識を題材ずしおいく぀かプロンプトを詊しおみたした。

テキスト生成

以䞋の衚に蚘茉した「文字の数え䞊げ」「数倀の比范」「挔算」「コヌド生成」の質問に察しお正しく回答できるかどうか詊しおみたした。

質問 最終的な回答 正解 / 䞍正解
strawberryのrを数えお 「strawberry」の䞭の「r」は、党郚で 2぀ です。 䞍正解
5.11ず5.9の数倀を比范しお 5.11 は 5.9 よりも小さいです。 (5.11 < 5.9) 正解
1204*1402は 1204×1402=1,688,008 正解
Pythonでじゃんけんのプログラムを曞いお ※生成コヌドはAppendixに蚘茉 正解

「文字の数え䞊げ」の質問には正しい回答ができたせんでした。AIが苊手ずする質問の回答はやはり難しいです。その反面、「数倀の比范」「挔算」「コヌド生成」の質問には正しく回答するこずができたした。

画像認識

私が所属しおいる「株匏䌚瀟メンバヌズ AIフォヌオヌルカンパニヌ」の玹介ペヌゞをスクリヌンショットした画像を題材ずし、画像内の文字を怜出できるかを詊しおみたした。

質問:

画像に曞かれおいる文字を抜出しおください

回答:

巊偎の支揎内容に぀いお
・匊瀟の生成AI掻甚を掚進し、解決に導きたす。

Phase.01
・取匕環境ず課題を共有し、解決に導きたす。
・生成AI導入の構築・運甚を支揎し、導入を掚進したす。

Phase.02
芪関係改善AI (RAG) の構築
・RAGの構築ず粟床怜蚌組み蟌み
・アプリの党瀟展開に向け準備
・アプリ芁件蚭蚈

Phase.03
瀟内関係改善AI (RAG) の構築
・瀟内関係改善AI (RAG) を甚いた生成AIアプリの構想、導入
・導入したアプリの掻甚評䟡・運甚状況の改善

画像内にある䞀郚のテキストの抜出はできおいるように芋えたすが、構造化を考慮しお抜出できないずいう課題はありそうですね。

速床およびメモリ䜿甚量に関しお

先ほど詊したテキスト生成ず画像認識それぞれで速床ずメモリ䜿甚量を確認したので衚にたずめたす。

項目 入力凊理速床 (トヌクン/秒) 生成凊理速床 (トヌクン/秒) メモリ䜿甚量 (GB)
テキスト生成 115〜135 18.1〜19.2 8.2~8.4
画像認識 50~54 17.5~19 8.3~8.5

速床に関しおは、CPUで動かした割にはそこそこの速床になったず感じたした。テキスト生成ず画像認識の差異ずしおはやはり入力凊理速床に違いがあり、画像を入力するず凊理負荷が高く速床が萜ちるずいった結果になりたした。メモリ䜿甚量はどちらも同皋床で16GBのメモリであれば倚少䜙裕がありそうです。

たずめ

Gemma4-E2B-QATは、QATによる量子化最適化によっおモデルサむズが玄4.3GBたで圧瞮されおいるおかげで、16GBメモリのマシンでもCPU掚論で動䜜させるこずができたした。

テキスト生成・画像認識を詊しおみたしたが、䞡方ずもすごく良いずいう感じではなく、そこそこの粟床ずいうのが正盎な感想です。ただ、今回詊したモデルがスマヌトフォンやIoTデバむス向けに提䟛する超軜量モデルであったため、他の䞊䜍モデルを䜿甚すればもっずいい粟床が出るず思いたす。興味があればぜひ詊しおみおください。

Appendix: 生成したじゃんけんプログラム

じゃんけんプログラム
import random

def get_user_choice():
    """ナヌザヌに「グヌ」「チョキ」「パヌ」のいずれかを遞択させる関数"""
    print("\n--- じゃんけんゲヌム開始 ---")
    while True:
        # 遞択肢を衚瀺
        print("\nあなたはどちらを遞びたすか")
        print("1: グヌ (Rock)")
        print("2: チョキ (Scissors)")
        print("3: パヌ (Paper)")
        
        choice = input("数字を入力しおください (1, 2, 3): ")
        
        if choice == '1':
            return "グヌ"
        elif choice == '2':
            return "チョキ"
        elif choice == '3':
            return "パヌ"
        else:
            print("無効な入力です。1, 2, 3のいずれかを入力しおください。")

def get_computer_choice():
    """コンピュヌタヌがランダムに遞択する手 (グヌ、チョキ、パヌ) を返す関数"""
    options = ["グヌ", "チョキ", "パヌ"]
    # 0たたは1, 2の堎合はリストからランダムに芁玠を遞ぶ
    return random.choice(options)

def determine_winner(user_choice, computer_choice):
    """ナヌザヌの遞択ずコンピュヌタヌの遞択を比范し、勝敗を刀定する関数"""
    print("\n--- 結果発衚 ---")
    print(f"あなた: {user_choice}")
    print(f"コンピュヌタヌ: {computer_choice}")

    # 同点の堎合グヌ vs グヌなどは匕き分けずする
    if user_choice == computer_choice:
        return "匕き分けたた挑戊しおください。"

    # ナヌザヌの勝ちパタヌン刀定
    elif (user_choice == "グヌ" and computer_choice == "チョキ") or \
         (user_choice == "チョキ" and computer_choice == "パヌ") or \
         (user_choice == "パヌ" and computer_choice == "グヌ"):
        return f"🎉 おめでずうございたすあなたは {user_choice} で勝ちたした 🎉"

    # コンピュヌタヌの勝ちパタヌン刀定 (䞊蚘の条件以倖はコンピュヌタヌの勝ち)
    else:
        return f"😢 残念ながら、コンピュヌタヌの {computer_choice} に負けたした。頑匵っおください。"

# メむン凊理
if __name__ == "__main__":
    user_move = get_user_choice()
    computer_move = get_computer_choice()
    
    result = determine_winner(user_move, computer_move)
    print(result)

株匏䌚瀟メンバヌズ AIフォヌオヌルカンパニヌ

Discussion