sidebar_position: 2
title: "Run Local LLMs on Mac"
description: "Set up a local OpenAI-compatible LLM server on macOS with llama.cpp or MLX, including model selection, memory optimization, and real benchmarks on Apple Silicon"
lang: ru
Запустите локальные LLM на Mac
В этом руководстве вы узнаете, как запустить локальный сервер LLM на macOS с API-интерфейсом, совместимым с OpenAI. Вы получаете полную конфиденциальность, нулевые затраты на API и удивительно хорошую производительность на Apple Silicon.
Мы рассматриваем два бэкэнда:
Бэкэнд
Установить
Лучшее в
Формат
llama.cpp
brew install llama.cpp
Самое быстрое время создания первого токена, квантованный KV-кэш для малой памяти
Самая быстрая генерация токенов, встроенная оптимизация Metal
MLX (защитные тензоры)
Оба предоставляют OpenAI-совместимую конечную точку /v1/chat/completions. Hermes работает с любым из них — просто укажите http://localhost:8080 or http://localhost:8000..
:::информация Только для Apple Silicon
Это руководство предназначено для компьютеров Mac с Apple Silicon (M1 и новее). Компьютеры Intel Mac будут работать с llama.cpp, но без ускорения графического процессора — ожидайте значительного снижения производительности.
Выбор модели
Для начала мы рекомендуем Qwen3.5-9B — это надежная модель рассуждения, которая удобно помещается в более чем 8 ГБ унифицированной памяти с квантованием.
Вариант
Размер на диске
Требуется ОЗУ (контекст 128 КБ)
Бэкэнд
Qwen3.5-9B-Q4_K_M (ГГУФ)
5,3 ГБ
~10 ГБ с квантованным KV-кешем
лама.cpp
Qwen3.5-9B-mlx-lm-mxfp4 (MLX)
~5 ГБ
~12 ГБ
омлкс
Практическое правило памяти: размер модели + кэш KV. Модель 9B Q4 занимает ~5 ГБ. Кэш KV в контексте 128 КБ с квантованием Q4 добавляет ~4-5 ГБ. При использовании кеша KV по умолчанию (f16) он увеличивается до ~ 16 ГБ. Флаги квантованного кэша KV в llama.cpp — ключевой трюк для систем с ограниченной памятью.
Для более крупных моделей (27B, 35B) вам потребуется более 32 ГБ единой памяти. 9B — лучшее место для машин с объемом памяти 8–16 ГБ.
Вариант А: llama.cpp
llama.cpp — наиболее переносимая локальная среда выполнения LLM. В macOS он использует Metal для ускорения графического процессора «из коробки».
Установить
brewinstallllama.cpp
Это дает вам глобальную команду llama-server.
Загрузите модель
Вам нужна модель в формате GGUF. Самый простой источник — Hugging Face через huggingface-cli:
:::совет Закрытые модели
Некоторые модели Hugging Face требуют аутентификации. Если вы получаете ошибку 401 или 404, сначала запустите huggingface-cli login.
Оптимизация памяти для систем с ограниченными возможностями
Флаги --cache-type-k q4_0 --cache-type-v q4_0 являются наиболее важной оптимизацией для систем с ограниченной памятью. Вот влияние в контексте 128K:
Тип кэша KV
Кэш-память KV (128K ctx, модель 9B)
f16 (по умолчанию)
~16 ГБ
q8_0
~8 ГБ
q4_0
~4 ГБ
На Mac с 8 ГБ памяти используйте кэш q4_0 KV и уменьшите контекст до -c 32768 (32 КБ). На 16 ГБ можно комфортно делать 128К контекста. На 32 ГБ+ вы можете использовать более крупные модели или несколько параллельных слотов.
Если вам по-прежнему не хватает памяти, сначала уменьшите размер контекста (-c), затем попробуйте меньшее квантование (Q3_K_M вместо Q4_K_M).
omlx — это собственное приложение для macOS, которое управляет моделями MLX и обслуживает их. MLX — это собственная платформа машинного обучения Apple, оптимизированная специально для унифицированной архитектуры памяти Apple Silicon.
Установить
Загрузите и установите с omlx.ai. Он предоставляет графический интерфейс для управления моделями и встроенный сервер.
Загрузите модель
Используйте приложение OMLX для просмотра и загрузки моделей. Найдите Qwen3.5-9B-mlx-lm-mxfp4 и загрузите его. Модели хранятся локально (обычно в ~/.omlx/models/).
Запускаем сервер
omlx обслуживает модели http://127.0.0.1:8000 by default. Start serving from the app UI, or use the CLI if available.
Both backends tested on the same machine (Apple M5 Max, 128 GB unified memory) running the same model (Qwen3.5-9B) at comparable quantization levels (Q4_K_M for GGUF, mxfp4 for MLX). Five diverse prompts, three runs each, backends tested sequentially to avoid resource contention.
Results
Metric
llama.cpp (Q4_K_M)
MLX (mxfp4)
Winner
TTFT (avg)
67 ms
289 ms
llama.cpp (4.3x faster)
TTFT (p50)
66 ms
286 ms
llama.cpp (4.3x faster)
Generation (avg)
70 tok/s
96 tok/s
MLX (37% faster)
Generation (p50)
70 tok/s
96 tok/s
MLX (37% faster)
Total time (512 tokens)
7.3s
5.5s
MLX (25% faster)
What this means
llama.cpp excels at prompt processing — its flash attention + quantized KV cache pipeline gets you the first token in ~66ms. If you're building interactive applications where perceived responsiveness matters (chatbots, autocomplete), this is a meaningful advantage.
MLX generates tokens ~37% faster once it gets going. For batch workloads, long-form generation, or any task where total completion time matters more than initial latency, MLX finishes sooner.
Both backends are extremely consistent — variance across runs was negligible. You can rely on these numbers.
Which one should you pick?
Use case
Recommendation
Interactive chat, low-latency tools
llama.cpp
Long-form generation, bulk processing
MLX (omlx)
Memory-constrained (8-16 GB)
llama.cpp (quantized KV cache is unmatched)
Serving multiple models simultaneously
omlx (built-in multi-model support)
Maximum compatibility (Linux too)
llama.cpp
Connect to Hermes
Once your local server is running:
hermesmodel
Select Custom endpoint and follow the prompts. It will ask for the base URL and model name — use the values from whichever backend you set up above.
Timeouts
Hermes automatically detects local endpoints (localhost, LAN IPs) and relaxes its streaming timeouts. No configuration needed for most setups.
If you still hit timeout errors (e.g. very large contexts on slow hardware), you can override the streaming read timeout:
# In your .env — raise from the 120s default to 30 minutesHERMES_STREAM_READ_TIMEOUT=1800
Timeout
Default
Local auto-adjustment
Env var override
Stream read (socket-level)
120s
Raised to 1800s
HERMES_STREAM_READ_TIMEOUT
Stale stream detection
180s
Disabled entirely
HERMES_STREAM_STALE_TIMEOUT
API call (non-streaming)
1800s
No change needed
HERMES_API_TIMEOUT
Тайм-аут чтения потока чаще всего вызывает проблемы — это крайний срок на уровне сокета для получения следующего фрагмента данных. Во время предварительного заполнения в больших контекстах локальные модели могут не выдавать выходные данные в течение нескольких минут во время обработки запроса. Автоматическое обнаружение решает эту проблему прозрачно.