LLMs locais no macOS: Ollama, LM Studio, MLX, llama.cpp
Tradução automática Este artigo foi traduzido automaticamente a partir da versão original em inglês.
Os engenheiros que executam modelos locais num Mac com Apple Silicon precisam de dimensionar a carga de trabalho completa, não apenas escolher um modelo que possa ser descarregado. O Apple Silicon consegue executar prompts do dia a dia sem uma API remota porque a CPU e a GPU partilham um pool de memória unificada, mas os pesos do modelo competem nesse espaço com o KV cache, o workspace do runtime e o macOS.
Depois de confirmar que o modelo, o contexto e a margem de memória pretendidos cabem, escolha a interface de controlo que corresponde ao fluxo de trabalho: Ollama para um serviço local gerido, LM Studio para inspeção numa aplicação de desktop, llama.cpp para execução direta de GGUF ou MLX-LM para Python nativo do ecossistema Apple. Assim, os testes de qualidade do modelo ficam separados da escolha da ferramenta e obtém um benchmark justo e consciente da memória para a stack que vai executar.
TL;DR. Use Ollama para um serviço local gerido, LM Studio para explorar modelos no desktop e as respetivas APIs locais, llama.cpp para controlo direto da execução de GGUF e MLX-LM para experimentação em Python nativo do ecossistema Apple. Nenhuma é universalmente mais rápida. Faça um benchmark com o modelo, a quantização, o contexto e a carga de trabalho exatos, mantendo uma margem de memória adequada.
Consulte a tabela de decisão compacta em Ferramentas para LLMs locais no macOS em 2026.
Comece por definir um envelope de memória
O tamanho bruto dos pesos quantizados é apenas o primeiro termo:
peak memory ≈ model weights
+ KV cache
+ runtime workspace
+ multimodal components
+ application and OS memory
O comprimento do contexto, o tipo de dados da cache, os pedidos em paralelo e a arquitetura do modelo alteram o resultado. Um modelo nominal de 7B ou 8B a quatro bits pode continuar a ser difícil de executar num Mac com 8 GB, porque o sistema operativo não consegue disponibilizar ao runtime toda a memória instalada.
Use o Monitor de Atividade ou as métricas do próprio runtime durante os testes. A Apple define a pressão de memória com base na memória livre, na taxa de swap, na memória wired e nos ficheiros em cache. Deixe margem suficiente para evitar swap contínuo; um modelo que carrega, mas coloca o sistema sob pressão de memória, não é adequado para interação.
Separe também inferência local de operação offline. Os prompts podem permanecer na máquina enquanto a aplicação continua a aceder à rede para descarregar modelos, obter atualizações ou usar funcionalidades opcionais. A Ollama documenta separadamente a execução local, os downloads de modelos e as funcionalidades opcionais na cloud na sua FAQ. Trate a operação offline como um requisito do fluxo de trabalho que deve ser verificado por aplicação: descarregue primeiro os artefactos, desligue a rede e teste o fluxo de trabalho completo.
As quatro ferramentas resolvem problemas diferentes do fluxo de trabalho
| Ferramenta | Interface principal | Via principal dos artefactos | Escolha-a quando |
|---|---|---|---|
| Ollama | CLI e API HTTP local | Bundles de modelos geridos, normalmente baseados em GGUF | Uma aplicação precisa de um serviço local gerido e simples |
| LM Studio | UI de desktop, CLI, SDKs, APIs locais | Modelos locais descarregados, incluindo vias GGUF e MLX | É necessário descobrir, comparar, inspecionar e servir modelos visualmente |
| llama.cpp | CLI, biblioteca C/C++, servidor local | GGUF | Precisa de flags diretas, ferramentas de conversão/quantização ou controlo dos embeddings |
| MLX-LM | Python e CLI | Pesos compatíveis com MLX | Está a desenvolver fluxos de trabalho em Python especificamente para Apple Silicon |
Esta é uma tabela de responsabilidades, não uma classificação de velocidade. Várias ferramentas podem usar kernels ou formatos relacionados, e o desempenho varia consoante o suporte do modelo e a versão.
Ollama: serviço local gerido
A Ollama gere downloads de modelos, templates, o ciclo de vida dos processos e uma API em localhost. É útil quando o código da aplicação deve apontar para um serviço local estável, em vez de gerir os flags de inferência.
MODEL=llama3.2
ollama pull "$MODEL"
ollama run "$MODEL" "Explain unified memory."
curl http://localhost:11434/api/chat \
-H 'Content-Type: application/json' \
-d '{
"model": "'"$MODEL"'",
"messages": [{"role": "user", "content": "Explain unified memory."}],
"stream": false
}'
Inspecione o manifesto do modelo e a configuração do contexto, em vez de assumir que um nome curto da biblioteca identifica um checkpoint imutável. Fixe ou registe o artefacto exato usado nas avaliações.
A Ollama troca alguma visibilidade de baixo nível pela conveniência de gerir o ciclo de vida. Passe para llama.cpp ou para outro runtime quando precisar de controlar diretamente um ficheiro GGUF, um chat template, uma configuração da cache ou uma nova funcionalidade do backend.
LM Studio: exploração no desktop e APIs locais
O LM Studio é útil quando a descoberta de modelos, a configuração do carregamento, a inspeção de conversas e a avaliação humana lado a lado fazem parte do mesmo fluxo de trabalho. Atualmente, também disponibiliza SDKs nativos para Python e TypeScript, endpoints compatíveis com OpenAI, structured output, tool use e um daemon headless, pelo que já não é apenas uma GUI de desktop.
O SDK Python atual liga-se a um modelo que já tenha descarregado:
import lmstudio as lms
MODEL_KEY = "ibm/granite-4-micro"
with lms.Client() as client:
model = client.llm.model(MODEL_KEY)
response = model.respond("Write one sentence about local inference.")
print(response)
Inicie a API local a partir do separador Developer ou com:
lms server start
O LM Studio pode servir em localhost ou numa rede local e suporta tokens de API nas suas definições de autenticação da API. Mantenha-o ligado ao loopback, salvo se o acesso remoto for deliberado. Se o expuser numa LAN, exija a opção documentada de token de API, aplique uma regra de firewall no anfitrião e reveja o acesso a ferramentas e integrações.
llama.cpp: execução direta de GGUF
O llama.cpp é a opção de referência quando o artefacto é GGUF e pretende observar diretamente a fronteira do runtime. Suporta Apple Metal, bem como CPU e outros backends de hardware.
brew install llama.cpp
# Download through the Hugging Face integration and select a quantization.
MODEL_REPO=ggml-org/gemma-3-1b-it-GGUF
QUANT=Q4_K_M
llama-cli -hf "$MODEL_REPO:$QUANT"
# Or start an OpenAI-compatible local server.
llama-server -hf "$MODEL_REPO:$QUANT"
A via atual -hf do repositório pode descarregar um projector multimodal compatível, quando disponível. O suporte de modelos, os templates e os flags da CLI mudam rapidamente; fixe uma build conhecida e mantenha o comando de arranque junto do registo da avaliação.
Escolha llama.cpp quando o objetivo for o controlo direto, não porque “nível mais baixo” signifique automaticamente maior velocidade. Uma ferramenta gerida pode escolher bons valores predefinidos; os flags diretos também podem piorar o desempenho.
MLX-LM: desenvolvimento em Python nativo do ecossistema Apple
O MLX-LM assenta no framework de arrays MLX da Apple. Suporta geração, chat, conversão, quantização e fine-tuning eficiente em parâmetros para modelos compatíveis.
MODEL=mlx-community/Llama-3.2-3B-Instruct-4bit
uv add mlx-lm
uv run mlx_lm.generate \
--model "$MODEL" \
--prompt "Explain Metal acceleration in one paragraph."
O Python expõe diretamente o modelo e o tokenizer:
from mlx_lm import generate, load
MODEL = "mlx-community/Llama-3.2-3B-Instruct-4bit"
model, tokenizer = load(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))
O servidor HTTP do MLX-LM está documentado como um servidor de desenvolvimento com verificações básicas de segurança, não como um serviço de produção. Use-o para experimentação local ou coloque à sua frente uma fronteira aplicacional revista.
Um benchmark justo demora menos tempo do que um download inadequado
Teste a mesma família de checkpoints e uma quantização comparável sempre que os formatos o permitam. Use um conjunto pequeno de prompts que inclua:
- um prompt interativo curto
- um prompt longo, próximo do contexto pretendido
- structured output ou tool calls, se a aplicação precisar deles
- um comprimento de geração representativo
- um pedido repetido, para distinguir o carregamento a frio da inferência a quente
Registe:
| Métrica | Porque é importante |
|---|---|
| Resultado da tarefa | Um modelo rápido, mas errado, não é útil |
| Tempo até ao primeiro token | Capacidade de resposta interativa |
| Tokens de saída por segundo | Throughput de geração |
| Memória e pressão máximas | Se a máquina continua utilizável |
| Tempo de carregamento a frio | Experiência no desktop e on-demand |
| Comportamento energético e térmico | Utilização prolongada num portátil |
| Compatibilidade da API/schema | Se a ferramenta se adequa à aplicação |
Não compare um modelo de uma ferramenta a 4 bits com um modelo de outra ferramenta em precisão total e atribua a diferença ao runtime.
Checklist de segurança e privacidade
- Ligue as APIs ao loopback, salvo se for necessário acesso pela rede.
- Se for necessário acesso pela LAN, use uma firewall no anfitrião e a autenticação documentada da ferramenta ou um reverse proxy autenticado à frente do serviço. O suporte de tokens de API é específico de cada ferramenta: o LM Studio documenta tokens de API, enquanto a via documentada de exposição da Ollama usa binding do anfitrião e proxying.
- Trate os ficheiros de modelos como artefactos de terceiros; registe a origem, a revisão, a licença e o hash.
- Evite executar código personalizado de modelos que não tenha sido revisto.
- Confirme se as funcionalidades opcionais de documentos, ferramentas, atualizações ou analytics fazem chamadas de rede.
- Não assuma que a geração local torna seguros os documentos recuperados, os logs ou os efeitos secundários das ferramentas.
Principais conclusões
- Escolha primeiro a fronteira do fluxo de trabalho: serviço gerido, desenvolvimento no desktop e headless, controlo direto de GGUF ou Python nativo do ecossistema Apple.
- Ollama e LM Studio expõem ambos APIs locais. Compare o controlo do ciclo de vida, os SDKs, o structured output, as ferramentas e a visibilidade do runtime.
- Os pesos do modelo são apenas uma parte do orçamento de memória. Inclua o KV cache, o workspace, os componentes multimodais, a aplicação e a margem necessária para o macOS.
- A inferência local não é automaticamente offline nem privada. Verifique as chamadas de rede, o binding, a autenticação, os artefactos, os logs e os efeitos secundários das ferramentas.
- Faça um benchmark com a mesma tarefa, família de checkpoints, contexto e quantização comparável antes de atribuir um resultado ao runtime.