mcpField
I
inferbench

inferbench

ローカル
github.com/RudrenduPaul開発ツール05 週間前に更新

inferbench について

InferBenchは、llama.cppとomlxを使い、手元のハードウェアでLLM推論速度を測定します。開発者やハードウェア利用者向けに、統一したプロンプトテストと機械可読な結果を提供し、ローカル環境でエンジンを比較できます。

主な機能

  1. 01llama.cppとomlxのベンチマーク
  2. 02共通プロンプトと計測方式
  3. 03ウォームアップ後に8件を測定
  4. 04平均・最小・最大tokens/secの報告
  5. 05JSONベンチマークレポート

活用シーン

  1. 01同じマシン上でローカル推論エンジンを比較
  2. 02エンジン選定前に推論速度を測定
  3. 03スクリプトやCI向けに測定結果を保存

MCP 対応

MCPサーバーはrunツールを公開し、InferBench CLIを呼び出して解析済みJSONレポートを返します。MCPクライアントはstdio経由でサーバーをローカル起動します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"rudrendupaul-inferbench": {
"command": "uvx",
"args": [
"inferbench-cli"
]
}
}
}
起動コマンドuvx inferbench-cli

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiinferbench-cli0.1.7

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

InferBench

CI npm version PyPI version License: Apache 2.0

Inferbench - ハードウェア上のローカル LLM エンジンをベンチマーク | Product Hunt

「最高のローカル LLM エンジン」を紹介する記事は、どれも他人のマシンでベンチマークしています。InferBench は、あなたのマシンをベンチマークします。

ローカル推論エンジンは、それぞれ独自のハードウェアで測定したベンチマークを、それぞれの README で公開しています。しかし、目の前にあるマシンで実際にどのエンジンが最速なのかを教えてくれるものはありません。InferBench は、インストール済みの対応エンジンに対して、固定された多様なプロンプトセットをあなた自身のハードウェア上で実行し、実測した 1 秒あたりのトークン数を報告します。他人のブログ記事からコピーした数値ではありません。

インストール、初回実行、キャッシュ済みモデルを使った実際の omlx ベンチマーク:

InferBench のインストールと初回実行:pip install inferbench-cli を実行し、実際の 1 秒あたりのトークン数と推奨事項を報告する omlx のライブベンチマーク

npx inferbench-cli run --engines llama.cpp --model "bartowski/Qwen2.5-1.5B-Instruct-GGUF:Q4_K_M"

目次

インストール

InferBench は、同等に重視される独立した 2 つのパッケージを提供しています。ツールチェーンに合った方を選ぶか、両方をインストールしてください。どちらかがもう一方に置き換えられることはありません。どちらも同じ 2 つの対応エンジンに対して、同じ測定アーキテクチャを実行します。

# npm -- JavaScript/TypeScript CLI
npm install -g inferbench-cli
# or, no install:
npx inferbench-cli run --engines llama.cpp --model "<repo>:<quant>"

# PyPI -- Python CLI + library (genuine port, not a wrapper around the Node binary)
pip install inferbench-cli

どちらのパッケージも公開済みで、今すぐインストールできます。 npm install -g inferbench-cli と pip install inferbench-cli はどちらも動作します。詳しくは、 npmjs.com/package/inferbench-cli と pypi.org/project/inferbench-cli、 または Python に特化した手順を説明する python/README.md と docs/getting-started.md、 各配布版のバージョン履歴については CHANGELOG.md をご覧ください。

npm パッケージには Node.js >=18、PyPI パッケージには Python >=3.10 が必要です。どちらの場合も、対応エンジンが少なくとも 1 つインストール済みである必要があります(InferBench はエンジンをインストールしません)。

  • llama.cpp:brew install llama.cpp(macOS)または ggml-org/llama.cpp からビルド
  • omlx:brew tap jundot/omlx https://github.com/jundot/omlx && brew install omlx(Apple Silicon のみ)

