ElcamyTECH
Articles
Ollama

llmfit の推定速度を M4 MacBook Air の実測と比べた。量子化を指定すれば差は2割以内

TechOllamaOllamaローカルLLMMacベンチマーク2026/09/22 (更新: 2026/09/23)

ローカルLLMを触るとき、どのモデルが自分のMacに載るのか、載ったとしてどれくらいの速さで返ってくるのかは、落として動かすまで分かりません。4Bクラスでも1モデル3GB前後あるので、片っ端から試すのは時間もディスクも食います。

llmfit は、そこを事前に見積もるCLIツールです(GitHub 3.5万スター、MIT)。CPU・メモリ・GPUを検出して、8,000件以上のモデルについて「メモリに載るか」と「生成速度(tok/s)」を出します。ただし中身は「メモリ帯域 ÷ モデルサイズ × 係数」の計算で、モデルを実際に動かしているわけではありません。どこまで信用していいのか、手元の M4 MacBook Air 16GB で実測と並べました。

先に結果です。量子化を指定して推定させた5件は、実測との差が最大15%でした。一方、何も指定しない一覧の値は実測の55〜75%で、3〜4割低く出ます。この差は精度の問題ではなく、量子化の前提が違うせいでした。

llmfit が出す数字は2種類ある

同じツールでも、コマンドによって前提が違います。

  • llmfit fit: 何も指定せず、全モデルの推定を一覧で出す。量子化は llmfit が選ぶ
  • llmfit plan: モデル・量子化・コンテキスト長を指定して、1件だけ推定する

比較の基準は測る前に決めました。差が2割以内なら合っているとみなすことにしています。

測り方

bash
llmfit fit --json --no-dashboard
llmfit plan "google/gemma-3-4b-it" --context 4096 --quant Q4_K_M --json

実測は Ollama と MLX の2通り。同じ日本語の指示文を投げ、最大200トークン、温度0、seed=42 で5回動かして中央値を取りました(9月6日の計測だけ3回)。Ollama は /api/generate の eval_count ÷ eval_duration、MLX は mlx-lm の stream_generate が返す generation_tps を使っています。

項目値
マシンMacBook Air(Apple M4・10コア・16GB ユニファイドメモリ)・macOS 26.5
llmfit1.1.15(GitHub Releases の arm64 バイナリ)
Ollama0.33.3
MLXmlx-lm 0.31.3 / mlx 0.32.2
モデルgemma3:4b(Q4_K_M・3.11GiB)、qwen3.5:4b(Q4_K_M・3.16GiB)、mlx-community/gemma-3-4b-it-4bit

Slack も Chrome も Notion も開いたまま測っています。普段の状態で何 tok/s 出るかが知りたかったからです。そのかわり、空きメモリとスワップ使用量を1回ごとに残しました。

量子化を指定した推定は、実測と最大15%差

llmfit の推定を実測で割った値。量子化を指定した5件は85〜115%で2割以内の帯に入り、何も指定しない一覧は55〜75%で帯の外

実測した構成推定(plan)実測(中央値)推定÷実測
gemma3:4b Ollama Q4(9月6日)30.7 tok/s31.3 tok/s98%
gemma3:4b Ollama Q4(9月12日、MLX の前)30.7 tok/s26.8 tok/s115%
gemma3:4b Ollama Q4(9月12日、MLX の後)30.7 tok/s27.8 tok/s110%
gemma3:4b MLX 4bit(9月12日)30.7 tok/s36.3 tok/s85%
qwen3.5:4b Ollama Q4(9月6日)28.3 tok/s24.7 tok/s115%

llmfit は Q4_K_M と mlx-4bit に同じ 30.7 tok/s を返します。ランタイムを Ollama から MLX に替えても実測はその前後で、4bit であれば実装の違いは誤差に埋もれました。

メモリ使用量も plan が返します。こちらは3件とも6〜28%多めでした。足りなくなる側には外していないので、載るかどうかの判断には使えます。

実測した構成推定(KVキャッシュ込み)実測推定÷実測
gemma3:4b Ollama Q43.53GB2.89GB(ollama ps の値)122%
qwen3.5:4b Ollama Q43.33GB3.15GB(同)106%
gemma3:4b MLX 4bit3.40GB2.65GB(mlx のピーク値)128%

一覧の値が低いのは 8bit 前提だから

fit の値は gemma3:4b が 20.1、qwen3.5:4b が 18.5 tok/s。実測の55〜75%です。

llmfit はメモリに余裕があると品質の高い量子化を選ぶので、このMacでは mlx-8bit で計算します。私が入れているのは Q4_K_M と mlx-4bit なので、そもそも別の構成の数字を見ていたことになります。plan で量子化だけ変えると、こう動きます。

指定した量子化gemma3:4bqwen3.5:4b
Q4_K_M(Ollama の既定)30.728.3
mlx-4bit30.728.3
mlx-8bit(llmfit が選ぶ)15.314.2

Ollama を起動していれば llmfit はインストール済みのモデルを検出します。それでも一覧の推定は mlx-8bit のままでした。一覧に並ぶ値は、自分が入れたモデルの速度ではなく、llmfit が勧める構成で動かしたときの速度です。

厄介なのは、同じモデルでもコマンドによって値が変わる点です。fit の 20.1 と plan --quant mlx-8bit の 15.3 は比が1.31。これは fit だけが掛けている補正係数(起動時に測ったメモリ帯域から出る1.309)と一致します。Web 画面は補正なしの側なので、比べるときはどれか1つのコマンドに揃えてください。

llmfit の Web 画面。上部に検出したハードウェア(Apple M4・16GB)、下にモデルの一覧と推定速度

同じモデルでも、日によって6倍違った

アプリを開いたまま、日を変えて gemma3:4b を測るとこうなりました。

同じ gemma3:4b の実測。MLX 4bit 36.3、9月6日 31.3、9月12日 26.8、9月11日 5.7 tok/s。点線は推定値30.7

計測空きメモリスワップ使用量実測(中央値)5回の範囲
9月12日 MLX 4bit31〜35%約15GB36.3 tok/s31.9〜37.5
9月6日 Ollama Q41.3〜2.4GB(llmfit の表示)記録なし31.3 tok/s31.2〜33.7
9月12日 Ollama Q421〜44%13〜16GB26.8 tok/s22.1〜27.9
9月11日 Ollama Q419〜21%15〜19GB5.7 tok/s3.8〜8.9

9月11日はスワップが19GBまで膨らんでいた日です。ollama ps を見るとモデルは GPU 側に全部載っているのに、初回の読み込みに16〜58秒、生成は5.7 tok/s。ほかの日とは6倍違います。スワップに押されて重みがメモリに留まれず読み直しているのだろう、という見当はつきますが、そこまでは追っていません。

llmfit はその時点のメモリの混み具合を見ていないので、推定の30.7 tok/s は「余裕がある日に出る速度」として読むことになります。

測っていないこと

llmfit が一覧で使う mlx-8bit そのものと、qwen3.5:4b の MLX 実測は試していません。12B以上のモデルもディスクの空きが足りず、13GB の gpt-oss:20b は見送りました。今回の2モデルはどちらもメモリに余裕のあるサイズなので、載るかどうかの境目はまだ確かめられていません。

関連記事

Solution

AIエージェント・Dify構築支援

AIエージェント開発・Dify構築・PoC・社内研修まで
ワンストップで支援。まずはお気軽にご相談ください。

Elcamy

Technology Partners

DifyGoogle Cloud Partner