TL;DR

  • Needle 214MB 함수 호출 모델로, Raspberry Pi 5에서 CPU만 사용해 자연어 요청을 로컬 동작으로 바꾸는 모델임.
  • Python 함수에 @needle.tool을 적용하면 함수 이름과 설명, 타입 주석으로 도구 스키마를 만들고 모델이 호출할 함수와 인수를 선택함.
  • 첫 다운로드 뒤에는 클라우드 API나 네트워크 연결 없이 동작하며, LED 제어부터 메모 작성, CPU 온도 조회, 사진 촬영까지 처리함.
  • Raspberry Pi 5에서 LED 켜기 요청은 78ms, 메모 저장은 107ms가 걸렸으며, 파이썬 데모 전체 프로세스 메모리 사용량은 최대 46.4MB임.
  • 지정된 도구로 처리할 수 없는 질문에는 함수 호출을 반환하지 않으며, 모델 가중치와 코드는 Apache 2.0 라이선스로 공개됨.

Raspberry Pi 5에서 텍스트를 동작으로 전환

  • Cactus Compute가 만든 Needle 2는 자연어를 Raspberry Pi의 로컬 동작으로 바꾸는 14MB 함수 호출 모델임.
  • “Turn the LED on”이라고 입력하면 78ms 뒤 Raspberry Pi 5의 LED가 켜지며, 별도의 AI HAT 없이 CPU만 사용함.
  • Needle은 챗봇이 아님. Cactus Compute 팀은 기기를 대상으로 한 안정적이고 구조화된 동작 하나에 집중해 학습시킴.

“Needle 2는 상당히 뛰어남” — Eben Upton, Raspberry Pi CEO

Python 함수로 도구 정의

  • 설정 방식은 Python 함수를 선언한 다음 Needle이 호출할 함수를 선택하고 인수를 채우도록 하는 구조임.
  • CPU만 사용하는 Raspberry Pi 5에서 로컬 메모 작성, vcgencmd 조회, LED 제어 등을 시험함.
  • cactus-needle을 설치하고 최초 다운로드를 마치면 클라우드 API나 네트워크 연결 없이 로컬에서 실행됨. 첫 예제에는 추가 하드웨어가 필요하지 않음.
  • @needle.tool 데코레이터가 적용된 함수의 이름, 독스트링, 타입 주석을 사용해 도구 스키마를 구성함. 예를 들어 save_note의 타입 주석은 text가 문자열이어야 함을 나타냄.
  • save_note는 텍스트 파일에 메모를 덧붙이고 메모 내용과 파일 경로를 반환함.
  • get_temperaturevcgencmd measure_temp를 실행해 Raspberry Pi의 현재 CPU 온도를 섭씨 값으로 반환함.

도구 호출과 실행 결과

  • “쿨러가 작동한다고 메모해”라는 요청에서 Needle은 save_note를 선택하고 text 인수에 the cooler is working을 전달함.
  • run()은 선택된 함수를 실행하고 반환값을 response["results"]에 포함함. 이 예제의 결과는 메모 내용과 needle-notes.txt 경로임.
  • 이 실행에서 run() 내부의 첫 complete()는 함수를 선택하고 인수를 생성하는 데 107ms가 걸림.
  • “이 Raspberry Pi는 얼마나 뜨거워?”라는 요청에는 get_temperature를 인수 없이 호출하며, 예시 결과는 49.9°C임.
  • set_led(on), blink_led(times), take_photo()도 도구로 선언해 선택을 시험함. 사진 촬영 함수는 rpicam-still을 이용함.
  • Needle은 도구를 선택하며, 다음 동작은 일반 Python 코드가 결정함. 이름과 타입 주석, 설명이 명확한 Python 함수라면 같은 방식으로 @needle.tool을 적용할 수 있음.

범위와 성능 측정

  • Needle은 의도적으로 범위를 좁힌 모델임. “프랑스의 수도는?”처럼 제공된 도구로 답할 수 없는 질문에는 92ms 뒤 빈 function_calls를 반환함. 동작 모델이 관련 없는 요청을 거부하는 것이 올바른 응답이라는 설명임.
  • Needle의 기본 세션 메모리 사용량은 약 28MB임. 인터프리터를 포함한 Python 데모 프로세스의 메모리 사용량은 43~46.4MB 범위에서 최고치를 기록함.
  • Raspberry Pi 5의 8GB 모델, Raspberry Pi OS, CPU 전용 환경과 cactus-needle 2.0.7에서 실행한 측정 결과는 다음과 같음.
  • LED 켜기 — set_led, 프리필 488 tok/s, 디코드 296 tok/s, 소요 시간 78ms
  • 온도 조회 — get_temperature, 프리필 487 tok/s, 디코드 303 tok/s, 소요 시간 149ms
  • LED 두 번 깜박이기 — blink_led, 프리필 475 tok/s, 디코드 314 tok/s, 소요 시간 83ms
  • 사진 촬영 — take_photo, 프리필 461 tok/s, 디코드 248 tok/s, 소요 시간 76ms
  • 쿨러 작동 메모 저장 — save_note, 프리필 475 tok/s, 디코드 305 tok/s, 소요 시간 107ms
  • 프랑스 수도 질문 — 호출 없음, 프리필 470 tok/s, 디코드 297 tok/s, 소요 시간 92ms
  • 프리필과 디코드 수치는 Needle 세션 카운터임. 소요 시간은 선택한 Python 함수가 실행되기 전, 한 번의 complete() 호출에 걸린 벽시계 시간임.

기존 Python 함수와 공개 자료

  • GPIO Zero 함수를 이미 사용한다면 데코레이터를 적용해 Needle에 전달할 수 있으며, 다른 애플리케이션 로직에도 같은 방식을 적용할 수 있음.
  • 특정 도구 모음에 맞춘 Needle 미세 조정은 노트북에서 로컬로 수행할 수 있음.
  • 가중치와 코드는 다음 저장소에서 확인할 수 있으며, 둘 다 Apache 2.0 라이선스로 공개됨.
  • huggingface.co/Cactus-Compute/needle2
  • github.com/cactus-compute/needle