oMLX — LLM-инференс на Mac с continuous batching и SSD-кэшем KV-блоков
📂 Исходный код на GitHubСервер LLM-инференса с continuous batching и SSD-кэшированием для Apple Silicon, управляемый из строки меню macOS. Поддерживает текстовые LLM, VLM, OCR-, embedding- и reranker-модели, совместим с OpenAI/Anthropic API.
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