Cactus Compute представила Needle 2 — открытую модель на 45 миллионов параметров и весом всего 14 МБ, предназначенную для вызова функций (tool calling), управления устройствами и структурированного извлечения данных. Модель работает без GPU и NPU, требует не более 28 МБ ОЗУ на сессию и распространяется под лицензией Apache 2.0.

45M
Параметров
800+ ток/с
Prefill на Pi5
500+ ток/с
Decode на Pi5
CQ2-бит
Сжатие
14 МБ
Размер файла
28 МБ
ОЗУ сессии

Ставка разработчиков

Перенос AI на устройства дешевле $200: Edge AI в последнее время ассоциируется с Mac и PC, но реальный edge — это в основном дешёвое железо: свыше 21 миллиарда подключённых IoT-устройств против примерно 1,5 миллиарда персональных компьютеров, а на развивающихся рынках большинство телефонов стоят меньше $200. Если считать бюджетные телефоны, Raspberry Pi, микроконтроллеры, носимые устройства, небольших роботов вроде Reachy Mini и устройства умного дома, то примерно четыре из пяти edge-устройств стоят дешевле $200. Именно на такое железо ориентирован Needle: без GPU, без NPU, с несколькими сотнями МБ ОЗУ.

Вызов функций и управление устройствами: Чтобы включить свет, не нужна flagship-модель. Часы, дом, робот — каждый из них уже предоставляет свои возможности как функции с типизированными параметрами, и единственная сложная часть — сопоставить произвольную фразу с этими функциями: какую функцию вызвать и с какими значениями. В такой формулировке задача не требует ни знаний о мире, ни свободной генерации текста, поэтому 45 миллионов параметров достаточно там, где чат-модели нужны миллиарды. Эта более узкая постановка задачи — исходная ставка, из которой следует всё остальное.

Извлечение и структурированный вывод: Схема данных выступает интерфейсом, и та же формулировка подходит для документов: схема плюс абзац текста возвращают типизированные поля, поле-enum работает как классификатор, поле-массив собирает список за один вызов. Это обеспечивается контрактом, а не соглашением: каждый ответ оформлен как конверт вызова, пустой вызов означает отказ, а байт-уровневая грамматика, скомпилированная из заявленных схем, ограничивает каждый токен. Грамматика берёт на себя синтаксис, поэтому все 45 миллионов параметров модели уходят на выбор функций и привязку аргументов к словам пользователя.

Взаимодействие edge и облака: Ни одна маленькая модель не покрывает все случаи, поэтому Needle честно сообщает об этом, а не угадывает: каждый ответ несёт обученную оценку уверенности, а запросы не по теме возвращают пустой вызов. Выше заданного порога — действие выполняется, ниже — переспрашивает или передаёт запрос в облако. Большинство запросов к устройствам — рутинное управление, поэтому передача в облако остаётся редкой, а стандартный путь остаётся приватным, мгновенным и бесплатным.

Безлоссовое 2-битное квантование: Маленькие модели ломаются при постфактум-квантовании, поэтому в Cactus его не применяют: Needle 2 обучается с учётом Cactus Quants на всех этапах — от предобучения до постобучения, для весов, активаций и KV-кэша одинаково. Развёртываемая 2-битная модель — это та же модель, что и обучалась. Именно так 45 миллионов параметров укладываются в 14 МБ без потерь для батареи.

Совместный дизайн модели и инференса: Каждое архитектурное решение проверялось на целевом железе до того, как получило право на существование в виде параметров, а конечный продукт — это пара «модель + движок», а не просто веса: единый C++-бинарник без зависимостей, который при запуске определяет процессор и выбирает подходящие ядра, при этом модель, токенизатор и компилятор грамматики упакованы внутри. Один артефакт запускается от Cortex-M до x86 и WebAssembly. Ничего не нужно устанавливать и скачивать отдельно.

Файнтюн на своём Mac/PC: У каждого продукта свой набор функций-инструментов, а модель на 45 миллионов параметров достаточно мала, чтобы переобучать её там же, где она работает: репозиторий и Python-пакет позволяют настраивать и тестировать модель на собственном компьютере за минуты-часы. Итог — Needle, которая говорит на языке инструментов конкретного устройства, а не универсальный ассистент.

Использование в продакшене

