1P by GN⁺ | ★ favorite | 댓글 1개
  • ESP32-S3에서 서버 연결 없이 2,890만 매개변수 언어 모델을 구동해 작은 화면에 약 초당 9개 토큰으로 텍스트를 출력함
  • 전체 매개변수 중 2,500만 개를 느린 플래시에 두고 토큰마다 필요한 약 6개 행, 450바이트만 읽는 Per-Layer Embeddings 구조를 사용함
  • 모델은 4비트 기준 14.9MB이며, 512KB SRAM에는 매 토큰에 쓰이는 연산 코어, 8MB PSRAM에는 출력 헤드와 작업 메모리, 16MB 플래시에는 대형 임베딩 테이블을 배치함
  • TinyStories로 훈련해 짧고 단순한 이야기는 대체로 일관되게 생성하지만, 질문 응답·명령 수행·코드 작성·사실 지식에는 적합하지 않음
  • 이전에 유사한 칩에서 실행된 26만 매개변수 모델보다 약 100배 많은 매개변수를 담았으며, 핵심은 생성 품질보다 대형 모델을 작은 칩에 수용하는 메모리 구조에 있음

하드웨어와 실행 성능

  • 8달러인 ESP32-S3 하나에서 모든 처리를 수행하며 서버로 데이터를 보내지 않음
    • 512KB SRAM, 8MB PSRAM, 16MB 플래시를 사용함
    • 전체 속도는 약 9.5 tok/s, 순수 연산 속도는 약 9.7 tok/s임
    • 4비트 모델 크기는 14.9MB임
  • 총 2,890만 매개변수 중 2,500만 개가 플래시 조회 테이블에 저장됨

작은 메모리에 모델을 넣는 방법

  • 일반적으로 모델 전체가 빠른 메모리에서 접근 가능해야 하지만, ESP32-S3의 SRAM은 512KB에 불과해 매우 작은 모델만 수용할 수 있음
  • 대부분의 매개변수가 계산 대상이 아닌 임베딩 테이블에 있다는 점을 이용해 테이블을 플래시에 남겨둠
    • 토큰마다 필요한 약 6개 행, 약 450바이트만 읽음
    • 실제 연산을 담당하는 작은 부분만 빠른 메모리에 유지함
    • 대부분의 모델은 실행 중 로드되지 않고 플래시에서 필요한 부분만 선택됨
  • 메모리 역할은 다음과 같이 나뉨
    • SRAM: 모든 토큰에서 사용하는 연산 코어
    • PSRAM: 출력 헤드와 작업 메모리
    • 플래시: 2,500만 매개변수 테이블

Per-Layer Embeddings 적용

  • Google의 Gemma 3n과 Gemma 4에서 사용한 Per-Layer Embeddings를 휴대전화나 GPU가 아닌 마이크로컨트롤러 메모리 구조에 적용함
  • 프로젝트 제작자가 확인한 범위에서는 이처럼 작은 칩에 해당 방식을 적용한 선례가 없음

모델이 할 수 있는 일과 한계

  • TinyStories의 짧은 합성 이야기를 학습해 단순한 이야기를 생성하고 대체로 일관성을 유지함
  • 질문 응답, 명령 수행, 코드 작성, 사실 지식 제공은 하지 못함
  • 이 한계는 추론을 담당하는 작은 코어에서 비롯되며, 메모리 배치 기법이 추론 능력 자체를 높이지는 않음

코드와 실험 자료

  • firmware/esp32_llm/README.md에 펌웨어, 배선, 플래싱 절차가 있음
  • src/experiments/에 훈련, 제거 실험(ablation), 양자화 코드가 포함됨
  • RESULTS.md에 전체 방법, 제거 실험, 온칩 측정값이 정리돼 있음

기반 프로젝트와 기록

  • TinyStories는 작은 모델도 일관된 글쓰기를 배울 수 있도록 만든 짧은 합성 이야기 데이터셋임
  • Google Gemma의 Per-Layer Embeddings가 대형 모델을 작은 칩에 담는 기반이 됨
  • Andrej Karpathy의 llama2.c는 작은 언어 모델을 훈련해 순수 C로 실행할 수 있다는 접근에 영향을 줌
  • 저장소에는 초기 매개변수 수를 부풀렸던 계산 오류와 수정 과정도 남겨둠
    • 커밋 기록과 RESULTS.md에서 수치가 변경된 지점과 이유를 확인할 수 있음

댓글과 토론

