O que medi rodando Qwen2.5-Coder 1.5B e 7B em 4 bits com MLX num M3 Pro de 18 GB, e o que esses números não dizem
English summary: A real MLX benchmark of Qwen2.5-Coder 1.5B and 7B (4-bit) on an 18 GB M3 Pro, the choice of the 7B for future training, and the limits of what a performance benchmark can claim.
Publicado: 9 de novembro de 2026
Tempo de leitura: 9 min
Série: lemon-code em 30 dias, parte 10 de 13
Com 8 mil tokens de contexto, o modelo de 7 bilhões de parâmetros levou 88 segundos para soltar o primeiro token no meu MacBook. O de 1,5 bilhão levou 24.
Mesmo assim escolhi o maior para os próximos treinos. Este post mostra o benchmark que rodei no lemon-model, o laboratório de modelo de código local que comecei em setembro, e explica a escolha. Também explica o que esses números não provam.
Pense em dois carros. O compacto sai rápido no sinal; o utilitário é pensado para levar cargas maiores. Para ir à padaria, o compacto pode bastar. Para uma mudança, o utilitário faz mais sentido.
O modelo pequeno é o compacto: responde rápido e usa menos memória. O grande é o utilitário: mais lento, com mais parâmetros. A pergunta certa é qual tarefa você quer executar.
Rodar um modelo de código local com MLX no Apple Silicon leva três linhas:
pip install mlx-lm
mlx_lm.generate \
--model mlx-community/Qwen2.5-Coder-1.5B-Instruct-4bit \
--prompt "Write a Python function that checks if a string is a palindrome."
O primeiro comando instala o mlx-lm. O segundo baixa o modelo quantizado em 4 bits e gera a resposta usando a memória unificada do Mac. Foi daí que o lemon-model partiu.
Produtos gratuitos e pagos para transformar ideias em uma base que você consegue executar.
13 produtos disponíveisContinue explorando tópicos similares
Minhas primeiras tentativas de treinar o 7B no Mac pararam no corte de segurança de memória, mesmo com o MLX abaixo de 14 GB. O piloto que passou usou 8 camadas, rank 4 e terminou em 200 segundos.
Uma resposta com 'if n == 20: return 6765' passa em todos os testes de Fibonacci. No lemon-model ela recebe nota zero. Este post mostra o resto do sistema que impede hype de virar release.
448 commits no CLI, 152 no app, 268 no laboratório de modelo, 67 arquivos de ADR para 60 números e nenhum modelo promovido. O fechamento da série, só com dados reais.
Checklist prático para validar segurança, custos, avaliações e observabilidade antes de colocar seu app com IA em produção.
Templates testados em produção, usados por desenvolvedores. Economize semanas de setup no seu próximo projeto.
O benchmark do lemon-model roda cinco casos nos dois modelos, com semente fixa e cinco medições por caso em cada uma de duas fases: fria e aquecida. Isso dá 50 medições por candidato. Na fase aquecida, há uma rodada de aquecimento antes das medições.
Ambiente registrado no relatório: Apple M3 Pro, 18 GiB de memória unificada, macOS 26.5.2, Python 3.12.12, MLX 0.32.2, mlx-lm 0.31.3.
Medianas da fase aquecida:
| Caso | L1 primeiro token | L1 tokens/s | L2 primeiro token | L2 tokens/s |
|---|---|---|---|---|
| chat curto | 104 ms | 109,6 | 236 ms | 26,9 |
| contexto 2K | 4,2 s | 89,7 | 18,0 s | 24,7 |
| contexto 8K | 23,7 s | 62,6 | 88,2 s | 20,0 |
| fill-in-the-middle | 148 ms | 94,8 | 348 ms | 27,1 |
| loop de agente | 121 ms | 104,7 | 248 ms | 26,3 |
Pico do alocador do MLX: de 916 MiB a 2.159 MiB no L1, de 4.207 MiB a 5.757 MiB no L2. Esse número é do alocador, não é o consumo total do processo.
A rodada final do L1 levou 604 segundos. A do L2, 2.156. Duas tentativas anteriores do L2 falharam com limites de tempo menores, e as duas falhas ficaram registradas como relatórios imutáveis.
Para treinar adaptações com LoRA (assunto do próximo post), capacidade importa mais que latência. O L2 tem 7B de parâmetros e evidência pública da mesma família de modelos. O L1 continua como reserva de baixa latência.
O próprio relatório deixa claro o limite dessa escolha: ela se baseia em desempenho de inferência. Não prova que o treino cabe na memória, que o LoRA vai funcionar, que a qualidade de código é boa ou que algum modelo está pronto para produção. Nenhum desses dois é um modelo treinado pelo lemon-model.
/Volumes. Modelos de 7B enchem o SSD interno rápido.No roteador do lemon-code (post 4), o provider mlx só entra na disputa se a máquina for Apple Silicon, o servidor local responder, o modelo do perfil ativo aparecer em /v1/models e a checagem de recursos não bloquear. É a regra de readiness antes do score, aplicada ao modelo local.
Um modelo de código local no Mac já é viável, com números que dá para medir e auditar. O pequeno responde rápido; o grande aguenta mais. O que o benchmark não responde é se algum deles escreve código bom o suficiente. Essa pergunta tem nome: avaliação, e ganha um post só para ela.
Na quarta, o próximo passo: LoRA e QLoRA com MLX, e o que aconteceu quando tentei treinar o 7B num Mac de 18 GB.
Se o seu time está avaliando modelos locais para código ou dados que não podem sair da empresa, desenhar esse benchmark é um trabalho que faço na LEMON.DEV.