PyTorch, BLAS, 의존성 없이 C++17로 처음부터 트랜스포머를 만들었습니다. CPU에서 학습하며, 0.83M 파라미터로 76분 만에 val loss 1.64를 달성했습니다.
I built a transformer in C++17 from scratch — no PyTorch, no BLAS, no dependencies. Trains on CPU. 0.83M params, full analytical backprop, 76 min to val loss 1.64.
핵심 요약
외부 라이브러리 없이 C++17만으로 트랜스포머 모델을 밑바닥부터 구현하여 CPU 학습에 성공한 사례입니다.
- 순수 C++ 구현 — PyTorch나 BLAS 같은 외부 라이브러리 없이 표준 라이브러리만 사용하여 트랜스포머를 밑바닥부터 직접 작성함.
- 분석적 역전파 — 모든 연산자에 대한 명시적 기울기 유도와 역전파 과정을 직접 구현하여 학습 효율을 최적화함.
- CPU 학습 최적화 — OpenMP를 활용한 병렬화로 8코어 환경에서 5~7배의 속도 향상을 달성하며 76분 만에 학습을 완료함.
- 학습 결과물 — 0.83M 파라미터 규모로 동화 데이터를 학습시켰으며, 완벽하진 않지만 모델이 스스로 텍스트를 생성하는 수준에 도달함.
지난 몇 달 동안 저는 C++17로 구현된 완전한 GPT 스타일 언어 모델인 Quadtrix.cpp를 작업해 왔습니다. PyTorch도 없고, LibTorch도 없습니다. BLAS도 없습니다. 그 어떤 종류의 자동 미분 라이브러리도 없습니다. 유일한 의존성은 C++17 표준 라이브러리와 POSIX 소켓뿐입니다.
저장소: https://github.com/Eamon2009/Quadtrix.cpp
텐서 라이브러리, 모든 순전파 연산, 그리고 모든 연산자에 대한 명시적 기울기 유도가 포함된 완전한 분석적 역전파까지 모든 것을 직접 손으로 작성했습니다.
학습 실행 v1.0
* 아키텍처: 4 레이어 x 4 헤드 x 200d 디코더 전용 트랜스포머
* 파라미터: 826,985 (0.83 M)
* 컨텍스트 윈도우: 128 문자
* 말뭉치: 31.4 M 문자의 어린이 동화
* 최적 val loss: 1.6371 nats
* 학습 시간: 단일 CPU 코어에서 76.2분
* 외부 의존성: 없음
실제로 구현된 내용
* 경량 CPU float 텐서 라이브러리 (2D/3D, 행 우선 저장)
* 토큰 및 위치 임베딩, LayerNorm, Linear, Dropout
* 인과적 마스크를 포함한 멀티 헤드 인과적 셀프 어텐션
* 피드 포워드 블록: Linear -> ReLU -> Linear
* 완전한 역전파: 교차 엔트로피, 소프트맥스, 레이어 정규화(Ba et al. 3항 공식), 스케일드 닷 프로덕트 어텐션, Q/K/V 기울기, ReLU, 드롭아웃, 임베딩 스캐터-애드
* 편향 보정이 포함된 AdamW 옵티마이저
* 문자 단위 토크나이저 및 배치 샘플러
* 모든 CPU 코어에 걸친 OpenMP 병렬화 — matmul, bmm, 소프트맥스, 레이어 정규화 모두 병렬화됨. 8코어 머신에서 약 5-7배 속도 향상
기울기 유도에만 약 일주일이 걸렸습니다.
레이어 정규화 역전파는 모두가 어려워하는 부분입니다. 순전파 중에 행별로 mu, 역-표준편차, x-hat을 저장하고 역전파에서 전체 3항 공식을 적용해야 합니다. 어텐션 역전파는 어텐션 가중치와 프로젝션 출력에 어떤 드롭아웃 마스크가 적용되었는지 주의 깊게 추적해야 합니다.
학습 후 샘플 출력
You > Once upon a time
Quadtrix > , and said askiced and so owas said sri. The his brickerys and stew hhat and saw and stark a din't. She stingry and asked day. Timmy watch and played to cones.
You > Timmy is a
Quadtrix > bog the scated justo prove the bret you. Timmy nevery some the gecid. Her neplay to bet starked a way, that litked cliend.
You > what is life
Quadtrix > st happe. It happ a liked back abp happy thing flongs way. Lily lood take maked a fiside apie? Tom and abed Timm.
네, 횡설수설하는 수준입니다. CPU에서 76분 동안 학습된 0.83M 파라미터 모델이니까요. 하지만 제가 직접 유도하고 구현한 기울기로 만들어진, 표준 라이브러리 외에는 아무것도 링크하지 않는 바이너리에서 실행되는 저만의 횡설수설입니다.
LibTorch GPU 포트도 별도의 브랜치로 완료되었습니다. 동일한 아키텍처, 동일한 하이퍼파라미터, 동일한 학습 루프입니다. 유일한 차이점은 model->to(torch::CUDA)이고, autograd가 처리해주기 때문에 600줄짜리 backward.h 전체가 삭제된다는 점입니다. RTX 3080에서 대략 75배 더 빠릅니다.