Hacker News 의견들
  • 요즘 5달러짜리 마이크로컨트롤러로 가능한 일이 놀라울 정도임. Milk-V 보드 중 Duo는 최대 256MB 메모리와 1TOPS@INT8 TPU를 갖추고 Linux까지 실행되기에 5개를 구입했음

    • 128비트 벡터 ISA와 32개 레지스터도 빼놓을 수 없음. 최대 64비트 정수·부동소수점을 지원하고 LMUL=8이면 단일 명령으로 1,024비트를 처리하며, 대부분의 연산은 128비트당 3사이클이 걸림
      GCC와 Clang이 xTHeadVector를 완전히 지원하며, C 내장 함수를 사용하면 명령줄 옵션만으로 RVV 1.0과 호환됨. 8비트 요소를 다루는 memcpy(), memset(), memcmp(), strlen(), strcpy(), strcmp() 같은 코드는 상당수가 바이너리 호환됨
      64MB Duo를 샀을 때는 3달러였고 이후 64MB·256MB·512MB 모델이 각각 5·7·10달러였지만, 올해 가격이 상당히 올랐음: https://arace.tech/products/milk-v-duo, https://arace.tech/products/milkv-duo-s
    • 0.5달러 미만 마이크로컨트롤러도 살 수 있지만, 5달러 제품이라도 모델 실행에는 제약이 너무 심해 사실상 쓸모없는 환경으로 보임. 모델 수요로 MCU 품귀가 생기지 않기를 바람
    • 마이크로컨트롤러가 1980년대 하드웨어에 머문 것처럼 어셈블리어나 C만이 유일한 선택이라고 생각할 필요는 없음. 이 정도 장치라면 Xerox PARC 운영체제도 어렵지 않게 실행할 수 있음
      4KB PIC가 최선인 용도도 여전히 있지만, 대부분의 상황에 더 나은 선택지가 없다고 행동해서는 안 됨
    • 이 가격과 성능은 ARM의 독점적 지위가 업계 전체에 얼마나 큰 비용을 부과했는지 실감하게 함
  • 음성·텍스트 변환 모델도 이 크기에 가까워지고 있어, 우리와 대화할 수 있는 소형 기기가 얼마나 가까워졌는지 궁금함. 칫솔이 구강 위생 조언을 하거나 치약 광고까지 하는 세상이 올 수도 있음

    • 구강 위생 조언은 이미 가능함. Philips 고급형 칫솔은 Bluetooth로 연결해 앱에서 피드백을 제공함
      하지만 칫솔 AI용 광고 차단기까지 찾아야 하는 세상은 원하지 않음
  • 레이어별 임베딩 기법을 아주 영리하게 활용했음. 약 2,000만~3,000만 매개변수의 실용적인 TTS 모델도 있으므로, 네트워크에 연결되지 않은 ESP32가 거의 실시간으로 글을 읽어줄 수도 있음

    • MCU마다 모델 레이어 하나씩 맡기는 구성을 시험해보고 싶음. 여러 RP2350을 PIO 전용 회선으로 연결하고 보간기와 이중 곱셈 명령을 조합하는 방식임
      PSRAM, 플래시, SD 카드는 개별 대역폭이 높지 않지만 다수를 동시에 구동하면 상당한 처리율에 도달할 수 있음. 대규모 전용 하드웨어가 전력당 성능에서는 앞서겠지만, 낮은 초기 비용과 점진적 확장성 때문에 이런 구성도 매력적임
  • 마이크로컨트롤러보다 Raspberry Pi 4의 로컬 LLM이 답변에 30초씩 걸리지 않도록 할 현실적인 선택지가 궁금함

  • 초소형 장치에서 LLM을 실행하는 것도 멋지지만, 그보다 이런 가중치를 만들어낸 학습 방식이 더 인상적임

    • 작은 매개변수 영역에서는 벤치마크만 겨냥한 과도한 최적화가 어렵기 때문에 리더보드의 효용이 끝난 것은 아님. 오히려 같은 벤치마크 성능을 내는 더 작은 모델을 찾아내면서, 모델링 단계에서 압축 가능성과 중복을 인식하고 제거하도록 만드는 역할이 남아 있음
  • 좋은 접근 패턴으로 플래시를 활용한다면, CPU에서 훨씬 큰 모델을 실행하는 방식으로 확장할 수 없는지 궁금함

    • 비슷한 시도가 최근 있었음. 일반 데스크톱 CPU, NVMe SSD, 약 25GB RAM으로 GLM-5.2를 실행했지만 속도는 초당 토큰이 아니라 토큰당 최대 20초 수준이었음: https://github.com/JustVugg/colibri
    • ESP32 플래시 대역폭은 내부 SRAM의 약 4분의 1에 불과함. 더 강력한 시스템에서는 이 격차가 훨씬 커지고, 늘어난 연산 성능을 효율적으로 활용하려면 공급해야 할 메모리 대역폭도 크게 증가함
  • ESP32-S3는 상당히 강력해서 현재 Raspberry Pi 4 개발 작업에 사용 중임. USB 포트 두 개 중 하나가 OTG를 지원하므로, 다른 방식이라면 100달러 이상 들 기능도 구현할 수 있음

    • 일부 제약을 감수하면 RP2350으로 약 1달러에 비슷한 구성이 가능함. 최대 속도는 USB Full Speed인 12Mbps이며, 하나는 칩 내장 USB 주변장치를 사용하고 다른 하나는 PIO가 지원하는 GPIO 핀에 연결하면 됨
      현재 tinyusb와 pico-pio-usb로 동작하며, 더 높은 성능을 기대하고 Rust 포팅도 실험 중임
  • 양자화 모델의 정확도가 어느 정도인지 궁금함

  • 이 정도 크기에서 보여주는 성능이 놀라우며, 스레드에 나온 조금 더 강력한 단일 보드 컴퓨터에서는 무엇까지 가능할지 기대됨