Paper Tape Is All You Need: 1976년산 미니컴퓨터로 트랜스포머 모델을 학습시킨 미친 프로젝트 분석


요즘 딥러닝 씬을 보면 컴퓨팅 파워의 인플레이션이 극에 달했다는 생각이 듭니다. H100 GPU 수천 대를 엮은 클러스터가 표준처럼 여겨지고, 파라미터 수는 수천억 개를 가볍게 넘어갑니다. 이런 시대에, 1976년에 출시된 32KB 메모리의 미니컴퓨터 PDP-11에서 트랜스포머(Transformer) 모델을 어셈블리어로 밑바닥부터 짜서 학습시킨 프로젝트가 등장했습니다.

처음 이 소식을 접했을 때 제 반응은 “굳이 왜?”였습니다. 하지만 저장소의 코드를 뜯어보고 작성자의 아키텍처 설계 과정을 따라가다 보니, 이 프로젝트는 단순한 레트로 긱(geek)의 장난감이 아니라 트랜스포머 아키텍처의 본질을 꿰뚫는 훌륭한 엔지니어링 마스터피스라는 것을 깨달았습니다.

아키텍처와 제약 조건: 32KB 메모리의 예술

이 모델(ATTN-11)은 단일 레이어, 단일 헤드를 가진 인코더 전용 트랜스포머입니다. 파라미터 수는 단 1,216개에 불과합니다. 목표는 8개의 숫자 시퀀스를 역순으로 뒤집는 것입니다. 단순해 보이지만, 이 작업은 콘텐츠 기반의 숏컷 없이 인덱스에만 의존해 토큰을 라우팅해야 하므로 Self-attention의 성능을 검증하기에 완벽한 태스크입니다.

가장 놀라운 점은 이 모든 것이 19.2KB의 메모리 안에서 구동된다는 것입니다. 현대의 머신러닝 프레임워크에 익숙한 엔지니어라면 상상하기 힘든 제약입니다. 이를 해결하기 위해 저자는 몇 가지 과감한 결정을 내립니다.

가장 먼저 눈에 띄는 것은 Optimizer의 선택입니다. 요즘 디폴트로 쓰이는 Adam 대신 순수한 SGD 방식을 사용했습니다. Adam은 가중치당 두 개의 상태 벡터를 요구하므로 메모리 사용량이 3배로 뛰기 때문입니다. 대신 저자는 레이어별로 학습률(Learning rate)을 수동 튜닝하는 방식을 택했습니다. Attention 가중치에는 0.08을, 출력 프로젝션에는 0.0025를 할당하여 Adam 없이도 350 스텝 만에 수렴하도록 만들었습니다. 제한된 리소스 내에서 엔지니어가 도메인 지식을 활용해 시스템을 최적화하는 아주 고전적이고 아름다운 접근입니다.

Fixed-point 연산과 하드웨어 최적화

PDP-11에는 FPU(Floating Point Unit)가 없습니다. 따라서 모든 연산은 Fixed-point로 처리되어야 합니다. 여기서 저자의 하드웨어 이해도가 빛을 발합니다.

  • Forward pass: Q8 (8 fractional bits)
  • Backward pass: Q15 (15 fractional bits)
  • Weight accumulators: Q16 (32-bit)

Forward에서 Q8, Backward에서 Q15를 사용하는 구조는 PDP-11의 레지스터 구조와 완벽하게 맞아떨어집니다. Q8과 Q15를 곱하면 32비트 레지스터 쌍에 Q23 결과가 담기는데, 이를 단일 ASHC #-8 명령어 하나로 다시 Q15로 되돌릴 수 있습니다. 즉, Backward pass의 곱셈 비용이 Forward pass와 동일하면서도 Gradient의 정밀도는 128배 높게 유지하는 기가 막힌 트릭입니다. 과거 엣지 디바이스나 초기 모바일 NPU에서 모델을 양자화(Quantization)하며 겪었던 고생들이 떠오르면서, 이 부분에서 정말 감탄했습니다.

또한 Softmax와 Cross-entropy 계산에 필요한 지수(exp) 및 로그(log) 함수는 Precomputed lookup table로 대체했습니다. 복잡한 CORDIC 알고리즘이나 다항식 근사 대신 단일 MOV 명령어로 처리하여 CPU 사이클을 극단적으로 절약했습니다.

검증된 엔지니어링 프로세스

이 프로젝트가 단순한 해킹과 다른 점은 개발 프로세스에 있습니다. 저자는 어셈블리 코드를 작성하기 전에 함수형 ML 프레임워크인 Sheaf를 사용해 부동소수점 및 고정소수점 연산의 프로토타입을 만들고 수학적 무결성을 증명했습니다.

/!\ Guard Breached: Range { lo: -5000.0, hi: 5000.0 }
Function: vtmul
Value range [-3.10e4, 3.28e4] outside allowed [-5000, 5000]

위 로그처럼 값의 범위를 추적하여 오버플로우를 사전에 잡아냈습니다. 로우레벨 언어로 작업할 때 비즈니스 로직(이 경우 수학적 모델)의 검증을 상위 레벨에서 먼저 끝내는 것은 시니어 엔지니어들이 항상 강조하는 베스트 프랙티스입니다. 코딩보다 설계와 검증이 먼저라는 기본기를 아주 잘 보여줍니다.

Hacker News의 반응과 현실적인 타협

Hacker News 커뮤니티에서도 32KB RAM 안에 트랜스포머를 욱여넣은 것에 대해 경악하는 반응이 주를 이뤘습니다. 흥미로운 점은 한 유저가 현재 실제 구동되는 PDP-11/34를 소유하고 있다는 사실 자체에 놀라워하자, 저자가 남긴 답변입니다.

저자는 실제 하드웨어가 끊임없이 관심이 필요한 다마고치 같다고 표현하며, 실제 개발과 튜닝의 대부분은 자신이 직접 만든 사이클 정확도 수준의 에뮬레이터(ll-34)에서 진행했다고 밝혔습니다. 낭만은 낭만이고, 실제 개발 생산성은 현대적인 도구(에뮬레이터)를 통해 확보한다는 점이 지극히 실용적인 엔지니어의 마인드셋을 보여줍니다.

결론: 우리는 추상화의 늪에 빠져있는가?

이 프로젝트(ATTN-11)가 프로덕션 레벨의 가치를 가지는 것은 당연히 아닙니다. 하지만 교육적, 철학적 가치는 엄청납니다.

우리는 PyTorch와 CUDA라는 거대한 추상화 레이어 위에서 loss.backward() 한 줄로 모든 것을 해결하는 데 익숙해져 있습니다. 하지만 이 프로젝트는 트랜스포머의 본질이 결국 단순한 행렬 곱셈, 잔차 연결, 그리고 약간의 확률 분포 변환이라는 사실을 가장 로우레벨의 언어로 증명해 냈습니다.

가끔은 우리가 다루는 기술의 블랙박스를 열어보고, 밑바닥의 톱니바퀴가 어떻게 맞물려 돌아가는지 확인하는 과정이 필요합니다. 컴퓨팅 리소스가 부족했던 시절의 제약이 오히려 알고리즘의 본질을 더 투명하게 보여주는 역설적인 사례입니다. 머신러닝의 펀더멘털을 다시 한번 고민해보고 싶은 엔지니어라면, 이 프로젝트의 어셈블리 코드와 설계 문서를 꼭 한번 정독해 보시기를 강력히 권합니다.

References