InferBench
Evalúa la velocidad de inferencia de LLM local (tokens/seg) en tu propio hardware mediante herramientas MCP.
Documentación
InferBench
Todo artículo sobre "el mejor motor LLM local" evalúa la máquina de otra persona. InferBench evalúa la tuya.
Instalación, primera ejecución y una prueba real de omlx contra un modelo en caché:

npx inferbench-cli run --engines llama.cpp --model "bartowski/Qwen2.5-1.5B-Instruct-GGUF:Q4_K_M"
Todos los motores de inferencia local publican sus propios benchmarks, en su propio hardware, en su propio README. Ninguno te dice cuál es realmente el más rápido en la máquina que tienes delante. InferBench ejecuta un conjunto fijo y variado de prompts contra los motores compatibles que estén instalados en tu propio hardware y reporta tokens/segundo reales y medidos, no un número copiado del blog de otra persona.
Qué hace
$ 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
Cada número anterior es real, producido por una ejecución en vivo contra un proceso real de llama-server en hardware real, no un marcador de posición ilustrativo.
Por qué existe esto
La inferencia local en hardware de consumo es ahora la ruta predeterminada para una proporción creciente de desarrolladores, y la comparación de cada motor contra sus competidores tiene un problema de incentivos obvio: ningún proveedor es un juez imparcial de sus propios números. InferBench no tiene un motor propio que vender, que es precisamente el punto.
La pregunta más difícil que esta herramienta realmente responde no es "qué motor es el más rápido en general" — no existe tal respuesta, porque depende de tu hardware exacto, tu modelo exacto y tu carga de trabajo exacta. Es "qué motor es el más rápido ahora mismo, en esta máquina, para este modelo" — una pregunta que solo una herramienta que se ejecuta en tu propio hardware puede responder honestamente.
Instalación
InferBench incluye dos paquetes independientes e igualmente de primera clase — elige el que se ajuste a tu cadena de herramientas, o instala ambos. Ninguno está en desuso en favor del otro; ambos ejecutan la misma arquitectura de medición contra los mismos dos motores compatibles.
# 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
Estado actual: ambos paquetes están publicados e instalables hoy.
npm install -g inferbench-cli y pip install inferbench-cli funcionan
— consulta
npmjs.com/package/inferbench-cli
y pypi.org/project/inferbench-cli,
o python/README.md y
docs/getting-started.md para la guía
específica de Python, y CHANGELOG.md para el
historial de versiones de cada distribución.
Requiere Node.js >=18 para el paquete npm, Python >=3.9 para el paquete PyPI. Al menos un motor compatible debe estar ya instalado en cualquier caso (InferBench no instala motores por ti):
- llama.cpp:
brew install llama.cpp(macOS) o compilar desde ggml-org/llama.cpp - omlx:
brew tap jundot/omlx https://github.com/jundot/omlx && brew install omlx(solo Apple Silicon)
Inicio rápido
# 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
[!ADVERTENCIA]
--modelsignifica algo diferente según el motor (una especificación HF descargable para llama.cpp, un nombre de directorio local predescargado para omlx), porque los dos motores tienen capacidades de adquisición de modelos genuinamente diferentes — el comandoservede omlx no tiene una bandera para descargar un modelo arbitrario de Hugging Face directamente. Ejecutar ambos motores contra el mismo modelo en un solo comando requiere, por tanto, que el modelo ya esté disponible en las formas esperadas de ambos motores.
Referencia de comandos 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
Código de salida 0 en una ejecución exitosa con al menos un motor probado; 1 en un error de uso o cuando no hay ningún motor compatible instalado.
Servidor MCP
InferBench incluye un servidor de Protocolo de Contexto de Modelo para que un agente de IA (Claude, Cursor o cualquier cliente compatible con MCP) pueda ejecutar un benchmark de hardware directamente, sin que un humano invoque la CLI manualmente.
Instala el extra:
pip install "inferbench-cli[mcp]"
Añádelo a la configuración de tu cliente MCP (para Claude Desktop, claude_desktop_config.json):
{
"mcpServers": {
"inferbench": {
"command": "uvx",
"args": ["--from", "inferbench-cli", "inferbench-mcp"]
}
}
}
El servidor expone una herramienta, run, que ejecuta el binario npm publicado inferbench con
el subcomando y argumentos dados más --json, y devuelve el resultado analizado:
run(["run", "--engines", "llama.cpp", "--model", "bartowski/Qwen2.5-1.5B-Instruct-GGUF:Q4_K_M"])
El transporte es stdio, así que no hay nada que alojar: el cliente MCP lanza el servidor como un
subproceso local. Fuente: python/src/inferbench/mcp_server.py.
Cómo funciona la medición
InferBench no ejecuta la herramienta de benchmark propia de cada motor y analiza su salida. Ese enfoque estaba en el plan original y resultó no funcionar en absoluto: omlx no tiene un comando de benchmark CLI — su función "Performance Benchmark" es una acción de un solo clic, solo GUI, en su panel de administración, verificada directamente contra su README real antes de escribir una línea de código de adaptador.
En su lugar, InferBench inicia el servidor HTTP compatible con OpenAI ya estandarizado de cada motor (omlx serve, llama-server) y envía exactamente los mismos prompts a través del mismo código de medición a cada motor, cronometrando la respuesta completa (no solo el tiempo hasta el primer byte — una versión anterior de este código medía el tiempo transcurrido justo después de que fetch() se resolviera, lo que solo captura la llegada de las cabeceras HTTP, no la finalización de la generación, y produjo unos físicamente imposibles 64,646 tok/s durante una ejecución de prueba real de extremo a extremo antes de que el error se detectara y corrigiera). Este es el único enfoque que es genuinamente comparable entre motores con internals fundamentalmente diferentes, y el único que funciona en absoluto para omlx.
Qué significa "recomendado" (y qué no)
La recomendación en cada informe está explícitamente acotada: nombra el motor con la mayor media medida de tokens/segundo en esta ejecución específica, este hardware específico, este modelo específico — no una afirmación general sobre qué motor es el mejor. Un modelo diferente, una máquina diferente o las condiciones térmicas de otro día pueden cambiar la respuesta; dos ejecuciones durante el propio desarrollo de esta herramienta produjeron clasificaciones opuestas entre omlx y llama.cpp en el mismo hardware y modelo, lo que es en sí mismo la razón por la que esta herramienta mide en vivo en lugar de citar un número fijo.
Comparación
| InferBench | Un artículo estático de comparación "guía definitiva 2026" | |
|---|---|---|
| Mide | Tu propio hardware, en vivo | La máquina del autor, una vez |
| Reproducible por ti | Sí — reejecuta en cualquier momento | No — no puedes reejecutar el blog de otra persona |
| Se mantiene actualizado conforme los motores se actualizan | Sí | No — congelado en la fecha de publicación |
| Neutral respecto al proveedor | Sí — sin motor propio | Varía según el autor |
Documentación
- docs/getting-started.md — instalación, primera ejecución y uso de la biblioteca en lugar de la CLI, para ambas distribuciones.
- docs/concepts.md — la arquitectura de medición, el detector de hardware, la regla de recomendación y el contrato de código de salida.
- docs/integrations/ci.md — por qué InferBench deliberadamente no es una puerta de CI por PR, y qué patrones funcionan en su lugar.
Demo
Salida legible por máquina escrita en un archivo con --json --out, útil para CI o para un agente que analice el resultado:

