//
추론 최적화는 모델을 더 빠르고 저렴하게 만드는 방법에 집중하는 장이다. 모델, 하드웨어, 서비스 수준에서 접근 가능하며, 모델 연구자부터 데이터 센터 운영자까지 함께 작업하는 융합 분야다.
주요 연산 병목에는 두 가지가 있다.
산술 강도(Arithmetic Intensity)로 어느 쪽 제약을 받는지 구분 가능하다. 이는 메모리 1바이트에 접근할 때 수행하는 산술 연산 수를 뜻한다.
산술 강도 = FLOP / 메모리 접근 바이트 수
산술 강도 높음 → 연산 제약 (배치 행렬 곱셈 등)
산술 강도 낮음 → 메모리 대역폭 제약 (단일 토큰 생성 등)
엔비디아 엔사이트 같은 프로파일링 도구로 루프라인 차트(Roofline Chart)를 확인할 수 있다. 루프라인 차트에서 X축은 산술 강도, Y축은 실제 성능(FLOP/s)이며, 꺾이는 지점이 연산 제약과 대역폭 제약의 경계다.
트랜스포머 기반 언어 모델의 추론은 두 단계로 나뉜다.
| 단계 | 제약 유형 | 이유 |
|---|---|---|
| 프리필 | 연산 제약 | 입력 토큰을 병렬 처리하므로 계산량이 많다 |
| 디코딩 | 대역폭 제약 | 토큰을 하나씩 생성하므로 계산보다 가중치를 읽는 게 병목 |
배치 API가 적합한 경우는 다음과 같다.
| 지표 | 설명 |
|---|---|
| TTFT (Time to First Token) | 첫 토큰까지 걸리는 시간 |
| TPOT (Time Per Output Token) | 출력 토큰당 시간 |
| TBT / ITL | 토큰 간 시간 / 토큰 간 지연 시간 |
전체 지연 시간 = TTFT + TPOT x (출력 토큰 수)
TTFT, TPOT를 희생하면 처리량을 2~3배 올릴 수 있지만 사용자 경험이 나빠지므로, 굿풋에 집중해야 한다.
알렉스넷(2012)이 신경망 학습에 GPU를 성공적으로 사용한 첫 번째 논문으로 주목받았다. 가속기는 특정 종류의 연산 작업을 빠르게 처리하도록 만들어진 칩이다.
엣지 컴퓨팅용 칩도 있다. 애플 Neural Engine, AWS Inferentia, 메타 MTIA, 구글 엣지 TPU, 엔비디아 Jetson Xavier 등이다.
| 특성 | 설명 |
|---|---|
| 연산 성능 | FLOP/s로 측정 |
| 메모리 크기와 대역폭 | CPU DRAM (25~50GB/s), GPU HBM (256GB/s~1.5TB/s), 온칩 SRAM (10TB/s 이상) |
| 전력 소모 | TDP로 표시. A100은 540억 개, H100은 800억 개의 트랜지스터 |
GPU 프로그래밍 언어로는 CUDA, OpenAI Triton, ROCm 등이 있다.
자기회귀 모델의 근본적인 한계는 토큰을 한 번에 하나씩 생성한다는 점이다. 이를 극복하기 위한 세 가지 접근법이 있다.
다음 토큰을 생성하려면 이전 토큰들의 키와 값이 필요하며, 이를 KV 캐시에 저장한다. 시퀀스가 길어질수록 KV 캐시의 메모리 사용량이 선형으로 증가하기 때문에, 이를 최적화하는 것이 매우 중요하다.
세 가지 최적화 방향이 있다.
1. 어텐션 메커니즘 재설계 (학습/파인튜닝 단계에서 적용)
| 기법 | 원리 | 효과 |
|---|---|---|
| 로컬 윈도우 어텐션 | 가까운 토큰만 참조 | 계산량 감소 |
| 크로스 레이어 어텐션 | 레이어 간 KV 공유 | KV 캐시 절감 |
| 그룹 쿼리 어텐션 (GQA) | 여러 쿼리 헤드가 KV 헤드를 공유 | KV 캐시 20배 이상 절감 |
2. KV 캐시 크기 최적화
3. 어텐션 연산을 위한 커널 작성
연산 속도를 높이는 네 가지 일반적인 기법은 벡터화, 병렬화, 루프 타일링, 연산자 융합이다.
대부분 서비스 수준 최적화 기법은 리소스 관리에 집중한다.
| 방식 | 설명 |
|---|---|
| 정적 배치 | 정해진 수만큼 대기 후 실행 |
| 동적 배치 | 정해진 시간만큼 대기 후 실행 |
| 연속 배치 (인플라이트 배치) | 배치의 응답이 끝나는 대로 바로 수행 |
연산 제약(프리필)과 대역폭 제약(디코딩)이 서로 다르므로, 함께 처리하면 어느 한 쪽 때문에 전체가 느려질 수 있다. 분리하면 각각에 최적화된 자원을 할당할 수 있다.
이 아키텍처를 프리필-디코드 분리(PD Disaggregation)라 하며, Mooncake, DistServe 등의 시스템이 이 접근법을 채택하고 있다.
컨텍스트 캐시, 프리픽스 캐시라고도 불린다. 반복되는 프롬프트 접두사의 KV 캐시를 재사용하여 TTFT를 줄인다.
# 프롬프트 캐싱의 효과
요청 1: [시스템 프롬프트 | 사용자 질문 A] → 프리필 전체 수행
요청 2: [시스템 프롬프트 | 사용자 질문 B] → 시스템 프롬프트의 KV 캐시 재사용
→ 사용자 질문 B만 프리필
긴 시스템 프롬프트를 사용하는 애플리케이션에서 특히 효과적이다. OpenAI, Anthropic 등 주요 API 제공자들이 프롬프트 캐싱을 지원하며, 캐시 히트 시 비용을 할인해준다.
| 방식 | 분할 대상 | 설명 |
|---|---|---|
| 데이터 병렬 처리 | 배치 | 동일 모델을 여러 GPU에 복제하고 배치를 나눠 처리 |
| 모델 병렬 처리 (텐서) | 레이어 내부 | 하나의 레이어를 여러 GPU에 분할 |
| 모델 병렬 처리 (파이프라인) | 레이어 간 | 레이어 그룹을 서로 다른 GPU에 배치 |
| 복제 병렬 처리 | 모델 전체 | 모델을 여러 벌 복제하여 병렬 서빙 |
| 컨텍스트 병렬 처리 | 시퀀스 | 긴 입력 시퀀스를 여러 GPU에 분할 |
| 시퀀스 병렬 처리 | 시퀀스 (LayerNorm 등) | 텐서 병렬과 함께 사용, 비어텐션 연산을 분할 |
각 방식은 분할 대상과 프로세스 흐름이 조금씩 다르며, 실제로는 여러 방식을 조합하여 사용한다. 예를 들어 데이터 병렬 + 텐서 병렬의 조합이 일반적이다.
추론 최적화는 비용과 지연 시간에 관한 것이다. 효율성 측정(지연 시간, 처리량, 활용률)부터, 하드웨어의 특성(GPU 메모리 계층, AI 가속기), 모델 수준 기법(양자화, 증류, 프루닝, 어텐션 최적화), 서비스 수준 최적화(배치 처리, 프리필/디코딩 분리, 프롬프트 캐싱, 병렬 처리)까지 폭넓게 다루었다. 유익하지만 어려운 장이었다.