AI 컴파일러란?
AI 모델을 효율적으로 실행하기 위해 중간 표현(Intermediate Representation, IR)으로 변환하고, 하드웨어별 최적화된 실행 코드로 컴파일하는 시스템을 의미
전통적인 컴파일러가 “C/C++ 같은 소스 코드를 기계어로 변환”한다면, AI 컴파일러는 “딥러닝 모델 그래프를 GPU, TPU, CPU 같은 다양한 하드웨어에서 최적 성능을 내도록 변환”하는 역할
1. 일반적인 정의
- 입력: 딥러닝 프레임워크(Pytorch, TensorFlow 등)에서 정의된 연산 그래프(예: matmul, conv, relu …).
- 중간 표현(IR): 하드웨어 독립적인 중간 언어로 모델을 추상화 (ex: XLA HLO, MLIR, TVM IR).
- 출력: 특정 하드웨어용 최적화된 코드 (CUDA kernel, LLVM IR → 기계어, etc).
즉, 모델 정의 → IR 변환 → 최적화 → 하드웨어 코드 생성을 수행합니다.
2. 주요 역할
- 그래프 최적화 (Graph Optimization)
- 불필요한 연산 제거 (fusion, constant folding 등)
- 커널 합치기 (fusion)로 메모리 접근 최소화
- 레이아웃 변환(NHWC ↔ NCHW)
- 하드웨어 추상화
- 같은 모델을 GPU, TPU, CPU, NPU 등 다양한 기기에서 실행 가능
- 벤더별 라이브러리(CuBLAS, MKLDNN, ROCm 등) 자동 호출
- 성능 향상
- 연산 병렬화, 메모리 사용 최적화
- 연산자 단위보다 큰 “연산 그래프 단위”로 최적화 → 기존 프레임워크 실행보다 빠름
예시 (Dense + ReLU)
- 모델 그래프: Z = ReLU(X @ W + b)
- 기본 실행:
- Kernel 1: MatMul(X, W)
- Kernel 2: Add(b)
- Kernel 3: ReLU(Z)
- AI 컴파일러 최적화 후:
- Kernel Fusion → 하나의 CUDA 커널에서 MatMul + Add + ReLU까지 수행
- 메모리 왕복 최소화 → 속도 증가
AI 컴파일러가 모델 그래프를 해석 → 최적 커널 선택까지 가려면, 결국 “선택지”가 다양해야 하니까 여러 종류의 커널 구현이 필수
1. 왜 다양한 커널이 필요한가?
- 연산 특화: 같은 행렬 곱이라도 입력 크기/배치 크기/레이아웃에 따라 다른 알고리즘이 더 효율적임.
- 작은 행렬 → 단순 GEMM보다 타일링 없는 direct kernel이 더 빠름
- 큰 행렬 → cuBLAS GEMM 같은 고도로 최적화된 라이브러리가 유리
- 하드웨어 차이: GPU, CPU, TPU, NPU마다 최적의 연산 방식이 다름.
- 연산 조합(fusion): Conv + BiasAdd + ReLU를 따로 하면 느린데, fused kernel을 구현하면 훨씬 빠름.
즉, AI 컴파일러가 “이 상황에선 어떤 커널을 써야 제일 빠른가?”를 고르려면 다양한 후보 커널이 필요
2. 필요한 커널 종류 예시
- 기본 연산 커널 (Primitive Ops)
- MatMul / GEMM / GEMV
- Convolution (direct, Winograd, FFT 기반 등)
- Element-wise (Add, Mul, ReLU, Sigmoid, Softmax …)
- Fused 커널 (연산 결합 버전)
- Conv + Bias + ReLU
- MatMul + Add + Activation
- LayerNorm + Dropout
- 메모리 최적화 커널
- inplace Add / inplace Activation
- layout transform (NCHW ↔ NHWC)
- reduction ops (sum, mean, max) with shared memory 최적화
- 하드웨어 특화 커널
- GPU: CUDA warp-level GEMM, Tensor Core 활용 커널
- CPU: AVX/AVX512, OpenMP 벡터화된 GEMM
- TPU/NPU: systolic array에 맞는 특수 커널
현재 나는 기본 연산 단위만 실행, 여러 커널 후보 등록 ㅣㅍㄹ요
'dev_AI_framework' 카테고리의 다른 글
| operator mapping 전략 짜기 - string or int ?? 메모리 효율, 빠른 비교를 위해 int 위주 매핑 전략 사용하기 (0) | 2025.09.01 |
|---|---|
| 폴더 및 파일 구조 변경 - Python 내 통제 방법으로 변경 예정 (2) | 2025.09.01 |
| cuda 내 연산 수행을 어떻게 하는게 이득일지 - 나눠서, 한 번에 (1) | 2025.09.01 |
| on-the-fly 전치 + 타일렁 누적 VS cuBLAS 의 비교 (0) | 2025.08.31 |
| 현재 GEMM 구현 내용 (0) | 2025.08.31 |