Это руководство проведёт вас через запуск локального LLM-сервера на macOS с OpenAI-совместимым API. Вы получаете полную приватность, нулевые затраты на API и удивительно хорошую производительность на Apple Silicon.
Мы рассматриваем два бэкенда:
Бэкенд
Установка
Лучше всего
Формат
llama.cpp
brew install llama.cpp
Самое быстрое время до первого токена, квантованный KV-кэш для малого потребления памяти
Самая быстрая генерация токенов, нативная оптимизация Metal
MLX (safetensors)
Оба предоставляют OpenAI-совместимый эндпоинт /v1/chat/completions. Hermes работает с любым из них — просто укажите http://localhost:8080 или http://localhost:8000.
info Только Apple Silicon
Это руководство предназначено для Mac на Apple Silicon (M1 и новее). Intel Mac будут работать с llama.cpp, но без GPU-ускорения — ожидайте значительно более низкой производительности.
Выбор модели
Для начала мы рекомендуем Qwen3.5-9B — это мощная модель для рассуждений, которая комфортно помещается в 8+ ГБ унифицированной памяти с квантованием.
Вариант
Размер на диске
Требуется ОЗУ (контекст 128K)
Бэкенд
Qwen3.5-9B-Q4_K_M (GGUF)
5.3 GB
~10 GB с квантованным KV-кэшем
llama.cpp
Qwen3.5-9B-mlx-lm-mxfp4 (MLX)
~5 GB
~12 GB
omlx
Эмпирическое правило памяти: размер модели + KV-кэш. Модель 9B Q4 занимает ~5 ГБ. KV-кэш при контексте 128K с Q4-квантованием добавляет ~4-5 ГБ. Со стандартным (f16) KV-кэшем это раздувается до ~16 ГБ. Флаги квантованного KV-кэша в llama.cpp — ключевой трюк для систем с ограниченной памятью.
Для более крупных моделей (27B, 35B) потребуется 32+ ГБ унифицированной памяти. 9B — оптимальный вариант для машин с 8-16 ГБ.
Вариант A: llama.cpp
llama.cpp — это наиболее портативная среда выполнения локальных LLM. На macOS он использует Metal для GPU-ускорения из коробки.
Установка
brewinstallllama.cpp
Это даёт вам команду llama-server глобально.
Загрузка модели
Вам нужна модель в формате GGUF. Проще всего скачать её с Hugging Face через huggingface-cli:
tip Модели с ограниченным доступом
Некоторые модели на Hugging Face требуют аутентификации. Сначала выполните huggingface-cli login, если получаете ошибку 401 или 404.
Флаги --cache-type-k q4_0 --cache-type-v q4_0 — это самая важная оптимизация для систем с ограниченной памятью. Вот влияние при контексте 128K:
Тип KV-кэша
Память KV-кэша (контекст 128K, модель 9B)
f16 (по умолчанию)
~16 GB
q8_0
~8 GB
q4_0
~4 GB
На Mac с 8 ГБ используйте KV-кэш q4_0 и уменьшите контекст до -c 32768 (32K). На 16 ГБ можно комфортно использовать контекст 128K. На 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 по умолчанию. Запустите раздачу из интерфейса приложения или используйте CLI, если доступно.
Оба бэкенда протестированы на одной машине (Apple M5 Max, 128 ГБ унифицированной памяти) с одной и той же моделью (Qwen3.5-9B) на сопоставимых уровнях квантования (Q4_K_M для GGUF, mxfp4 для MLX). Пять разнообразных промптов, по три запуска каждый, бэкенды тестировались последовательно во избежание конкуренции за ресурсы.
Результаты
Метрика
llama.cpp (Q4_K_M)
MLX (mxfp4)
Победитель
TTFT (среднее)
67 ms
289 ms
llama.cpp (в 4.3x быстрее)
TTFT (p50)
66 ms
286 ms
llama.cpp (в 4.3x быстрее)
Генерация (среднее)
70 tok/s
96 tok/s
MLX (на 37% быстрее)
Генерация (p50)
70 tok/s
96 tok/s
MLX (на 37% быстрее)
Общее время (512 токенов)
7.3s
5.5s
MLX (на 25% быстрее)
Что это означает
llama.cpp отлично справляется с обработкой промптов — его конвейер flash attention + квантованный KV-кэш выдаёт первый токен за ~66 мс. Если вы создаёте интерактивные приложения, где важна воспринимаемая отзывчивость (чат-боты, автодополнение), это значимое преимущество.
MLX генерирует токены примерно на 37% быстрее после запуска. Для пакетных задач, длительной генерации или любых задач, где общее время выполнения важнее начальной задержки, MLX завершает работу быстрее.
Оба бэкенда чрезвычайно стабильны — разброс между запусками был незначительным. На эти цифры можно полагаться.
Какой выбрать?
Сценарий использования
Рекомендация
Интерактивный чат, инструменты с низкой задержкой
llama.cpp
Длительная генерация, пакетная обработка
MLX (omlx)
Ограниченная память (8-16 ГБ)
llama.cpp (квантованный KV-кэш вне конкуренции)
Одновременная раздача нескольких моделей
omlx (встроенная поддержка нескольких моделей)
Максимальная совместимость (включая Linux)
llama.cpp
Подключение к Hermes
Когда ваш локальный сервер запущен:
hermesmodel
Выберите Custom endpoint и следуйте подсказкам. Будет запрошен базовый URL и имя модели — используйте значения из выбранного вами бэкенда.
Таймауты
Hermes автоматически определяет локальные эндпоинты (localhost, LAN IP) и ослабляет таймауты стриминга. Для большинства настроек не требуется конфигурация.
Если вы всё ещё получаете ошибки таймаута (например, очень большие контексты на медленном железе), вы можете переопределить таймаут чтения стриминга:
# In your .env — raise from the 120s default to 30 minutesHERMES_STREAM_READ_TIMEOUT=1800
Таймаут
По умолчанию
Локальная автокорректировка
Переопределение через переменную окружения
Чтение стрима (уровень сокета)
120 с
Повышен до 1800 с
HERMES_STREAM_READ_TIMEOUT
Обнаружение зависшего стрима
180 с
Полностью отключён
HERMES_STREAM_STALE_TIMEOUT
API-вызов (без стриминга)
1800 с
Изменения не требуются
HERMES_API_TIMEOUT
Таймаут чтения стрима — наиболее вероятная причина проблем. Это дедлайн на уровне сокета для получения следующего фрагмента данных. Во время префилла на больших контекстах локальные модели могут не выдавать вывод в течение нескольких минут, пока обрабатывается промпт. Автоопределение обрабатывает это прозрачно.