Needle готова к продакшену для продуктов, которым нужны минимальный объём ОЗУ, низкая задержка, приватность и офлайн-надёжность. Pebble — пионер современной индустрии носимых устройств — использует модель локально в приложении Index 01, превращая голосовые запросы в действия без зависимости от сетевого подключения.

«У Pebble Index Ring нет экрана. Поэтому когда с ним говоришь, действие должно происходить каждый раз, с интернетом или без. Мы запускаем Cactus Needle локально в приложении, а не полагаемся на облако. У модели крошечный размер, и она никогда не подводит по производительности».

Архитектура

Диаграмма архитектуры Simple Attention Network
Рисунок 2. Simple Attention Network. Каждый блок несёт собственное правило обновления. Здесь x̂ — RMS-нормализованное сплющивание четырёх остаточных потоков, H — ортонормальное преобразование Уолша-Адамара (фиксированная матрица, применяемая за время n log n без весов для чтения), (kᵢ, vᵢ) — строки, собранные из хешированных n-грамм таблиц, а P — дважды-стохастическая нормализация логитов маршрутизации A, вычисляемая итерацией Синкхорна; a, b, g и все σ-гейты обучаемы и зависят от входа. Остаточные связи как attention, так и MLP нормализованы по типу sandwich и снабжены гейтами, участки engram срабатывают на двух слоях, а декодирование ограничено байт-уровневой грамматикой, скомпилированной из заявленных схем.

Needle 2 предобучена на собственном корпусе из 115 миллиардов токенов и дообучена на 38 миллиардах токенов с компактными следами рассуждений и тщательно продуманным распределением датасета. Для сравнения масштабов: LFM2.5-230M предобучена на 19 триллионах токенов — это примерно в 120 раз больше суммарного объёма для Needle, и приведённая ниже оценка показывает, что обе модели попеременно выигрывают друг у друга. Каждый компонент архитектуры даёт прирост возможностей без роста нагрузки на память. Hadamard MLP заменяет обычные плотные up-and-down проекции фиксированным преобразованием Уолша и обучаемыми диагоналями, поэтому смешивание каналов, которое в маленькой модели обычно доминирует по числу обращений к весам, обходится почти без параметров. Engram выносит знания о мире из основного стека в хешированные n-грамм таблицы, из которых на каждый токен считывается лишь несколько строк: это почти бесплатная по времени декодирования ёмкость, что критично для устройств, где каждый мегабайт, считанный из флеш-памяти, — это задержка и расход батареи. Многодорожечные остаточные потоки дают 27-слойной сети шириной 512 гибкость маршрутизации гораздо более широкой сети, ценой всего нескольких скалярных произведений на слой вместо увеличения объёма attention или MLP.

Система памяти спроектирована с оглядкой на устройства с фиксированным объёмом ОЗУ. Attention использует скользящее окно на 256 токенов, поэтому KV-кэш ограничен независимо от длительности сессии, а системный промпт и объявления инструментов закреплены как постоянные «якоря», чтобы единственное, что модель для вызова функций не должна забывать — свои инструменты — структурно не могло быть вытеснено из памяти. Сам кэш обучается с помощью QAT, а веса хранятся в формате Cactus Quants со смешанной битностью, в среднем составляющей 2 бита на вес. В результате решения о качестве и решения о развёртывании остаются разделёнными: одна обученная модель адаптируется под ту точность и то окно, которые способно позволить себе целевое устройство.

Скорость движка обеспечивается тем, чего он не вычисляет. Веса никогда полностью не распаковываются в ОЗУ: 2-битные коды расширяются прямо внутри векторных регистров и сливаются в целочисленные скалярные произведения, поэтому резидентная память остаётся размером с блоб, а арифметика на всём пути целочисленная (int8) — для активаций, KV-кэша и таблиц маршрутизации дорожек одинаково. Грамматика — это не просто гарантия корректности, а оптимизация: поскольку сопоставитель знает, какие токены допустимы, ещё до вычисления логитов, движок считает выходные оценки только для токенов-кандидатов, пропуская до 98% проекции словаря на структурных токенах, а на шагах, где вывод уже предопределён, пропуская вычисление целиком. Единый универсальный бинарник при запуске определяет процессор и сам выбирает уровень ядра — SDOT, NEON, AVX2, векторы RISC-V, wasm SIMD или скалярный режим — а пул потоков активно проходит короткие последовательные участки обработки токена вместо ожидания, что само по себе почти вдвое увеличило скорость декодирования. Ни один из этих приёмов не меняет результат: каждый оптимизирован либо точно, либо проверен токен-за-токеном против референсного пути.

