본문 바로가기

AI Compiler framework

AICF 현재 실행 구조와 IR 도입 시 변화 정리

1. 현재 실행 구조 ( IR 없는 상태 )

1.1 전체 개요

현재 AICF 는 IR 기반 컴파일러 이전 단계의 실행 시스템,

Python 프레임 워크 - CUDA 백엔드 - CUDA Graph 런타임이 직접 연결된 구조를 가진다

핵심 특징은

  • 연산 즉시 실행
  • CUDA Graph 는 이미 결정된 실행 시퀀스를 캡처
  • 최적화는 커널 내부 또는 수동 구서에 국한

 

1.2 현재 실행 경로

Python (aicf_fw)
 └─ train_step()
     ├─ Linear / LayerNorm / ReLU / ...
     │    └─ backend.op_call_out(...)
     │         └─ _C.op_call(...)
     │              └─ dispatch_v0(...)  // 즉시 CUDA kernel enqueue
     ├─ autograd_backward(...)
     │    └─ op_call_out(...) 반복
     └─ optimizer.step()
  • python 에서 연산이 호출되는 순간
  • C++ 바인딩이 TensorDesc / AttrPack 을 만들고
  • dispatch_v0 를 통해 CUDA Kernel 이 바로 enqueue 됨

 

1.3 CUDA Graph 와의 관계

  • capture_begin 호출 이후
    • 모든 C.op_call 은 AICF 전용 stream 으로 enqueue
    • CUDA runtime 이 enqueue 된 kernel 들을 graph 로 기록
  • capture_end()
    • graph - graphExec 생성
  • replay
    • 동일한 graph Exec 을 반복 실행

CUDA Graph 는 이미 python 이 실행한 커널 시퀀스를 그대로 저장하는 역할

 

2. IR 기반 AI 컴파일러 도입 시 개녑적 변화

op_call 이 실행을 의미하지 않게 된다.

즉, 연산 호출과 실제 실행 사이에 컴파일 단계가 삽입된다.

 

3. IR 도입 후의 실행 구조 

3.1 단계 분리

  1. Trace / IR 생성 단계
  2. Compile / lowering 단계
  3. Runtime 실행 단계

1,3 번이 지금 구조에서 분리된다.

 

3.2 Trace / IR 생성 단계

  • python 프레임워크는 더 이상 커널을 실행하지 않음
  • 대신 연산 정보를 IR Node 로 기록
Python (trace mode)
 └─ Linear(x, W)
      └─ ir_add_node(
            op=Gemm,
            inputs=[x_id, W_id],
            outputs=[y_id],
            attrs={transB: true}
         )

해당 단계에선

  • cuda kernel 실행 x
  • cuda graph capture x
  • 오직 그래프 구조 기록만 수행

 

3.3 compile / lowering 단계

C++ 컴파일러 코어가 IR 을 받아서 다음을 수행

  • IR 정규화
  • IR-level 최적화
  • 커널 variant 선택
  • buffer lifetime 분석 및 메모리 플랜 생성
  • executino plan 생성

이 시점에서

  • 어떤 op_call 을
  • 어떤 순서로
  • 어떤 버퍼를 써서 실행할지가 결정됨

 

3.4 Runtime 실행 단계

  • Execution Plan 을 실행
  • 이 때 비로소
    • C.op_call
    • dispatch_v0
    • CUDA Graph capture 가 사용됨

op_call 은 컴파일 결과를 실행하는 내부 도구가 된다.

 

4. op_call 의 역할 변화

현재

op_call == 실행
  • python 이 호출, 즉시 커널 실행
  • capture 중이면 그래프에 기록

IR 도입 시 

op_call == 실행 엔진의 내부 primitive
  • python trace 단계에서는 호출되지 않음
  • C++ runtime / planner 가 plan 실행 시 호출
  • 실행 시점은 컴파일 결과에 의해 결정

 

5. CUDA Graph 캡처의 위치 변화

현재

  • python 이 capture_begin / end 를 직접 호출
  • python 코드 실행 자체가 캡처 대상

ir 기반 구조

  • c++ runtime 이 내부적으로 capture 수행
  • python 은 이 그래프를 실행해달라는 요청만 전달
Python: run(graph_key)
C++  : if not cached:
          build plan
          capture(plan)
       replay(plan)

 

6. 바뀌는 것과 유지되는 것

바뀌는 것

  • op_call 호출 시점
  • python 의 역할
  • cuda grahp 캡처 주제
  • 실행 경로의 결정 시점

유지되는 것

  • 커널 구현
  • cuda graph 매커니즘 자체
  • 스트림 정책
  • backend / registry 구조

 

실행 중심에서 컴파일 중심 구조로 전환

op_call 이 실행 지시에서 컴파일 결과 실행으로 의미가 바뀌는 것