Inco выпустила Splash, новый движок для локальных языковых моделей на Mac. На коротких запросах в тесте разработчиков Qwen3.8-27B генерирует примерно вдвое быстрее oMLX и втрое быстрее Ollama на одном и том же железе.
У меня под рукой Mac mini M4 Pro с 64 ГБ памяти и уже скачанная 27B в Ollama. Решил проверить эти обещания на одинаковых заданиях.
Что делает Splash
Splash подгоняет вычислительные ядра под конкретную модель и GPU Apple. Маленькая draft-модель предлагает несколько токенов сразу, большая проверяет их пакетом. Это speculative decoding. Ещё движок кэширует прочитанный контекст и объединяет запросы в пакеты. Механизм описан в README.
Qwen3.8-27B, M5 Pro / 48 ГБ, medium, лимит 1024 токена.
График доступен с JavaScript. Исходные числа ниже.
Источник: тест Inco. Токенов в секунду, после чтения входа.
Посмотреть исходные числа
| Движок | 8K | 16K | 32K |
|---|---|---|---|
| Splash | 55 | 55 | 54 |
| oMLX | 33 | 29 | 28 |
| Ollama | 21 | 21 | 19 |
| uzu | 18 | 17 | 15 |
У Inco скорость почти не меняется между 8K и 32K. Это генерация после чтения входа; само чтение в неё не входит.
Проверка на моём Mac mini
Решил приблизить тест к методике Inco: отправил в оба движка одинаковые задания с одинаковым контекстом и лимитом ответа. Взял задачи с кодом из SPEED-Bench, включил reasoning medium и поставил лимит 1024 токена вместе с reasoning.
Тестирование на большом контексте
В агентных задачах история быстро растёт. Поэтому проверил 8K, 16K и 32K, как у Inco, и дополнительно 128K. На первых трёх размерах по три разных задания, на 128K один расширенный промпт и три генерации. Сравнил скорость после чтения входа.
M4 Pro / 64 ГБ, medium, лимит 1024 токена. Пакеты с разным квантованием.
График доступен с JavaScript. Исходные числа ниже.
Посмотреть исходные числа
| Контекст | Движок | Ток/с | Диапазон ток/с | Вход, токены | Выход, токены | Первый токен, с | Запросов |
|---|---|---|---|---|---|---|---|
| 8K | Ollama | 22,02 | 20,92–23,13 | 8161–8197 | 1024 | 88,86 | 3 |
| 8K | Splash | 36,79 | 32,79–40,29 | 8197–8201 | 1024 | 85,29 | 3 |
| 16K | Ollama | 21,02 | 18,97–22,35 | 16362–16382 | 1024 | 193,79 | 3 |
| 16K | Splash | 35,48 | 33,23–42,01 | 16391–16393 | 1024 | 175,55 | 3 |
| 32K | Ollama | 18,24 | 16,61–18,62 | 32603–32748 | 1024 | 550,30 | 3 |
| 32K | Splash | 31,71 | 25,92–34,11 | 32775–32777 | 557–1024 | 365,99 | 3 |
| 128K | Ollama | 8,92 | 7,86–10,41 | 129571 | 401–1024 | 2272,46 | 3 |
| 128K | Splash | 24,78 | 24,30–24,82 | 129606 | 1024 | 2005,63 | 3 |
Splash генерировал быстрее Ollama: на 67% на 8K, на 69% на 16K, на 74% на 32K.
На 128K Splash генерировал примерно в 2,8 раза быстрее Ollama. Но первого токена на новом входе 128K пришлось ждать около 38 минут у Ollama и 33 минут у Splash. Быстрая генерация начинается после этого ожидания.
Настоящий агент: Pi
Затем подключил Pi 1.0.4 к обоим движкам и дал три последовательных задания в одном Python-проекте: исправить расчёт корзины, обработку возвратов и импорт CSV. Pi получил доступ к файлам, редактору и терминалу. Reasoning medium, бюджет ответа оставил штатным для Pi. Оба варианта выполнили все три задания и прошли все 27 проверок.
Вся цепочка со Splash заняла на 69% меньше времени.
Pi 1.0.4, окно 32K, medium, штатный бюджет ответа. Один прогон на движок.
График доступен с JavaScript. Исходные числа ниже.
Время исправлений: Ollama = 100%. Чем меньше, тем лучше.
Посмотреть исходные числа
| Задание | Ollama, с | Splash, с | Ollama: выполнено | Splash: выполнено | Время Splash |
|---|---|---|---|---|---|
| Корзина | 111,42 | 99,37 | Да | Да | На 11% меньше |
| Возвраты | 310,28 | 110,40 | Да | Да | На 64% меньше |
| Импорт CSV | 686,05 | 129,90 | Да | Да | На 81% меньше |
| Вся цепочка | 1107,76 | 339,66 | Да | Да | На 69% меньше |
Со Splash Pi потратил на исправления меньше времени, чем с Ollama: на 11% для расчёта корзины, на 64% для обработки возвратов и на 81% для импорта CSV. У обоих было по 20 обращений к модели, но Ollama сгенерировала в 2,3 раза больше выходных токенов.
Методика и условия
Mac mini M4 Pro: 12 ядер CPU, 16 GPU, 64 ГБ, macOS 27.0.1. Ollama 0.34.0 с qwen3.8:27b-mlx (NVFP4); Splash 1.2.1 с incoai/Qwen3.8-27B-Splash (affine Q4 + DFlash 2). Разные готовые пакеты, квантование и шаблоны: вклад движка отдельно не выделяется. У Inco M5 Pro / 48 ГБ и своя выборка SPEED-Bench; это близкая методика, не точное воспроизведение.
В HTTP-серии окно 131072 для всех точек, temperature 0, seed 42, medium и 1024 токена вместе с reasoning. На 8K/16K/32K первые три подходящих code_completion-задания из NVIDIA SPEED-Bench, ревизия 454f88454792dfa3ccfd7ef15fff248efde44cd1. Менялся только конечный padding Answer now please. под Qwen-токенизацию. На 128K первое задание 32K расширено тем же padding. Сообщения двух движков совпадают, API-счётчики входа сохранены в таблице, локальные token IDs совпали. MLX не усекал вход.
На 8K/16K/32K три разных холодных запроса. На 128K один холодный и два точных повтора: медиана трёх скоростей, один замер холодного ожидания. Диапазон показывает наблюдения, не доверительный интервал. Объём и скорость генерации зависят от текста ответа; 1024 является потолком, причина завершения и фактический выход сохранены. Решения HTTP-задач отдельно не проверялись.
HTTP-скорость: число completion_tokens за вычетом токенов первого непустого фрагмента, делённое на время от первого до последнего фрагмента. Из числителя убран первый непустой фрагмент. Разбиение потока на фрагменты принадлежит серверу; это наблюдаемая HTTP-скорость. Reasoning включён; показатель точки равен обратной медиане времени на токен. Native-скорости API сохранены отдельно. Процент прироста скорости: 100 × (V_Splash / V_Ollama − 1). Полное время и ожидание первого токена не подменяют скорость генерации.
Движки выполнялись последовательно, с отдельным прогревом без учёта загрузки. На первом 8K проверка счётчика остановила контроллер; ошибка проверки исправлена, завершённый ответ сохранён, продолжение началось с новым прогревом. Приложения и swap ОС не сбрасывались, ABBA нет. Splash: int8 KV, потолок Metal 40G; настройки KV Ollama не выравнивались.
Pi выполнял три задания на изолированном синтетическом Python-проекте через read/bash/edit/write. Medium, окно 32768, штатный бюджет ответа Pi: 16384 для custom model, с автоматическим уменьшением по свободному контексту. Наш код не переопределяет max_tokens. Retries, compaction, cache warming выключены. Начальный payload совпал кроме model ID; дальше истории настоящие и различаются. Тесты неизменяемы, итоговая приёмка независимая, Bash ограничен macOS sandbox. Не более 16 обращений на задание и 900 секунд на этап. По одной траектории; время включает старт Pi, обращения к модели и инструменты, прогрев и внешнюю приёмку исключает. Успех определяется исправленным кодом и неизменяемыми тестами. Обрезанный финальный текст при уже принятом коде отмечается отдельно. Неуспешное задание не получает процент выигрыша.
Pi: у Ollama 20 обращений и 20 выполненных инструментов; у Splash 20 и 21. Выходных токенов, включая reasoning: 13664 у Ollama, 6031 у Splash. Максимум реального входа 24164 и 13588 токенов соответственно. Бюджеты ответа в запросах Pi: 4509–16384 токенов для Ollama, 15072–16384 для Splash.
Для выбранного пакета Splash нужны M3+, macOS 26.4+ и минимум 36 ГБ памяти; рекомендуют 48 ГБ.
Выводы делайте сами.