손바닥 크기의 마이크로컨트롤러 개발 보드가 게임 엔진과 외부 서버 없이 독립적으로 작동합니다. 칩 내부에서 물리 세계의 인과관계를 스스로 연산해 냅니다. 오픈소스 프로젝트 tinyworldformer에서는 Raspberry Pi Pico 2 W가 환경 예측과 의사결정의 전체 루프를 담당합니다. 단 520KB의 SRAM만을 갖춘 이 칩에서 화면을 생성하는 순환 트랜스포머와 행동을 결정하는 신경망이 동시에 구동됩니다.
월드 모델은 수십억 개의 매개변수와 막대한 전력을 소모하며 고성능 클라우드 클러스터의 전유물로 여겨져 왔습니다. tinyworldformer는 이와 완전히 다른 경량화 경로를 개척했습니다. 네트워크 매개변수를 26k131k 수준으로 압축하고 프레임당 연산량을 2M8M MACs로 낮추어, 5종의 고전 게임 환경을 4MB Flash와 520KB SRAM 안에 온전히 담아냈습니다.
강화학습 훈련은 네트워크가 직접 예측해 낸 프레임 내부에서만 진행됩니다. 에이전트는 실제 게임 엔진을 전혀 거치지 않습니다. 엔드투엔드 신경망 시뮬레이션은 클라우드 오버헤드를 완전히 걷어내고, 월드 모델과 강화학습을 마이크로컨트롤러 단위로 끌어내렸습니다. 그래픽 해상도의 한계와 83.6%~100%의 프레임 정확도라는 타협점이 있지만, 외부 연산 비용을 완전히 없앴다는 점에서 의미가 큽니다.
미러링된 듀얼 네트워크: 마이크로컨트롤러에 실제 게임은 없다
Pico 2 W에 탑재된 RP2350은 두 개의 Cortex-M33 코어를 갖추고 있습니다. 시스템은 화면 재생과 인과 추론의 역할을 물리적인 코어 단위로 명확하게 분리했습니다. Core 0은 USB 통신과 디스플레이 출력을 전담하며, Core 1은 실제 게임 엔진 없이 상호 미러링된 두 개의 신경망을 독립적으로 실행합니다.
월드 모델은 환경 상태의 전방 추론을 담당합니다. 현재 프레임과 행동을 입력받아 다음 프레임과 보상을 예측해 출력합니다. 아키텍처는 int8로 양자화된 순환 트랜스포머로 구성되며 매개변수 규모는 26k131k입니다. 프레임당 2M8M회의 곱셈-누산 연산(Pac-Man lite의 경우 8.2M MACs)을 수행하여, 온칩 추론이 제어 루프의 반응 속도를 충분히 따라가도록 보장합니다.
액터는 생성된 화면을 인식하고 행동을 결정합니다. float32 정밀도의 2계층 MLP 구조로 매개변수는 9k16k에 불과합니다. 프레임당 연산량 역시 9k16k MACs로 연산 부담이 극히 적습니다. 액터는 월드 모델이 예측한 특징값만을 읽어 들이고, 월드 모델은 액터가 선택한 이산 행동만을 전달받습니다.
이 듀얼 네트워크 시스템은 유연한 사용자 개입 메커니즘을 지원합니다. 보드에 미리 탑재된 액터는 처음부터 학습을 시작하는 stream-x 에이전트로 실시간 교체될 수 있습니다. 개발자가 온보드 버튼을 누르는 순간 제어권이 즉시 사람 플레이어에게 넘어갑니다. 버튼을 조작하는 사용자 역시 신경망이 실시간으로 상상해 낸 가상의 화면 속에서 플레이하게 됩니다.
그림: tinyworldformer 아키텍처 및 단일 보드에서 구동되는 듀얼 네트워크 개요. 출처: SheepSeb/tinyworldformer.
단일 계층 가중치 순환 재사용: 지연 시간을 대가로 메모리 확보
일반적인 비전 트랜스포머는 여러 블록을 수직으로 쌓아 용량을 확장합니다. 그러나 마이크로컨트롤러의 SRAM은 여러 계층의 가중치를 동시에 보관할 수 없습니다. tinyworldformer는 순환 트랜스포머 아키텍처를 도입하여 전역적으로 단 하나의 트랜스포머 블록만을 유지합니다. 동일한 가중치 세트를 1회에서 4회까지 반복 사용하며, 매 순환 직전에 최초 입력의 잔차를 다시 더해줍니다.
학습 시에는 각 순환 루프의 중간 출력을 실제 다음 프레임에 맞춰 지도 회귀 방식으로 학습시킵니다. 실행 시 순환 횟수는 연산 지연 시간과 추론 정밀도 사이를 조율하는 물리적 조절기 역할을 합니다. Pico 2 W 하드웨어에서는 원활한 상호작용 프레임레이트를 유지하기 위해 기본 2회 순환으로 고정되어 있습니다. 네트워크 깊이에 대한 선택권을 엣지 실행 환경에 넘겨준 설계입니다.
Doom-lite의 독립 테스트 사례를 보면 순환 횟수가 환각 현상을 억제하는 데 직관적인 효과를 낸다는 점을 알 수 있습니다. 1회 순환 추론 시 모델은 존재하지 않는 적을 임의로 만들어내어 화면 전체에 92개의 오류 격자를 발생시켰습니다. 순환을 2회로 늘리자 오류 격자가 35개로 줄어들었고, 3회에서는 12개, 4회 순환에서는 모든 오류가 완전히 제거되었습니다.
프로젝트는 2회 순환 조건에서 5종의 게임 성능을 검증했습니다. Breakout(20×16 격자)은 26k 매개변수와 4.3M MACs로 프레임당 99.99%의 정확도를 달성했습니다. Flappy Bird(24×24 격자)는 46k 매개변수와 2.0M MACs로 100% 정확도를 기록했습니다. Pong(20×32 격자)은 46k 매개변수와 2.3M MACs로 99.45%의 정확도를 보여 결정론적 평면 역학을 높은 충실도로 모사했습니다.
반면 깊은 상태 추적과 유사 3D 렌더링이 필요한 환경에서는 모델 용량의 한계가 드러납니다. Pac-Man lite는 48×48 격자에 복잡한 미로와 유령 두 마리를 담아내며 매개변수가 131k, 연산량이 8.2M MACs까지 증가했고 정확도는 86.4%를 기록했습니다. Doom-lite는 32×32 1인칭 시점과 8×8 미로 구성으로 55k 매개변수와 4.2M MACs를 소모하며 83.6%의 정확도를 보였습니다. 다중 객체의 숨겨진 상태를 처리할 때 저매개변수 모델은 국소적인 격자 왜곡이라는 타협을 감수해야 합니다.
그림: 실제 게임 엔진의 개입 없이 월드 모델이 자체 생성한 Pac-Man 연속 예측 프레임. 출처: SheepSeb/tinyworldformer.
휴리스틱 디코딩으로 환각 억제: 확률 분포에 규칙 부여
경량 신경망이 제약 없는 소프트맥스 분포에서 자유롭게 샘플링하도록 두면 생성된 물리 세계는 몇 단계 만에 무너지고 맙니다. 팩맨이 맵 위에서 복제되어 둘로 나뉘거나 튕겨 나가야 할 공이 공중에서 증발해 버립니다. 원시 확률 분포가 스스로 온전한 게임 화면을 만들어내지 못하기 때문에 디코딩 규칙 설계가 필수적입니다.
첫 번째 규칙은 정적 배경을 위한 것입니다. 벽, 벽돌, 펠릿, 바닥 같은 타일은 각자 독립적으로 최대 확률 토큰을 선택합니다(argmax). 배경 요소를 독립적으로 결정함으로써 전역 탐색 비용을 없애고 미로 벽면이 일그러지는 현상을 방지합니다.
두 번째 규칙은 단일 객체의 관리입니다. 공이나 플레이어와 같은 단일 객체는 전체 격자와 클래스 조합 중에서 화면 전체에 단 하나만 선택됩니다. 이를 통해 물리적인 유일성을 엄격히 유지합니다. 리스폰이나 서브와 같은 무작위 이벤트가 발생할 때는 디코더가 최적해 주변 2.2 로짓 영역 내에서 샘플링을 진행하여 평균화로 인한 잔상을 없애면서도 역동적인 다양성을 보존합니다.
세 번째 규칙은 2×2 복합 격자를 차지하는 이동 스프라이트를 제어합니다. 팩맨이나 유령 같은 스프라이트는 메인 격자만 상태값을 가집니다. 메인 격자가 입 방향을 기록하거나 유령이 펠릿을 가리고 있는지를 판별합니다. 나머지 세 격자는 사전 정의된 규칙에 따라 자동으로 채워지므로 픽셀별 개별 예측을 건너뛰어 캐릭터 그래픽이 찢어지는 현상을 방지합니다.
전 과정 int8 양자화: SIMD 명령어 하나로 2회 곱셈-누산 처리
트랜스포머를 마이크로컨트롤러로 이식할 때 가장 큰 걸림돌은 부동소수점 행렬 곱셈의 연산 부하입니다. tinyworldformer는 월드 모델의 모든 가중치 행렬을 int8 정수로 압축했습니다. 네트워크는 행렬 출력 행 단위로 스케일 계수를 계산합니다(scale = max|w| / 127). 활성화 텐서 역시 int8로 양자화되며 텐서 소속과 순환 차수에 따라 개별 스케일이 부여됩니다.
RP2350의 Cortex-M33 코어는 정수 연산을 위한 로우레벨 가속 명령어를 지원합니다. 32비트 메모리 읽기 한 번으로 가중치 4개를 가져오고, SXTB16이 바이트를 두 쌍의 16비트로 나누며, SMLAD 명령어 하나로 두 번의 곱셈-누산을 실행해 32비트 레지스터에 누적합니다(어텐션 메커니즘의 uint8 확률 × int8 값 연산에는 UXTB16 활용). 행렬 연산 파이프라인은 int32 누적이 끝난 뒤 듀얼 스케일 부동소수점 곱셈을 단 한 번 적용해 본래 값을 복원합니다. 여기에 1024개 항목의 사전 계산 테이블을 사용한 uint8 룩업테이블 소프트맥스를 결합하여 지속적인 부동소수점 연산 오버헤드를 완전히 걷어냈습니다.
RP2350에 내장된 하드웨어 FPU도 효과적으로 활용됩니다. LayerNorm 정규화, 잔차 연결 덧셈, 입력 임베딩은 여전히 float32 정밀도를 유지합니다. 행렬 곱셈을 제외한 이러한 연산은 전체 연산량에서 차지하는 비중이 매우 낮습니다. 부동소수점 형식을 유지함으로써 깊은 계층에서 발생하는 누적 오차를 방지하고 정수 가속과 수치 안정성을 동시에 확보했습니다.
이 양자화 기법이 높은 재현성을 갖는 이유는 훈련과 배포의 동작이 엄격하게 일치하기 때문입니다. 모델은 훈련 단계부터 양자화 인식 훈련(QAT)과 직선 추정기(STE)를 통해 동일한 정수 반올림을 적용받으므로 훈련된 모델이 곧 배포용 고정소수점 네트워크가 됩니다. 내보내기 모듈인 rustexport/intref.py는 NumPy의 부동소수점 연산 순서를 엄격히 고정했습니다. Rust 추론 엔진은 마이크로컨트롤러 위에서 참조 구현을 비트 단위까지 완벽하게 재현합니다.
그림: 모델 행렬 및 활성화 값의 행 단위 및 순환 차수별 int8 양자화 구조. 출처: SheepSeb/tinyworldformer.
제로 힙 할당으로 520KB SRAM 제한 준수: 엣지 자율 시뮬레이션
임베디드 환경에서는 메모리 부족 현상을 용납할 수 없습니다. ELF 바이너리를 size -A로 분석한 결과 Breakout은 Flash 361KB와 RAM 299KB를 차지하며, Flappy Bird는 409KB와 227KB, Pong은 414KB와 244KB를 사용합니다. Doom-lite는 471KB와 357KB, Pac-Man lite는 600KB와 460KB로 나타났습니다. 모든 펌웨어가 Pico 2 W의 4MB Flash 및 520KB SRAM 한도 내에 안전하게 배치됩니다.
메모리 프로파일링은 직관과 상반되는 사실을 보여줍니다. 전체 월드 모델에서 양자화된 int8 가중치가 차지하는 용량은 19.7KB33.9KB에 불과합니다. 반면 float32 형식의 임베딩, 정규화 매개변수, 스케일 배열이 31.6KB91.9KB로 메모리 소비의 대부분을 차지합니다. 저장 공간의 주된 비용은 핵심 연산 블록이 아니라 엣지 정합성을 보장하는 어댑터 계층에 집중되어 있습니다.
시스템의 장기적인 안정성을 보장하기 위해 펌웨어는 no_std Rust와 Embassy 비동기 프레임워크로 작성되었습니다. 시스템은 전체 생명주기 동안 동적 힙 메모리 할당을 전혀 사용하지 않는 제로 힙 할당을 달성했습니다. 모든 모델 가중치는 Flash에 static 배열로 직접 상주하며, 중간 연산 버퍼와 디스플레이 메모리는 모두 RAM 내부의 고정 크기 정적 배열로 할당됩니다. 동적 메모리 관리를 없앰으로써 메모리 파편화와 할당 실패로 인한 시스템 중단 위험을 원천 차단했습니다.
보드에 내장된 stream-x 학습기에 필요한 가중치와 적격성 흔적 역시 49KB~106KB에 불과하여 정적 메모리 내에서 안전하게 구동됩니다. 듀얼 코어 비동기 파이프라인은 안정적인 응답성을 보장합니다. Core 1은 특징 추출, 행동 선택, 2회 순환 추론, 휴리스틱 디코딩, 보상 예측을 루프로 수행합니다. 연산 데이터는 크기 2의 채널을 통해 Core 0으로 전달되며, Core 0이 바쁠 때는 프레임을 유연하게 건너뛰어 Core 1의 추론이 멈추지 않도록 보장합니다.
데스크톱 CPU에서 이 Rust 엔진은 프레임당 0.7ms(Flappy Bird)1.5ms(Breakout)의 속도로 연산을 마칩니다. Pico 2 W 실기에서의 밀리초 단위 수치는 명시되지 않았으나 사람이 플레이할 때 프레임 간격을 66ms150ms 수준으로 설정하면 매우 부드러운 플레이 경험을 제공합니다. 5종의 환경은 모두 SheepSeb/tinyworldformer 저장소에 오픈소스로 공개되어 있으며, uv 도구를 통한 터미널 실행과 WebAssembly 브라우저 데모를 지원합니다.
월드 모델이 거대한 클라우드 데이터센터에만 머무를 필요는 없습니다. tinyworldformer는 가중치 시간 순환 재사용과 정수 SIMD 연산 파이프라인을 결합하여 마이크로컨트롤러 위에서 환경 시뮬레이션을 온전히 실행할 수 있음을 증명했습니다. 그래픽 해상도의 한계와 미세한 화면 왜곡을 감수하는 대신 외부 서버 없는 완전한 온디바이스 자율성을 확보했습니다. 수백 킬로바이트 수준의 극소 메모리만으로도 자율 에이전트를 위한 물리 시뮬레이션 환경을 충분히 구동할 수 있습니다.
참고 링크:
- SheepSeb 기술 블로그: tinyworldformer 아키텍처 및 구현 분석
- GitHub 오픈소스 저장소: SheepSeb/tinyworldformer