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-кэш для малой памяти ГГУФ
омлкс omlx.ai Самая быстрая генерация токенов, встроенная оптимизация 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 для ускорения графического процессора «из коробки».

Установить

brew install llama.cpp

Это дает вам глобальную команду llama-server.

Загрузите модель

Вам нужна модель в формате GGUF. Самый простой источник — Hugging Face через huggingface-cli:

brew install huggingface-cli

Затем скачайте:

huggingface-cli download unsloth/Qwen3.5-9B-GGUF Qwen3.5-9B-Q4_K_M.gguf --local-dir ~/models

:::совет Закрытые модели Некоторые модели Hugging Face требуют аутентификации. Если вы получаете ошибку 401 или 404, сначала запустите huggingface-cli login.

Запускаем сервер

llama-server -m ~/models/Qwen3.5-9B-Q4_K_M.gguf \
  -ngl 99 \
  -c 131072 \
  -np 1 \
  -fa on \
  --cache-type-k q4_0 \
  --cache-type-v q4_0 \
  --host 0.0.0.0

Вот что делает каждый флаг:

Флаг Цель
-ngl 99 Выгрузите все слои в графический процессор (металл). Используйте большое число, чтобы ничего не оставалось в процессоре.
-c 131072 Размер окна контекста (128 000 токенов). Уменьшите это значение, если у вас мало памяти.
-np 1 Количество параллельных слотов. Оставьте значение 1 для однопользовательского использования — большее количество слотов разделит ваш бюджет памяти.
-fa on Вспышка внимания. Уменьшает использование памяти и ускоряет вывод в длинном контексте.
--cache-type-k q4_0 Квантуйте ключевой кэш до 4-битного. Это экономит память.
--cache-type-v q4_0 Квантуйте кэш значений до 4-битного. Вместе с вышесказанным это сокращает кэш-память KV примерно на 75% по сравнению с f16.
--host 0.0.0.0 Слушайте на всех интерфейсах. Используйте 127.0.0.1, если вам не нужен доступ к сети.

Сервер готов, когда вы видите:

main: server is listening on http://0.0.0.0:8080
srv  update_slots: all slots are idle

Оптимизация памяти для систем с ограниченными возможностями

Флаги --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).

Проверьте это

curl -s http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3.5-9B-Q4_K_M.gguf",
    "messages": [{"role": "user", "content": "Hello!"}],
    "max_tokens": 50
  }' | jq .choices[0].message.content

Получить название модели

Если вы забыли имя модели, запросите конечную точку модели:

curl -s http://localhost:8080/v1/models | jq '.data[].id'

Вариант Б: MLX через omlx

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.

Test it

curl -s http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3.5-9B-mlx-lm-mxfp4",
    "messages": [{"role": "user", "content": "Hello!"}],
    "max_tokens": 50
  }' | jq .choices[0].message.content

List available models

omlx can serve multiple models simultaneously:

curl -s http://127.0.0.1:8000/v1/models | jq '.data[].id'

Benchmarks: llama.cpp vs MLX

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

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:

hermes model

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 minutes
HERMES_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

Тайм-аут чтения потока чаще всего вызывает проблемы — это крайний срок на уровне сокета для получения следующего фрагмента данных. Во время предварительного заполнения в больших контекстах локальные модели могут не выдавать выходные данные в течение нескольких минут во время обработки запроса. Автоматическое обнаружение решает эту проблему прозрачно.