딥러닝 프레임워크 (Pytorch, TensorFlow, JAX 등 ) 은 본질적으로 inference 성능을 기준으로 설계된 runtime 구조를 가진다.
그 이유는 training 과 inference 이 시스템 관점에서 요구하는 특성이 다르기 때ㅜㅁㄴ
1.Training vs Inference 요구 조건의 차이
Training
- dynamic control-flow 필요
- autograd graph 매 iteration 새로 생성
- 메모리, CPU, GPU 모두 매우 복잡하게 움직임
- python-level branching, 반복, shape 변화가 자연스럽게 발생
Training = dynamic execution + autograd engine 중심 구조
Inference
- 동일한 연산 패턴 반복
- control-flow 거의 없음
- static shape 선호
- 빠르고, determinism 필요
- python 레이어 제거 선호
Inference = static, 고정된 실행 경로를 빠르게 돌리는 구조
상용 프레임워크는 이 inference 의 고정성과 단순성을 기준으로 내부 runtime 을 최적화한다.
상용 프레임워크의 기본 전제
"학습은 dynamic, 추론은 static"
- 학습 시에는 그래프가 매번 달라져도 됨
- 추론 시에는 그래프가 변경되어선 안 됨
- 그래야 최적화, fusion, kernel selection, scheduling 이 가능
추론 runtime을 중심으로 발전
상용 프레임워크마다 추론 runtime 이 따로 있다.
추론 Runtime 이란?
고정된 모델 그래프 + 학습된 파라미터를 실제 하드웨어에 맞춰 최대한 빠르고 안정적으로 실행시키는 엔진
실행 플랜을 만들고 돌리는 시스템 계층이 바로 runtime
추론 runtime의 핵심 책임들
그래프 로딩 & 준비
- 이미 학습된 모델을 static graph 형식으로 로딩
- 예: ONNX graph, TorchScript graph, 내부 IR
- 이 시점에서:
- 연산 노드: matmul, conv, add, relu…
- edge: 텐서의 흐름
- shape, dtype, layout 정보 포함
runtime의 첫 역할은 “이 그래프를 이해 가능한 내부 표현(IR)로 옮기는 것”
그래프 최적화 (Graph Optimization
여기서부터 “inference runtime 기반”이라는 말이 의미를 갖는다.
- 연산 fusion
- GEMM + bias + activation → 하나의 kernel
- Conv + BN + ReLU → 하나로 합치기
- constant folding
- 변하지 않는 텐서/상수는 미리 계산해서 그래프에서 제거
- 불필요한 op 제거
- identity, no-op cast, 중복 reshape 등 정리
- layout 변환
- NCHW ↔ NHWC, etc. 하드웨어/커널에 맞게 맞춤
즉,
“고정된 그래프”라는 전제를 깔고, 이걸 한 번 싹 다 뜯어고쳐서 “GPU가 좋아하는 형태”로 변환하는 게 추론 runtime의 핵심 역할 중 하나다.
메모리 플래닝 (Memory Planning)
추론은 학습보다 간단하지만, 여전히 메모리가 크다.
- 각 노드의 입출력 텐서 크기 계산
- 텐서의 liveness 분석
- 가능한 동일 버퍼 재사용
- workspace 버퍼 할당
- 일부 텐서는 persistent, 일부는 매 요청마다 재사용
매번 동적할당을 하는 것이 아닌, 텐서 생애를 분석해서 메모리를 계획적으로 재사용하는 시스템
커널 선택과 디스패치 Kernel Dispatch
각 연산 노드는 실제로는 어떤 커널로 실행할지 선택해야 한다.
이 노드는 어떤 커널이 제일 빠른지를 결정해서 디스패치한다.
추론 runtime = IR 노드를 실제 컨러로 매핑하고, 선택/튜닝하는 층
실행 스케줄링 Execution Scheduling
그래프에는 dependency 가 있다. 이걸 보고 runtime 의 결정
- 특정 노드 실행 순서 topological order
- 병렬 가능한 노드를 어떤 stream 에 나눌지
- multi-stream / multi-GPU / multi-request 상황에서
- 어느 시점에 어느 연산을 스케줄링할지
- CUDA Graph capture
- 그래프 전체를 capture 하고 이후에는 replay 만 하도록
고정된 그래프 + 디바이스 조건에 의해 그대로 반복 재사용할 수 있다.
'dev_AI_framework' 카테고리의 다른 글
| 🧭 GE2 Runtime — 설계 회고 (Design Retrospective) (3) | 2025.12.01 |
|---|---|
| 어느 환경에서 학습 시 매 번 새로운 graph 가 생성될까 (0) | 2025.12.01 |
| gemm_bias_act_f32_tilled_kernel 만 자세히 봐보자 (0) | 2025.11.24 |
| 현재 구현된 gemm 의 fwd 부분 커널 코드 확인 (0) | 2025.11.24 |
| Shared Memory - Bank Conflict (0) | 2025.11.23 |