Needle: дистилляция Gemini в 26M-модель для edge-устройств
Как команда Cactus Compute сжала способность Gemini вызывать инструменты в 26-миллионную модель и запустила её на телефоне и умных часах.
Зачем вызывать инструменты на устройстве — и почему это так сложно
Функция вызова инструментов (tool calling / function calling) — это сердце современных агентных систем. Именно она позволяет языковой модели не просто «поговорить», а реально что-то сделать: проверить погоду, забронировать встречу, управлять умным домом. Большие облачные модели справляются с этим отлично, но каждый запрос — это сетевой round-trip, задержка и расход трафика. А что, если всё это должно работать прямо на телефоне, умных часах или очках?
Именно эту задачу решила команда Cactus Compute, выпустив открытую модель Needle — 26-миллионный параметровый специалист по однократному вызову функций, дистиллированный из Gemini. Проект был опубликован на Hacker News в формате «Show HN» и немедленно вызвал дискуссию: как модель настолько маленькая может конкурировать с монстрами в 270M–350M параметров?
Что такое Needle и как он устроен
Команда Cactus дистиллировала Gemini в 26-миллионный параметровый «Simple Attention Network» — модель, которую можно дообучить прямо на Mac или PC.
Needle — это экспериментальная реализация концепции Simple Attention Networks, нацеленная на переосмысление того, что значит «крошечный ИИ» для потребительских устройств: телефонов, часов, очков.
Архитектура модели радикально отличается от стандартных трансформеров. Вот ключевой принцип:
Cross-attention — правильный примитив для этой задачи, а параметры FFN (feed-forward слоёв) расходуются впустую при таком масштабе.
В Simple Attention Networks вся модель состоит только из attention и gating — без MLP-слоёв вообще.
Архитектурные параметры модели: d=512, 8H/4KV (GQA), BPE-словарь на 8192 токенов. Encoder состоит из 12 слоёв (только self-attention + gating, без FFN), decoder — из 8 слоёв с cross-attention к encoder. Это классическая encoder-decoder схема, но очищенная от всего лишнего.
graph TD
A["Запрос пользователя"] --> B["Encoder x12\n(Self-Attn + GQA + RoPE)"];
C["Список инструментов (JSON)"] --> B;
B --> D["Cross-Attention\n(Decoder x8)"];
D --> E["ZCRMSNorm"];
E --> F["Linear (Tied Embeddings)"];
F --> G["Softmax"];
G --> H["Tool Call Output\n(JSON)"];
Производительность
В продакшене Needle работает на платформе Cactus со скоростью 6000 токенов/сек на prefill и 1200 токенов/сек на decode. Для модели, предназначенной для умных часов, это фантастический результат.
Сравнение с конкурентами
Needle превосходит FunctionGemma-270M, Qwen-0.6B, Granite-350M и LFM2.5-350M в задаче single-shot function calling для персонального ИИ — при этом все эти модели крупнее и обладают более широким набором возможностей, хорошо работая в разговорных сценариях.
Это важная оговорка: Needle — не универсальная языковая модель. Это специализированный инструмент для одной задачи — вызова функций — и именно в ней он бьёт противников, которые крупнее в 10–14 раз.
| Модель | Параметры | Single-shot tool call | Диалог | Устройство |
|---|---|---|---|---|
| Needle | 26M | ✅ Лучший | ❌ Нет | Телефон, часы |
| FunctionGemma | 270M | Хуже | ✅ Да | Смартфон |
| Qwen | 600M | Хуже | ✅ Да | Смартфон/ПК |
| Granite | 350M | Хуже | ✅ Да | Смартфон/ПК |
| LFM2.5 | 350M | Хуже | ✅ Да | Смартфон/ПК |
Как использовать Needle: практическое руководство
Быстрый старт
После клонирования репозитория и запуска setup открывается веб-интерфейс на http://127.0.0.1:7860, где можно тестировать и дообучать модель на своих инструментах. Веса скачиваются автоматически.
git clone https://github.com/cactus-compute/needle.git
cd needle && source ./setup
needle playground
Инференс через Python API
После загрузки чекпоинта можно запустить инференс буквально в несколько строк: передаёте запрос и JSON-список инструментов — получаете обратно JSON с именем функции и аргументами.
from needle import SimpleAttentionNetwork, load_checkpoint, generate, get_tokenizer
params, config = load_checkpoint("checkpoints/needle.pkl")
model = SimpleAttentionNetwork(config)
tokenizer = get_tokenizer()
result = generate(
model,
params,
tokenizer,
query="What's the weather in San Francisco?",
tools='[{"name":"get_weather","parameters":{"location":"string"}}]',
stream=False,
)
print(result)
# [{"name": "get_weather", "arguments": {"location": "San Francisco"}}]
Команды CLI
Needle поставляется с полноценным CLI: needle playground — веб-интерфейс, needle finetune data.jsonl — дообучение на своих данных, needle run — одиночный инференс, needle generate-data — синтез обучающих данных через Gemini.
needle generate-data для автоматической генерации синтетических обучающих примеров через Gemini API. Затем запустите needle playground — в браузере можно дообучить модель на своих инструментах буквально за несколько минут, без написания кода.Архитектурные решения: почему Simple Attention Network?
Ключевой вопрос: почему авторы отказались от стандартной архитектуры трансформера?
Причина проста и элегантна. В задаче однократного вызова функций модели нужно сделать ровно одно: сопоставить намерение пользователя с одним из доступных инструментов и извлечь аргументы. Это задача семантического поиска и структурированного вывода, а не генерации свободного текста.
Feed-forward слои в трансформерах хранят «фактические знания» о мире — именно они занимают большую часть параметров LLM. Но для вызова функций эти знания не нужны. Нужно только умение сопоставлять структуры. Поэтому:
- Encoder обрабатывает описания инструментов через self-attention (GQA + RoPE) — без FFN
- Decoder читает запрос пользователя и через cross-attention к encoder находит нужный инструмент
- Tied embeddings — матрица эмбеддингов используется как для входа, так и для выхода, экономя параметры
- ZCRMSNorm вместо LayerNorm — более стабильная нормализация без смещения
Место Needle в экосистеме edge AI
Tool calling — это ядро агентных систем. Существует потребность в динамическом комбинировании edge-вычислений и облачных моделей (таких как Gemini Flash), чтобы получить лучшее из обоих миров.
Cactus Compute развивает именно этот подход — гибридный AI: простые, повторяющиеся вызовы инструментов обрабатываются на устройстве (Needle), сложные рассуждения уходят в облако (Gemini). Cactus работает локально на edge-устройствах с гибридной маршрутизацией сложных задач к облачным моделям, таким как Gemini.
Эта стратегия даёт:
- Конфиденциальность: личные данные не покидают устройство
- Скорость: никакой сетевой задержки для рутинных действий
- Офлайн-работу: агент функционирует даже без интернета
- Экономию: дорогие облачные запросы только когда реально нужны
Веса модели полностью открыты на Hugging Face (Cactus-Compute/needle), а также опубликован код генерации обучающего датасета.
Заключение
Needle — это не просто ещё одна маленькая языковая модель. Это демонстрация важного принципа: специализация бьёт универсальность при равных ресурсах. Отказавшись от FFN-слоёв, выбросив всё ненужное для конкретной задачи и применив дистилляцию из Gemini, команда Cactus Compute создала модель в 26M параметров, которая обходит конкурентов в 10 раз большего размера.
Для разработчиков, строящих агентные приложения на мобильных устройствах и wearables, Needle открывает новый класс возможностей: полноценный агентный слой прямо на чипе телефона или умных часов, с задержкой в миллисекунды и без зависимости от облака.
Проект полностью открытый, веса доступны, код генерации данных опубликован. Это означает, что любой разработчик может адаптировать Needle под свой набор инструментов — командой в одну строку: needle finetune data.jsonl.
Будущее агентного ИИ — не в том, чтобы запускать GPT-4 на смартфоне. Оно в том, чтобы понять, какие задачи реально требуют мощи GPT-4, а какие решает специализированная 26M-модель быстрее и надёжнее.