약 8달러 가격의 ESP32-S3 마이크로컨트롤러에서 2
약 8달러의 저가형 마이크로컨트롤러에서 2,890만 개의 파라미터를 가진 언어 모델이 서버 연결 없이 텍스트를 생성한다. ESP32-S3(마이크로컨트롤러) 칩 자체에서 모든 연산을 처리하며, 칩에 물리적으로 연결된 소형 화면에 단어를 직접 출력하는 구조다. 텍스트 생성 속도는 초당 약 9개의 토큰으로 작동하며, 서버로 데이터를 보내지 않는 완전한 로컬 환경에서 구동된다.
모델의 학습에는 TinyStories(단순 이야기 데이터셋)가 활용되었다. 이를 통해 짧고 단순한 이야기를 일관성 있게 작성하는 기능을 수행한다. 하지만 모델 내부에서 추론을 담당하는 부분의 크기가 작아 고차원적인 언어 처리 능력은 제한된다.
사용자의 질문에 답변하거나 특정 지시를 이행하는 기능은 작동하지 않는다. 프로그래밍 코드를 작성하거나 객관적인 사실 관계를 파악하는 능력 역시 구현되지 않았다. 이는 추론 영역의 물리적 크기가 작기 때문에 발생하는 모델 구조의 한계다.
기술이 실제로 작동하는 방식
2,890만 개의 파라미터를 보유한 이번 모델은 기존 마이크로컨트롤러 구동 모델보다 규모가 약 100배 크다. 이전 유사 칩에서 구동된 언어 모델의 파라미터가 26만 개였던 점과 대조된다. 26만 개에서 2,890만 개로 파라미터를 늘리면서도 칩에서 구동이 가능하다는 점이 핵심이다. 하드웨어의 물리적 메모리 한계를 극복하고 모델의 체급을 획기적으로 높인 수치다.
Google의 Gemma 모델에서 사용한 Per-Layer Embeddings(레이어별 임베딩, 각 층마다 별도의 임베딩 벡터를 사용하는 방식) 기술을 적용해 모델을 플래시 메모리에 배치했다. 모델 파라미터 대부분을 RAM이 아닌 상대적으로 느린 플래시 메모리에 저장하고, 실제 연산을 수행하는 작은 부분만 빠른 메모리에 유지한다. 이 기술은 모델의 가중치를 효율적으로 분산 배치하여 메모리 병목 현상을 줄이며, 저장 장치의 속도 차이를 고려해 데이터 배치 전략을 최적화했다.
2,500만 개의 행으로 구성된 거대한 테이블을 플래시 메모리에 두고, 각 토큰에 필요한 일부 행만 선택적으로 가져와 사용한다. 이때 토큰 하나당 읽어오는 데이터는 약 450바이트 수준이다. 전체 모델을 RAM에 올리는 대신 필요한 조각만 호출하는 구조를 통해 제한된 자원 내에서 대형 모델을 구동한다.
제한된 SRAM 용량(512KB) 문제를 해결하기 위해 메모리
512KB라는 극도로 적은 SRAM(정적 랜덤 액세스 메모리) 용량은 모델 크기를 결정짓는 결정적인 제약이다. 마이크로컨트롤러는 빠른 메모리가 매우 부족한 하드웨어 구조를 가지며, 일반적으로 모델 전체가 SRAM에서 접근 가능해야 한다는 조건 때문에 모델 크기가 극도로 제한된다. 이를 해결하기 위해 모델의 대부분을 빠른 메모리에 배치하지 않고 관리하는 최적화된 메모리 레이아웃을 적용해 모델 크기의 한계를 극복했다.
순수 C 언어로 작은 언어 모델을 구현하고 구동하는 방식은 Andrej Karpathy의 llama2.c 프로젝트를 통해 가능성이 입증됐다. 이번 시도는 해당 프로젝트의 영향을 받아 아주 작은 칩에서도 언어 모델을 실행할 수 있다는 가능성을 확인했으며, 이를 바탕으로 실제 칩 환경에서 언어 모델을 구동하는 실질적인 구현 단계로 이어졌다.
펌웨어 설정과 배선, 플래싱 단계가 포함된 `firmware/esp32_llm/README.md`와 온칩 측정 결과가 담긴 `RESULTS.md`에서 상세 구현 경로를 확인한다. 모델의 추론 능력은 SRAM에 상주하는 작은 모델 부분에 의해 결정되므로, 메모리 트릭으로 모델 크기를 키워도 복잡한 지식이나 질문 답변, 코드 작성 같은 고차원적 추론 기능은 구현되지 않는다.




