"linear tensor projection"이라는 표현이 등장한다. 머신러닝의 핵심 연산을 설명하며 나온 말이다. 이번 주 한 개발자가 애플 실리콘(Apple의 자체 설계 칩) 환경에서 프레임워크 없이 Swift(애플의 프로그래밍 언어)만으로 LLM(거대 언어 모델)을 학습시키려는 실험을 공개했다. 맥북 앞에서 학습 버튼을 눌렀는데 토큰(텍스트의 최소 단위)이 하나씩 느릿하게 출력되는 답답한 상황을 해결하기 위해, 그는 가장 원초적인 계산 방식인 행렬 곱셈의 속도를 극한으로 끌어올리기로 했다.
llm.c 기반의 Swift 구현과 연산 규모
Andrej Karpathy(AI 연구자)가 공개한 llm.c(C언어로 구현한 GPT-2 호환 모델)가 이번 실험의 기준점이다. 이 모델은 약 1,000줄의 순수 C언어로 작성되어 내부 동작이 투명하게 드러나는 특징이 있다. 모델 가중치는 124,439,808개이며, 한 번의 학습 반복(iteration)당 약 0.2조 번의 부동 소수점 연산이 필요하다. 구체적으로는 6 x 124,439,808 x 256이라는 수치가 도출된다.
최적화 수준인 -O3 옵션을 적용한 C언어 코드는 학습 반복 1회에 7초가 걸렸고, 추론 속도는 초당 1토큰 미만으로 측정되었다. 이는 개념 증명으로는 충분하지만, 실제 사용하기에는 10배 이상 느린 속도다. 개발자는 이 속도를 Gflop/s(초당 10억 번의 부동 소수점 연산) 수준에서 Tflop/s(초당 1조 번의 부동 소수점 연산) 수준으로 끌어올리기 위해 Swift(애플의 프로그래밍 언어)를 사용해 행렬 곱셈(숫자 격자끼리 곱하고 더하는 연산)을 직접 구현하기 시작했다.
프레임워크 없는 순수 코드 최적화의 차이
예전에는 PyTorch(파이썬 기반 머신러닝 라이브러리)나 TensorFlow(구글의 머신러닝 프레임워크) 같은 도구를 주로 썼다. 하지만 이런 도구들은 내부 계산 엔진을 따로 두고 파이썬은 지휘자 역할만 수행하는 구조다. 이번 실험은 이런 중간 단계 없이 Swift(애플의 프로그래밍 언어)로 직접 연산 커널(특정 작업을 수행하는 핵심 코드)을 작성해 제어권을 완전히 갖는 방식을 택했다.
쉽게 말하면, 이미 만들어진 밀키트를 쓰는 대신 식재료 손질부터 직접 해서 맛을 조절하는 것과 같다. 머신러닝은 기본적으로 모델 가중치를 입력 데이터에 적용하는 순전파(forward pass, 결과값을 계산하는 과정)와 오차를 계산해 가중치를 수정하는 역전파(backward pass, 학습을 통해 정답에 가깝게 만드는 과정)의 반복이다. 이 과정의 핵심은 z += x * y라는 단순한 곱셈과 덧셈을 수조 번 반복하는 행렬 곱셈에 있다.
비유하자면 이 작업은 거대한 엑셀 시트의 수만 개 셀을 동시에 계산하는 것과 비슷하다. 개발자는 이 계산을 CPU(중앙 처리 장치)뿐만 아니라 SIMD(한 번에 여러 데이터를 처리하는 기술), AMX(애플의 행렬 연산 가속기), GPU(그래픽 처리 장치)라는 각기 다른 엔진에서 어떻게 돌릴지 고민했다. 특히 Swift(애플의 프로그래밍 언어)의 안전성 검사 기능을 끄는 -remarks-unsafe 옵션을 사용하여 C언어와 같은 수준의 메모리 접근 속도를 확보하려 했다.
개발자가 바로 체감하는 변화는 언어의 제약을 벗어나 하드웨어의 성능을 직접 제어할 때 나타난다. Swift(애플의 프로그래밍 언어)는 기본적으로 메모리 안전성을 위해 배열의 범위를 매번 확인하지만, 이를 제거함으로써 C언어와 동일한 속도 경쟁 선상에 설 수 있었다. 결국 이번 최적화의 여정은 단순히 언어를 바꾸는 것이 아니라, 애플 실리콘(Apple의 자체 설계 칩)이 가진 연산 유닛들을 어떻게 효율적으로 깨워 사용할 것인가에 대한 탐구다.
결국 AI 성능의 한계는 고도의 알고리즘보다 하드웨어의 끝단까지 쥐어짜는 최적화 능력에서 결정된다.




