MLX LM en Apple Silicon
Libre WebUI incluye un plugin MLX LM (Apple Silicon) para ejecutar modelos de lenguaje con formato MLX directamente en un Mac de la serie M. Se conecta a la API HTTP compatible con OpenAI integrada en MLX LM.
Este camino resulta útil para obtener inferencia Metal nativa sin convertir un checkpoint MLX a Ollama o GGUF.
Arquitectura
Libre WebUI in native development mode
frontend http://localhost:5173
backend http://localhost:3001
|
| OpenAI-compatible chat request
v
mlx_lm.server http://127.0.0.1:8081
|
v
MLX model on Apple Silicon unified memory
El puerto 8081 es intencionado. MLX LM usa normalmente 8080, que entra en conflicto con npx libre-webui.
Requisitos
- Mac con Apple Silicon (M1 o posterior).
- macOS con herramientas de línea de comandos de Xcode.
- Python 3.10 o posterior.
- Memoria unificada suficiente para el modelo, su caché KV y macOS.
- Libre WebUI ejecutándose de forma nativa; el flujo desde código es el más sencillo porque ambos backends usan loopback.
El modelo Ternary Bonsai predeterminado ocupa unos 8.5 GB en disco y necesita más al ejecutarse. Un Mac de 16 GB puede manejar contextos cortos, pero 24 GB o más ofrecen margen. Si falta memoria, usa un checkpoint MLX menor y añade su ID a una copia de la definición del plugin.
Instalar MLX LM
uv mantiene el comando aislado de los paquetes Python de Homebrew:
brew install uv
uv tool install --upgrade mlx-lm
rehash
mlx_lm.server --help
Si ya existe:
uv tool upgrade mlx-lm
rehash
Los modelos Qwen 3.5 requieren mlx-lm 0.30.7 o posterior; el ejemplo del repositorio requiere 0.31.3 o posterior.
Iniciar el servidor
Para Ternary Bonsai:
mlx_lm.server \
--model "prism-ml/Ternary-Bonsai-27B-mlx-2bit" \
--host 127.0.0.1 \
--port 8081 \
--max-tokens 262144 \
--allowed-origins "http://localhost:5173,http://127.0.0.1:5173"
La primera ejecución descarga el modelo de Hugging Face; las posteriores usan la caché. Ternary Bonsai declara
262144 posiciones máximas. El prompt y la salida comparten la ventana, por lo que un prompt largo reduce los
tokens generables aunque el servidor use el máximo del modelo.
Para empezar con algo menor:
mlx_lm.server \
--model "mlx-community/Llama-3.2-3B-Instruct-4bit" \
--host 127.0.0.1 \
--port 8081 \
--max-tokens 2048
El repositorio incluye un lanzador reutilizable:
cd examples/mlx-lm-server
uv run server.py
Inspecciona el comando sin cargar un modelo:
uv run server.py --dry-run
Verificar la API compatible con OpenAI
Comprueba salud y modelos:
curl http://127.0.0.1:8081/health
curl http://127.0.0.1:8081/v1/models
Envía un chat sin streaming:
curl http://127.0.0.1:8081/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "prism-ml/Ternary-Bonsai-27B-mlx-2bit",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Reply with: MLX is ready."}
],
"temperature": 0.7,
"top_p": 0.95,
"max_tokens": 64,
"stream": false
}'
También admite Server-Sent Events cuando "stream": true.
Conectar Libre WebUI
Desde la raíz:
npm install
npm run dev
Abre http://localhost:5173 y:
- Ve a Ajustes > Plugins.
- Busca MLX LM (Apple Silicon).
- Confirma
http://127.0.0.1:8081/v1/chat/completions. - Activa el plugin; no necesita clave API.
- Vuelve al chat y selecciona el modelo MLX.
La lista integrada incluye:
prism-ml/Ternary-Bonsai-27B-mlx-2bit
El modelo seleccionado debe estar disponible en el servidor. Para otro checkpoint, exporta o copia
plugins/mlx-lm.json, añade el ID a model_map e importa la definición desde Ajustes > Plugins.
Ajustes de generación
Recomendaciones publicadas:
| Ajuste | Valor |
|---|---|
| Temperatura | 0.7 |
| Top P | 0.95 |
| Top K | 20 |
Libre WebUI envía temperatura y Top P. Inicia el servidor con --top-k 20 para aplicar Top K:
mlx_lm.server \
--model "prism-ml/Ternary-Bonsai-27B-mlx-2bit" \
--host 127.0.0.1 \
--port 8081 \
--top-k 20 \
--max-tokens 262144
Work y llamadas a herramientas
El plugin puede aparecer en Work por usar el formato de chat de OpenAI. Elígelo solo si el modelo y su plantilla admiten llamadas a herramientas de forma fiable. Que el texto funcione en Chat no demuestra compatibilidad.
Los analizadores cambian rápidamente. Si una ejecución devuelve llamadas malformadas, actualiza mlx-lm,
prueba la solicitud directamente y usa un modelo cuya ficha documente herramientas.
Redes con Docker
Se recomienda ejecutar Libre WebUI nativamente: un contenedor no alcanza 127.0.0.1 del Mac.
Si se ejecuta en Docker:
- Inicia MLX LM con
--host 0.0.0.0. - Usa una IP LAN privada como
http://192.168.1.20:8081/v1/chat/completions. - Permite
8081solo en redes fiables.
No expongas mlx_lm.server a Internet. Sus responsables lo describen como servidor local con controles básicos;
usa un proxy HTTPS autenticado para cualquier despliegue no local.
Solución de problemas
Model type qwen3_5 not supported
Se sigue usando un lanzador antiguo:
rehash
which -a mlx_lm.server
uv tool upgrade mlx-lm
Libre WebUI muestra el modelo, pero fallan las solicitudes
Verifica el ID directamente:
curl http://127.0.0.1:8081/v1/models
Confirma también que el endpoint incluya /v1/chat/completions.
Dirección en uso
Mueve MLX a otro puerto:
mlx_lm.server --model "owner/model" --port 8082
Actualiza a http://127.0.0.1:8082/v1/chat/completions.
El primer pedido es lento
La carga y el prefill inicial cuestan más que la generación. Vigila la presión de memoria y usa un modelo o chat menor si macOS empieza a intercambiar.