機能

  • エンジンをまたいでも、同じ測定コードを使用します。 InferBench は各エンジン独自の OpenAI 互換 HTTP サーバー(llama-server、omlx serve)を起動し、エンジンごとに異なるベンチマークツールが出した数値を比較するのではなく、同一のプロンプトセットを同一の計測コードで各エンジンに送信します。
  • ヘッダーではなく、レスポンスボディ全体を計測します。 このコードの以前のバージョンでは、HTTP レスポンスオブジェクトが解決された直後に経過時間を計測していたため、ヘッダーの到着しか捉えておらず、バグが見つかる前に物理的にあり得ない 64,646 tok/s が報告されたこともありました。現在は両方の配布版でレスポンスボディ全体の所要時間を計測しており、各言語のハーネスに回帰テストを追加して修正を保護しています。
  • ウォームアップ付きの固定 8 プロンプトスイープ。 破棄する補完を 1 回実行して初回リクエストのレイテンシーを吸収してから、内容の異なる 8 個のプロンプトを個別に計測し、avg/min/max tok/s として報告します(結果テーブルでは n=8)。
  • 個別に保守され、出力が一致する 2 つの配布版。 npm の inferbench-cli(TypeScript)と PyPI の inferbench-cli(Node バイナリーのラッパーではなく、正規の Python 移植版)は、同じ CLI フラグと同じ JSON レポートフィールド名を公開します。
  • 機械可読なレポート。 どちらの配布版でも、--json / --out <file> を指定すると、完全な BenchmarkReport を camelCase の JSON で書き出します。そのため、CI やエージェントは、どちらの言語で生成されたかを個別に処理することなく解析できます。
  • ローカルとクラウドのコスト比較(Python ライブラリー)。 compare_to_cloud() は、計測したローカルのスループットとあわせて、日付が明記された静的なクラウド API 価格を参照します。これはライブ見積もりではなくスナップショットであることを明示し、認識できないモデルについては数値を推測せず None を返します。
  • パスを安全に扱う --out。 現在の作業ディレクトリーの外を指す相対パスの --out 値は拒否されるため、エージェントが指定した出力パスによって意図したディレクトリーの外に書き出されることはありません。

クイックスタート

# llama.cpp -- pass a Hugging Face repo spec; llama.cpp downloads and
# caches it automatically, no manual step required
inferbench run --engines llama.cpp --model "bartowski/Qwen2.5-1.5B-Instruct-GGUF:Q4_K_M"

# omlx -- pass the model-directory subdirectory name under ~/.omlx/models/;
# omlx has no CLI download flow, so the model must already be present there
# (download it once via `omlx`'s own admin dashboard, or huggingface_hub's
# snapshot_download into that directory)
inferbench run --engines omlx --model "qwen2.5-1.5b-instruct-4bit"

# Both installed engines, machine-readable output, saved to a file
inferbench run --model "<spec>" --json --out report.json

実際の llama-server プロセスを使ったライブ実行の出力例:

$ inferbench run --engines llama.cpp --model "bartowski/Qwen2.5-1.5B-Instruct-GGUF:Q4_K_M"
Hardware: Apple M4 (darwin/arm64), 16GB

llama.cpp: starting server...
llama.cpp: warming up...
llama.cpp: [1/8] benchmarking...
...
llama.cpp: [8/8] benchmarking...

Results:
  llama.cpp: avg 75.54 tok/s (range 69.54-79.78, n=8)

Recommendation: llama.cpp -- highest measured throughput on this run (75.54 tok/s avg) -- specific to this hardware and model, not a universal ranking

警告

--model の意味はエンジンによって異なります(llama.cpp ではダウンロード可能な HF 仕様、omlx では事前にダウンロードしたローカルディレクトリー名)。これは、2 つのエンジンでモデル取得機能が実際に異なるためです。omlx の serve コマンドには、任意のモデルを Hugging Face から直接取得するフラグがありません。そのため、1 つのコマンドで両方のエンジンを同じモデルに対して実行するには、各エンジンが想定する形式でモデルがすでに利用可能になっている必要があります。

CLI コマンドリファレンス

inferbench run [options]

Options:
  --model <spec>    Model spec (engine-specific, see Quickstart above)   [required]
  --engines <list>  Comma-separated engines to test (default: all installed --
                    omlx, llama.cpp)
  --max-tokens <n>  Max completion tokens per prompt (default: 200)
  --json            Output machine-readable JSON instead of a human table
  --out <file>      Also write the full JSON report to this file
  --verbose         Show raw engine server stdout/stderr

少なくとも 1 つのエンジンをテストして正常に実行された場合の終了コードは 0、使用方法の誤り、または対応しているエンジンがインストールされていない場合は 1 です。Python CLI には、ドキュメントに記載された小さな相違点が 1 つあります。必須の --model フラグがない場合、1 ではなく 2 で終了します。これは解析時エラーに対する標準の argparse の慣例です。

ライブラリ API リファレンス

Python パッケージ(pip install inferbench-cli)では、CLI の代わりにスクリプトやノートブックから利用できる、ドキュメント化されたライブラリ API を公開しています。npm パッケージの package.json の main フィールドは CLI スクリプト自体(インポート時に副作用として引数パーサーを実行する dist/cli.js)を指しており、個別のライブラリエントリーポイントは宣言していません。そのため、現時点でライブラリとしてのインポートがサポートされているのは Python ディストリビューションのみです。

