Needle 2: LLM на 14 МБ выполняет команды на Raspberry Pi 5 без облака и нейроускорителя
Cactus Compute выпустила Needle 2 — модель на 14 МБ для вызова функций, которая превращает обычные фразы в действия на Raspberry Pi 5, работая только на CPU. Команда «Turn the LED on» выполняется за 78 мс, а выбор функции и аргументов занимает около 107 мс. Установка через pip, локальная работа без сети и API, инструменты описываются Python-функциями с декоратором @needle.tool.

Первоисточник: www.raspberrypi.com
Что такое Needle 2 и чем он не является
Cactus Compute представила Needle 2 — компактную модель на 14 МБ для вызова функций. Она превращает обычные фразы в действия на Raspberry Pi 5, работая только на CPU и без выделенного AI HAT. В примере команда «Turn the LED on» включает светодиод за 78 мс.
Needle 2 — не чат-бот. Модель обучена одной задаче: выбирать подходящую функцию из заданного набора и заполнять её аргументы. Она не ведёт диалог и не отвечает на общие вопросы.
Как работает вызов функций через @needle.tool
Инструменты описываются обычными Python-функциями с декоратором @needle.tool. Декоратор использует имя функции, docstring и аннотации типов, чтобы построить схему инструмента. Например, аннотация text: str сообщает Needle, что аргумент text должен быть строкой.
import needle
from pathlib import Path
import subprocess
notes_path = Path("needle-notes.txt")
@needle.tool
def save_note(text: str):
"""Append a note to a local text file."""
with notes_path.open("a", encoding="utf-8") as notes:
notes.write(text + "\n")
return {"text": text, "path": str(notes_path)}
@needle.tool
def get_temperature():
"""Return the current CPU temperature of this Raspberry Pi in Celsius."""
out = subprocess.check_output(["vcgencmd", "measure_temp"], text=True)
return {"temperature_c": float(out.split("=")[1].split("'")[0])}
agent = needle.Needle(tools=[save_note, get_temperature])
response = agent.run("Save a note that says the cooler is working.")Внутри run() модель сначала формирует выбор инструмента и аргументов, затем run() выполняет функцию и включает её возвращаемое значение в response["results"]. В примере с save_note модель вернула вызов с аргументом text: "the cooler is working", а результат содержал путь к файлу needle-notes.txt.
Установка и запуск на Raspberry Pi 5
Установка выполняется через pip в виртуальном окружении. После первой загрузки Needle работает локально, без облачного API и сетевого подключения.
python3 -m venv needle-env
source needle-env/bin/activate
python -m pip install cactus-needleПримеры инструментов: save_note, get_temperature, set_led, blink_led, take_photo
В демонстрации использовались функции save_note (запись заметки), get_temperature (запрос vcgencmd), set_led(on), blink_led(times) и take_photo() через rpicam-still. Needle выбирает инструмент, а логика выполнения остаётся в обычном Python-коде. Если у вас уже есть функции GPIO Zero, их можно декорировать и передать в Needle.
- save_note — добавляет заметку в локальный текстовый файл.
- get_temperature — возвращает текущую температуру CPU Raspberry Pi в градусах Цельсия через vcgencmd.
- set_led(on) — управляет светодиодом.
- blink_led(times) — мигает светодиодом заданное число раз.
- take_photo() — делает снимок через rpicam-still.
Производительность и задержки
Замеры проводились на Raspberry Pi 5 8 ГБ под Raspberry Pi OS, только на CPU, с cactus-needle 2.0.7. Prefill и decode — счётчики сессии Needle. Время в таблице — это wall-clock время одного полного вызова complete() до запуска выбранной Python-функции.
| Запрос | Вызов | Prefill (ток/с) | Decode (ток/с) | Время (мс) |
|---|---|---|---|---|
| Turn the LED on. | set_led | 488 | 296 | 78 |
| How hot is this Raspberry Pi? | get_temperature | 487 | 303 | 149 |
| Blink the LED 2 times. | blink_led | 475 | 314 | 83 |
| Take a photo. | take_photo | 461 | 248 | 76 |
| Save a note that says the cooler is working. | save_note | 475 | 305 | 107 |
| What is the capital of France? | (нет) | 470 | 297 | 92 |
Память и потребление
Нативная сессия Needle занимает около 28 МБ. В этом Python-демо пиковое потребление всего процесса составило от 43 МБ до 46,4 МБ, включая интерпретатор. Это позволяет запускать модель на Raspberry Pi 5 без нейроускорителя.
Отказ от нерелевантных запросов
Needle намеренно узкоспециализирован. На вопрос «What is the capital of France?» модель возвращает пустой список function_calls за 92 мс, потому что ни один из переданных инструментов не может ответить на этот вопрос. Для модели действий отказ от нерелевантного запроса — корректное поведение.
Дообучение и ресурсы
Needle можно дообучить локально на ноутбуке под конкретный набор инструментов. Веса и код доступны на Hugging Face (huggingface.co/Cactus-Compute/needle2) и GitHub (github.com/cactus-compute/needle). Оба проекта выпущены под лицензией Apache 2.0.
Частые ошибки
FAQ
Нужен ли нейроускоритель для Needle 2 на Raspberry Pi 5?
Нет. Needle 2 работает только на CPU, без выделенного AI HAT. В примерах команда «Turn the LED on» выполняется за 78 мс.
Работает ли Needle 2 без интернета?
Да. После первой загрузки модель работает локально, без облачного API и сетевого подключения.
Как описать инструмент для Needle 2?
Обычной Python-функцией с декоратором @needle.tool. Декоратор использует имя функции, docstring и аннотации типов для построения схемы инструмента.
Что делает Needle 2 с нерелевантным запросом?
Возвращает пустой список function_calls. Например, на вопрос «What is the capital of France?» ответ приходит за 92 мс без вызова инструментов.
Источник: Raspberry Pi — Turn text input into actions with Needle