본문 바로가기

AI Compiler framework

그래프 최적화 기법 ( Fusion, Constant Folding, CSE )

그래프 최적화 중심 AI 컴파일러가 수행하는 대표적인 최적화 기법

 

1. 서브 그래프 합치기 ( Operator / Subgraph Fusion )

개념 정의

서브그래프 합치기(fusion)
여러 개의 연속된 연산 노드를 하나의 커널로 결합하여 실행하는 최적화 기법이다.

예를 들어 다음과 같은 연산 그래프가 있을 때:

y = relu(x @ W + b)

그래프 상에서는 보통 다음과 같이 표현된다:

x ──▶ GEMM ──▶ BiasAdd ──▶ ReLU ──▶ y

Fusion을 적용하면 이를 다음과 같이 하나의 커널로 합칠 수 있다:

x ──▶ FusedGemmBiasReLU ──▶ y

 

Fusion의 목적

Fusion은 주로 다음 문제를 해결하기 위해 사용된다.

  1. 메모리 트래픽 감소
    • 중간 텐서(GEMM 출력, BiasAdd 출력)를 글로벌 메모리에 쓰고 다시 읽는 비용 제거
  2. 커널 런치 오버헤드 감소
    • 여러 CUDA kernel launch → 하나의 launch
  3. 레지스터/공유 메모리 재사용
    • 중간 결과를 레지스터에 유지 가능

 

일반적인 Fusion 방식

그래프 최적화 컴파일러는 보통 다음 단계를 거친다.

  1. 연산 패턴 탐색
    • 예: GEMM → BiasAdd → ReLU
  2. 지원 가능한 fusion 패턴인지 검사
  3. 새로운 fused op 생성
  4. 기존 노드 제거 및 그래프 재작성(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 연산과 충돌 가능