- 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에서 수치가 변경된 지점과 이유를 확인할 수 있음
- 커밋 기록과