본문 바로가기

AI Compiler framework

기존의 구조가 컴파일러로서 부족한 이유, 새롭게 제안한 구조 - IR 표현 재구성 단계 추가

1. 문제 제기

초기 구조는 다음과 같은 실행 모델을 가진다.

  • Python에서 그래프를 만들고
  • 실행 시점에 op_call을 통해
  • CUDA backend가 런타임 디스패치로 커널 variant를 선택하고
  • 해당 커널을 실행한다

이 구조는 성능은 좋고, 실행은 안정적이지만
“AI Compiler”라는 이름을 붙이기에는 어딘가 부족한 감각을 남긴다.

그 이유는 단순히 코드 생성이 없어서가 아니라, 결정이 언제, 어디에, 어떤 형태로 존재하는가에 있다.

 

2. 이전 구조가 Compiler 로 느껴지지 않았던 이유

2.1 결정이 런타임에 일어난다

이전 구조의 핵심흐름

IR → lowered ops
   → op_call
     → dispatch (runtime)
       → kernel variant 선택
         → kernel launch

중요한 점

  • 커널 선택이라는 핵심 결정이
  • 실행 시점마다
  • backend 내부에서 이뤄진다는 점

frontend, IR 에는 결정이 없다.

 

IR 은 무엇을 계산할지만 알고 있고, 어떻게 계산할지는 실행 중에 backend ( CUDA ) 가 판단한다

이 구조는 다음의 성격을 띈다.

  • 의미 : Python / IR
  • 결정 : CUDA backend
  • 실행 : CUDA kernel

이 때문에 구조적으로는 smart runtime 에 가까움

 

2.2 결정 결과가 의미적 표현으로 남지 않는다

이전 구조에서 커널 선택은 실제로는 한 번만 일어난다

  • warmup / capture 시점에서 dispatch 가 실행되고
  • CUDA Graph 에 kernel launch 시퀀스가 기록되며
  • replay 시에는 해당 커널들이 그대로 실행된다.

이 결정은 다음의 특징

  • CUDA Graph 내부에만 존재
  • 커널 포인터와 grid / block 정보만 남음
  • 왜 이 커널인가라는 의미 정보는 소실됨

  • 실행 결과는 고정되지만
  • 결정의 의미는 프로그램으로 남지 않는다.

이 때문에

  • 재최적화 불가
  • 분석 불가
  • 다른 backend 로의 이식 불가

컴파일 산출물, artifact 로 보기 어렵다

 

2.3 backend 가 결정을 담당한다

전통적 컴파일러 구조에서는

  • frontend / optimizer 가 결정을 내리고
  • backend 는 그 결정을 실행하거나 검증한다

하지만 이전 구조에서는

  • backend 가
  • 이 shape 에는 이 커널을
  • 런타임에 직접 결정한다

즉, 컴파일러의 핵심 책임이 backend 에 남아 있다.

이로 인해 구조적으로

  • Python 은 스케줄러
  • CUDA 는 의사 결정자 + 실행자

처럼 보이게 됨

 

3. 제안한 구조의 핵심 변화

의미를 가진 IR 위에서 Python 이 결정을 끝내고, CUDA 는 그 결정을 실행만 하게 한다

 

4. 제안한 구조에서 Compiler 가 충족되는 이유

4.1 IR 위에서 의미 기반 결정이 이루어진다

Python 쪽에서 다음 작업들이 수행된다.

  • IR 생성
  • lowering 
  • IR 변환 / 압축
    • epilogue 흡수
    • save 제거
    • inplace overwrite 결정
    • meta tnesor 분리
  • 커널 / 알고리즘 선택
High-level IR
  → Lowered IR
    → Decision-applied IR (압축된 IR)

이 과정은

  • 연산의 의미를 이해한 상태에서
  • 실행 전략을 선택하고
  • 그 선택을 IR 구조에 반영하는 과정

정의상 컴파일러의 역할

 

4.2 결정 결과가 IR 에 의미적으로 남는다

이 구조에서는

  • 커널 선택
  • epilogue 구성
  • inplace 여부
  • meta tensor 사용 방식

등이 모두 IR 변환 결과로 남는다

  • fused gemm + relu
  • in-place overwrite
  • host-managed static

같은 결정이 프로그램의 일부가 된다

이 IR 은

  • 설명 가능
  • 재실행 가능
  • 재최적화 가능
  • backend 교체 가능

컴파일 산출물로서 의미를 갖는다.

 

4.3 CUDA 는 ISA-like executor 로 역할이 축소된다

  • 주어진 TensorDesc
  • 주어진 kernel
  • 주어진 stream

을 기반으로 연산만 수행한다

CUDA 는 더 이상

  • 어떤 커널을 쓸 지
  • 어떤 epilogue 를 붙일지
  • 어떤 메모리 전략을 쓸지

를 결정하지 않고 단순 실행만 수행한다