[!NOTE] Traducción automática Este artículo se tradujo automáticamente a partir de la versión original en inglés.

Ejecución local de LLMs en macOS: Ollama, LM Studio, llama.cpp, MLX y Apple Silicon

Muchas aplicaciones cotidianas prompts no requieren un API remoto. Apple Silicon permite ejecutar modelos de lenguaje útiles de forma local, ya que el CPU y el GPU comparten un único pool de memoria unificado, aunque el archivo del modelo solo representa una parte del presupuesto de memoria disponible.

La principal decisión en esta guía se refiere a la herramienta que se utilizará para trabajar con el modelo. Ollama, LM Studio, llama.cpp y MLX-LM tienen funcionalidades similares, pero ofrecen distintos niveles de control: un servicio local gestionado, posibilidades de exploración desde el escritorio, ejecución directa de GGUF o el uso de Python nativo en Apple. Priorice la calidad del modelo según la tarea que vaya a realizar, y luego elija la herramienta en función de la interfaz y los resultados que necesite.

TL;DR. Utilice Ollama para obtener un servicio local gestionado, LM Studio para explorar modelos en el escritorio y su APIs local, llama.cpp para un control directo sobre la ejecución de GGUF, y MLX-LM para realizar experimentos con Python de forma nativa en Apple. Ninguna de estas herramientas es necesariamente la más rápida en todos los casos. Depende del Benchmark específico del modelo, de la cuantización, del contexto y de la carga de trabajo, además del margen de memoria disponible.

Comience con un sobre de memoria

Presupuesto de memoria unificada de Apple Silicon para inferencia local

El tamaño de los pesos cuantizados en bruto es solo el primer término:

peak memory ≈ model weights
            + KV cache
            + runtime workspace
            + multimodal components
            + application and OS memory

La longitud del contexto, el tipo de datos del caché, las solicitudes en paralelo y la arquitectura del modelo influyen en el resultado. Incluso un modelo nominal de 7B u 8B con cuatro bits puede resultar problemático en una Mac de 8 GB, ya que el sistema operativo no puede asignarle a runtime toda la memoria instalada.

Durante las pruebas, utilice el Activity Monitor o las métricas propias del runtime. Debe dejar suficiente margen para evitar la presión en la memoria y el uso del espacio de intercambio; un modelo que se cargue pero haga que el sistema dependa constantemente del espacio de intercambio no resulta adecuado para un uso interactivo.

También es necesario diferenciar la inferencia local de la operación sin conexión. Prompts puede permanecer en la máquina mientras la aplicación sigue teniendo acceso a la red para descargar modelos, realizar actualizaciones o acceder a funcionalidades opcionales. Primero descargue los artefactos necesarios, desconecte la red y verifique el flujo de trabajo si se requiere una operación sin conexión.

Las cuatro herramientas resuelven problemas distintos en los flujos de trabajo

HerramientaInterfaz principalElige esta opción cuando
OllamaCLI y HTTP local APIPaquetes de modelos gestionados, comúnmente respaldados por GGUFUna aplicación necesita un servicio local gestionado y sencillo.
LM StudioInterfaz de usuario de escritorio, CLI, SDKs, APIs localDescargados los modelos locales, incluidos GGUF y las rutas de MLX
llama.cppCLI, biblioteca en C/C++, servidor localGGUFNecesitas banderas directas, herramientas de conversión/cuantización, o control mediante embedding.
MLX-LMPython y CLIPesos compatibles con MLXEstás desarrollando flujos de trabajo en Python específicamente para Apple Silicon.

Esta es una tabla de responsabilidades, no un ranking de velocidad. Diversas herramientas pueden utilizar núcleos o formatos relacionados, y el rendimiento varía en función del soporte de modelos y de las versiones publicadas.

Ollama: servicio local gestionado

Ollama Gestiona las descargas de modelos, las plantillas, el ciclo de vida de los procesos y un servidor localhost API. Resulta útil cuando el código de la aplicación debe apuntar a un servicio local estable en lugar de utilizar sus propios parámetros de inferencia.

ollama pull <model>
ollama run <model>

curl http://localhost:11434/api/chat \
    -H 'Content-Type: application/json' \
    -d '{
      "model": "<model>",
      "messages": [{"role": "user", "content": "Explain unified memory."}],
      "stream": false
    }'

Inspeccione el manifiesto del modelo y la configuración de contexto en lugar de asumir que un nombre de biblioteca breve corresponde a un checkpoint inmutable. Fije o registre el artefacto exacto para realizar las evaluaciones.

Ollama sacrifica cierto nivel de visibilidad a nivel bajo en pos de la comodidad durante todo el ciclo de vida del sistema. Pasa a llama.cpp u otro runtime cuando necesites controlar directamente un archivo GGUF, una plantilla de chat, una configuración de caché o alguna nueva funcionalidad backend.

LM Studio: exploración en escritorio y APIs local

LM Studio Resulta útil cuando la exploración de modelos, la carga de configuraciones, la inspección de chats y la evaluación humana en paralelo deben integrarse en un único flujo de trabajo en escritorio. Su servidor admite SDKs nativo, así como puntos de conexión para garantizar compatibilidad con otros sistemas.

