기하급수적으로 빠른 추론 속도로 트랜스포머 내부에서 프로그램 실행하기

#서론
대규모 언어 모델(LLM)은 인간과 같은 텍스트를 이해하고 생성하는 능력으로 전 세계를 놀라게 했습니다. 하지만 이러한 모델의 놀라운 확률론적 능력 이면에는 잘 알려진 한계가 존재합니다. 바로 전통적인 트랜스포머(transformer) 아키텍처가 길고 정확하며 결정론적(deterministic)인 연산을 처리하는 데 어려움을 겪는다는 점입니다. 이론적으로는 튜링 완전(Turing-complete)하지만, 성능 병목 현상으로 인해 수백만 개의 엄격한 프로그래밍 단계를 표준 트랜스포머 내부에서 직접 실행하는 것은 역사적으로 사실상 불가능했습니다.
그렇다면 어텐션(attention) 메커니즘을 재구성하여 이러한 한계를 우회할 수 있다면 어떨까요? LLM이 단순한 텍스트 생성기가 아니라, 완전하고 매우 효율적인 컴퓨터로 기능할 수 있다면 어떨까요? 최근 Percepta의 연구 결과가 바로 이를 증명했습니다. 기하급수적으로 빠른 추론 속도로 트랜스포머 내부에서 프로그램을 실행하는 새로운 접근 방식을 제시한 것입니다. 이는 단순한 점진적 최적화가 아닙니다. 신경망이 네이티브하게 처리할 수 있는 영역에 대한 근본적인 재해석입니다.
#무슨 일이 일어났는가
Percepta의 연구원들은 "LLM이 컴퓨터가 될 수 있을까?"라는 흥미로운 질문을 던졌습니다. 이에 대한 답을 찾기 위해, 그들은 긴 시퀀스에서 발생하는 연산 비효율성의 근본 원인에 주목했습니다. 표준 트랜스포머 모델에서 어텐션 메커니즘은 일반적으로 새로 생성되는 모든 토큰에 대해 이전 시퀀스 전체를 스캔해야 합니다. 이로 인해 단계당 $O(n)$의 시간 복잡도가 발생하며, 수백만 단계에 걸쳐 복잡한 로직이나 수학 퍼즐을 실행하려고 할 때 금세 처리 불가능한 상태가 됩니다.
이 문제를 해결하기 위해 연구팀은 획기적인 아키텍처 수정을 도입했습니다. 조회 헤드(lookup heads)의 차원을 정확히 2로 제한함으로써, 표준 어텐션 메커니즘을 2D 볼록 껍질(convex-hull) 쿼리로 변환한 것입니다.
이러한 기하학적 변환을 통해 모델이 상태를 검색하고 업데이트하는 데 걸리는 시간 복잡도가 시퀀스 길이에 대해 선형($O(n)$)에서 로그($O(\log n)$)로 바뀝니다. 이는 추론 과정을 기하급수적으로 가속화하여, 수정된 트랜스포머가 치명적인 성능 저하 없이 수백만 단계에 걸쳐 "추가 전용 추적(append-only trace)"을 유지할 수 있게 해줍니다.
놀라운 실제 시연에서 연구팀은 외부 도구, 코드 인터프리터 또는 API 호출에 의존하지 않았습니다. 대신 그들은 세계에서 가장 어려운 스도쿠로 널리 알려진 아르토 잉칼라(Arto Inkala) 스도쿠를 풀기 위해, 트랜스포머 내부에서 전적으로 컴파일된 솔버(solver)를 실행했습니다. 모델은 새로운 $O(\log n)$ 어텐션 메커니즘으로 구동되는 내부적인 "사고(thought)" 과정에만 의존하여 이를 달성했습니다.
#왜 중요한가
AI 분야에서 일하는 개발자와 엔지니어에게 이 발전은 확률론적 생성과 엄격한 결정론적 실행 사이의 간극이라는 중요한 마찰점을 해결해 줍니다.
현재 LLM이 정밀한 수학 연산을 수행하거나 복잡한 로직을 실행하도록 하려면, 일반적으로 그 주변에 스캐폴딩(scaffolding)을 구축해야 합니다. 무겁고 정확한 작업은 에이전트, 함수 호출(function calling) 또는 외부 코드 인터프리터(예: Python 샌드박스)를 사용하여 분산시킵니다. LLM은 오케스트레이터 역할을 하고, 전통적인 컴퓨팅 환경이 엄격한 실행을 담당하는 식입니다.
트랜스포머의 가중치 내부에 직접 프로그램을 실행할 수 있는 능력을 내장함으로써, 외부 상태 관리 및 복잡한 오케스트레이션 계층에 대한 필요성을 줄일 수 있습니다. 모델 자체는 본질적으로 가상 머신(WebAssembly 인터프리터와 유사)을 실행합니다. 생성된 각 토큰은 특정 순간에 이 가상 머신의 변화하는 상태를 나타내며, 명령 포인터(instruction pointer)를 업데이트하고, 스택을 관리하며, 메모리를 수정합니다.
이것이 중요한 이유는 LLM을 강력하게 만드는 자연어 인터페이스를 유지하면서 결정론적 작업의 지연 시간(latency)을 극적으로 낮추기 때문입니다. 이는 신경망이 내부적으로 창의적인 추론과 엄격한 연산 사이의 간극을 메울 수 있음을 증명합니다.
#기술적 영향
2D 볼록 껍질 쿼리를 통해 어텐션이 $O(n)$에서 $O(\log n)$으로 전환된 것은, AI 시스템을 설계하고 배포하는 방식에 지대한 기술적 영향을 미칩니다. 핵심 아키텍처 변화와 그 효과를 살펴보겠습니다.
#1. 기하학적 어텐션 메커니즘
표준 내적(dot-product) 어텐션은 고차원 공간에서 호환성 점수를 계산하며, 이는 계산 비용이 많이 듭니다. 키-값(key-value) 조회를 2D 공간에 투영하고 이를 볼록 껍질 쿼리로 처리함으로써, 모델은 고도로 최적화된 기하학적 알고리즘을 활용할 수 있습니다. 이는 검색 속도를 높일 뿐만 아니라, 프로그램 실행에 필수적인 더 구조화되고 결정론적인 메모리 액세스 패턴을 강제합니다.
#2. 추가 전용 추적을 통한 상태 관리
전통적인 컴퓨팅 환경에서는 메모리 변경이 가능(mutable)합니다. 하지만 자기회귀(autoregressive) 트랜스포머에서 시퀀스는 추가만 가능(append-only)합니다. 가상 머신을 실행하려면 모델은 전체 상태(레지스터, 스택, 메모리 포인터)를 출력 시퀀스로 인코딩해야 합니다.
- 명령 포인터 (Instruction Pointer): 컴파일된 프로그램의 현재 줄을 추적합니다.
- 스택 표현 (Stack Representation): 푸시/팝(push/pop) 연산을 시퀀스 추가로 인코딩합니다.
- 메모리 업데이트 (Memory Updates): 로그 어텐션 헤드를 사용하여 히스토리를 쿼리함으로써 특정 변수의 가장 최근 값을 검색합니다.
#3. 가중치로의 컴파일
아마도 가장 놀라운 시사점은 소프트웨어를 모델의 가중치로 직접 컴파일한다는 개념일 것입니다. 트랜스포머가 가상 머신을 실행할 수 있다면, 이론적으로 모든 결정론적 프로그램(정렬 알고리즘, 물리 엔진 또는 암호화 해싱 함수 등)을 모델이 네이티브하게 실행할 수 있는 형식으로 컴파일할 수 있습니다. 이는 사전 학습된 신경망과 컴파일된 바이너리 실행 파일 사이의 경계를 모호하게 만듭니다.
#다음 단계
아르토 잉칼라 스도쿠 솔버의 성공적인 실행은 시작에 불과합니다. 이 연구가 성숙해짐에 따라 다음과 같은 흥미로운 발전들을 기대할 수 있습니다.
- 하이브리드 아키텍처: 미래의 파운데이션 모델(foundation models)은 의미론적 추론을 위한 표준 고차원 어텐션 헤드와, 엄격한 로직 및 상태 추적을 전담하는 2D 볼록 껍질 헤드를 혼합하여 통합할 수 있습니다.
- 네이티브 코드 실행: 특정 문제 클래스에 대해서는 외부 코드 인터프리터에서 완전히 벗어나, 추론 단계에서 모델이 샌드박스화된 바이트코드를 네이티브하게 자체 실행하는 데 의존하게 될 수 있습니다.
- 향상된 추론 능력: 핵심 아키텍처에 결정론적 실행을 통합함으로써, 모델은 엄격한 수학적 증명이나 복잡한 데이터 변환이 필요한 작업에서 환각(hallucination) 현상을 훨씬 덜 일으키게 될 것입니다.
Ichiban Tools 커뮤니티의 경우, 이는 우리가 LLM 위에 구축하는 유틸리티와 개발자 도구가 훨씬 더 빠르고 안정적으로 변할 것임을 의미합니다. 복잡한 파싱이나 정적 분석을 LLM의 순전파(forward pass)에 직접 통합할 수 있다는 전망은 개발자 생산성을 위한 완전히 새로운 패러다임을 열어줍니다.
#결론
LLM이 고도로 효율적인 컴퓨터로 기능할 수 있다는 깨달음은 인공지능 분야에 있어 중요한 이정표입니다. 어텐션 메커니즘을 근본적으로 재고하고 2D 볼록 껍질 쿼리를 활용하여 로그 추론 시간을 달성함으로써, 연구원들은 트랜스포머가 길고 결정론적인 프로그램을 네이티브하게 실행할 수 있는 능력을 끌어냈습니다.
우리가 신경망이 달성할 수 있는 한계를 계속해서 탐구함에 따라, 확률론적 추론과 정확한 연산의 융합은 의심할 여지 없이 더 견고하고 유능하며 다재다능한 AI 시스템을 탄생시킬 것입니다. 우리는 더 이상 단순히 다음 단어를 예측하도록 모델을 학습시키는 것이 아닙니다. 다음 명령을 실행하도록 가르치고 있습니다.