Compilar llama.cpp con Metal
En un Mac con Apple Silicon, llama.cpp se compila con tres comandos y Metal está activado por defecto: clona el repositorio, ejecuta cmake -B build y después cmake --build build --config Release, sin instalar un toolkit de GPU. También puedes instalarlo sin compilar con Homebrew. Los binarios llama-cli y llama-server ejecutan entonces los cálculos en la GPU del chip M; es la memoria unificada, más que la potencia bruta, la que determina el tamaño de modelo que puedes utilizar.
llama.cpp es el motor de inferencia en el que se basan Ollama y LM Studio, y funciona de forma nativa en Mac. Esta guía muestra cómo instalarlo o compilarlo con Metal, ejecutarlo con un modelo GGUF, ofrecerlo a través de una API, aumentar el límite de memoria GPU de macOS e interpretar correctamente los benchmarks publicados para los chips M1 a M5.
#llama.cpp en Mac: lo que aporta Metal
En macOS, la GPU se utiliza a través de Metal, la API gráfica y de cálculo de Apple, y llama.cpp la aprovecha directamente. El README del proyecto indica que Apple Silicon recibe soporte de primer nivel, con optimizaciones mediante ARM NEON, Accelerate y Metal. En la práctica, esto significa que la compilación por defecto ya produce un motor que utiliza la GPU, sin necesidad de añadir opciones, y que la memoria unificada evita cualquier transferencia entre el procesador y la GPU: el modelo se almacena una sola vez en memoria. Por tanto, los factores limitantes en un Mac son la capacidad y el ancho de banda de esta memoria.
#Prerrequisitos
Tu ChatGPT privado y gratuito en tu máquina en 1 hora — LM Studio, Ollama, Open WebUI, tus documentos, sin nube.
- Espacio en línea de por vida
- PDF + archivos
- Reembolsado 30 j
- Un Mac Apple Silicon
- De M1 a M5: esta guía está dirigida a estos modelos. Los Mac con procesador Intel apenas se benefician.
- Herramientas de compilación de Apple
- Instala las herramientas de línea de comandos con xcode-select --install.
- CMake y Git
- Disponibles a través de Homebrew: brew install cmake git.
- Memoria para el modelo
- La referencia del sitio: un 8B en Q4 pesa aproximadamente 5 GB, un 14B alrededor de 9 GB, un 32B entre 19 y 20 GB, antes del contexto.
#Instalar sin compilar: Homebrew
Si no necesitas opciones de compilación especiales, la opción más rápida es Homebrew. La documentación de instalación de llama.cpp indica que la fórmula se actualiza automáticamente con cada nueva versión del proyecto. Obtienes los mismos ejecutables listos para usar con Metal.
Compila tú mismo cuando quieras la última versión del repositorio, probar una rama o modificar una opción de compilación. De lo contrario, Homebrew basta: ahorrarás el tiempo de compilación y las actualizaciones se hacen con brew upgrade.
#1. Compilar con Metal
La documentación de compilación es explícita: en macOS, Metal está activado por defecto y hace que los cálculos se ejecuten en la GPU. No hay que añadir ninguna opción. El nombre anterior del repositorio, bajo la cuenta de Georgi Gerganov, redirige a la organización ggml-org, donde ahora se encuentra el proyecto. Los binarios aparecen en build/bin, entre ellos llama-cli para la terminal y llama-server para la API.
Dos opciones útiles: la documentación indica que -DGGML_METAL=OFF desactiva Metal durante la compilación y que se puede obligar a un binario compilado con Metal a ejecutarse en el procesador mediante --n-gpu-layers 0, lo que resulta práctico para comparar velocidades.
#2. Arrancar un primer modelo
Los motores recientes saben descargar el modelo ellos mismos. La opción -hf toma el nombre de un repositorio de Hugging Face, con la cuantización en sufijo; sin sufijo, se usa por defecto Q4_K_M. Para un archivo ya descargado, usa -m con su ruta.
El número de capas cargadas en la GPU se ajusta con -ngl; su valor predeterminado es auto, lo que resulta adecuado para un Mac con memoria unificada. También puedes escribir -ngl all para cargarlo todo. No busques la ruta de un modelo en la carpeta de Ollama: sus archivos se almacenan en un formato interno que no es un GGUF directamente utilizable.
#Servir una API compatible con OpenAI con llama-server
llama-server expone rutas compatibles con la API de OpenAI para chat, respuestas y embeddings. Por defecto, escucha en 127.0.0.1, puerto 8080: solo es accesible desde tu Mac. Para hacerlo accesible por red, se debe especificar --host explícitamente, y entonces es necesario proteger el acceso.
#4. El límite de memoria de la GPU en macOS
En Apple Silicon, macOS solo deja a la GPU una parte de la memoria unificada. Un modelo que supere esa parte se rechaza o pasa a ejecutarse parcialmente en el procesador, aunque la memoria total sea suficiente. El motor muestra el valor efectivo al arrancar: busca la línea ggml_metal_init: recommendedMaxWorkingSetSize en los registros de llama-cli o llama-server.
El comando sysctl iogpu.wired_limit_mb permite aumentar este límite. Acepta un valor en megabytes: 61 440 para 60 GB, por ejemplo. Un colaborador del repositorio de llama.cpp recuerda que debes volver a ejecutarlo en cada arranque, porque el ajuste no es persistente, y desaconseja llegar al 100 %: el sistema necesita memoria para todo lo que no está bloqueado por la GPU, y las cosas van mal si no le dejas suficiente.
#Qué modelo elegir según la capacidad de memoria unificada
La memoria unificada se comparte entre macOS, tus aplicaciones y el modelo, y la GPU solo recibe una parte. La referencia del sitio sitúa los pesos de un modelo de 8B en Q4 en torno a 5 GB, los de un 14B en torno a 9 GB y los de un 32B entre 19 y 20 GB. A esto se añade la caché de contexto. La tabla ofrece una estimación orientativa y prudente; el valor que debes tomar como referencia es recommendedMaxWorkingSetSize, mostrado por el motor.
| Memoria del Mac | Modelo razonable | Nota |
|---|---|---|
| 8 GB | 3B (2 GB) | Un 8B es posible pero deja demasiado poco margen para macOS |
| 16 GB | 8B (5 GB), contexto medio | El límite predeterminado de la GPU sigue siendo suficiente |
| 24 a 32 GB | 14B (9 GB), o incluso un 8B en Q8 | Un 32B en Q4 requiere aumentar el límite de la GPU |
| 48 a 64 GB | 32B (19-20 GB) con contexto largo | Aumentar el límite de la GPU si el motor rechaza el modelo |
| 96 GB y más | 70B (aproximadamente 40 GB) y modelos MoE | Verificar recommendedMaxWorkingSetSize antes de descargar |
Estas cifras orientativas son estimaciones prudentes, no mediciones: basta con un contexto largo, un segundo modelo o una aplicación que consuma muchos recursos para cambiar la situación. La guía dedicada a la memoria ofrece el método de cálculo completo.
#5. Las opciones que cuentan
| Opción | Rol | Valor por defecto |
|---|---|---|
| -ngl, --n-gpu-layers | Número de capas en VRAM (un número, auto o all) | auto |
| -fa, --flash-attn | Flash Attention: on, off o auto | auto |
| -ctk, -ctv | Tipo de caché KV para las claves y los valores (f16, q8_0, q4_0…) | f16 |
| -hf | Repositorio de Hugging Face que se descargará, con cuantización opcional | Q4_K_M si el sufijo se omite |
| -c | Tamaño de contexto, en tokens | según el modelo |
Flash Attention está en modo automático por defecto: en la mayoría de los casos no es necesario activarlo manualmente. La caché KV se cuantiza con -ctk y -ctv, siempre que Flash Attention esté activado; al usar q8_0 en lugar de f16, la memoria de la caché se reduce aproximadamente a la mitad, a costa de una ligera pérdida de precisión que conviene comprobar en tus casos de uso. La guía específica detalla esta contrapartida.
#6. Rendimiento por chip: lo que miden los benchmarks públicos
QuelLLM no mide estas máquinas. La referencia es el hilo «Performance of llama.cpp on Apple Silicon M-series» del repositorio de llama.cpp, donde cada participante ejecuta la misma prueba con un LLaMA 7B en Q4_0. La tabla siguiente recoge algunas de sus filas, con las versiones de llama.cpp utilizadas en cada medición: las mediciones de los chips M1 a M4 corresponden a la misma versión; la utilizada para los M5 es más reciente.
| Chip (núcleos de GPU) | Ancho de banda | Prompt | Generación | Parte del techo teórico |
|---|---|---|---|---|
| M2 Pro (19) | 200 GB/s | 341,19 | 38,86 | 74 % |
| M3 Pro (18) | 150 GB/s | 341,67 | 30,74 | 78 % |
| M4 Pro (20) | 273 GB/s | 439,78 | 50,74 | 71 % |
| M5 Pro (20) | 307 GB/s | 1 620,64 | 66,33 | 82 % |
| M4 Max (40) | 546 GB/s | 885,68 | 83,06 | 58 % |
El límite teórico es el ancho de banda dividido por el tamaño del modelo (3,56 GiB, es decir, 3,82 GB). Los chips Pro alcanzan entre el 71 % y el 82 % de ese límite, mientras que el chip Max solo alcanza el 58 %: a partir de cierto nivel, la memoria ya no es el único freno, y pagar por más ancho de banda aporta menos de lo que sugiere la ficha técnica.
Tres conclusiones. La velocidad de generación depende del ancho de banda: el M3 Pro, a 150 GB/s, es más lento que el M2 Pro a 200 GB/s, pese a tener un chip de una generación más reciente. Los chips Max, con un ancho de banda mucho mayor, dominan. Por último, la lectura del prompt ha dado un salto con los M5: 1 620,64 tokens/s para un M5 Pro, frente a 439,78 para un M4 Pro con el mismo número de núcleos GPU, es decir, 3,7 veces esa velocidad. Esta diferencia importa para los documentos largos y el RAG, mucho menos para el chat.
Una buena costumbre antes de concluir que un Mac es lento: volver a ejecutar el mismo modelo con -ngl 0, después con el valor predeterminado, y comparar. La diferencia entre ambas ejecuciones muestra lo que realmente aporta la GPU en tu máquina y confirma que el cálculo se realiza mediante Metal. Anota también la versión de llama.cpp utilizada: las optimizaciones para Metal evolucionan rápidamente y un binario antiguo puede ser considerablemente más lento que una versión reciente.
#Solución de problemas: errores comunes
| Síntoma | Causa probable | Posible solución |
|---|---|---|
| Velocidad muy baja, procesador al 100 % | Modelo cargado en CPU | Verificar -ngl y leer los logs de arranque |
| Error de asignación de memoria del GPU | Modelo más grande que la parte de RAM asignada al GPU | Aumentar iogpu.wired_limit_mb, reducir el modelo o el contexto |
| El Mac se ralentiza o se congela | Límite de GPU demasiado alto, no hay margen para macOS | Reducir el valor de iogpu.wired_limit_mb |
| La compilación falla | Herramientas Apple ausentes o CMake demasiado antiguo | xcode-select --install luego brew upgrade cmake |
| El modelo no se encuentra | Ruta o nombre de repositorio de Hugging Face incorrecto | Probar -hf con un repositorio conocido, o -m con una ruta absoluta |
- MLX vs llama.cpp en Mac: ¿quién gana en 2026?
- Compilar llama.cpp con CUDA
- ¿Qué modelos para 32 GB de memoria?
- Fuente: repositorio oficial de llama.cpp
- Fuente: documentación de compilación de llama.cpp
- Fuente: benchmark público en Apple Silicon
- Fuente: discusión sobre el límite de memoria GPU de los Mac
¿Se necesita compilar llama.cpp para usar Metal en Mac?+
¿Cómo verificar que llama.cpp utiliza la GPU en mi Mac?+
¿Cómo asignar más memoria a la GPU en un Mac con Apple Silicon?+
¿llama.cpp o Ollama en Mac?+
¿Qué velocidad esperar de un Mac M4 Pro con llama.cpp?+
¿Un comentario, un error, una precisión? Avísanos, eso mejora la guía para todos.