El uso actual de Python SDK es el siguiente:

import lmstudio as lms


with lms.Client() as client:
    model = client.llm.model("<downloaded-model-key>")
    response = model.respond("Write one sentence about local inference.")
    print(response)

Inicie el API local desde la pestaña de Desarrollador o con:

lms server start

LM Studio puede ejecutarse en localhost o en una red local y es compatible con tokens API. Es recomendable mantenerlo en modo loopback, a menos que se necesite acceso remoto de forma intencionada; al vincularlo a la red, un modelo de escritorio privado se convierte en un servicio que requiere autenticación, políticas de firewall y una configuración segura de las herramientas.

llama.cpp: ejecución directa de GGUF

llama.cpp Se trata de la ruta de referencia cuando el artefacto es GGUF y se desea visualizar directamente el límite de runtime. Este sistema admite Apple Metal, así como CPU y otros backends de hardware.

brew install llama.cpp

# Download through the Hugging Face integration and select a quantization.
llama-cli -hf <publisher>/<gguf-repository>:Q4_K_M

# Or start an OpenAI-compatible local server.
llama-server -hf <publisher>/<gguf-repository>:Q4_K_M

el estado actual del repositorio -hf El path puede descargar un proyector multimodal compatible cuando esté disponible. Dado que el soporte de modelos, las plantillas y los parámetros de la CLI cambian con frecuencia, es recomendable fijar una versión conocida del mismo y conservar la orden de ejecución junto con el registro de evaluación.

Elija llama.cpp cuando el objetivo sea un control directo, y no porque el término “de nivel inferior” signifique automáticamente mayor velocidad. Una herramienta gestionada puede establecer valores predeterminados adecuados; sin embargo, los parámetros de control directo también pueden empeorar el rendimiento.

MLX-LM: Trabajo en Python nativo de Apple

MLX-LM Se basa en la matriz MLX de Apple framework. Permite tareas de generación, chat, conversión, cuantización y fine-tuning eficiente en parámetros para modelos compatibles.

uv add mlx-lm
uv run mlx_lm.generate \
    --model mlx-community/<compatible-model> \
    --prompt "Explain Metal acceleration in one paragraph."

Python expone directamente el modelo y el tokenizador:

from mlx_lm import generate, load


model, tokenizer = load("mlx-community/<compatible-model>")
messages = [{"role": "user", "content": "Give one local-LLM benchmark rule."}]
prompt = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
)
print(generate(model, tokenizer, prompt=prompt, max_tokens=80))

El servidor HTTP de MLX-LM está documentado como un servidor de desarrollo con comprobaciones de seguridad básicas, y no como un servicio de producción. Úselo para experimentos locales o coloque una capa de control de aplicaciones revisada delante de él.

Una benchmark equitativa tarda menos tiempo que una descarga deficiente

Flujo de trabajo para seleccionar una herramienta local de macOS LLM

Pruebe la misma familia de checkpoint y la cuantización comparable siempre que los formatos lo permitan. Utilice un conjunto pequeño de prompt que contenga:

Record:

MétricaPor qué es importante
Resultado de la tarea
Tiempo hasta el primer tokenRespuesta interactiva
Tokens de salida por segundoRendimiento de generación
Memoria y carga máximasSi la máquina sigue siendo utilizable
Tiempo de carga en condiciones fríasExperiencia de escritorio y bajo demanda
Comportamiento energético y térmicoUso sostenido del portátil
API/compatibilidad de esquemasSi la herramienta es adecuada para la aplicación.

No compare el modelo de 4 bits de una herramienta con el modelo de precisión completa de otra herramienta, atribuyendo la diferencia a runtime.

Lista de verificación de seguridad y privacidad

  1. Vincule APIs a la comunicación de bucle cerrado, a menos que sea necesario acceder a la red.
  2. Implemente mecanismos de autenticación antes de exponer la red local.
  3. Considere los archivos del modelo como artefactos de terceros; registre su origen, versión, licencia y valor hash.
  4. Evite ejecutar código personalizado de modelos que no haya sido revisado previamente.
  5. Verifique si las funciones opcionales relacionadas con documentos, herramientas, actualizaciones o análisis realizan llamadas a la red.
  6. No asuma que la generación local hace que los documentos recuperados, los registros o los efectos secundarios de las herramientas sean seguros.

Conclusión

La opción adecuada no es la “mejor aplicación para Mac LLM”. Se trata del conjunto de herramientas más reducido que ofrece la interfaz de control necesaria para tu flujo de trabajo. Ollama gestiona un servicio, LM Studio se encarga del ciclo de exploración en entorno de escritorio, llama.cpp permite la ejecución de GGUF, y MLX-LM proporciona un entorno de Python nativo para Apple.

Se debe asignar a cada candidato la misma tarea, el mismo contexto y el mismo volumen de memoria. De este modo, los resultados serán más fiables que los métodos basados en criterios subjetivos del hardware o que una tabla estática de calificaciones, además de ser fáciles de consultar cuando cambien las herramientas utilizadas.

Referencias