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주 차 이후 — 학생 프로젝트: 프로젝트를 선택해 컴파일러를 확장함.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요