본문 바로가기

dev_AI_framework

AI Compiler — Role by Graph Type (정적 vs 동적 그래프 형태에 따른 AI 컴파일러의 역할 차이)

1️⃣ 개요 (Overview)

AI Compiler의 핵심 목적은

Python 레벨의 연산 그래프를 분석·변환하여, 하드웨어 친화적이고 고정된 실행 경로로 최적화하는 것”이다.

하지만 이 역할은 그래프 구조가 고정(static) 인지,
혹은 런타임에 변하는(dynamic) 지에 따라 완전히 달라진다.


2️⃣ 정적 그래프 (Static Graph)

💡 정의

  • 입력 shape, 연산 순서, control flow가 고정되어 있음.
  • Graph를 한 번만 capture/compile 하면 이후 수천 번 재사용 가능.

🧠 AI Compiler의 역할

역할설명
Graph Capture / IR 생성 Python 모델을 내부 IR로 변환하여 정적 실행 그래프 구성
Kernel Fusion / Scheduling 연속된 연산(bias+act+dropout 등)을 단일 커널로 융합
Memory Planning 모든 텐서의 크기와 생애(lifetime)를 알고 있으므로 정적 메모리 배치 가능
CUDA Graph Capture Forward→Backward→Optimizer 전체를 하나의 capture로 고정하여 replay
Recompilation 제거 동일 shape 입력에 대해 Python 오버헤드 없이 반복 실행

⚙️ 장점

  • 실행 효율 극대화 (launch overhead 제거)
  • 메모리 예측 가능성 높음
  • 하드웨어 수준의 최적화 가능 (Tensor Core, warp scheduling 등)

⚠️ 한계

  • shape이나 control flow가 바뀌면 재컴파일 필요
  • 완전한 정적 구조를 요구하므로, 유연한 모델 표현에는 부적합

3️⃣ 동적 그래프 (Dynamic Graph)

💡 정의

  • 입력 데이터나 조건에 따라 그래프 구조가 변함.
  • 실행 시점(runtime)에서 새로운 graph가 생성됨.

🧠 AI Compiler의 역할

역할설명
Shape Specialization 런타임에 입력 shape을 감지하고, 기존 그래프 중 캐시된 버전을 재사용하거나 새로 컴파일
Dynamic IR Tracing 분기, 반복, 조건 등을 추적하여 각 실행 경로별로 subgraph 생성
Partial Compilation 고정 가능한 부분만 정적으로 컴파일하고, 나머지는 fallback (Python/eager) 처리
Dynamic Kernel Registry 다양한 shape/signature에 맞는 커널 세트를 캐싱 및 재활용
Hybrid Execution Python에서 결정된 control flow를 따라 CUDA Graph 단위로 실행 연결 (Path Linearization)

⚙️ 장점

  • 유연한 제어 흐름 표현 가능
  • 복잡한 입력 구조(트리, 그래프, variable-length 등)에 대응
  • 연구용, 실험용 모델에서 빠른 프로토타이핑

⚠️ 한계

  • 그래프 변경 시 재컴파일 오버헤드 발생
  • 최적화 불완전 (모든 경로를 미리 최적화 불가)
  • branch 선택이 확률적 / 근사적 (학습 불안정성 유발)

4️⃣ AI Compiler의 하이브리드 전략 (Unified Strategy)

현대적 AI 컴파일러(PyTorch 2.0 / XLA / TensorRT-LLM 등)는 완전한 정적 또는 완전한 동적을 지양하고,
“정적 + 동적 하이브리드” 접근을 취한다.

전략설명
Tracing + Caching 다양한 shape/signature에 대해 실행 그래프를 trace 후 캐시
Dynamic Key 기반 Graph Lookup GraphKey = (shape, dtype, path signature) 로 그래프 재사용
Segmented Graph Capture 전체 그래프를 segment 단위로 나누어 일부만 재캡처
Speculative Compilation 예상 가능한 패턴(shape range)에 대해 미리 컴파일
Fallback-safe Runtime 미지원 연산은 Python fallback으로 실행하되, 그래프 안정성 유지

5️⃣ 결론 (Summary)

구분정적 그래프 (Static)동적 그래프 (Dynamic)
구조 고정된 연산 경로 입력/조건에 따라 변함
컴파일러 역할 전체 그래프를 완전 정적으로 컴파일 실행 중 그래프를 부분적으로 추적·재컴파일
최적화 범위 전체 경로 (global) 부분 경로 (local/subgraph)
실행 효율 매우 높음 낮거나 불안정함
유연성 낮음 매우 높음
적용 사례 CNN, Transformer, ViT 등 MoE, RNN, GNN, TreeLSTM 등

요약하자면,

AI Compiler의 역할은 정적 그래프에서는 “완전한 실행 고정화(compile-once, replay-many)”,
**동적 그래프에서는 “실행 중 변화에 대응하는 부분적 컴파일과 캐싱”**이다.