700줄의 C언어로 구현한 최신 LLM
I implemented a modern LLM in 700 lines of C
핵심 요약
외부 라이브러리 없이 700줄의 C 코드로 Gemma 4 모델을 CPU에서 구동하는 고성능 추론 엔진 프로젝트입니다.
- 경량화 구현 — 외부 프레임워크 없이 단일 C 파일로 토크나이저부터 CPU 커널까지 모두 구현함
- 학습용 프로젝트 — LLM 추론 과정을 다이어그램이 아닌 실제 코드로 직접 이해할 수 있도록 설계됨
- 고성능 추론 — int8 가중치와 AVX-512 VNNI 등을 활용해 llama.cpp보다 빠른 속도를 달성함
- 실시간 성능 — Ryzen 7 7700 환경에서 실시간 텍스트 생성이 가능한 수준의 속도를 보여줌
gemma4.c라는 작은 프로젝트를 하나 만들고 있다.
아이디어는 꽤 간단하다. 최신 언어 모델을 다운로드하고, 700줄짜리 C 파일 하나를 컴파일하면 일반 CPU에서도 텍스트를 생성할 수 있게 만드는 거다. 그리고 그 파일을 처음부터 끝까지 읽어보면 모델이 어떻게 새로운 토큰을 하나하나 생성하는지 정확히 이해할 수 있다.
이 모델은 구글의 최신 오픈 모델 중 하나인 Gemma 4 E2B다. C 런타임이 토크나이저, 트랜스포머, KV 캐시, 샘플링, 그리고 CPU 커널까지 전부 직접 처리한다. 밑바닥에서 복잡한 작업을 대신 해주는 추론 프레임워크나 외부 라이브러리 같은 건 없다.
이걸 만든 이유는 순전히 LLM 추론을 다이어그램이나 수식이 아니라 실제 코드로 돌아가는 수준에서 이해하고 싶었기 때문이다. 모든 걸 파일 하나에 다 때려 박으니까 훨씬 이해하기 쉽더라. main()부터 시작해서 프롬프트가 런타임을 거쳐 나가는 과정을 따라가다 보면, 할당되는 모든 버퍼와 활성화 함수를 변환하는 모든 수학 연산, 그리고 입력값이 결국 새로운 토큰으로 바뀌는 모든 단계를 눈으로 직접 확인할 수 있다.
CPU 최적화 쪽에도 시간을 꽤 썼다. 런타임은 int8 가중치와 활성화 함수를 사용하고, 가능한 경우 OpenMP, AVX2, AVX-512 VNNI를 지원한다. 내 Ryzen 7 7700 기준으로 512 토큰 프리필(prefill) 시 약 639 tok/s, 생성 시 25.9 tok/s가 나오는데, llama.cpp보다 빠르다.
레포지토리는 의도적으로 작게 유지하고 있다. 이 모델과 CPU 추론만 지원하기 때문에 범용 런타임보다 훨씬 덜 복잡해서 파고들기 좋다.