from inferbench import (
    benchmark_engine, detect_hardware, all_engines, resolve_engines,
    recommend, compare_to_cloud, report_to_dict, write_json_report,
)
シンボルシグネチャ戻り値
detect_hardware()() -> HardwareProfileプラットフォーム、アーキテクチャ、CPU モデル文字列、メモリの合計容量(GB)、およびマシンが Apple Silicon かどうか。
all_engines()() -> List[EngineAdapter]サポートされているすべてのエンジン(omlx、llama.cpp)のアダプターインスタンス。
resolve_engines(names)(names: List[str]) -> List[EngineAdapter]ユーザー指定のエンジンリストから重複を除いたアダプター。不明な名前が指定された場合は例外を発生させます。
benchmark_engine(adapter, *, model, ...)(adapter, *, model: str, max_tokens=None, prompts=None, verbose=False, on_progress=None) -> EngineBenchmarkResult1 つのエンジンに対して固定のプロンプトスイープを実行し、構造化された結果を返します。「エンジンがインストールされていない」場合や、1 つのプロンプトで失敗した場合も例外は発生しません。この状態は返されたオブジェクトに記録されます。
recommend(results)(results: List[EngineBenchmarkResult]) -> Optional[Recommendation]インストール済みでテストに成功したエンジンのうち、測定された平均 tok/s が最も高いエンジン。
compare_to_cloud(cloud_model)(cloud_model: str) -> Optional[CostComparison]既知のクラウドモデル(現在は claude-5-haiku、claude-5-sonnet)の、日付が明記された出力トークン 1,000 個あたりの固定価格と、価格に関する注記を返します。認識できないモデルの場合は None を返します。
report_to_dict(report) / write_json_report(report, path)(report: BenchmarkReport) -> dict / (report, path: str) -> NoneBenchmarkReport を、CLI の --json / --out が出力するものと同じキャメルケースの JSON 形式にシリアライズします。
from inferbench import benchmark_engine, detect_hardware, all_engines, recommend, compare_to_cloud

hardware = detect_hardware()
results = [
    benchmark_engine(adapter, model="qwen2.5-1.5b-instruct-4bit")
    for adapter in all_engines()
]
best = recommend(results)
print(f"{hardware.cpu_model}: {best.engine} -- {best.reason}")

# What would the same output volume cost on a cloud API instead?
cost = compare_to_cloud("claude-5-haiku")
if cost:
    print(f"{cost.cloud_model}: ${cost.cloud_cost_per_1k_tokens_usd}/1K tokens (snapshot {cost.pricing_snapshot_date})")

MCP サーバー

InferBench にはモデルコンテキストプロトコルサーバーが付属しているため、AI エージェント(Claude、Cursor、または MCP 互換のクライアント)が、人間が手動で CLI を実行することなく、ハードウェアベンチマークを直接実行できます。

追加パッケージをインストールします。

pip install "inferbench-cli[mcp]"

MCP クライアントの設定に追加します(Claude Desktop の場合は claude_desktop_config.json)。

{
  "mcpServers": {
    "inferbench": {
      "command": "uvx",
      "args": ["--from", "inferbench-cli", "inferbench-mcp"]
    }
  }
}

サーバーは run というツールを 1 つ公開します。このツールは、指定されたサブコマンドと引数に --json を付けて公開済みの inferbench npm バイナリをシェル経由で実行し、解析した結果を返します。

run(["run", "--engines", "llama.cpp", "--model", "bartowski/Qwen2.5-1.5B-Instruct-GGUF:Q4_K_M"])

トランスポートは stdio なので、ホストする必要はありません。MCP クライアントがサーバーをローカルのサブプロセスとして起動します。ソース:python/src/inferbench/mcp_server.py。

測定の仕組み

InferBench は、各エンジン独自のベンチマークツールをシェルから実行して、その出力を解析するわけではありません。この方法は当初の計画に含まれていましたが、まったく機能しないことがわかりました。omlx には CLI ベンチマークコマンドがありません。その「Performance Benchmark」機能は、管理ダッシュボードからワンクリックで実行する GUI 専用の操作です。アダプターコードを1行でも書く前に、実際の README で直接確認しました。

代わりに、InferBench は各エンジンが標準で備える OpenAI 互換 HTTP サーバー(omlx serve、llama-server)を起動し、すべてのエンジンにまったく同じ測定コードでまったく同じプロンプトを送信して、応答全体(最初のバイトが届くまでの時間だけではありません)を計測します。内部構造が根本的に異なるエンジンを真に公平な条件で比較できる唯一の方法であり、omlx で実際に機能する唯一の方法でもあります。

