ローカルLLMを動かすのに、Macのメモリは何GB要るのか。買う前に知りたかったのに、どこにも書いていない。仕方がないので手元の3台で測りました。
一番ひっかかったのは、ファイル7.6GBのモデルが、動かすと9.0GBのメモリを食っていたことです。7.6GBなら8GBのMacBook Proに載るだろう、と思ってダウンロードしました。結果は、1時間走らせて200トークンが1回も返ってこない。
つまり、買うときに見るべきはダウンロードサイズではなく実行時占有で、必要なメモリはそこにOSとアプリの3GBを足した量になる。目安は「使いたいモデルの実行時占有 + 3GB」。これが今回いちばん言いたいことです。
もう一つ。「Intel Macだけどメモリは32GBある」という人向けの話も測りました。こちらは、小型モデルを回すぶんには買い替えなくても足ります。
測った環境
| M1 MacBook Pro | M4 MacBook Air | Intel mac mini | |
|---|---|---|---|
| メモリ | 8GB | 16GB | 32GB |
| SoC | Apple M1 | Apple M4 | Intel Core i5-8500B |
| 演算 | Apple GPU | Apple GPU | OllamaはCPUのみで動作(内蔵GPUは使われない) |
| OS | macOS 15.6.1 | macOS 26.5.2 | macOS 15.7.7 |
| ollama | 0.32.4 | 0.32.4 | 0.32.4 |
Ollama REST API の /api/generate に num_predict=200・seed=42 で同じ日本語プロンプトを投げ、eval_count ÷ eval_duration を tok/s としています。各モデル3回測って中央値を採り、モデル間は keep_alive:0 でアンロード。コンテキスト長は ollama ps の表示で3台とも 4096 でした。
先に断っておくと、3台はメモリ量以外もぜんぶ違います。SoCの世代もGPUの有無もOSも違うので、速度差のうちどれがメモリによるものかは切り分けられていません。
あと、速い遅いを言うのに基準がないと話が進まないので、この記事では 10 tok/s 以上を「待たずに読める」、5前後を「遅いが使える」、1前後を「実用外」として書きます。測って決めた線ではなく、日本語を読む速度から引いた目安です。
「Intel Macで32GB」はどこまで使えるか
まずIntel機は、明らかに事情が違いました。ollama ps を見ると、mac miniは 100% CPU と出ます。Apple Silicon機はGPUで動く。ollamaがIntel Macの内蔵GPUを使わないためで、ここはメモリを積んでも埋まりません。
| モデル | ファイル容量 | M4 16GB | mac mini 32GB | 速度比 |
|---|---|---|---|---|
alibayram/smollm3 | 1.9 GB | 46.7 | 14.2 | 3.29× |
gemma3:4b | 3.3 GB | 36.0 | 11.1 | 3.24× |
qwen3.5:4b | 3.4 GB | 28.0 | 9.5 | 2.95× |
gemma4:e2b | 7.2 GB | 53.3 | 17.6 | 3.03× |
gemma4:12b | 7.6 GB | 12.9 | 3.8 | 3.39× |
gpt-oss:20b | 13.0 GB | 18.2 | 7.5 | 2.43× |
倍のメモリを積んでいるのに、6モデルすべてで2.43〜3.39倍の開きがつきました。32GBが活きるはずの中型2モデル(下2行)でも変わりません。8GBのM1と比べても1.31〜1.39倍遅いので、メモリで挽回できる差ではないです。
とはいえ、小型モデルなら 9.5〜17.6 tok/s は出ています。上の基準では「待たずに読める」に入るので、手持ちのIntel機で小型モデルを回すぶんには、買い替えなくても足ります。
そして大きいモデルになると、今度は逆にIntel機のほうが返ってきます。
| 機体 | 占有9.0GBの gemma4:12b を走らせた結果 |
|---|---|
| M1 8GB(GPU) | 62分37秒で未完走。スワップ5,232MB・空きメモリ11% |
| M4 16GB(GPU) | 完走 12.9 tok/s(占有8.0GB・100% GPU) |
| mac mini 32GB(CPU) | 3回とも完走 3.8 tok/s |
Apple Siliconは載れば速く、載らなければ返ってこない。Intelは崖が無い代わりに全域で遅い。メモリに収まらないサイズのモデルを試したいときだけ、32GBのIntel機に出番があります。 ただし3.8 tok/sは「遅いが使える」の下限あたりなので、常用するものではありません。
Intel機だけでどこまでやれるかは、32GBのIntel Mac miniで「35B級MoE」ローカルLLMは動くかで別途測っています。
ダウンロードサイズは、載るかどうかの判断に使えない
冒頭に書いた話です。ファイル容量と実行時占有は一致しません。
gemma4:e2b はファイル7.2GBですが、占有はM1で1.7GB、M4で7.0GB。gemma4:12b はファイル7.6GBに対して占有9.0GBと、逆にファイルサイズを上回ります。同じくらいのファイル容量でも、載る場合と載らない場合がある。 占有は動かした状態で ollama ps に出るので、そちらを見てください。コンテキスト長を増やせば必要なメモリも増えます。
測れた4点を、占有と搭載メモリの差で並べるとこうなりました。
| 機体 | モデル | 占有 | 搭載メモリとの差 | 結果 |
|---|---|---|---|---|
| M1 8GB | 小型4モデル | 1.7〜3.9GB | −4.1GB以上 | 完走 |
| M1 8GB | gemma4:12b | 9.0GB | +1.0GB | 未完走 |
| M4 16GB | gemma4:12b | 8.0GB | −8.0GB | 完走 12.9 tok/s |
| M4 16GB | gpt-oss:20b | 13.0GB | −3.0GB | 完走 18.2 tok/s |
4点とも「占有 + 3GB が搭載メモリに収まれば完走する」で説明がつきます。3GBはOSとアプリの分です。
ただし境界そのものは測っていません。8GB機で確かめたのは占有3.9GBまでと占有9.0GBの2点で、間の占有5〜6GBは未計測です。際どい位置のモデルを使うなら、ollama ps で占有を見てから決めてください。
未完走というのも、制限時間内に返らなかったという意味です。放置すれば返る可能性はあります。ただしその間、スワップは5,232MB、空きメモリは11%でした。
早見表

