POOOLING FOREST
2x2 행렬에서 시작하는 AI 하드웨어의 본질: TinyTinyTPU가 알려준 것들 - 풀링포레스트 CTO 송찬영이 전하는 TinyTinyTPU 프로젝트를 통한 AI 하드웨어의 본질 탐구. 시스톨
Engineering & Tech

2x2 행렬에서 시작하는 AI 하드웨어의 본질: TinyTinyTPU가 알려준 것들

풀링포레스트 CTO 송찬영이 전하는 TinyTinyTPU 프로젝트를 통한 AI 하드웨어의 본질 탐구. 시스톨릭 배열과 하드웨어 최적화가 소프트웨어 개발에 주는 영감을 다룹니다.

송찬영

CTO

안녕하세요. 풀링포레스트 CTO 송찬영입니다.

요즘 우리 팀은 LLM을 활용한 서비스 고도화에 여념이 없습니다. 하루가 멀다 하고 쏟아지는 새로운 모델들, RAG 파이프라인 최적화, 그리고 그 비용을 감당하기 위한 인프라 효율화까지... 정신없는 나날의 연속이죠. 그런데 문득 그런 생각이 들더군요. 우리는 import torchmodel.generate() 같은 추상화된 함수 너머에서 실제로 무슨 일이 벌어지는지 얼마나 알고 있을까요? 개발자로서 '마법' 같은 AI를 다루지만, 그 마법을 가능케 하는 기계적인 원리에 대해서는 정작 소홀했던 건 아닐까 하는 반성 말입니다.

솔직히 고백하자면, 저 역시 소프트웨어 엔지니어링에 집중하느라 하드웨어 레벨의 데이터 흐름은 블랙박스 취급을 해왔습니다. 그러다 우연히 흥미로운 프로젝트 하나를 발견했습니다. 바로 'TinyTinyTPU'입니다.

이 프로젝트는 이름 그대로 아주 작은 TPU(Tensor Processing Unit)를 FPGA 상에 구현한 것입니다. 구글이 자랑하는 거대한 TPU 아키텍처를 교육 목적으로 축소해놓은 것이죠. 사실 처음에는 "겨우 2x2 행렬 연산이 무슨 의미가 있을까?" 싶었습니다. 하지만 코드를 뜯어보고 시뮬레이션을 돌려보며 생각이 완전히 바뀌었습니다.

이 프로젝트의 핵심은 시스톨릭 배열(Systolic Array) 아키텍처의 구현에 있습니다. 우리가 흔히 CPU에서 for 루프를 돌며 행렬 곱셈을 할 때와는 전혀 다른 방식으로 데이터가 움직입니다. 데이터가 심장 박동(Systolic)처럼 규칙적으로 흐르며, 각 처리 장치(PE, Processing Element)들이 데이터를 옆으로, 아래로 전달하면서 연산을 수행하죠.

TinyTinyTPU는 비록 2x2라는 아주 작은 스케일이지만, 실제 TPU가 갖춰야 할 핵심 요소들을 빠짐없이 갖추고 있었습니다.

  • Diagonal Wavefront Weight Loading: 타이밍에 맞춰 가중치를 계단식으로 캡처하는 방식

  • Full Post-MAC Pipeline: 단순 곱셈 합(MAC) 이후에 이어지는 활성화 함수(Activation), 정규화(Normalization), 양자화(Quantization)까지.

이 작은 시스템을 SystemVerilog로 구현하고 Verilator와 cocotb로 시뮬레이션해보면서, 저는 비로소 AI 연산의 물리적 실체를 마주하는 기분이었습니다. 수천 개의 GPU 클러스터에서 일어나는 거대한 연산도 결국은 이 작은 2x2 유닛들의 집합적인 움직임이라는 사실이 새삼 경이롭게 다가오더군요.

특히 인상 깊었던 점은 '제약'이 주는 배움이었습니다. Basys3와 같은 저가형 FPGA(Artix-7) 보드에 배포하기 위해 LUTs와 Flip-Flops 같은 리소스를 최적화하는 과정을 보며, 우리 풀링포레스트 팀이 겪고 있는 클라우드 리소스 최적화 문제와 본질적으로 다르지 않음을 느꼈습니다. 하드웨어의 게이트 하나를 아끼는 마음가짐이, 결국 소프트웨어 레벨에서의 극한의 최적화로 이어진다는 것을요.

소프트웨어 개발자, 특히 AI 엔지니어들에게 하드웨어는 종종 '남의 영역'으로 치부되곤 합니다. 하지만 우리가 작성한 코드가 실리콘 위에서 어떻게 전자가 되어 흐르는지 이해할 때, 비로소 더 효율적인 모델 아키텍처를 설계하고 추론 속도를 획기적으로 개선할 수 있는 단서를 얻을 수 있습니다.

TinyTinyTPU 프로젝트는 거창한 장비 없이도 내 책상 위에서 AI 하드웨어의 원리를 탐구할 수 있게 해줍니다. GitHub 코드를 내려받아 시뮬레이터를 돌려보는 것만으로도, 데이터가 웨이브폼을 그리며 흘러가는 모습을 눈으로 확인할 수 있죠.

저희 팀 주니어 개발자들에게도 이 프로젝트를 한 번쯤 뜯어보라고 권했습니다. 당장 베릴로그(Verilog)를 짜라는 게 아닙니다. 우리가 다루는 기술의 가장 밑바닥(Low-level)을 한 번이라도 들여다본 엔지니어와 그렇지 않은 엔지니어의 깊이는 분명 다를 수밖에 없으니까요.

기술의 트렌드는 빠르게 변하지만, 그 기저에 있는 원리는 쉽게 변하지 않습니다. 가끔은 화려한 프레임워크 뒤에 숨겨진 기계의 심장 소리에 귀를 기울여보는 건 어떨까요? 그 작은 2x2 행렬 속에서, 여러분도 분명 새로운 영감을 얻으실 수 있을 겁니다.

지금 읽으신 내용, 귀사에 적용해보고 싶으신가요?

상황과 목표를 알려주시면 가능한 옵션과 현실적인 도입 경로를 제안해드립니다.