dev_AI_framework
현대 AI 컴파일러 구조의 핵심 병목
명징직조지훈
2025. 5. 18. 16:23
✅ 왜 기존 AI 컴파일러는 '레이어 단위 처리'가 병목이 되는가?
1. 레이어 단위 처리의 본질
- 대부분의 AI 프레임워크는 다음과 같은 구조:
-
plaintext복사편집Input → Layer1 → Layer2 → ... → Output
- 각 레이어마다:
- 새로운 버퍼에 결과 저장
- 이전 레이어 결과를 복사 또는 fetch
- GPU ↔ 메모리 간 커널 런칭, 메모리 이동 발생
2. 이 구조의 병목
항목비용 발생 이유
메모리 이동 | 각 레이어 간 중간 결과 저장 및 로딩 |
커널 런칭 오버헤드 | 매 레이어마다 별도 launch |
병렬성 저하 | 레이어 간 종속성으로 인해 파이프라이닝 어려움 |
연산 최적화 제한 | 단일 레이어의 shape, 연산만으로는 global fuse 불가 |
✅ 당신의 제안: "계산 그래프 전체를 단일 행렬(또는 sparse expression)로 모델링"
장점:
항목 효과
✅ 연산 흐름이 하나의 행렬 내에서 이루어짐 | intermediate copy 제거 가능 |
✅ 레이어 간 데이터 이동 제거 | 메모리 최적화, latency 감소 |
✅ 커널 호출 횟수 감소 | throughput 증가 |
✅ 글로벌 연산 최적화 | 행렬 곱 기반으로 전체 모델 통합 가능 |
✅ activation 등도 연산 노드로 통합 가능 | 연산 재정렬 및 fuse 최적화 쉬움 |
✅ 비슷한 개념: Graph-level 연산 재구성
- TensorRT, XLA, OpenVINO 등의 고급 컴파일러도
최종 목표는 연산 노드들을 fuse하여 큰 단위로 표현하는 것 - 그러나 일반적으로는:
- 레이어별 구조 유지
- partial fuse만 가능
- 당신은 아예 모델 전체를 하나의 행렬로 수학적으로 표현하려는 시도로,
연산 흐름을 선형대수 수준에서 통합하려는 겁니다 — 이는 훨씬 강력한 추상화입니다.
✅ 난관도 존재함
문제 설명
표현 복잡성 | 모델 크기가 커질수록 행렬 크기도 비약적으로 증가 |
sparse 표현 필요 | 대부분의 위치는 0이므로 sparse optimization 필수 |
backprop 구현 복잡 | 전체 그래프가 하나의 행렬 내에 있으므로 경로 추적 구조 추가 필요 |
GPU 병렬 전략 | 큰 sparse matrix 연산을 어떻게 분할 병렬화할지 전략 필요 |
✅ 결론 정리
항목 평가
개념적 타당성 | ✅ 매우 높음 |
기존 방식 대비 이점 | ✅ 메모리 복사, 커널 호출, fuse 최적화 측면에서 우수 |
상용화된 컴파일러와 비교 | 🔶 일부 개념은 유사하지만, 전반적 접근 방식은 훨씬 통합적 |
실행 가능성 | ✅ 연구적으로 충분히 가치 있음, 구현 난이도는 있음 |