oMLX — LLM-инференс на Mac с continuous batching и SSD-кэшем KV-блоков

· 2 мин чтения
llm inference local-first apple-silicon model-serving
📂 Исходный код на GitHub

Сервер LLM-инференса с continuous batching и SSD-кэшированием для Apple Silicon, управляемый из строки меню macOS. Поддерживает текстовые LLM, VLM, OCR-, embedding- и reranker-модели, совместим с OpenAI/Anthropic API.

oMLX — LLM-инференс на Mac с continuous batching и SSD-кэшем KV-блоков

oMLX — open-source сервер LLM-инференса, оптимизированный специально для Mac на Apple Silicon. Проект вырос из vllm-mlx v0.1.0 и заметно эволюционировал: мульти-модельное обслуживание, двухуровневый KV-кэш, VLM с полной поддержкой paged cache, админ-панель и нативное приложение в строке меню. Требуется macOS 15.0+ (Sequoia), Python 3.11–3.13 и Apple Silicon (M1–M5). Лицензия — Apache 2.0, больше 21 тысячи звёзд на GitHub.

Автор пишет, что его не устраивало выбирать между удобством и контролем в существующих LLM-серверах: он хотел закреплять повседневные модели в памяти, автоматически подгружать тяжёлые по требованию, задавать лимиты контекста — и управлять всем этим из строки меню. oMLX решает эти задачи и делает локальные LLM практичными для реальной работы с кодом в связке с Claude Code, OpenCode, Codex и другими агентами.

Ключевая идея: двухуровневый KV-кэш

Главная особенность oMLX — tiered KV cache, split across два уровня:

  • Hot tier (RAM) — часто используемые блоки KV-кэша остаются в памяти для быстрого доступа.
  • Cold tier (SSD) — когда горячий кэш переполняется, блоки выгружаются на SSD в формате safetensors. При следующем запросе с совпадающим префиксом они восстанавливаются с диска вместо пересчёта с нуля — даже после перезапуска сервера.

Управление кэшем блочное, по мотивам vLLM: prefix sharing и Copy-on-Write. Даже если контекст меняется посреди разговора, весь прошлый контекст остаётся закэшированным и переиспользуется между запросами. Именно это делает локальные модели пригодными для агентной работы, где каждый шаг тянет за собой длинную историю.

Установка

Три варианта на выбор.

macOS-приложение — скачайте .dmg со страницы Releases, перетащите в Applications. Встроенное автообновление, плюс лёгкий CLI-шим ~/.omlx/bin/omlx, чтобы терминал и Apple Shortcuts могли управлять сервером.

Homebrew:

brew tap jundot/omlx https://github.com/jundot/omlx
brew install jundot/omlx/omlx

# Run as a background service (auto-restarts on crash)
omlx start

# Optional: MCP (Model Context Protocol) support
/opt/homebrew/opt/omlx/libexec/bin/pip install mcp

Из исходников:

git clone https://github.com/jundot/omlx.git
cd omlx
pip install -e .          # Core only
pip install -e ".[mcp]"   # With MCP support

# Native custom kernels for GLM-5.2 / MiniMax M3 / Qwen3.5
OMLX_WITH_CUSTOM_KERNEL=1 pip install -e .

Важно про нативные ядра: обычный pip install -e . их не собирает, и затронутые семейства моделей молча падают на медленные generic-пути. Для GLM-5.2 fused DSA prefill с ядрами примерно в 30 раз быстрее — 845 против ~29 ток/с на M3 Ultra (замер автора), а fallback ещё и ест больше памяти. Сборка требует полного Xcode с Metal toolchain; официальный DMG поставляет ядра прекомпилированными. Проверить установку можно так:

python -c "from omlx.custom_kernels import native_kernel_status; print(native_kernel_status())"

Быстрый старт

# Managed background server
omlx start
omlx stop
omlx restart

# Foreground server attached to this terminal
omlx serve --model-dir ~/models

Сервер автоматически находит LLM, VLM, embedding-модели и реранкеры в подкаталогах. Любой OpenAI-совместимый клиент подключается к http://localhost:8000/v1, встроенный чат доступен на http://localhost:8000/admin/chat.

