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)”,
**동적 그래프에서는 “실행 중 변화에 대응하는 부분적 컴파일과 캐싱”**이다.
'dev_AI_framework' 카테고리의 다른 글
| 현재 상황 정리, 앞으로 뭘 어떻게 해야 할까 (0) | 2025.11.06 |
|---|---|
| graph_executor, 어떤 방식으로 graph_key, pool 의 분리, 재사용 확인 (0) | 2025.11.04 |
| 세 단계로 구분한 AI 개발자 ( ML 연구자, 커널 엔지니어, 컴파일러 엔지니어 ) (0) | 2025.10.29 |
| 지금까지 실행 파이프 라인 ( graph_capture, planner ... ) 향후 pattern matting 을 추가하기 위해 확인 (0) | 2025.10.29 |
| Graph Execution & Planning 과 CUDA Graph Capture & Stability 의 차이 (0) | 2025.10.28 |