Evaluación comparativa de múltiples motores lado a lado, con una recomendación real medida entre ellos:

Preguntas frecuentes
¿Qué es exactamente InferBench?
Una herramienta de evaluación comparativa para motores de inferencia LLM local ya instalados en tu máquina — actualmente omlx y llama.cpp. Ejecuta un conjunto fijo y variado de prompts contra los que estén presentes, mide tokens/segundo reales para cada uno y recomienda el que fue más rápido en esa ejecución específica. Se distribuye como dos paquetes con el mismo nombre, inferbench-cli: uno en npm (JavaScript/TypeScript) y uno en PyPI (Python).
¿En qué se diferencia InferBench del propio llama-bench de llama.cpp?
llama-bench (incluido con llama.cpp) solo evalúa llama.cpp en sí mismo, con ajustes finos detallados (tamaño de lote, tipo de caché, número de hilos y más). InferBench evalúa entre motores — actualmente omlx y llama.cpp — usando el mismo conjunto de prompts y el mismo código de medición para ambos, de modo que los números de tokens/segundo resultantes son directamente comparables entre sí en tu hardware, no solo ajustables de forma aislada para un motor.
¿Funciona InferBench en Linux y Windows, o solo en macOS?
El motor llama.cpp funciona en cualquier plataforma que el propio llama.cpp soporte (Linux, macOS, Windows), ya que InferBench solo inicia llama-server y mide su endpoint compatible con OpenAI. El motor omlx es solo para Apple Silicon, coincidiendo con el alcance propio de omlx — en Linux o Windows, --engines omlx informa que ese motor no está instalado e InferBench evalúa cualquier motor compatible que realmente esté presente. Se requiere Node.js >=18 para el paquete npm, Python >=3.9 para el paquete PyPI.
¿Descarga InferBench modelos por mí?
Para llama.cpp, sí — pasa una especificación de repositorio de Hugging Face y la bandera -hf del propio llama-server descarga y lo almacena en caché. Para omlx, no — el comando serve de omlx solo descubre modelos ya presentes en un directorio local, así que necesitas tener el modelo descargado allí primero.
¿Sale algún dato de mi máquina?
No. Cada solicitud de benchmark va a un servidor que el propio InferBench inició en 127.0.0.1. No se sube nada a ningún sitio.
¿Por qué --engines a veces necesita un valor de --model diferente por motor?
Porque omlx y llama.cpp tienen mecanismos de adquisición de modelos genuinamente diferentes — consulta la nota de limitación conocida en Inicio rápido arriba.
¿Es la recomendación una garantía de que este motor es el más rápido para mí en general? No. Es el motor más rápido medido en esta ejecución exacta. Reejecútalo — tu propio hardware, tu propio modelo, tu propio momento — en lugar de confiar en un número de una máquina diferente o de otro día.
¿Es seguro apuntar --out a una ruta que proviene de un agente u otra entrada menos confiable?
Sí, con una restricción documentada: --out rechaza una ruta relativa que se resuelva fuera del directorio de trabajo actual (por ejemplo --out ../../etc/cron.d/x), específicamente para que un benchmark invocado con una ruta proporcionada por un agente no pueda ser engañado para escribir fuera del directorio previsto. Una ruta absoluta todavía se acepta, ya que es un valor que el llamador pasó directamente en lugar de uno que escapó mediante el traversal de ...
¿Qué sucede si no hay ningún motor compatible instalado, o una ejecución falla a mitad de camino?
Si no se encuentra ni omlx ni llama.cpp, InferBench sale con el código 1 y un mensaje que nombra ambos comandos de instalación en lugar de devolver un resultado vacío silencioso. Si un motor está instalado pero una ejecución específica falla, la línea de ese motor en el informe dice FAILED con el error subyacente en lugar de un número — cualquier otro motor que sí se completó todavía obtiene un resultado real y sigue siendo elegible para la recomendación.
¿Puedo usar InferBench comercialmente y es gratuito? Sí. InferBench tiene licencia Apache 2.0, que permite uso comercial, modificación y redistribución sin tarifa de licencia. No tiene dependencia de API de pago — cada solicitud de benchmark va a un servidor que inicia localmente en tu propia máquina.
Contribuciones
Consulta CONTRIBUTING.md para la guía completa, que cubre tanto el código TypeScript como Python. Se aceptan issues y PRs. El alcance diferido conocido incluye adaptadores de motor adicionales, un panel de flota alojado y una puntuación de recomendación más rica — abre un issue si te gustaría tomar uno de estos.
Seguridad
Consulta SECURITY.md para el proceso de reporte de vulnerabilidades.
Licencia
Apache 2.0, consulta LICENSE.