- Дата публикации
SwiftLM: TurboQuant-сжатие KV-кэша и стриминг MoE с SSD на MacBook Pro с M5 Pro
Что появилось / что изменилось
SwiftLM — это нативный Swift-сервер для инференса, который запускает MLX‑модели на Apple Silicon и полностью копирует API OpenAI (/v1/chat/completions, стриминг и т.п.). Без Python, без GIL, один скомпилированный бинарник под macOS.
Главные новшества:
- Полная нативная работа на Apple Silicon: расчёты идут через Metal и Swift, без промежуточных прослоек.
- Совместимость с OpenAI‑SDK: можно подменить эндпоинты в уже готовом коде и слать запросы так же, как к GPT‑4o.
- Прямое чтение моделей в формате Hugging Face: SwiftLM сам парсит Safetensors, без конвертации.
- TurboQuantization для KV‑кэша: гибрид TurboQuant V2+V3 с онлайновым сжатием KV‑кэша примерно до 3,6 бита на координату. Это даёт около 3,5× экономии памяти по сравнению с FP16 при почти нулевой потере точности.
- SSD Expert Streaming для MoE: экспериментальный нулевой копирующий стриминг, который подгружает слои Mixture of Experts напрямую с NVMe‑SSD в GPU‑командный буфер. Это снижает нагрузку на Unified Memory и помогает избегать kernel panic от Watchdog на моделях 122B+ параметров.
- Гранулярный контроль памяти: параметр
--gpu-layersдля разбиения слоёв между GPU и RAM плюс автоматическая калибровка (Wisdom Auto‑Calibration), чтобы втиснуть большие модели в доступную память. - Тесты на MacBook Pro с M5 Pro: 64 ГБ Unified Memory, внутренняя NVMe‑SSD, модель Qwen3.5‑122B‑A10B‑4bit. Цель — стабильный запуск таких MoE‑моделей через SSD‑стриминг.
- Строгий порог по квантованию для продакшена: авторы прямо говорят, что для MoE‑моделей 4‑битное квантование — рабочий стандарт. При 2‑битном квантовании JSON‑ответы регулярно ломаются (например,
ame\вместо"name"), что убивает совместимость с OpenAI‑стилем tool calling. - Приложение SwiftLM Chat для iOS: нативный клиент для iPhone и iPad, который скачивает MLX‑модели с Hugging Face и гоняет инференс на устройстве.
В iOS‑приложении есть:
- вкладки Chat · Models · Settings;
- показ скорости скачивания и кольцевой прогресс‑бар;
- каталог моделей (Qwen3, Phi‑3.5, Mistral, Llama) с оценкой, влезет ли модель в RAM устройства;
- поиск по Hugging Face среди моделей mlx‑community;
- разные состояния интерфейса под загрузку, запуск и простой;
- учёт жизненного цикла iOS, чтобы приложение не падало при сворачивании.
Как это работает
SwiftLM строится вокруг двух вещей: TurboQuant‑сжатия KV‑кэша и стриминга MoE‑слоёв с SSD.
TurboQuant для KV‑кэша
Разработчики взяли две реализации TurboQuant:
- V2 — быстрая, аппаратно ускоренная, но с линейным квантованием, которое заметно портит качество при 3 битах.
- V3 — «бумажная» реализация из статьи Google с нелинейными кодбуками Lloyd‑Max. Она даёт высокое качество, но тормозит из-за софтовой деквантовки.
В SwiftLM код V3‑кодбуков перенесли в нативный C++‑энкодер, а деквантовку собрали в Metal‑шейдерах (bggml-metal). В итоге V3‑качество работает на V2‑скорости и не зависит от Python.
Сами кэши устроены так:
K‑кэш (ключи) — 3‑битное PolarQuant + 1‑битный QJL, всего 4,25 бита на измерение:
- Считают L2‑норму вектора и нормализуют: x̂ = x / ‖x‖.
- Применяют быстрое преобразование Уолша–Адамара (WHT), чтобы размазать выбросы по координатам.
- Квантуют каждую координату в 3‑битные нелинейные центроиды Lloyd‑Max.
- Считают остаточную ошибку между исходным и квантованным вектором.
- Прогоняют остаток через случайную матрицу Джонсона–Линденштраусса (QJL) и сохраняют только 1‑битные знаки.
QJL здесь работает как регуляризатор: он не даёт потере разрешения центроидов слишком сильно портить скалярные произведения в внимании.
V‑кэш (значения) — только 3‑битный PolarQuant, 3,125 бита на измерение. Эти матрицы не участвуют в вычислении скалярных произведений, поэтому QJL там не нужен. Его отключили и сэкономили ещё около 25% памяти без заметной потери качества.
SSD Expert Streaming
Для Mixture of Experts SwiftLM использует «нулевой копирующий» стриминг: нужные эксперты подгружаются напрямую с NVMe‑SSD во внутренние структуры GPU‑команд. Слои не пролетают через лишние копии в Unified Memory, что снижает риск kernel panic от Watchdog на огромных моделях вроде Qwen3.5‑122B‑A10B‑4bit.
Дополнительно можно управлять, сколько слоёв живёт на GPU (--gpu-layers), а автоматическая калибровка подбирает конфигурацию под конкретную машину.
Что это значит для вас
Если вы разрабатываете продукты под macOS и iOS и хотите запускать крупные языковые модели локально, SwiftLM закрывает сразу несколько задач:
- Бэкенд для своих LLM‑сервисов на Mac. Можно поднять локальный сервер с MLX‑моделью и общаться с ним через тот же API, что и с GPT‑4o. Подойдёт для внутренних ассистентов, прототипов и офлайн‑сценариев.
- Эксперименты с тяжёлыми MoE‑моделями. На MacBook Pro с M5 Pro и 64 ГБ памяти можно запускать 4‑битную Qwen3.5‑122B‑A10B через SSD‑стриминг, не покупая отдельный сервер с A100.
- Экономия памяти без сильного удара по качеству. TurboQuant сжимает KV‑кэш примерно в 3,5 раза относительно FP16. Это особенно полезно при длинных диалогах и больших контекстах.
- iOS‑клиент для онлайновых и офлайновых сценариев. SwiftLM Chat даёт быстрый способ тестировать MLX‑модели прямо на iPhone или iPad, без удалённого сервера.
Когда лучше не использовать:
- Если вам нужна максимальная совместимость с экосистемой OpenAI, включая сложный tool calling и строгий JSON, не стоит уходить ниже 4‑битного квантования. Авторы прямо пишут, что 2‑битные настройки ломают JSON‑грамматики.
- Если у вас нет Mac на Apple Silicon с достаточным объёмом Unified Memory и быстрой NVMe‑SSD, SSD‑стриминг и TurboQuant не раскроются.
Про доступность в России разработчики ничего не говорят. SwiftLM и iOS‑приложение завязаны на Hugging Face, поэтому иногда может понадобиться VPN — это зависит от вашего провайдера и политики к облачным сервисам.
Место на рынке
SwiftLM занимает нишу нативного инференса на Apple Silicon с OpenAI‑совместимым API и опорой на MLX. В отличие от Python‑стека с PyTorch или vLLM, здесь вся цепочка — Swift + Metal + MLX, без отдельного Python‑рантайма и GIL.
По сравнению с запуском GPT‑4o или Claude 3.5 в облаке, SwiftLM даёт контроль над железом и стоимостью: вы платите за Mac и электричество, а не за токены. Зато берёте на себя настройку квантования, выбор моделей и мониторинг стабильности (особенно с MoE и SSD‑стримингом).
С Llama.cpp и похожими проектами SwiftLM конкурирует за локальный инференс, но делает ставку на глубокую интеграцию с MLX и Apple Silicon, TurboQuant‑сжатие KV‑кэша и прямой стриминг MoE‑слоёв с NVMe. Конкретных сравнительных бенчмарков по скорости или цене токена авторы не приводят, поэтому оценивать придётся на своей машине.