그래프 최적화 중심 AI 컴파일러가 수행하는 대표적인 최적화 기법
1. 서브 그래프 합치기 ( Operator / Subgraph Fusion )
개념 정의
서브그래프 합치기(fusion) 는
여러 개의 연속된 연산 노드를 하나의 커널로 결합하여 실행하는 최적화 기법이다.
예를 들어 다음과 같은 연산 그래프가 있을 때:
y = relu(x @ W + b)
그래프 상에서는 보통 다음과 같이 표현된다:
x ──▶ GEMM ──▶ BiasAdd ──▶ ReLU ──▶ y
Fusion을 적용하면 이를 다음과 같이 하나의 커널로 합칠 수 있다:
x ──▶ FusedGemmBiasReLU ──▶ y
Fusion의 목적
Fusion은 주로 다음 문제를 해결하기 위해 사용된다.
- 메모리 트래픽 감소
- 중간 텐서(GEMM 출력, BiasAdd 출력)를 글로벌 메모리에 쓰고 다시 읽는 비용 제거
- 커널 런치 오버헤드 감소
- 여러 CUDA kernel launch → 하나의 launch
- 레지스터/공유 메모리 재사용
- 중간 결과를 레지스터에 유지 가능
일반적인 Fusion 방식
그래프 최적화 컴파일러는 보통 다음 단계를 거친다.
- 연산 패턴 탐색
- 예: GEMM → BiasAdd → ReLU
- 지원 가능한 fusion 패턴인지 검사
- 새로운 fused op 생성
- 기존 노드 제거 및 그래프 재작성(rewrite)
Fusion의 단점과 복잡성
Fusion은 강력하지만 다음과 같은 비용을 가진다.
- 패턴 수가 많아질수록 관리 난이도 급증
- shape / dtype / layout 조건에 매우 민감
- fusion 여부가 런타임 조건에 따라 달라질 수 있음
- 디버깅이 어려움
→ “이 결과는 GEMM 때문인가, ReLU 때문인가, fused kernel 때문인가?”
2. 상수 접기 ( Constant Folding )
개념 정의
상수 접기(constant folding) 는
그래프 내에서 입력이 모두 상수인 연산을 컴파일 타임에 미리 계산해 버리는 최적화다.
예:
y = (2 * 3) + x
그래프 상에서는:
2 ──▶ Mul ──▶
Add ──▶ y
3 ─────────▶ ^
x
Constant folding을 적용하면:
y = 6 + x
Mul 노드는 제거되고, 6이라는 상수만 남는다.
Constant Folding의 목적
- 불필요한 연산 제거
- 런타임 계산량 감소
- 그래프 단순화 → 이후 최적화 기회 증가
일반적인 적용 예시
- shape 계산
- 고정된 scale / bias
- 사전 계산 가능한 normalization 상수
- fixed positional encoding 일부
단점 및 주의점
- “상수”의 정의가 애매해질 수 있음
- 학습 중 파라미터는 상수인가?
- inference-only 그래프인가?
- 디버깅 시:
- “이 값은 어디서 계산됐지?” 추적이 어려워질 수 있음
- precision / overflow 문제를 컴파일 타임에 고정해버릴 위험
3. 공통 부분 제거 (CSE : Common Subexpression Elimination)
개념 정의
공통 부분 제거(CSE) 는
그래프 내에서 동일한 계산이 여러 번 반복될 경우,
이를 한 번만 계산하고 결과를 재사용하도록 바꾸는 최적화다.
예:
a = x + y
b = x + y
CSE 적용 전:
x ──▶ Add ──▶ a
y ──▶
x ──▶ Add ──▶ b
y ──▶
CSE 적용 후:
x ──▶ Add ──▶ t
y ──▶ ├─▶ a
└─▶ b
CSE의 목적
- 중복 계산 제거
- 연산량 감소
- 메모리 및 실행 시간 절약
CSE가 어려운 이유
- “같다”의 정의가 까다로움
- dtype
- shape
- broadcasting 규칙
- side-effect 여부
- floating-point 연산에서는
- 연산 순서 변경이 수치 결과에 영향을 줄 수 있음
- 메모리 aliasing / in-place 연산과 충돌 가능
'AI Compiler framework' 카테고리의 다른 글
| AICF Framework - Execution & Synchronization Model (0) | 2026.01.22 |
|---|---|
| 테스트 코드를 통한 파일 실행 순서 확인 (0) | 2026.01.21 |
| AICF v2 실행 과정 정리 (0) | 2026.01.21 |
| 기존의 구조가 컴파일러로서 부족한 이유, 새롭게 제안한 구조 - IR 표현 재구성 단계 추가 (1) | 2026.01.20 |
| ISA vs Compiler (0) | 2026.01.20 |