В конечном счёте всё сводится к энергопотреблению. На кремнии устройства перемещение байта из флеш-памяти или DRAM стоит на порядки дороже, чем операция умножения-накопления, поэтому важен бюджет FLOPs на токен вместе с байтами на токен. Архитектура снижает первый показатель: обычный трансформер с шириной и глубиной Needle тратит 164 MFLOPs на токен, и даже сжатый до того же числа параметров, что у Needle, тратит 87, потому что каждый его параметр должен быть задействован через matmul. Needle тратит 70, при этом пятая часть параметров хранится как собираемая память, вообще не требующая арифметики. Бинарник снижает второй показатель, как показано в разделе про движок: ничего не пересчитывается заново, арифметика остаётся int8 на всём пути, а грамматика напрямую сокращает вычисления, поэтому декодирование токена читает 14-МБ блоб не более одного раза, а на структурных токенах — заметно меньше. Именно из этого складывается время работы от батареи. Даже на топовом телефоне ассистент, работающий постоянно, живёт в рамках энергетического бюджета; каждый MFLOP — это милливатт-часы, и Needle тратит в 7-85 раз меньше их на токен, чем модели, с которыми сравнивается в бенчмарках.

Вычисления на токен
МодельПараметрыАктивны в matmulMFLOPs / токен
Needle 245M35M70
Трансформер той же формы, плотный MLP82M82M164
Трансформер с подобранными параметрами43M43M87
LFM2.5 230M230M230M460
FunctionGemma 270M270M270M540
Apple FM~3B~3B~6 000
Подсчёт 2 FLOPs на операцию умножения-накопления по параметрам, активным в matmul, с общими эмбеддингами во всех строках; члены attention равны для всех строк при одинаковом контексте и исключены из подсчёта. Разница между двумя столбцами Needle — это engram: 8 миллионов параметров, считываемых через gather-операцию, не требующую арифметики. В базовых моделях каждый параметр считается активным в matmul, что точно для обеих: восемь коротких свёрточных блоков LFM2.5 хранят параметры в плотных gate- и projection-matmul, выполняемых на каждом токене — сами depthwise-свёрточные ядра незначительны — а то, что экономят короткие свёртки, — это зависящий от контекста член attention, уже исключённый для всех строк. Общие эмбеддинги считаются один раз как выходная голова. 540 у FunctionGemma в основном определяется этой головой: 170 из 270 миллионов параметров модели — это таблица эмбеддингов на 262 тысячи токенов.

Ограниченный объём памяти сессии открывает дорогу микроконтроллерам. Поскольку скользящее окно ограничивает состояние, ОЗУ Needle 2 — это детерминированный потолок в 28 МБ, а не кривая, растущая с длиной диалога. Это укладывается в параметры MCU-класса с внешней памятью, например ESP32-P4 с 32 МБ PSRAM, или платы STM32H7 и NXP i.MX RT с SDRAM. Движок компилируется однопоточным для bare metal и поставляется как статическая библиотека для Cortex-M4, M7 и M55.

Оценка результатов

Модель оценивалась на пяти публичных бенчмарках вызова функций: Google Mobile Actions, DroidCall, in-domain и out-of-domain тесты Seal-Tools и BFCL v4 single-turn. Оценка идёт по правилу упорядоченного строгого точного совпадения: строка засчитывается пройденной только если совпадают имена функций, порядок вызовов и каждое значение аргумента. Все показатели Needle 2 измерены сквозным образом через поставляемый C++-движок в продакшн-конфигурации: веса CQ2-бит, поиск инструментов включён, скользящее KV-окно на 256 токенов. Ничего не ослаблялось специально для бенчмарка — цифры отражают именно тот движок, который работает на устройстве, включая вытеснение из окна. Базовые модели запускались из опубликованных чекпоинтов под vLLM с полным контекстом, а Apple FM работала на устройстве.