Возможности

Admin Dashboard. Веб-интерфейс на /admin: мониторинг в реальном времени, управление моделями, чат, бенчмарки и настройки per-model. Интерфейс переведён на восемь языков, включая русский; все CDN-зависимости вендорены — панель полностью работает офлайн.

Мульти-модельное обслуживание. LLM, VLM, embedding и reranker живут в одном сервере. Моделями управляют автоматика и ручные инструменты: LRU-вытеснение при нехватке памяти, ручная загрузка/выгрузка из админки, закрепление (pinning) часто используемых моделей, TTL автовыгрузки по простою и общий лимит памяти процесса (по умолчанию RAM минус 8 ГБ) для защиты от OOM.

Vision- и OCR-модели. VLM работают на том же стеке continuous batching и tiered KV-кэша, что и текстовые LLM: мульти-картиночный чат, ввод изображений через base64/URL/файл, tool calling с визуальным контекстом. OCR-модели (DeepSeek-OCR, DOTS-OCR, GLM-OCR) определяются автоматически.

Оптимизация под Claude Code. Context scaling позволяет запускать модели с меньшим контекстом в Claude Code: счётчики токенов масштабируются так, чтобы auto-compact срабатывал в правильный момент, а SSE keep-alive предотвращает таймауты чтения при длинном prefill.

Интеграции в один клик. OpenClaw, OpenCode, Codex, Hermes Agent, Copilot и Pi настраиваются прямо из админ-панели — без ручного редактирования конфигов.

Экспериментальный multi-Mac инференс. В сборках из исходников одну модель можно разложить по двум Mac с разной памятью через MLX pipeline ranks поверх Ring или Thunderbolt RDMA/JACCL. Кластерный дашборд берёт на себя обнаружение пиров, верификацию SSH, планирование неравных шардов и живую карту производительности.

API и tool calling

oMLX — drop-in замена OpenAI и Anthropic API:

Endpoint Описание
POST /v1/chat/completions Чат-комплишены (стриминг)
POST /v1/completions Текстовые комплишены (стриминг)
POST /v1/messages Anthropic Messages API
POST /v1/embeddings Текстовые эмбеддинги
POST /v1/rerank Реранкинг документов
GET /v1/models Список моделей

Поддерживаются стриминговая статистика usage, adaptive thinking Anthropic, визуальный ввод, JSON schema validation и MCP-инструменты. Автоопределение tool calling работает для десятка семейств: Llama, Qwen, DeepSeek, Gemma, GLM, MiniMax, Mistral, Kimi K2 и других — на основе встроенных парсеров mlx-lm.

Модели и настройка

Укажите --model-dir на каталог с MLX-моделями — типы определяются автоматически:

~/models/
├── Step-3.5-Flash-8bit/
├── Qwen3-Coder-Next-8bit/
├── gpt-oss-120b-MXFP4-Q8/
├── Qwen3.5-122B-A10B-4bit/
└── bge-m3/

Полезные флаги omlx serve:

omlx serve --model-dir ~/models --paged-ssd-cache-dir ~/.omlx/cache  # SSD cache
omlx serve --model-dir ~/models --hot-cache-max-size 20%             # Hot cache size
omlx serve --model-dir ~/models --max-concurrent-requests 16         # Concurrency
omlx serve --model-dir ~/models --memory-guard safe                  # Memory guard tier
omlx serve --model-dir ~/models --api-key your-secret-key            # Auth

Все настройки дублируются в веб-панели и сохраняются в ~/.omlx/settings.json. Отдельно стоит упомянуть профили: набор per-model настроек можно сохранить под именем и выставить как отдельную модель вида qwen3-8b:thinking — она работает на том же движке, что и базовая, без дополнительной памяти и перезагрузки.

Кому это интересно

oMLX подойдёт разработчикам, которые держат локальные модели на Mac и хотят выжать из них максимум: агентный кодинг с Claude Code или OpenCode на локальной модели, обработка длинных контекстов без пересчёта prefill, обслуживание нескольких моделей одновременно — и всё это под управлением нативного SwiftUI-приложения из строки меню, без Electron.

Источник: https://github.com/jundot/omlx