Slotstream запускает 104-гигабайтную Qwen3.8-Flash-Next на Mac с 48 ГБ памяти

Разработчик под ником carloslfu опубликовал на Hacker News проект slotstream, консольную утилиту на Swift без единой строчки Python, которая запускает Qwen3.8-Flash-Next (модель смеси экспертов, MoE, на 125 млрд параметров, 104 ГБ на диске в 4-битном формате) на Mac с недостаточным объёмом оперативной памяти. Идея простая: вместо того чтобы держать все веса в ОЗУ, slotstream подкачивает экспертов модели с SSD в кэш фиксированного размера и сам подбирает размер этого кэша под конкретную машину. Инструмент говорит на тех же API, что Ollama и OpenAI, поэтому существующие клиенты (Open WebUI, OpenAI SDK) работают без переделок; клиент самой Ollama пока подключиться не может, в версии 0.2.0 строгий валидатор отклоняет часть его запросов с пустыми полями, но это уже исправлено в основной ветке и выйдет в следующем релизе.
Для запуска нужны Apple Silicon, macOS 14 и выше и около 110 ГБ свободного места на диске; реалистичный минимум, Mac с 512 ГБ накопителем (упирается именно диск, а не память). Сами веса, 103,8 ГБ в 24 файлах, каждый файл проверяется по sha256-хешу, зашитому в бинарник, а релизы подписаны и проверяются командой gh attestation verify. Скачивание идёт по восьми параллельным TCP-соединениям: полная загрузка по гигабитному каналу дата-центра занимает 16 минут при 112 МБ/с, при 100 Мбит/с, около 2 часов 20 минут, при 25 Мбит/с, около 9 часов; прерванная закачка докачивается с места остановки.
Измерена производительность только на одной реальной машине, Mac с M5 Pro и 48 ГБ памяти: около 12 токенов в секунду на прогретой генерации. Показатели для остальных объёмов памяти в таблице автора, это оценки по кривой с той же машины, а не замеры на реальном железе, и у младших Mac ещё и SSD медленнее. Узкое место, не генерация, а обработка промпта: он весь читается перед первым токеном, поэтому промпт на 8000 токенов ждёт около минуты на 48-гигабайтном Mac и больше трёх минут на 16-гигабайтном; суммарный лимит на промпт и ответ, 32 768 токенов. Внутри одного диалога это дорого лишь один раз: при таргете в 16 ГБ время до первого токена на восьмом по счёту ходе диалога, 6,0 секунды вместо 25,8 секунды при пересчёте с нуля, потому что кэш префикса переиспользуется. Переиспользованное состояние не побитово совпадает с пересчитанным заново, поэтому ответ иногда может отличаться там, где два токена были почти равновероятны; для точной воспроизводимости есть флаг --no-prefix-cache.
Отдельная функция, спекулятивное декодирование (MTP): модель поставляется с «черновой» головой, которая предсказывает не следующий, а через-один токен, и slotstream проверяет несколько таких черновиков за один проход. Доля верных первых черновиков, 86% (измерено). На маленьких кэшах ускорения нет: замер A/B показал множитель ×0,96 (то есть медленнее), поэтому автонастройка включает эту функцию только выше примерно 26 ГБ целевой памяти; ожидаемое ускорение выше этого порога, ×1,5, 1,9, но это арифметическая оценка по доле верных черновиков, а не подтверждённый A/B-тест. Сама черновая голова добавляет 1,6 ГБ к кэшу, поэтому порог автовключения на деле сдвигается до 34,6 ГБ; для неё нужна разовая конвертация, которая скачивает 4,9 ГБ из официального релиза и создаёт файл mtp.safetensors на 1,5 ГБ.
Большая часть байтов модели лежит в двух местах: 68 ГБ подгружаемых экспертов (по 512 на слой, по 10 активных на токен) и 32-гигабайтная n-gram-таблица; плотный «ствол» модели весит всего 3,8 ГБ и держится в памяти постоянно. Автонастройка берёт минимум из трёх пределов, целевого потолка (например, 33 ГБ на тестовой машине), 70% всей RAM и 2 ГБ до предела рабочего набора Metal, и пересчитывает состояние каждые 15 секунд, сжимая кэш под давлением памяти и снова расширяя его, когда давление спадает; вывод модели при этом остаётся побайтово одинаковым при любом размере кэша (жадное декодирование даёт идентичный результат при кэше в 4 ГБ и в 24 ГБ). По замерам автора, в диапазоне от 34 до 84 ГБ целевой памяти скорость генерации и обработки промпта не растёт вовсе, поэтому Mac на 128 ГБ получает от автонастройки тот же план, что и Mac на 48 ГБ. Разработчик объясняет, почему нельзя просто замаппировать файл весов в память (mmap): фреймворк MLX не умеет материализовать часть маппированного тензора, а выбор топ-10 экспертов из 512 на слое требует вычислить их все, из-за этого mmap-путь пытается загрузить около 100 ГБ и падает; на той же 48-гигабайтной машине штатный способ загрузки mlx_lm.load() загнал систему в 48 ГБ подкачки на диск, так и не выдав ни одного токена.
Ограничения версии v0: инструмент умеет запускать ровно одну модель, qwen3.8-flash-next:4bit, и блокировка на пользователя разрешает только один процесс модели одновременно; на macOS 14 и 15 проверен только установщик, а не сама работа движка; неподдерживаемые возможности (инструменты/tools, изображения, вывод по JSON-схеме, логарифмы вероятностей) явно возвращают ошибку 400 вместо тихого игнорирования. Код лицензирован по MIT, веса распространяются под лицензией сообщества Qwen.
Ключевые факты
- slotstream, однобинарная Swift-утилита без Python, которая запускает 125-миллиардную MoE-модель Qwen3.8-Flash-Next (104 ГБ на диске) на Mac с памятью меньше размера модели, подкачивая экспертов с SSD
- Нужны Apple Silicon, macOS 14+, около 110 ГБ свободного диска; реалистичный минимум, Mac с 512-гигабайтным накопителем, хотя измерения делались только на машине с 48 ГБ памяти
- На 48-гигабайтном Mac (M5 Pro) измерена скорость около 12 токенов в секунду на прогретой генерации; показатели для других объёмов памяти, расчётные оценки, а не реальные замеры
- Спекулятивное декодирование (MTP) даёт 86% верных черновых токенов и ожидаемое ускорение ×1,5, 1,9 выше 26 ГБ целевой памяти, но это арифметическая оценка, не подтверждённая A/B-тестом
- В версии 0.2.0 клиент Ollama CLI подключиться не может из-за строгой валидации запросов; исправление уже в основной ветке и выйдет в следующем релизе
Почему это важно
Инференс больших MoE-моделей на потребительском железе обычно упирается в одно требование: веса должны целиком помещаться в оперативную память, иначе система уходит в подкачку и останавливается, как показал провал штатного mlx_lm.load() на той же 48-гигабайтной машине (48 ГБ подкачки без единого токена). slotstream меняет саму модель работы: SSD становится не аварийным резервом, а рабочим уровнем хранения, из которого нужные эксперты читаются по требованию в кэш фиксированного размера. Это конкретный, измеренный на реальном железе способ обойти главное ограничение локального инференса больших моделей без урезания самой модели.
Кому это важно
В первую очередь, разработчикам и энтузиастам с Mac на Apple Silicon, которые хотят запускать крупные открытые модели локально, не покупая старшую конфигурацию со 128+ ГБ памяти. Инструмент говорит на API Ollama и OpenAI, поэтому он полезен и тем, кто уже собрал инструментарий вокруг этих интерфейсов (Open WebUI, OpenAI SDK) и хочет подключить к нему тяжёлую модель без переписывания кода.
Как это применить
Установка, одна команда curl-скрипта, которая кладёт бинарник в ~/.slotstream/bin; для сборки из исходников достаточно инструментов командной строки, Xcode не нужен. Перед скачиванием весов стоит выполнить slotstream doctor, команда покажет план памяти для конкретной машины и хватит ли места на диске; вес модели (103,8 ГБ в 24 файлах) скачивается через восемь параллельных соединений и проверяется по sha256. Дальше, slotstream run для разовых запросов или slotstream serve, поднимающий сервер на порту 11434 с API, совместимым с Ollama и OpenAI SDK, включая потоковую генерацию и CORS.
Можно ли доверять
Проект с открытым кодом под лицензией MIT, релизы собираются в CI и подписываются, любой ассет можно проверить через gh attestation verify, а все 24 файла весов сверяются по хешам, зашитым в бинарник. Есть тестовый набор Tools/verify.sh, сверка происхождения весов, эталонные значения против Python-референса, побайтовое совпадение вывода при разных размерах кэша и живых пересчётах, проверка спекулятивного декодирования и робастности сервера к некорректным запросам. При этом ключевая оговорка честно вынесена автором на видное место: реальным железом измерена только конфигурация с 48 ГБ памяти на одной машине (M5 Pro), все прочие объёмы памяти в таблице, расчётные оценки по той же кривой, а не самостоятельные замеры.
Риски и подводные камни
Версия v0 умеет запускать ровно одну модель, qwen3.8-flash-next:4bit, и держит только один процесс модели на пользователя одновременно, так что это не универсальный движок для любых MoE-моделей. На macOS 14 и 15 протестирован только установщик, а не сама работа рантайма. Клиент Ollama CLI в текущем релизе 0.2.0 подключиться не может из-за расхождения в формате запросов, исправление уже в основной ветке, но ещё не вышло отдельным релизом. Загрузка весов остаётся тяжёлой операцией: на канале 25 Мбит/с она занимает около 9 часов, а младшие по памяти конфигурации Mac, для которых нет реальных замеров, вдобавок обычно имеют более медленные SSD, то есть указанные для них цифры производительности могут оказаться оптимистичнее фактических.