実機ログ・自動計測

Mac mini M4・24GBでGemma 4を実測:日本語4課題の入力・出力・速度

結論:このMacでは、E2B・12Bともに4課題×3回の実行が完了しました。課題別の生成速度中央値は下表で比較できます。

誰向け:Mac mini M4・24GBで、日本語の短い下書きや整理をローカル実行する判断材料がほしい人向けです。

次にやること:入力と出力の例を読み、同じモデル・量子化・条件で短い架空データから再現してください。

何を、どの条件で測ったか

実行日(自動計測):2026-10-24。Mac mini M4・メモリ24GB、macOS 27.0.1、Ollama 0.35.0。ログの時刻はUTC、閲覧時は日本時間に9時間加算します。人による確認記録とは分けています。

OllamaのローカルAPI経由の結果です。各社のアプリ版の画面・機能を操作した結果ではありません。APIの従量課金は0円、電力費は未計測です。

入力はすべて架空。temperature=0、seed=42、num_ctx=4096、num_predict=768、think=false、JSON形式を指定しました。両モデルに同じ入力を送り、各課題を3回ずつ実行しています。

モデル名だけで同じ配布物とみなさず、各行のログにダイジェスト・量子化・ファイルサイズを保存しています。12Bは導入済みの配布物、E2Bは今回取得した配布物です。

全条件・固定入力 / 全24回の集計元 / 再現用スクリプト

4課題の結果:各3回の中央値

最初の応答は、送信開始から最初の空でない出力文字列を受信するまで。生成速度はOllamaのeval_count÷eval_durationから算出しました。モデルごとにトークンの区切り方が異なるため、文字/秒とは違います。

同じ固定入力を3回実行した中央値。不一致は定義した機械判定の範囲です。
モデル課題生成 tokens/秒最初の応答 秒完了 秒不一致 3回
gemma4:e2b要約55.640.0901.7550 / 0 / 0
gemma4:e2bメール下書き38.760.0892.7820 / 0 / 0
gemma4:e2b議事録整形54.140.0861.6790 / 0 / 0
gemma4:e2b簡単なコード49.200.0871.0000 / 0 / 0
gemma4:12b要約13.000.3887.7800 / 0 / 0
gemma4:12bメール下書き13.090.3257.5160 / 0 / 0
gemma4:12b議事録整形13.120.3267.1440 / 0 / 0
gemma4:12b簡単なコード13.270.3394.1100 / 0 / 0

繰り返し実行ではモデルや入力のキャッシュの影響を含みます。中央値だけでは起動待ちを表せないため、初回の全経過時間・load_duration・各回の時刻も生ログで確認できます。OS再起動直後やキャッシュ消去後の検査は実施していません。

不一致0は、文章の自然さや全事実が正しいという評価ではありません。要約の数量・費用案・期限・予算未決定、メールの未定項目、議事録の担当別期限と予算、コードの5入力と入力非変更を機械判定した結果です。重要な内容は原文と照合してください。

モデルサイズとメモリの観測

GiBは1024の3乗バイト。RSSは対象サーバープロセス群のサンプル最大値です。
モデル量子化登録サイズ GiBRSS最大 GiBOllama申告size GiBこの条件での実行
gemma4:e2bQ4_K_M4.274.680.2212回完了
gemma4:12bQ4_K_M7.047.917.5012回完了

RSSは約0.25秒ごとのpsによるllama-server等の観測で、Mac全体やGPUを含めた総消費量の保証ではありません。Ollamaの/api/psが申告するsizeとは定義が異なります。特にE2Bでは両者の差が大きいため、申告sizeだけを必要メモリとして使わないでください。両者を足し合わせません。

24GBでこの短い入力・4096コンテキストの実行は確認できました。長文、画像・音声、同時実行、大きなコンテキスト、別の配布物の必要メモリは未測定です。

固定入力と、出力をそのまま読む

共通のシステム指示:

日本語で、指定したJSONだけを返してください。入力にない事実や期限を補完しないでください。入力はすべて架空の練習データです。

要約

入力:

次のメモを要約してJSONで返してください。キーは「数量」「費用案円」「期限」「予算決定」「要約」です。数量と費用案円は単位を付けずJSONの数値にしてください。未決定の予算決定はfalse。
架空メモ:研修資料は30部。印刷費の案は120000円で、予算の承認はまだない。納品期限は2026-10-30。全社展開はせず、まず一部署で試行する。

gemma4:e2b