| モデル | ファイル容量 | M1 8GB | M4 16GB | mac mini 32GB |
|---|---|---|---|---|
alibayram/smollm3 | 1.9 GB | 19.8 | 46.7 | 14.2 |
gemma3:4b | 3.3 GB | 14.7 | 36.0 | 11.1 |
qwen3.5:4b | 3.4 GB | 12.4 | 28.0 | 9.5 |
gemma4:e2b | 7.2 GB | 23.0 | 53.3 | 17.6 |
gemma4:12b | 7.6 GB | 20分以内に完走せず | 12.9 | 3.8 |
gpt-oss:20b | 13.0 GB | 未計測 | 18.2 | 7.5 |

16GBのM4は8GBのM1に対して 2.26〜2.45倍(平均2.35倍)速い。ただしこの2台はメモリ量とチップ世代が同時に変わっているので、どちらがどれだけ効いたかは分けられません。同じチップでメモリだけ違う2台を並べる必要があります。
gpt-oss:20b(ファイル13GB)を8GB機で試していないのは、載らないだろうと決めつけて回さなかったからです。
測るなら、ollamaのバージョンは揃えてください
自分で測る人向けに3つ。どれも数字が大きく動いた実例があります。
バージョンを揃える。 同じM4・同じモデルで、変えたのは ollama のバージョンだけで gpt-oss:20b が 1.0 → 18.2 tok/s(18倍)になりました。初回ロードも140.8秒→34.7秒。演算配分も占有13GBも変わっていません。リリースノートを 0.31.2 から 0.32.4 まで追いましたが、この差を説明する記載は見つけられませんでした。原因は分からないままですが、揃えないと比較にならないことだけは確かです。