Сравнение осложняют две асимметрии, которые стоит обозначить прямо. Точность: базовые модели намеренно остаются в f16, поскольку обычное постфактум-квантование до 2 бит разрушает модели, никогда не обучавшиеся под агрессивное сжатие, тогда как Cactus Quants встроено в обучение Needle с самого начала. Этот перекос в пользу базовых моделей. Область применения: Needle обучена конкретно для агентного вызова функций и ничего больше, тогда как каждая базовая модель — это универсальная языковая модель, которая наряду с вызовом инструментов несёт функции чата, генерации текста и знаний о мире. Этот перекос в пользу Needle. Уравнять оба фактора одновременно честным способом не получается, поэтому такой попытки и не делалось. Таблицы отвечают на один узкий вопрос: какая модель правильно выполняет вызовы функций в рамках бюджета устройства. Перекос принят как данность — картина всё равно получается нужная.

Mobile Actions (961 строка)
МодельТочностьТочность имениНепустые1 вызов2 вызова
LFM2.5 230M (f16, vLLM)69.193.098.976.155.0
FunctionGemma 270M (f16, vLLM)64.087.398.973.046.2
Needle 2 (CQ2-bit)63.798.399.471.348.4
Apple FM (на устройстве)57.694.295.564.543.8
Оценочный сплит Google Mobile Actions, упорядоченное строгое точное совпадение; должны совпадать имена функций, порядок вызовов и все аргументы.
Тестовый сплит DroidCall (200 строк)
МодельТочностьТочность имениНепустые1 вызов2 вызова
FunctionGemma 270M (f16, vLLM)17.537.559.522.70.0
Needle 2 (CQ2-bit)17.036.547.522.10.0
LFM2.5 230M (f16, vLLM)11.021.522.514.30.0
Вызовы функций в стиле Android-интентов, упорядоченное строгое точное совпадение; строк с 1 вызовом n=154, с 2 вызовами n=24.
Seal-Tools in-domain (700 строк)
МодельТочностьТочность имени1 вызов2-3 вызова4+ вызовов
Needle 2 (CQ2-bit)32.664.963.021.814.6
LFM2.5 230M (f16, vLLM)26.945.454.517.110.4
FunctionGemma 270M (f16, vLLM)16.356.047.04.52.1
Большие списки кандидатов-инструментов, большинство строк — многовызовные.
Seal-Tools out-of-domain (654 строки)
МодельТочностьТочность имени1 вызов2-3 вызова4+ вызовов
Needle 2 (CQ2-bit)28.758.756.427.115.4
LFM2.5 230M (f16, vLLM)17.035.042.613.79.8
FunctionGemma 270M (f16, vLLM)15.648.950.011.06.3
Целые домены инструментов исключены из обучения — проверка обобщения на новые схемы.

Needle не обучалась для универсального вызова функций: её корпус — это действия потребительских устройств (умный дом, мобильные устройства, носимая электроника, ТВ, автомобиль) плюс структурированное извлечение данных, а универсальные и корпоративные API-поверхности BFCL, включая категории SDK для Java и JavaScript, полностью лежат за пределами этого распределения. Тем не менее модель хорошо обобщается: на простых Python-вызовах она отстаёт менее чем на один пункт от FunctionGemma — модели в шесть раз крупнее, обученной специально для этой задачи, — и сохраняет 93,4% корректно оформленных ответов по всем 3641 строкам. Разрыв концентрируется там, где обучающих данных практически не было: Java, JavaScript и категории с параллельными множественными вызовами.

BFCL v4 single-turn (3641 строка)
КатегорияApple FM
на устройстве
LFM2.5 230M
f16 · vLLM
FunctionGemma 270M
f16 · vLLM
Needle 2
CQ2-bit
Simple73.363.248.140.8
— Python86.885.562.361.2
— Java67.048.038.029.0
— JavaScript66.056.044.032.0
Multiple84.078.560.057.0
Parallel65.064.036.530.0
Parallel multiple52.051.530.522.5
Live simple70.545.033.736.8
Live multiple45.947.825.227.9
Live parallel50.043.818.825.0
Live parallel multiple58.345.825.029.2
Relevance100.068.881.281.2
Irrelevance28.377.772.160.8
Overall61.760.846.142.6
Well-formed rate95.094.2100.093.4
Официальный скорер BFCL v4 single-turn. Overall — невзвешенное среднее по всем 13 исходным категориям.

Изучить Needle 2 можно на Hugging Face, в репозитории на GitHub и в научной статье.