1回目:出力・ログ
{
  "数量": 30,
  "費用案円": 120000,
  "期限": "2026-10-30",
  "予算決定": false,
  "要約": "研修資料30部を印刷費120000円で作成し、一部署での試行を行う。予算承認は未了。"
}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{
  "数量": 30,
  "費用案円": 120000,
  "期限": "2026-10-30",
  "予算決定": false,
  "要約": "研修資料30部を印刷費120000円で作成し、一部署での試行を行う。予算承認は未了。"
}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{
  "数量": 30,
  "費用案円": 120000,
  "期限": "2026-10-30",
  "予算決定": false,
  "要約": "研修資料30部を印刷費120000円で作成し、一部署での試行を行う。予算承認は未了。"
}

この回の生ログ・時間・メモリサンプル / 送信内容

gemma4:12b

1回目:出力・ログ
{
  "数量": 30,
  "費用案円": 120000,
  "期限": "2026-10-30",
  "予算決定": false,
  "要約": "研修資料30部を120000円で印刷。2026-10-30までに、まず一部署で試行する。"
}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{
  "数量": 30,
  "費用案円": 120000,
  "期限": "2026-10-30",
  "予算決定": false,
  "要約": "研修資料30部を120000円で印刷。2026-10-30までに、まず一部署で試行する。"
}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{
  "数量": 30,
  "費用案円": 120000,
  "期限": "2026-10-30",
  "予算決定": false,
  "要約": "研修資料30部を120000円で印刷。2026-10-30までに、まず一部署で試行する。"
}

この回の生ログ・時間・メモリサンプル / 送信内容

メール下書き

入力:

架空の顧客・佐藤さんから、納期と値引きの問い合わせが来ました。担当・田中として返信の下書きを作ってください。納期は未定、値引きも未決定です。約束せず、確認後に連絡する内容にします。JSONのキーは「件名」「本文」「納期」「値引き率」。納期と値引き率の値はどちらもnullにしてください。

gemma4:e2b

1回目:出力・ログ
{
  "件名": "お問い合わせありがとうございます",
  "本文": "佐藤様\n\nいつもお世話になっております。田中です。\n\n納期と値引きについてお問い合わせいただき、ありがとうございます。\n\n現在、詳細を確認しておりますので、改めて納期および値引きの件につきまして、確認が取れ次第、改めてご連絡させていただきます。\n\n今しばらくお待ちいただけますようお願い申し上げます。",
  "納期": null,
  "値引き率": null
}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{
  "件名": "お問い合わせありがとうございます",
  "本文": "佐藤様\n\nいつもお世話になっております。田中です。\n\n納期と値引きについてお問い合わせいただき、ありがとうございます。\n\n現在、詳細を確認しておりますので、改めて納期および値引きの件につきまして、確認が取れ次第、改めてご連絡させていただきます。\n\n今しばらくお待ちいただけますようお願い申し上げます。",
  "納期": null,
  "値引き率": null
}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{
  "件名": "お問い合わせありがとうございます",
  "本文": "佐藤様\n\nいつもお世話になっております。田中です。\n\n納期と値引きについてお問い合わせいただき、ありがとうございます。\n\n現在、詳細を確認しておりますので、改めて納期および値引きの件につきまして、確認が取れ次第、改めてご連絡させていただきます。\n\n今しばらくお待ちいただけますようお願い申し上げます。",
  "納期": null,
  "値引き率": null
}

この回の生ログ・時間・メモリサンプル / 送信内容

gemma4:12b

1回目:出力・ログ
{
  "件名": "お問い合わせの件につきまして",
  "本文": "佐藤様\n\nいつもお世話になっております。担当の田中です。\n\nお問い合わせいただきました納期および値引きの件につきまして、現在社内にて確認を行っております。\n確認ができ次第、改めてご連絡差し上げます。今しばらくお待ちいただけますと幸いです。",
  "納期": null,
  "値引き率": null
}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{
  "件名": "お問い合わせの件につきまして",
  "本文": "佐藤様\n\nいつもお世話になっております。担当の田中です。\n\nお問い合わせいただきました納期および値引きの件につきまして、現在社内にて確認を行っております。\n確認ができ次第、改めてご連絡差し上げます。今しばらくお待ちいただけますと幸いです。",
  "納期": null,
  "値引き率": null
}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{
  "件名": "お問い合わせの件につきまして",
  "本文": "佐藤様\n\nいつもお世話になっております。担当の田中です。\n\nお問い合わせいただきました納期および値引きの件につきまして、現在社内にて確認を行っております。\n確認ができ次第、改めてご連絡差し上げます。今しばらくお待ちいただけますと幸いです。",
  "納期": null,
  "値引き率": null
}

この回の生ログ・時間・メモリサンプル / 送信内容