「推奨」の意味(および意味しないこと): 各レポートの推奨では、この実行、このハードウェア、このモデルで測定された平均トークン数/秒が最も高いエンジンを示しています。どのエンジンが最適かを一般的に断定するものではありません。モデルやマシンが異なる場合、あるいは日によって熱条件が異なる場合、結果は変わる可能性があります。このツール自体の開発中、同じハードウェアとモデルで実行した2回の測定では、omlx と llama.cpp の順位が逆になりました。このこと自体が、固定値を引用するのではなく、実際に測定する理由です。

比較

同じ領域で実際に使われている、独立してメンテナンスされているツールが3つあり、それぞれ対象範囲が異なります。リンク先のプロジェクトのドキュメントから引用していないセルには、その旨を記載しています。

InferBenchllama-bench(llama.cpp に同梱)local-llm-benchinference-benchmarker(Hugging Face)
対応エンジンomlx、llama.cppllama.cpp のみOllama、LM Studio、omlx、任意の OpenAI 互換エンドポイント任意の OpenAI 互換チャット API(TGI、vLLM など)
測定内容固定の8プロンプトを順に実行した場合の、単一リクエストにおける平均/最小/最大 tok/s調整可能なバッチサイズ、キャッシュタイプ、スレッド数で測定するプロンプト処理およびトークン生成の tok/sカスタムの実環境シナリオにおける「実効」tok/s(出力トークン数/プリフィルを含む総実時間)リクエストレート(QPS)を増加させながら行う同時実行数/スループットの測定。実運用サーバー向け
1回の実行でエンジンを横断して比較はいいいえ。1回につき1エンジンのみはい。実行ごとにエンジンを選択はい。API を備えた任意のサーバーを実行ごとに選択
出力形式人間が読める表、JSONMarkdown、CSV、JSON、JSONL、SQLJSON をディスクに出力。比較用の別スクリプト compare.py ありJSON
配布方法npm + PyPI、pip install/npm install -gllama.cpp のビルドに同梱。別パッケージは不要git clone + python3 bench.py(PyPI/npm パッケージなし)cargo install、ビルド済みバイナリ、または Docker イメージ
プラットフォームllama.cpp はクロスプラットフォーム。omlx は Apple Silicon 専用クロスプラットフォーム(llama.cpp と同じ)Apple Silicon(MLX/GGUF エンジン)向けにドキュメントが整備され、実演済みクロスプラットフォーム。GPU サーバーへのデプロイ向けに構築

このツールを作った理由

コンシューマー向けハードウェアでのローカル推論は、今やますます多くの開発者にとって標準的な選択肢です。また、各エンジンが競合製品と比較する場合には、明白な利益相反があります。自社の数値を公平に評価できるベンダーは存在しません。InferBench は独自のエンジンを販売していません。それがこのツールの存在意義です。

このツールが実際に答える、より難しい問いは「一般的に最速のエンジンはどれか」ではありません。そのような答えは存在しないからです。結果は、実際のハードウェア、モデル、ワークロードによって異なります。このツールが答えるのは「今、このマシンで、このモデルを使う場合、最速のエンジンはどれか」という問いです。正直に答えられるのは、自分のハードウェアで実行できるツールだけです。

ドキュメント

  • docs/getting-started.md -- どちらのディストリビューションでも、インストール、初回起動、CLI の代わりにライブラリを使用する方法を説明します。
  • docs/concepts.md -- 測定アーキテクチャ、ハードウェア検出機能、推奨ルール、終了コードの仕様を説明します。
  • docs/integrations/ci.md -- InferBench を PR ごとの CI ゲートとして意図的に使用しない理由と、代わりに有効なパターンを説明します。

デモ

--json --out を使用してファイルに書き込まれる機械可読な出力です。CI や、結果を解析するエージェントに便利です。

InferBench --json --out の使用例:実行中の omlx ベンチマーク結果として、プロンプトごとのトークン数/秒と推奨事項を含む完全な JSON レポートが標準出力に表示され、report.json にも保存されます

複数のエンジンを並べてベンチマークし、実測に基づいてどちらがおすすめかを示します。

InferBench によるエンジン比較:omlx と llama.cpp の両方を実行し、それぞれの実測トークン数/秒を報告して、この実行ではどちらが速かったかを示します

よくある質問

InferBenchとは具体的に何ですか? お使いのマシンにすでにインストールされているローカルLLM推論エンジン(現時点ではomlxとllama.cpp)のベンチマークツールです。固定の多様なプロンプトセットを、インストールされているエンジンに対して実行し、それぞれの実測トークン/秒を計測して、その実行で最速だったエンジンを推奨します。同じ名前のパッケージが2種類あり、npm版(JavaScript/TypeScript)とPyPI版(Python)が用意されています。

