18년 된 RTOS 위에서 에뮬레이트된 90년대 CPU로 구동하는 260K 파라미터 LLM
260K-param LLM running on an emulated 90s CPU inside an 18-year-old RTOS
핵심 요약
18년 전 대학 과제로 만든 RTOS를 복구해 90년대 CPU 에뮬레이터 위에서 초소형 LLM을 구동하는 데 성공했습니다.
- 기술적 도전 — 90년대 Freescale ColdFire CPU를 에뮬레이트하여 260K LLM 구동
- 최적화 기법 — INT8 양자화와 Carmack의 고속 역제곱근 알고리즘을 활용해 연산 효율 극대화
- 프로젝트 배경 — 2008년 작성된 RTOS 코드를 Claude와 Qwen을 활용해 리버스 엔지니어링으로 복구
- 향후 계획 — FPGA를 통해 하드웨어를 직접 구현하여 실사용 가능한 수준의 속도 확보
저는 이 서브레딧이 엉뚱한 LLM 프로젝트를 사랑한다는 걸 알고 있습니다. 그래서 새로운 Qwen 3.7 모델이 나오기를 기다리는 동안 제 기여물을 공유합니다!
저는 Freescale ColdFire MCF5307을 위한 커스텀 JavaScript 에뮬레이터 안에서 돌아가는 RTOS 내부에 작은 LLM을 성공적으로 구동했습니다. 이 CPU는 오리지널 Mac과 세가 제네시스를 구동했던 전설적인 Motorola 68K의 파생형입니다.
이 RTOS는 2008년에 임베디드 시스템 대학 강의를 위해 세 명의 동급생과 함께 작성했던 것입니다. 하드웨어와 원본 ROM은 진작에 사라져 버렸죠. 몇 달 전, 저는 Claude와 Qwen을 사용하여 이를 부활시키기로 결심했고, CPU 에뮬레이터를 처음부터 다시 작성하고 커널 호출을 통해 ROM을 리버스 엔지니어링했습니다. 2008년의 원본 바이너리가 부팅되자, 저는 더 나아가 에뮬레이트된 스택 위에서 LLM을 실행해 보고 싶었습니다.
시작점으로 저는 TinyStories로 학습된 Karpathy의 llama2.c와 stories260K 모델을 가져왔습니다. 가중치는 약 0.5MB로 매우 작지만, 커널 스택을 줄여 공간을 확보한 후 16MB의 에뮬레이트된 메모리에 딱 맞게 들어갔습니다. ColdFire에는 FPU가 없어서 모든 부동 소수점 계산에 libgcc의 소프트웨어 에뮬레이션이 필요합니다. 즉, 토큰 하나당 수백만 개의 에뮬레이트된 명령어가 필요해서 시작부터 난관이었죠.
이를 해결하기 위해 모델을 행별 스케일 팩터를 가진 INT8로 양자화하여, 중요한 행렬 곱셈을 순수 정수 연산으로 바꾸고 내부 루프를 몇 개의 명령어로 줄였습니다. 행렬 곱셈 외의 부동 소수점 연산은 고전적인 방식을 택해 Carmack의 고속 역제곱근(Quake에서 가져옴)을 사용했고, 삼각 함수 계산을 피하기 위해 RoPE용 룩업 테이블을 대량으로 사용했습니다. 에뮬레이트된 부동 소수점으로 남은 유일한 부분은 softmax/RMSnorm뿐인데, 이들은 호출 빈도가 낮아 비교적 빠르게 작동합니다.
전체 모델은 토큰당 2~4초라는 엄청난 속도로 출력되며, 대체로 일관성 있는(가끔은 이상한) TinyStories 스타일의 영어를 생성합니다!
당신은 브라우저에서 직접 시도해 볼 수 있으며, %a를 입력하면 모델이 실행됩니다. 궁금하신 분들을 위해 제 RTOS 고고학 프로젝트 전체에 대한 긴 글을 여기에 남겨두었습니다.
물론 실용적인 용도는 전혀 없지만, 감자 수준의 스택에서 LLM이 돌아가는 걸 보는 건 꽤 멋진 일입니다. 다음 단계는 원본 하드웨어를 재구현한 FPGA에 전체 스택을 올리는 것인데, 그렇게 하면 실제로 사용 가능한 속도까지 올라갈 것입니다.