議事録整形

入力:

次の架空メモをJSONで整理してください。キーは「田中の期限」「佐藤の期限」「予算決定」「ToDo」。不明な期限はnull、予算が決まっていなければfalseです。
田中:見積書を2026-10-30までに送ります。
佐藤:設計を確認します。期限はまだ決められません。
田中:予算の採否は来週相談します。今日は決めません。

gemma4:e2b

1回目:出力・ログ
{
  "田中の期限": "2026-10-30",
  "佐藤の期限": null,
  "予算決定": false,
  "ToDo": [
    "見積書を送る(田中)",
    "設計を確認する(佐藤)",
    "予算の採否を来週相談する(田中)"
  ]
}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{
  "田中の期限": "2026-10-30",
  "佐藤の期限": null,
  "予算決定": false,
  "ToDo": [
    "見積書を送る(田中)",
    "設計を確認する(佐藤)",
    "予算の採否を来週相談する(田中)"
  ]
}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{
  "田中の期限": "2026-10-30",
  "佐藤の期限": null,
  "予算決定": false,
  "ToDo": [
    "見積書を送る(田中)",
    "設計を確認する(佐藤)",
    "予算の採否を来週相談する(田中)"
  ]
}

この回の生ログ・時間・メモリサンプル / 送信内容

gemma4:12b

1回目:出力・ログ
{
  "田中の期限": "2026-10-30",
  "佐藤の期限": null,
  "予算決定": false,
  "ToDo": [
    "見積書を2026-10-30までに送る",
    "設計を確認する",
    "予算の採否を来週相談する"
  ]
}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{
  "田中の期限": "2026-10-30",
  "佐藤の期限": null,
  "予算決定": false,
  "ToDo": [
    "見積書を2026-10-30までに送る",
    "設計を確認する",
    "予算の採否を来週相談する"
  ]
}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{
  "田中の期限": "2026-10-30",
  "佐藤の期限": null,
  "予算決定": false,
  "ToDo": [
    "見積書を2026-10-30までに送る",
    "設計を確認する",
    "予算の採否を来週相談する"
  ]
}

この回の生ログ・時間・メモリサンプル / 送信内容

簡単なコード

入力:

Pythonの関数 sum_positive(values) を作ってください。数値のリストから0より大きい数だけを合計し、空リストなら0を返します。入力リストは変えません。importや外部アクセスは使わないでください。JSONのキー「code」に関数定義の文字列だけを入れてください。

gemma4:e2b

1回目:出力・ログ
{"code": "def sum_positive(values):\n    total = 0\n    for x in values:\n        if x > 0:\n            total += x\n    return total"}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{"code": "def sum_positive(values):\n    total = 0\n    for x in values:\n        if x > 0:\n            total += x\n    return total"}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{"code": "def sum_positive(values):\n    total = 0\n    for x in values:\n        if x > 0:\n            total += x\n    return total"}

この回の生ログ・時間・メモリサンプル / 送信内容

gemma4:12b

1回目:出力・ログ
{
  "code": "def sum_positive(values):\n    total = 0\n    for num in values:\n        if num > 0:\n            total += num\n    return total"
}

この回の生ログ・時間・メモリサンプル / 送信内容

2回目:出力・ログ
{
  "code": "def sum_positive(values):\n    total = 0\n    for num in values:\n        if num > 0:\n            total += num\n    return total"
}

この回の生ログ・時間・メモリサンプル / 送信内容

3回目:出力・ログ
{
  "code": "def sum_positive(values):\n    total = 0\n    for num in values:\n        if num > 0:\n            total += num\n    return total"
}

この回の生ログ・時間・メモリサンプル / 送信内容

今回の結果を選び方へ使う

今回の短い日本語4課題では、E2Bの生成速度中央値が各課題で12Bを上回りました。定義した判定項目は両モデルとも不一致0でした。これはこの入力と配布物の結果で、未検証の長文・知識量・画像・他社サービスの優劣には広げません。

まず同じ入力で試したい人は、E2Bから出力と待ち時間を確かめられます。自分の資料に置き換える際も、議事録なら担当と期限、メールなら未決定の約束を作っていないかを確認してください。

初回の計測では、サーバーのプロセス名を拾えていないRSSと、単位付きの「30部」を数値30との型不一致にした判定を見つけました。初回24件は削除せずリポジトリに保存し、収集対象と指示の型を明確にしたプロトコル2で両モデルを再実行しています。

初回ログ・使用スクリプト・実行記録

目的から手順へ進む

録音やPDFのアップロード、音声認識、画像生成、各社アプリ版の無料枠はこの実測の対象外です。