추론 속도
추론 속도 (Inference Speed)
1. 개요
추론 속도(Inference Speed)란 학습이 완료된 AI 모델에 새로운 입력 데이터를 넣었을 때, 모델이 예측 결과(출력)를 내놓기까지 걸리는 시간을 의미한다.
AI 모델 서비스(Serving) 단계에서 추론 속도는 서비스의 실용성을 결정짓는 핵심 요소이다. 특히 실시간 상호작용이 필요한 챗봇, 자율주행, 실시간 번역 서비스의 경우, 추론 속도가 느려지면 사용자 경험(UX)이 급격히 저하되며 이는 곧 서비스 이탈로 이어진다. 따라서 모델의 정확도(Accuracy)와 추론 속도 사이의 최적의 균형점(Trade-off)을 찾는 것이 엔지니어링의 핵심 과제이다.
2. 추론 속도 측정 지표
모델의 성능을 정량적으로 평가하기 위해서는 단순한 '속도'가 아닌, 목적에 맞는 세부 지표를 측정해야 한다.
2.1 일반 추론 지표
| 지표명 | 정의 | 측정 단위 | 주요 관심 지점 |
|---|---|---|---|
| Latency (지연 시간) | 단일 요청이 입력되어 결과가 나올 때까지의 시간 | ms, s | 개별 사용자가 느끼는 응답 속도 |
| Throughput (처리량) | 단위 시간당 처리할 수 있는 총 요청 수 | req/s, tokens/s | 시스템 전체의 처리 용량 및 비용 효율성 |
| TPS (Transactions Per Second) | 초당 처리되는 트랜잭션 수 | TPS | 동시 접속자가 많은 환경에서의 시스템 안정성 |
배치 사이즈(Batch Size)의 영향: 배치 사이즈가 커지면 한 번의 연산으로 더 많은 데이터를 처리하므로 Throughput은 증가하지만, 개별 요청의 Latency는 증가하는 Trade-off 관계가 있다.
2.2 Latency와 Throughput의 상관관계
| 배치 사이즈 (Batch Size) | Latency (지연 시간) | Throughput (처리량) | 효율성 및 사용자 경험 |
|---|---|---|---|
| 작음 (Small) | 낮음 (빠름) | 낮음 | 실시간 응답에 유리, 하드웨어 자원 낭비 발생 가능 |
| 큼 (Large) | 높음 (느림) | 높음 | 대량 데이터 처리에 유리, 개별 응답 대기 시간 증가 |
2.3 LLM(대규모 언어 모델) 특화 지표
LLM은 텍스트를 한 토큰(Token, 단어 또는 문자 단위의 최소 의미 단위)씩 생성하는 자기회귀(Autoregressive) 특성을 가지므로, 다음과 같은 세분화된 지표를 사용한다.
- TTFT (Time To First Token): 사용자의 입력 후 첫 번째 토큰이 생성될 때까지의 시간. 사용자가 느끼는 '체감 대기 시간'을 결정한다.
- TPOT (Time Per Output Token): 첫 토큰 이후, 각 토큰이 생성되는 평균 시간. 텍스트가 출력되는 '읽기 속도'와 직결된다.
3. 추론 속도 저하의 주요 원인
추론 속도를 늦추는 병목 현상은 크게 연산량과 메모리 접근 문제로 나뉜다.
- 연산 복잡도 (Compute Bound): 모델의 파라미터 수가 많거나 연산량이 많은 레이어(예: Dense Layer)가 많을 때 발생한다. 이는 주로 FLOPs(Floating Point Operations, 총 부동 소수점 연산량)의 증가로 나타나며, GPU의 연산 코어 성능에 의존한다.
- 메모리 대역폭 제한 (Memory Bound): 연산 속도는 빠르나, 데이터를 메모리(VRAM)에서 연산 장치(Core)로 옮기는 속도가 느려 발생하는 병목이다. 특히 LLM의 KV 캐시(Key-Value Cache) 접근 시 빈번하게 발생한다.
- 데이터 전송 지연 (I/O Bound): CPU와 GPU 간의 데이터 전송(PCIe 대역폭), 혹은 네트워크를 통한 데이터 입출력 과정에서 발생하는 지연이다.
4. 추론 속도 최적화 기법
모델의 정확도 손실을 최소화하면서 속도를 높이기 위한 기법들은 다음과 같다.
4.1 주요 최적화 방법론 및 관련 라이브러리
- 양자화 (Quantization): 가중치의 정밀도(예: FP32 $\rightarrow$ INT8, FP8)를 낮추어 메모리 사용량을 줄이고 연산 속도를 높이는 기법이다.
- 관련 라이브러리:
bitsandbytes,AutoGPTQ,AutoAWQ,<a href="/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D%20%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC/TensorRT" class="wiki-link">TensorRT</a>-LLM
- 관련 라이브러리:
- 가지치기 (Pruning): 모델 성능에 영향이 적은 중요도가 낮은 가중치를 0으로 만들어 연산량을 줄이는 기법이다.
- 관련 라이브러리:
torch.nn.utils.prune,Neural Magic
- 관련 라이브러리:
- 지식 증류 (Knowledge Distillation): 거대한 교사 모델(Teacher Model)의 지식을 작은 학생 모델(Student Model)에게 전수하여, 작은 모델로 유사한 성능을 내게 하는 기법이다.
- 관련 라이브러리:
Hugging Face Transformers(Custom Training Loop)
- 관련 라이브러리:
- 컴파일러 최적화: 연산 그래프를 분석하여 불필요한 연산을 합치거나(Operator Fusion), 하드웨어에 최적화된 커널로 변환하는 과정이다.
- 관련 라이브러리:
torch.compile(PyTorch 2.0+),TVM,XLA
- 관련 라이브러리:
4.2 기법별 정확도 손실 및 효과 비교
| 최적화 기법 | 속도 향상 폭 | 메모리 절감 | 정확도 손실 위험 | 비고 |
|---|---|---|---|---|
| 양자화 (INT8) | 높음 | 매우 높음 | 낮음 $\sim$ 중간 | 가장 보편적인 적용 방법 |
| 양자화 (FP4/NF4) | 매우 높음 | 매우 높음 | 중간 $\sim$ 높음 | LLM의 가중치 압축에 주로 사용 |
| 가지치기 | 중간 | 중간 | 중간 $\sim$ 높음 | 구조적 가지치기 시 효과 극대화 |
| 지식 증류 | 매우 높음 | 매우 높음 | 중간 | 별도의 학습 과정 필요 |
| 컴파일러 최적화 | 중간 | 낮음 | 없음 | 하드웨어 종속적 최적화 |
5. 하드웨어 및 런타임 가속화
하드웨어 가속기와 전용 런타임을 사용하면 소프트웨어 최적화 이상의 성능 향상을 기대할 수 있다.
5.1 가속기 및 엔진
- GPU/NPU: 병렬 연산에 최적화된 하드웨어. 특히 NPU(Neural Processing Unit)는 AI 연산 전용 회로를 통해 전성비와 속도를 극대화한다.
- TensorRT / ONNX Runtime: 모델 그래프를 최적화하고 하드웨어별 최적 커널을 매핑하여 추론 속도를 가속하는 런타임 엔진이다.
- vLLM: PagedAttention 기술을 통해 LLM의 KV 캐시 메모리 낭비를 줄여 Throughput을 획기적으로 높인 추론 엔진이다.
5.2 런타임 적용 전후 코드 예시 (Python/PyTorch 기준)
# [Before] 일반 PyTorch 추론
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(10, 1)
def forward(self, x):
return self.linear(x)
model = MyModel().cuda().eval()
input_tensor = torch.randn(1, 10).cuda()
with torch.no_grad():
output = model(input_tensor) # 표준 연산 수행
print(output)
# [After] TensorRT/ONNX Runtime 적용 (개념적 예시)
import onnxruntime as ort
import numpy as np
# 모델이 이미 .onnx 파일로 변환되어 있다고 가정
session = ort.InferenceSession("model_optimized.onnx", providers=['CUDAExecutionProvider'])
# ONNX Runtime은 입력 이름을 키로 하는 딕셔너리 형태를 요구함
input_name = session.get_inputs()[0].name
input_data = input_tensor.cpu().numpy() # ONNX Runtime은 기본적으로 numpy 배열 사용
output = session.run(None, {input_name: input_data})
print(output)
5.3 하드웨어별 벤치마크 결과 예시 (Llama-3-8B 기준)
(아래 데이터는 예시 수치이며, 환경에 따라 다를 수 있음)
| 하드웨어 | 정밀도 | TTFT (ms) | TPOT (ms/token) | Throughput (tokens/s) |
|---|---|---|---|---|
| NVIDIA A100 | FP16 | 120 | 25 | 1,200 |
| NVIDIA A100 | INT8 | 80 | 15 | 2,100 |
| NVIDIA L40S | FP16 | 150 | 30 | 900 |
| NVIDIA T4 | INT8 | 300 | 60 | 400 |
6. 최적화 전략 선택 가이드
서비스의 목적과 가용 자원에 따라 최적화 우선순위를 다르게 설정해야 한다.
6.1 상황별 추천 최적화 조합 매트릭스
| 서비스 목적 | 우선순위 지표 | 추천 최적화 조합 | 핵심 전략 |
|---|---|---|---|
| 실시간 챗봇 | TTFT, TPOT | 양자화 $\rightarrow$ vLLM $\rightarrow$ FP8 | 응답 시작 시간을 줄이고 생성 속도 확보 |
| 배치 처리 (분석) | Throughput | 지식 증류 $\rightarrow$ TensorRT $\rightarrow$ Batching | 단위 시간당 처리량 극대화 |
| 온디바이스 AI | Memory, Latency | Pruning $\rightarrow$ Quantization $\rightarrow$ NPU | 메모리 점유율 최소화 및 전력 효율 |
| 고정밀 진단 AI | Accuracy | 컴파일러 최적화 $\rightarrow$ FP16 | 정확도 손실을 완전히 배제한 속도 개선 |
이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.