3回測って中央値を採る。 掲載した0.32.4の16件でブレ幅(最大−最小÷中央値)を出すと 0.0%〜38.9% に散りました。100% GPUで回ったM4の5件は 0.0〜1.4% に収まりましたが、mac miniの qwen3.5:4b は 6.0/9.5/9.7 で 38.9% あります。1回で済ませると、最大でこれだけ外します。
モデル間でアンロードする。 他のモデルを常駐させたまま単発で測っていたとき、同じ qwen3.5:4b が 27.3 と 18.5 tok/s を返しました。32%のブレです。
再現手順
掲載値は3回計測の中央値なので、その形で貼ります。ollamaとjqがあれば動きます。版が違えば止まるようにしてあります。
MODEL=qwen3.5:4b
EXPECT_OLLAMA=0.32.4 # 揃える版。ここで止めないと、別版の数字を後で引き算してしまう
TIMEOUT=1200 # 1回あたりの上限(秒)。返ってこない組み合わせを延々待たない
PROMPT="製造業の中小企業がローカルLLMを導入する利点と注意点を、日本語の箇条書きで5つ、簡潔に説明してください。"
# 条件ごとにディレクトリを分ける(同じモデルを別バージョンで測り直すので上書きさせない)
OUT="$HOME/bench-raw/$(hostname -s)-$(date +%Y%m%d-%H%M%S)"; mkdir -p "$OUT"
# 版は記録するだけでなく、違ったら測らない
ollama --version | tee "$OUT/version.txt"
ollama --version | grep -q "$EXPECT_OLLAMA" \
|| { echo "ollama が $EXPECT_OLLAMA ではありません。揃えてから測ってください"; exit 1; }
ollama list | tee "$OUT/models.txt" # モデルIDを控える
# 測る前に、常駐しているモデルを全部降ろす(常駐したままだと最大32%ずれた)
curl -s http://localhost:11434/api/ps | jq -r '.models[]?.name' | xargs -I{} ollama stop {}
# 3回まわして生JSONを保存し、中央値を出す
for i in 1 2 3; do
curl -s --max-time "$TIMEOUT" http://localhost:11434/api/generate \
-d "$(jq -n --arg m "$MODEL" --arg p "$PROMPT" \
'{model:$m, prompt:$p, stream:false, options:{num_predict:200, seed:42, num_ctx:4096}}')" \
> "$OUT/${MODEL//[:\/]/_}-$i.json" \
|| { echo "$TIMEOUT 秒で返りませんでした。この構成は未完走として記録します"; break; }
done
jq -s 'map(.eval_count / (.eval_duration / 1000000000)) | sort | .[1]' \
"$OUT/${MODEL//[:\/]/_}"-*.json # 3回の中央値
# メモリ占有とCPU/GPU配分(アンロード前に取る)
ollama ps | tee "$OUT/${MODEL//[:\/]/_}-ps.txt"
# 次のモデルを測る前にアンロード
ollama stop "$MODEL"使ったモデルのIDも載せておきます(表の値はM4のもの)。小型4モデルは計測時に3台でIDが一致することを確認しましたが、ollama list の出力を保存し忘れたので後から突き合わせられません。上の手順で models.txt に残しているのはそのためです。ollamaのタグは可変で、同じ gemma3:4b でも取得時期が違えば別の重みになり得ます。
| モデル | ID |
|---|---|
alibayram/smollm3:latest | 6463ebe1ce6a |
gemma3:4b | a2af6cc3eb7f |
qwen3.5:4b | 2a654d98e6fb |
gemma4:e2b | 7fbdbf8f5e45 |
gemma4:12b | 4eb23ef187e2 |
gpt-oss:20b | 17052f91a42e |
num_predict=200 には注意点があります。今回使ったモデルの一部は思考を先に出すので、200トークンだと回答本文が出ないまま打ち切られます。速度の計測としては有効ですが、日本語の品質を見たいときは think:false と num_predict≥500 で取り直してください(gpt-oss のように thinking を完全には切れないモデルもあります)。今回も gemma4:e2b と qwen3.5:4b は本文が空でした。
測っていないこと
- 占有4GB〜9GBの間。 8GB機の境界がどこにあるかは特定できていません
- 同世代SoCでメモリだけ違う2台。 これがないとメモリ量とチップ世代の寄与を分けられません
- Apple Siliconの32GB機。今回の32GB列はIntel機なので、32GBそのものの評価にはなっていません
- 量子化方式とコンテキスト長を変えたときの挙動、日本語品質(速度しか測っていません)