InferBenchはllama.cpp独自のllama-benchとどう違いますか? llama-bench(llama.cppに同梱)はllama.cpp自体のみをベンチマークするツールで、細かな調整項目(バッチサイズ、キャッシュタイプ、スレッド数、反復回数など)があり、Markdown、CSV、JSON、JSONL、SQL形式で出力します。InferBenchは、同じプロンプトセットと同じ計測コードを使って、エンジン間(現時点ではomlxとllama.cpp)の性能をベンチマークします。そのため、得られるトークン/秒の数値は、1つのエンジンを個別に調整した結果ではなく、お使いのハードウェア上で相互に直接比較できます。

InferBenchはLinuxやWindowsでも動作しますか? それともmacOSのみですか? llama.cppエンジンは、InferBenchがllama-serverを起動してOpenAI互換エンドポイントを計測するだけなので、llama.cpp自体がサポートするすべてのプラットフォーム(Linux、macOS、Windows)で動作します。omlxエンジンはApple Silicon専用で、omlx自体の対応範囲に準じます。LinuxまたはWindowsで--engines omlxを指定すると、そのエンジンはインストールされていないと報告され、InferBenchは実際にインストールされている対応エンジンをベンチマークします。npmパッケージにはNode.js >=18、PyPIパッケージにはPython >=3.10が必要です。

InferBenchはモデルをダウンロードしてくれますか? llama.cppの場合はダウンロードします。Hugging Faceのリポジトリ指定を渡すと、llama-server独自の-hfフラグによってモデルがダウンロードされ、キャッシュされます。omlxの場合はダウンロードしません。omlxのserveコマンドはローカルディレクトリにすでに存在するモデルのみを検出するため、事前にモデルをそのディレクトリにダウンロードしておく必要があります。

データがマシンの外部に送信されることはありますか? ありません。すべてのベンチマーク要求は、InferBench自身が127.0.0.1上で起動したサーバーに送信されます。どこにもアップロードされません。

--enginesによって、エンジンごとに異なる--model値が必要になる場合があるのはなぜですか? omlxとllama.cppでは、モデルの取得方法が実際に異なるためです。前述のクイックスタートにある既知の制限事項の注記を参照してください。

推奨されたエンジンが、一般的に自分にとって最速であると保証されますか? いいえ。この実行で計測された最速のエンジンです。別のマシンや別の日の数値を信頼するのではなく、ご自身のハードウェア、ご自身のモデル、ご自身のタイミングで再実行してください。

エージェントや、信頼性の低い入力から取得したパスを--outに指定しても安全ですか? はい。ただし、記載されている制限が1つあります。--outでは、現在の作業ディレクトリの外部に解決される相対パス(たとえば--out ../../etc/cron.d/x)は拒否されます。これは、エージェントから渡されたパスを使ってベンチマークを実行した際に、意図したディレクトリの外部への書き込みに誘導されないようにするためです。絶対パスは引き続き指定できます。これは呼び出し元が直接渡した値であり、..によるパス移動で範囲外に出たものではないためです。

対応エンジンがインストールされていない場合や、実行途中で失敗した場合はどうなりますか? omlxもllama.cppも見つからない場合、InferBenchは空の結果を黙って返すのではなく、両方のインストールコマンドを示すメッセージを出して終了コード1で終了します。エンジンがインストールされていても、特定の実行に失敗した場合は、レポート内のそのエンジンの行に数値ではなく、根本原因のエラーとともにFAILEDと表示されます。正常に完了したほかのエンジンは実測結果を返し、引き続き推奨対象となります。

InferBenchを商用利用できますか? 無料ですか? はい。InferBenchはApache License 2.0で提供されており、ライセンス料なしで商用利用、変更、再配布が認められています。有料APIへの依存はありません。すべてのベンチマーク要求は、お使いのマシン上でInferBenchがローカルに起動するサーバーに送信されます。

貢献

TypeScript と Python の両方のコードベースを対象とした完全なガイドについては、CONTRIBUTING.md を参照してください。Issue や PR を歓迎します。対応が保留されている範囲には、追加のエンジンアダプター、ホスト型フリートダッシュボード、より高度なレコメンデーションスコアリングが含まれます。これらのいずれかに取り組みたい場合は、Issue を作成してください。

セキュリティ

脆弱性の報告手順については、SECURITY.md を参照してください。

ライセンス

Apache 2.0。詳細は LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。