[AI 컴파일러] Operator Fusion 기법 with TVM
Operator Fusion
여러 개의 작은 연사자들을 하나의 큰 커널(kernel) 함수로 합치는 최적화 기법
왜 operator Fusion을 하는 가?
- 메모리 접근 횟수 감소
- 커널 호출 오버헤드 감소
- 병렬 최적화 : SIMD, Tensor Core, NPU MAC 배열 등으로 더 최적화해 실행 가능
- Low-precision 최적화 용이 : 연산자를 합친 상태가 더 quantization-friendly함
- Fusion 전
A + B -> Temp -> ReLU(Temp) -> C- GPU가 메모리에서 A, B를 읽음
- 더하기 연산 수행
- 결과값을 VRAM에 씀
- VRAM에서 다시 읽음
- ReLU 수행 후 결과값 C를 VRAM에 씀
- Fusion 후
Fused_Func(A, B) -> C- GPU가 A,B를 읽음
- 더하기 연산을 수행하고, 결과를 레지스터(캐시)에 잠시 저장
- 저장한 값을 바로 ReLU 수행
- 결과값 C를 VRAM에 씀
=> Memory I/O 감소 & Kernel Launch Overhead 감소
TVM에서 Fusion 전략
- Injective(일대일 매핑) : element-wise 연산 (addition, subtraction, scale, ReLU)
-> injective operation끼리 서로 쉽게 fuse 가능 - Reduction(축소) : 여러 element 들간의 연산 (e.g., sum)
-> injective operators 마지막에 fuse 가능 - Complex-out-fusable(복잡한 연산) : 복잡한 연산 (e.g., Conv2D) -> Complex-out-fusable operator 뒤에 injective operator가 fuse 가능
- Opaque(fuse할 수 없는 연산) : (e.g., sort)
주로 Fuse되는 연산들
- Conv + BatchNorm
- Conv + ReLU
- Conv + BN + ReLU
- Conv + Add + ReLU (Residual block 패턴)
- MatMul + Add
- GEMM + Activation
Transformer에서 자주 일어나는 fusion - QKV Linear fusion
- Add + LayerNorm
- Attention Softmax + Mask
- GELU + Bias Add
예시1 Conv + BN
BN 공식:
1
y = gamma * (x - mean) / sqrt(var + eps) + beta
=> Conv + BN
새 weight:
1
W' = W * gamma / sqrt(var + eps)
새 bias:
1
b' = beta + (b - mean) * gamma / sqrt(var + eps)
출처
- https://operatingsystems.tistory.com/entry/TVM-An-Automated-End-to-End-Optimizing-Compiler-for-Deep-Learning
- https://computing-jhson.tistory.com/45#google_vignette
- https://github.com/andersy005/tvm-in-action?tab=readme-ov-file
This post is licensed under CC BY 4.0 by the author.