Swiftlet запустил 80B-модель Qwen на Mac при 4,3 ГБ памяти и 35B, на iPhone

На Hacker News опубликовали Show HN про Swiftlet, рантайм на Swift и Metal для семейства гибридных MoE-моделей Qwen3-Next и Qwen3.5/3.6. Его идея: держать в оперативной памяти только небольшое плотное ядро модели (внимание, проекции DeltaNet, роутеры, общие эксперты, эмбеддинги), а разреженные маршрутизируемые эксперты Mixture-of-Experts, которые запрашиваются лишь частично на каждый токен, подгружать с накопителя по требованию. Результат: 80-миллиардная модель Qwen3-Next работает на Mac всего с ~4,3 ГБ оперативной памяти, хотя её контейнер на диске занимает 42 ГБ. 35-миллиардная Qwen3.5/3.6 работает на iPhone 17 при ~2,5 ГБ памяти со скоростью около 1 токена в секунду, по словам авторов, это первый известный им случай, когда модель такого класса заработала нативно на телефоне. У обеих моделей активны лишь около 3 млрд параметров на токен: каждый слой направляет токен к 10 из 512 экспертов у 80B-модели или к 8 из 256 у 35B-модели, из-за этого модели пишут и поддерживают диалог на уровне крупных моделей, но хуже держат в памяти конкретные факты. Плотное ядро в 4-битном формате весит около 1,3 ГБ у 35B-модели и около 2,5 ГБ у 80B-модели. Маршрутизируемые эксперты упакованы блоками фиксированного размера в контейнер формата .qpack, поэтому загрузка одного эксперта, это ровно одно чтение с SSD, без mmap и без забивания страничного кэша. Кэш горячих экспертов с вытеснением по принципу LFU и давности обращения даёт от 43 до 70% попаданий при сопоставимой скорости, размер кэша почти не влияет на производительность, потому что SSD в устройствах Apple хорошо справляются с промахами. Весь прямой проход считается на Metal с шейдерами, компилируемыми на лету, поэтому для сборки не нужен отдельный набор инструментов Metal, а один и тот же код работает и на macOS, и на iOS. 75% слоёв модели используют линейное внимание Gated DeltaNet с рекуррентным состоянием фиксированного размера, из-за чего для этих слоёв KV-кэш не растёт независимо от длины контекста. Swiftlet распространяется в четырёх формах: Swift-пакет SwiftletCore для встраивания в свои приложения (потоковая генерация, кэширование диалога, управление памятью при её нехватке); CLI-утилиты swiftlet chat и swiftlet generate для локального запуска и замеров, а также swiftlet-repack для сборки контейнеров моделей из чекпоинтов MLX, включая потоковую докачку прямо с Hugging Face с возобновлением при обрыве; локальный сервер swiftlet-server с API, совместимым с OpenAI Chat Completions, доступным только на loopback-адресе; и готовое iOS-приложение Priv AI, которое встраивает SwiftletCore как движок. В новой версии Priv AI, которая на момент публикации ещё проходила проверку в App Store, скачивание 35B-модели будет доступно прямо в настройках приложения через раздел Experimental Models; до выхода версии приложение можно собрать из открытых исходников (leonickson1/localLLM). Для работы нужны устройство на Apple Silicon с macOS 14+ или iOS 17+ и свободное место на SSD, 18 ГБ под контейнер 35B-модели или 42 ГБ под 80B. Авторы описывают проверку корректности: каждый слой прямого прохода (рекуррентность Gated DeltaNet, gated GQA-внимание, разреженная маршрутизация MoE) сверен с эталонной реализацией mlx-lm на пофрагментных тестах в формате f32 и в квантованном int4; пошаговая генерация сверена с обработкой всей последовательности целиком; Metal-ядра протестированы против точного CPU-эталона, а быстрый и скалярный варианты GPU-ядер дают идентичные результаты; сами контейнеры моделей побайтово проверяемы против исходных весов, а подгрузка эксперта из кэша или с диска не меняет ответ модели. Часть архитектурных решений, потоковая подгрузка экспертов через pread в ограниченный пул слотов вместо mmap, вытеснение по LFU и давности, упаковка экспертов фиксированным шагом, установка байтов сразу в финальную позицию контейнера, компиляция шейдеров на лету, заимствована с благодарностью у более раннего проекта TurboFieldfare, который доказал этот подход на модели Gemma. При этом собственный код Swiftlet, около 10 тысяч строк на Swift и Metal, написанных с нуля: он поддерживает принципиально другую архитектуру (гибрид Qwen с Gated DeltaNet, gated GQA и высокоразреженным MoE с общим экспертом, тогда как TurboFieldfare работает с классическим плотным трансформером Gemma), включает собственные int4/int8-ядра квантования, CPU-эталон с инфраструктурой тестов, формат контейнера .qpack и его упаковщик с докачкой из Hugging Face, слой чат-сессий и поддержку памяти на iOS. Код Swiftlet распространяется по лицензии Apache 2.0, веса моделей Qwen скачиваются отдельно и распространяются по собственной лицензии (тоже Apache 2.0). Авторы отдельно отмечают, что Swiftlet создавался в сотрудничестве с Claude Code. На момент публикации фокус разработки, скорость ядер: по словам авторов, цикл декодирования сейчас упирается в число вызовов GPU, а не в скорость чтения с диска, то есть запас для ускорения ещё есть. Пост набрал 48 баллов и 18 комментариев на Hacker News примерно через 12 часов после публикации.
Ключевые факты
- Swiftlet, открытый (Apache 2.0) рантайм на Swift и Metal: держит в памяти только плотное ядро модели, а MoE-экспертов подгружает с диска по требованию.
- 80-миллиардная Qwen3-Next работает на Mac при ~4,3 ГБ RAM (контейнер, 42 ГБ на диске); 35-миллиардная Qwen3.5/3.6 работает на iPhone 17 при ~2,5 ГБ RAM со скоростью ~1 токен/с.
- На токен активны лишь около 3 млрд параметров (10 из 512 экспертов у 80B, 8 из 256 у 35B), модели пишут как крупные, но хуже помнят факты, чем полноразмерная плотная модель.
- Кэш горячих экспертов (LFU + давность обращения) даёт 43, 70% попаданий при той же скорости, SSD Apple хорошо переносят промахи мимо кэша.
- Доступ: Swift-пакет SwiftletCore, CLI (swiftlet chat/generate/-repack), локальный сервер с OpenAI-совместимым API и приложение Priv AI для iOS (функция скачивания модели ещё проходит проверку в App Store).
Почему это важно
До сих пор запуск больших MoE-моделей на потребительских устройствах упирался в объём оперативной памяти: чтобы просто загрузить модель, требовалось держать все её веса в RAM целиком. Swiftlet показывает другой путь: в памяти остаётся лишь небольшое плотное ядро модели, блоки внимания, проекции DeltaNet, роутеры, общие эксперты и эмбеддинги, а разреженные маршрутизируемые MoE-эксперты, которые нужны лишь частично на каждый токен, подгружаются с накопителя по требованию. Благодаря этому 80-миллиардная Qwen3-Next умещается всего в ~4,3 ГБ оперативной памяти на Mac, а 35-миллиардная Qwen3.5/3.6, в ~2,5 ГБ на iPhone 17, хотя контейнеры моделей на диске занимают 42 ГБ и 18 ГБ соответственно. Авторы утверждают, что это первый известный им случай, когда модель такого класса заработала нативно на телефоне.
Кому это важно
Разработчикам приложений для iOS и macOS, которые хотят встроить локальный чат-движок без сервера и без отправки данных пользователя наружу; людям, для которых важны приватность и офлайн-работа ИИ; и всем, кто хочет попробовать модель весом в десятки миллиардов параметров на обычном Mac или iPhone без дорогой видеокарты. Swiftlet поставляется и как Swift-пакет для встраивания в свои приложения, и как CLI, и как локальный сервер с OpenAI-совместимым API, то есть подходит и авторам готовых приложений, и тем, кто хочет просто локальный чат для себя.
Как это применить
Исходники и инструкции, в репозитории leonickson1/Swiftlet на GitHub, лицензия Apache 2.0. Нужны устройство на Apple Silicon и macOS 14+ или iOS 17+, а также свободное место на SSD: 18 ГБ под контейнер 35B-модели или 42 ГБ под 80B. Модель скачивается и переупаковывается командой swiftlet-repack прямо с Hugging Face, с докачкой при обрыве соединения; дальше с ней можно общаться через swiftlet chat, генерировать текст через swiftlet generate или поднять локальный сервер swiftlet-server с API, совместимым с OpenAI Chat Completions, к нему подключится любой чат-интерфейс, рассчитанный на OpenAI. Для iPhone готовится отдельное приложение Priv AI: 35B-модель можно будет скачать прямо в настройках через раздел Experimental Models, но на момент публикации эта функция ещё проходила проверку в App Store; до её выхода приложение можно собрать самостоятельно из открытых исходников (leonickson1/localLLM).
Можно ли доверять
Код открыт по лицензии Apache 2.0, а корректность вычислений проверена методично: каждый слой прямого прохода, рекуррентность Gated DeltaNet, gated GQA-внимание, разреженная маршрутизация MoE, сверен с эталонной реализацией mlx-lm на пофрагментных тестах, как в формате f32, так и в квантованном int4; пошаговая генерация сверена с обработкой всей последовательности целиком; Metal-ядра протестированы против точного CPU-эталона, а быстрый и скалярный варианты GPU-ядер дают идентичные результаты; сами контейнеры моделей побайтово проверяемы против исходных весов, а подгрузка эксперта из кэша или с диска не меняет ответ модели. При этом проект, свежий Show HN (48 баллов и 18 комментариев на момент публикации), не проходил внешнего рецензирования, а часть архитектурных решений заимствована с благодарностью у более раннего проекта TurboFieldfare, доказавшего похожий подход на модели Gemma; собственный код Swiftlet под другую архитектуру, около 10 тысяч строк на Swift и Metal, написанных с нуля. Авторы отдельно отмечают, что проект создавался в сотрудничестве с Claude Code.
Риски и подводные камни
Скорость на iPhone пока низкая, около 1 токена в секунду для 35B-модели, и сами авторы говорят, что цикл декодирования сейчас упирается в число вызовов GPU, а не в скорость чтения с диска, то есть заметный резерв для ускорения ещё предстоит реализовать. Активны лишь около 3 млрд параметров на токен, из-за этого модели бегло пишут и поддерживают диалог на уровне крупных моделей, но хуже держат в памяти конкретные факты, чем полноразмерная плотная модель того же класса. Контейнер 80B-модели весит 42 ГБ на диске, ощутимо для памяти телефона или ноутбука. Скачивание модели прямо в приложении Priv AI ещё не вышло официально (версия проходила проверку в App Store), так что часть описанного пока доступна только через сборку из исходников. И главное: Swiftlet, это движок для уже существующих моделей Qwen, а не новая модель; он ничего не меняет в качестве ответов, только в том, где и как хранятся веса.
«Насколько нам известно, это первый случай, когда модель такого класса заработала нативно на телефоне.»
— команда Swiftlet, Show HN на Hacker News