Запуск локальных LLM на Mac

Это руководство проведет вас через запуск локального LLM-сервера на macOS с API, совместимым с OpenAI. Вы гарантируете полную конфиденциальность, нулевую стоимость API и высокую производительность Apple Silicon.

Мы рассмотрим два бэкенда:

Бекенд Установка Лучше всего подходит для Формат
llama.cpp brew install llama.cpp Самое быстрое время до первого токена, квантовый KV-кэш для памяти низкого потребления ГГУФ
омлкс omlx.ai Самая быстрая генерация токенов, нативная оптимизация Metal MLX (защитные тензоры)

Оба варианта имеют конечную точку /v1/chat/completions, совместимую с OpenAI. Hermes работает с любым из них — просто укажите http://localhost:8080 или http://localhost:8000.

ℹ️ Info

Только Apple Silicon Это руководство предназначено для Mac с Apple Silicon (M1 и новинки). Intel Mac будет работать с llama.cpp, но без ускорения графического процессора — ожидайте значительного снижения производительности.


Выбор модели

Для начала мы рекомендуем Qwen3.5-9B — это сильная модель рассуждений, которая комфортно размещается в 8 ГБ+ унифицированной памяти с квантованием.

Вариант Размер на диске Требуется ОЗУ (контекст 128К) Бекенд
Qwen3.5-9B-Q4_K_M (ГГУФ) 5,3 ГБ ~10 ГБ с квантовым КВ-кэшем лама.cpp
Qwen3.5-9B-mlx-lm-mxfp4 (MLX) ~5 ГБ ~12 ГБ омлкс

Эмпирическое правило памяти: размер модели + КВ-кэш. Модель 9B Q4 занимает ~5 ГБ. КВ-кэш при девяти 128К с квантованием Q4 добавил ~4-5 ГБ. В стандартном (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
```<div class="admonition admonition-tip"><p class="admonition-title">💡 Tip</p> Модели с ограниченным доступом
Некоторые модели «Обнимающее лицо» требуют аутентификации. Если вы получили ошибку 401 или 404, сначала выполните `huggingface-cli login`.</div>
### Запуск сервера
```bash
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

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

Флаг Назначение
-нгл 99 Выгрузить все слои на GPU (Metal). Используйте большое число, чтобы ничего не оставалось на процессоре.
-c 131072 Размер контекста окна (128 тыс. токенов). Уменьшите, если не хватает памяти.
-np 1 Количество параллельных слотов. Оставьте 1 для одного пользователя — большее количество слотов разделяет бюджетную память.
-фа включен Вспышка внимания. Уменьшает использование памяти и делает выводы из длительного контекста.
--cache-type-k q4_0 Квантовать кэш-ключи до 4 бит. Это главный экономитель памяти.
--cache-type-v q4_0 Квантовать кэш результатов до 4 бит. Вместе с вкладом памяти КВ-кэша примерно на 75% по сравнению с f16.
--хост 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:

Тип КВ-кэша Память КВ-кэша (контекст 128K, модель 9B)
f16 (по умолчанию) ~16 ГБ
q8_0 ~8 ГБ
q4_0 ~4 ГБ

На Mac с 8 ГБ используйте KV-кэш q4_0 и уменьшите контекст до -c 32768 (32K). На 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 по умолчанию. Запустите обслуживание из интерфейса приложения или через CLI, если доступно.

Проверка

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

Список доступных моделей

Omlx может обслуживать несколько моделей одновременно:

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

Бенчмарки: llama.cpp против MLX

Оба бэкенда протестированы на одной машине (Apple M5 Max, 128 ГБ унифицированной памяти) с одной и той же моделью (Qwen3.5-9B) на прогрессивных уровнях квантования (Q4_K_M для GGUF, mxfp4 для MLX). Пять различных запросов, при запуске каждого, резервные копии тестировались последовательно, чтобы избежать конкуренции за ресурсы.

Результаты

Метрика llama.cpp (Q4_K_M) MLX (mxfp4) Победитель
TTFT (среднее) 67 мс 289 мс llama.cpp (в 4,3 раза быстрее)
ТТФТ (стр.50) 66 мс 286 мс llama.cpp (в 4,3 раза быстрее)
Генерация (среднее) 70 ток/с 96 ток/с MLX (на 37% быстрее)
Генерация (стр.50) 70 ток/с 96 ток/с MLX (на 37% быстрее)
Общее время (512 токенов) 7,3 с 5,5 с MLX (на 25% быстрее)

Что это значит

Какой выбрать?

Сценарий использования Рекомендация
Интерактивный чат, инструменты с низкой задержкой лама.cpp
Длинная генерация, пакетная обработка MLX (omlx)
Ограниченная память (8-16 ГБ) llama.cpp (квантованный КВ-кэш не имеет актуальности)
Обслуживание нескольких моделей одновременно omlx (встроенная поддержка нескольких моделей)
Максимальная совместимость (включая Linux) лама.cpp

Подключение к Гермесу

После запуска локального сервера:

hermes model

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


Тайм-ауты

Hermes автоматически определяет локальные конечные точки (локальный хост, IP-адрес локальной сети) и сокращает тайм-ауты стриминга. Для большинства конфигураций настройка не требуется.

Если вы всё же сталкиваетесь с ошибками тайм-аута (например, очень большие контексты на медленном оборудовании), вы можете переопределить тайм-аут чтения стримы:

# В вашем.env — увеличьте со 120 с по умолчанию до 30 минут
HERMES_STREAM_READ_TIMEOUT=1800
Тайм-аут По умолчанию Локальная автонастройка Переопределение через переменное окружение
Чтение стрима (уровень сокета) 120 с Увеличивается до 1800 с HERMES_STREAM_READ_TIMEOUT
Наружное освещение 180 с Полностью отключается HERMES_STREAM_STALE_TIMEOUT
Вызов API (не стриминг) 1800 с Изменения не требуются HERMES_API_TIMEOUT

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