피드로 돌아가기
Dev.toAI/ML
원문 읽기
Liveness Analysis 기반 메모리 최적화로 활성 버퍼 76% 절감
What building an LLM inference engine from scratch taught me about compiler design
AI 요약
Context
LLM 추론 엔진의 핵심을 단순 행렬 연산이 아닌 Graph-compile, Memory-plan, Kernel-schedule의 컴파일러 문제로 정의함. 기존의 단순 버퍼 할당 방식으로는 추론 과정의 중간 결과물(Activation buffers)로 인한 메모리 낭비가 심한 한계점이 존재함.
Technical Solution
- Qwen2 forward pass 전체를 SSA(Static Single Assignment) IR로 구축하여 연산 간 명시적 데이터 의존성 파악
- Operation B가 A의 출력만 읽는 경우 두 연산을 하나로 합치는 Fusion Pass를 통해 중간 버퍼 제거 및 연산 수 감소(435개 $\rightarrow$ 362개)
- 각 버퍼의 마지막 사용 시점을 추적하는 Liveness Analysis를 적용하여 더 이상 필요 없는 메모리를 즉시 재사용하는 Register Allocation 전략 도입
- ARM NEON 기반의 Q8_0 양자화 커널을 직접 구현하여 int8 $\rightarrow$ int32 $\rightarrow$ f32 Widening 및 FMA 연산을 통한 하드웨어 레벨의 제어권 확보
- memmap2와 fancy-regex 단 두 개의 의존성만 사용하는 Zero-dependency 지향 구조로 엔진 경량화 달성
실천 포인트
- 단순 버퍼 할당 대신 SSA IR 기반의 Liveness Analysis를 도입하여 메모리 재사용률을 검토하십시오. - 연산 간 의존성 분석을 통한 Fusion Pass를 적용해 불필요한 중간 버퍼 생성과 메모리 I/O를 최소화하십시오. - 하드웨어 가속기(NEON, Metal 등)의 특성에 맞는 커널을 직접 설계하여 양자화 연산의 Trade-off를 정밀하게 제어하십시오.