Compilar llama.cpp com Metal
Em um Mac com Apple Silicon, o llama.cpp pode ser compilado com três comandos, e o Metal está ativado por padrão: clone o repositório, execute cmake -B build e depois cmake --build build --config Release, sem instalar um toolkit de GPU. Você também pode instalá-lo sem compilar usando o Homebrew. Os binários llama-cli e llama-server passam então a executar os cálculos na GPU do chip M; é a memória unificada, mais do que a potência bruta, que determina o tamanho possível do modelo.
O llama.cpp é o motor de inferência no qual se baseiam Ollama e LM Studio, e roda nativamente no Mac. Este guia mostra como instalá-lo ou compilá-lo com Metal, executá-lo com um modelo GGUF, disponibilizá-lo via API, aumentar o limite de memória da GPU no macOS e ler corretamente os benchmarks publicados para os chips M1 a M5.
#llama.cpp no Mac: o que o Metal oferece
No macOS, a GPU é usada via Metal, a API gráfica e de computação da Apple, e o llama.cpp a utiliza diretamente. O README do projeto informa que o Apple Silicon recebe suporte de primeira classe, com otimizações via ARM NEON, Accelerate e Metal. Na prática, isso significa que a compilação padrão já produz um motor que utiliza a GPU, sem precisar adicionar nenhuma opção, e que a memória unificada evita qualquer transferência entre o processador e a GPU: o modelo ocupa a memória uma única vez. O fator limitante em um Mac é, portanto, a capacidade e a largura de banda dessa memória.
#Pré-requisitos
Seu ChatGPT privado e gratuito na sua máquina em 1 hora — LM Studio, Ollama, Open WebUI, seus documentos, sem nuvem.
- Espaço online vitalício
- PDF + arquivos
- Atualizações vitalícias
- Um Mac Apple Silicon
- M1 a M5: é o foco deste guia. Os Macs com processador Intel quase não se beneficiam disso.
- Ferramentas de compilação Apple
- Instale as ferramentas de linha de comando com xcode-select --install.
- CMake e Git
- Disponíveis via Homebrew: brew install cmake git.
- Memória para o modelo
- O ponto de referência do site: um 8B em Q4 pesa aproximadamente 5 GB, um 14B cerca de 9 GB, um 32B entre 19 e 20 GB, antes do contexto.
#Instalar sem compilar: Homebrew
Se você não precisar de opções de compilação específicas, a maneira mais rápida é o Homebrew. A documentação de instalação do llama.cpp indica que a fórmula é atualizada automaticamente com cada nova versão do projeto. Você obtém os mesmos executáveis prontos para uso, com Metal.
Compile você mesmo quando quiser a versão mais recente do repositório, testar uma ramificação ou modificar uma opção de compilação. Caso contrário, o Homebrew é suficiente: você economiza o tempo de compilação e as atualizações são feitas com brew upgrade.
#1. Compilar com Metal
A documentação de build é explícita: no macOS, o Metal está ativado por padrão e faz com que os cálculos sejam executados na GPU. Nenhuma opção precisa ser adicionada. O antigo nome do repositório, sob a conta de Georgi Gerganov, redireciona para a organização ggml-org, onde agora está o projeto. Os binários aparecem em build/bin, incluindo llama-cli para o terminal e llama-server para a API.
Duas opções úteis: a documentação indica que -DGGML_METAL=OFF desativa o Metal na compilação e que é possível forçar um binário compilado com Metal a executar no processador usando --n-gpu-layers 0, o que é útil para comparar as velocidades.
#2. Iniciar um primeiro modelo
Os motores recentes sabem baixar o modelo por si mesmos. A opção -hf recebe o nome de um repositório Hugging Face, com a quantização no sufixo; sem sufixo, Q4_K_M é usada por padrão. Para um arquivo já baixado, use -m com o caminho dele.
O número de camadas colocadas na GPU é definido com -ngl; seu valor padrão é auto, o que se adapta a um Mac com memória unificada. Você também pode escrever -ngl all para carregar tudo. Não procure o caminho de um modelo no diretório de Ollama: seus arquivos são armazenados em um formato interno que não é diretamente utilizável como GGUF.
#Servir uma API compatível com OpenAI com llama-server
O llama-server expõe rotas compatíveis com a API OpenAI para chat, respostas e embeddings. Por padrão, ele escuta em 127.0.0.1, porta 8080: é acessível apenas do seu Mac. Para torná-lo acessível na rede, é necessário especificar --host explicitamente, e então convém proteger o acesso.
#4. O limite de memória da GPU no macOS
No Apple Silicon, o macOS disponibiliza à GPU apenas uma parte da memória unificada. Um modelo que ultrapassa essa parte é recusado ou passa a usar o processador, mesmo que a memória total seja suficiente. O motor exibe o valor efetivo ao iniciar: procure a linha ggml_metal_init: recommendedMaxWorkingSetSize nos logs do llama-cli ou do llama-server.
O comando sysctl iogpu.wired_limit_mb permite aumentar esse limite. Ele espera um valor em megabytes: 61.440 para 60 GB, por exemplo. Um colaborador do repositório do llama.cpp lembra que o comando precisa ser executado novamente a cada inicialização, pois a alteração não é persistente, e desaconselha chegar a 100%: o sistema precisa de memória para tudo o que não está reservado pela GPU, e surgem problemas se não sobrar memória suficiente para ele.
#Qual modelo para cada capacidade de memória unificada
A memória unificada é compartilhada entre o macOS, seus aplicativos e o modelo, e a GPU recebe apenas uma parte dela. A referência do site situa os pesos de um modelo 8B em Q4 em torno de 5 GB, de um 14B em torno de 9 GB e de um 32B em torno de 19 a 20 GB. O cache de contexto se soma a esses valores. A tabela fornece uma estimativa conservadora; o valor que deve ser tomado como referência é recommendedMaxWorkingSetSize, exibido pelo motor.
| Memória do Mac | Modelo razoável | Observação |
|---|---|---|
| 8 GB | 3B (2 GB) | Um 8B é possível, mas deixa muito pouco espaço para o macOS |
| 16 GB | 8B (5 GB), contexto médio | O limite padrão da GPU continua sendo suficiente |
| 24 a 32 GB | 14B (9 GB), ou até um 8B em Q8 | Um 32B em Q4 exige aumentar o limite da GPU |
| 48 a 64 GB | 32B (19-20 GB) com contexto longo | Aumentar o limite da GPU se o motor recusar o modelo |
| 96 GB ou mais | 70B (aproximadamente 40 GB) e modelos MoE | Verificar recommendedMaxWorkingSetSize antes de baixar |
Esses valores aproximados são estimativas conservadoras, não medições: um contexto longo, um segundo modelo ou um aplicativo que consuma muitos recursos bastam para mudar o cenário. O guia dedicado à memória apresenta o método completo de cálculo.
#5. As opções que importam
| Opção | Função | Valor padrão |
|---|---|---|
| -ngl, --n-gpu-layers | Número de camadas colocadas em VRAM (um número, auto ou all) | auto |
| -fa, --flash-attn | Flash Attention: on, off ou auto | auto |
| -ctk, -ctv | Tipo de cache KV para chaves e valores (f16, q8_0, q4_0…) | f16 |
| -hf | Repositório do Hugging Face para download, com quantização opcional | Q4_K_M se o sufixo for omitido |
| -c | Tamanho do contexto, em tokens | de acordo com o modelo |
O Flash Attention está em modo automático por padrão: na maioria dos casos, não é necessário ativá-lo manualmente. O cache KV pode ser quantizado com -ctk e -ctv, desde que o Flash Attention esteja ativo; a quantização em q8_0 reduz aproximadamente pela metade a memória do cache em comparação com f16, ao custo de uma pequena perda de precisão que convém verificar nos seus casos de uso. O guia dedicado detalha essa contrapartida.
#6. Desempenho por chip: o que os benchmarks públicos medem
O QuelLLM não realiza medições nessas máquinas. A referência é a discussão «Performance of llama.cpp on Apple Silicon M-series» no repositório do llama.cpp, em que cada colaborador executa o mesmo teste com um LLaMA 7B em Q4_0. A tabela abaixo apresenta algumas dessas linhas, com a versão do llama.cpp usada em cada medição: as medições dos chips M1 a M4 foram feitas com a mesma versão, enquanto a dos M5 foi feita com uma versão mais recente.
| Chip (núcleos de GPU) | Largura de banda | Prompt | Geração | Proporção do limite máximo 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 % |
O limite teórico é a largura de banda dividida pelo peso do modelo (3,56 GiB, ou seja, 3,82 GB). Os chips Pro atingem 71 a 82% desse limite, enquanto o chip Max alcança apenas 58%: a partir de certo nível, a memória não é mais o único fator limitante, e pagar por mais largura de banda traz menos benefício do que a ficha técnica sugere.
Três lições. A geração segue a largura de banda: o M3 Pro, a 150 GB/s, é mais lento que o M2 Pro a 200 GB/s, apesar de seu chip ser de uma geração mais recente. Os chips Max, com largura de banda muito maior, dominam. Por fim, a leitura do prompt deu um salto com os M5: 1.620,64 tokens/s para um M5 Pro, contra 439,78 para um M4 Pro com o mesmo número de núcleos de GPU, ou seja, 3,7 vezes mais. Essa diferença importa para documentos longos e RAG, muito menos para o chat.
Uma boa prática antes de concluir que um Mac é lento: executar novamente o mesmo modelo com -ngl 0, depois com o valor padrão, e comparar. A diferença entre os dois mostra o ganho real proporcionado pela GPU na sua máquina e confirma que o processamento está sendo feito pelo Metal. Anote também a versão do llama.cpp utilizada: as otimizações para Metal evoluem rapidamente, e um binário antigo pode ser significativamente mais lento que uma versão recente.
#Solução de problemas: erros comuns
| Sintoma | Causa provável | Possível solução |
|---|---|---|
| Velocidade muito baixa, processador com 100 % de uso | Modelo carregado na CPU | Verificar -ngl e ler os logs de inicialização |
| Erro de alocação de memória do GPU | Modelo maior do que a parcela de RAM alocada à GPU | Aumentar iogpu.wired_limit_mb, reduzir o modelo ou o contexto |
| O Mac fica lento ou travado | Limite da GPU alto demais, sem margem para o macOS | Reduzir novamente o valor de iogpu.wired_limit_mb |
| A compilação falha | Ferramentas Apple ausentes ou CMake muito antigo | xcode-select --install em seguida brew upgrade cmake |
| O modelo não foi encontrado | Caminho ou nome do repositório Hugging Face incorreto | Testar -hf com um repositório conhecido, ou -m com um caminho absoluto |
- MLX versus llama.cpp no Mac: quem vence em 2026?
- Compilar llama.cpp com CUDA
- Quais modelos para 32 GB de memória
- Fonte: repositório oficial do llama.cpp
- Fonte: documentação de compilação do llama.cpp
- Fonte: benchmark público em Apple Silicon
- Fonte: discussão sobre o limite de memória da GPU dos Macs
É necessário compilar o llama.cpp para usar o Metal no Mac?+
Como verificar se o llama.cpp está usando a GPU no meu Mac?+
Como alocar mais memória à GPU em um Mac Apple Silicon?+
llama.cpp ou Ollama no Mac?+
Qual velocidade esperar de um Mac M4 Pro com llama.cpp?+
Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.