TL;DR

  • 한 학기 실습 과정에서 학생들이 UOp와 재작성부터 시작해 GPU에서 최신 성능 수준의 대형 언어 모델(LLM) 학습까지 가능한 컴파일러를 처음부터 구축함.
  • 과정은 매주 이전 주차의 결과물에 크게 의존하며, 초기에 쌓인 구현상의 허술함이 누적되면 수료하지 못할 수 있음.
  • 강의 계획서는 사양을 제시하고 구현 방식과 프로그래밍 언어 선택은 학생에게 맡기며, 시작 코드 없이 UOp용 간단한 공통 교환 형식을 사용함.
  • 초반에는 요소별 연산, 그래프 재작성, C 렌더링과 런타임을 다루고, 이후 루프·메모리 계층·커널 융합을 거쳐 CPU 최적화를 진행함.
  • 후반에는 멀티스레딩, GPU, 하드웨어 가속기, 자동 미분과 실제 모델 학습을 다루며 학생 프로젝트로 컴파일러를 확장함.

머신러닝 컴파일러 과정

  • 한 학기 동안 학생들이 요소별 프로그램으로 시작해 GPU에서 최신 성능 수준의 LLM을 학습하는 단계까지 자체 컴파일러를 구축하는 실습 중심 과정임.
  • 매주 이전 주차의 작업물을 적극적으로 쌓아 올리는 구성으로, 초기에 구현상의 허술함을 허용하면 문제가 누적되어 과정을 끝내지 못할 수 있음.
  • 강의 계획서는 사양을 제시하되 구현 방법은 규정하지 않으며, 구현 언어 선택도 학생에게 맡김.
  • 시작 코드는 제공하지 않으며, UOp를 위한 범용적이고 단순한 교환 형식을 정함.
  • 예시 형식은 256×256 행렬 곱셈(GEMM)을 버퍼 선언, 모양 변경, 곱셈, 덧셈 축소 연산으로 표현함.

1주 차: UOp와 재작성

  • 주제는 UOp, 요소별 연산, 기호 연산, 재작성, 렌더러임.
  • UOp에 익숙해지고 요소별 프로그램을 컴파일하고 단순화하는 컴파일러를 작성함.
  • 그래프 구조와 재작성 기법을 도입하며 UOp는 해시 컨싱(hash consing)을 적용함.
  • UOp는 연산(op), UOp 튜플인 입력(src), 인자(arg)로 구성됨.
  • 재귀 속성으로 불리언·정수·부동소수점 데이터형(dtype)을 도입함.
  • 연산은 PARAM(ParamArg), CALL(CallArg), CONST, CAST, NEG, RECIP, EXP2, LOG2, ADD, MUL, CMPLT, CMPNE, MAX, FLOORDIV, FLOORMOD, WHERE임.
  • PARAM은 호출에 전달되는 입력 인자이며, CALL은 src[0]에 함수 본문을, src[1:]에 매개변수를 둠. CONST의 데이터형은 인자로 결정됨.
  • 불리언 연산에서 MUL은 AND, MAX는 OR, CMPNE는 XOR에 해당함.
  • 그래프 재작성 엔진은 상수 접기를 통해 프로그램을 실행할 수 있어야 함.

2주 차: 렌더링, 런타임, 메모리

  • C 프로그램을 컴파일하고 실행할 수 있는 렌더러와 런타임을 작성함.
  • 재귀 속성으로 정수 튜플인 shape와 MEM, ALU 주소 공간(addrspace)을 도입함.
  • 연산은 BUFFER(ParamArg), ALLOC(ParamArg), INDEX, LOAD, STORE, AFTER임.
  • BUFFER는 호출에 포함되지 않는 전역 영구 버퍼이며, ALLOC은 호출 범위 저장 공간으로 float a[10]과 같은 예가 있음.
  • 메모리와 즉시값(immediate)을 다루는 루프 없는 C 함수를 렌더링할 수 있음.

3주 차: 루프와 이동 연산

  • 주제는 루프, 이동 연산, 축소 연산, 합성곱, rangeify임.
  • 이동 연산과 루프를 도입하며, 기본 이동 연산으로 GEMM과 합성곱을 유도할 수 있음.
  • 연산은 인자에 사양을 두는 RESHAPE, EXPAND, PERMUTE, FLIP, PAD, SHRINK, 그리고 RANGE, END, REDUCE임.
  • REDUCE는 축 개수와 연산을 지정함.

4주 차: 커널 분할과 융합

  • 컴파일러가 모든 모델을 커널로 분할하고 C로 컴파일할 수 있는 단계임.
  • 인덱싱할 수 있는 임시 버퍼인 STAGE 연산을 도입함.

5~6주 차: 메모리 계층과 고속 커널

  • 주제는 메모리 계층, 업캐스팅, 고속 GEMM, 플래시 어텐션임.
  • 이 단계에서도 CPU만 사용하지만 GEMM, 축소 연산, 합성곱에 대해 최신 성능 수준에 경쟁력 있는 C 코드를 생성할 수 있음.
  • 새 연산은 추가하지 않음.
  • 많은 학생이 3~4주 차의 구현을 다시 작성해야 함을 깨닫게 됨.

7~8주 차: 멀티스레딩, GPU, 하드웨어 가속기

  • 주제는 병렬 처리, GPU, 하드웨어 가속기, 텐서 코어임.
  • 커널, GPU, 축 매핑, 텐서 코어를 도입함.
  • 이 단계에서는 PyTorch와 경쟁할 만한 CUDA/HIP 코드를 생성할 수 있음.

9~10주 차: 실제 모델과 자동 미분

  • 실제 LLM과 자동 미분을 구현해 모델을 학습함.

11주 차부터 과정 종료까지: 학생 프로젝트

  • 컴파일러로 논문을 구현하거나, 특이한 하드웨어로 포팅하거나, 그 밖의 프로젝트를 수행함.

한눈에 보기

  • 1~2주 차 — UOp, 요소별 연산, 기호 연산, 재작성: 요소별 프로그램을 C로 컴파일하고 단순화함.
  • 3~4주 차 — 루프, 이동 연산, 축소 연산, rangeify: 느리지만 올바르게 모든 모델을 C로 컴파일함.
  • 5~6주 차 — 메모리 계층, 업캐스팅, GEMM, 합성곱: 최신 성능 수준에 경쟁력 있는 CPU 코드를 생성함.
  • 7~8주 차 — 호출, GPU, 가속기, 텐서 코어: PyTorch와 경쟁할 만한 CUDA/HIP 코드를 생성함.
  • 9~10주 차 — 실제 모델, 자동 미분: 실제 LLM을 학습함.
  • 11주 차 이후 — 학생 프로젝트: 프로젝트를 선택해 컴파일러를 확장함.