🤖
AI/ML
Inference
추론
학습된 모델로 예측을 수행하는 과정. 학습(Training)과 대비.
추론
학습된 모델로 예측을 수행하는 과정. 학습(Training)과 대비.
Inference(추론)는 학습이 완료된 모델을 사용해 새로운 데이터에 대한 예측을 수행하는 과정입니다. Training(학습)이 모델의 가중치를 업데이트하는 과정이라면, Inference는 고정된 가중치로 입력을 처리해 출력을 생성하는 과정입니다.
딥러닝 초기에는 학습이 주요 과제였지만, GPT-4, LLaMA 같은 대규모 모델이 등장하면서 추론 비용과 속도가 핵심 이슈가 되었습니다. OpenAI의 GPT-4 서비스 운영 비용 중 대부분이 추론에 사용됩니다.
추론 최적화 기법으로는 양자화(Quantization), KV Cache, 배치 처리, 모델 증류(Distillation) 등이 있습니다. NVIDIA TensorRT, vLLM, llama.cpp 같은 도구가 추론 가속을 지원합니다.
실무에서 LLM 추론 비용은 입력 토큰당 $0.01~0.03, 출력 토큰당 $0.03~0.06 수준입니다. 배치 처리로 throughput을 높이고, KV Cache로 TTFT(Time to First Token)를 줄이는 것이 핵심 최적화 전략입니다.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import time
# 모델과 토크나이저 로드
model_name = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16, # FP16으로 메모리 절약
device_map="auto"
)
# 추론 함수 (배치 처리 지원)
def batch_inference(prompts, max_new_tokens=100):
# 토큰화 (패딩 포함)
inputs = tokenizer(
prompts,
return_tensors="pt",
padding=True,
truncation=True
).to(model.device)
start_time = time.time()
# 추론 실행 (gradient 계산 비활성화로 메모리 절약)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.7,
use_cache=True # KV Cache 활성화
)
inference_time = time.time() - start_time
# 결과 디코딩
responses = tokenizer.batch_decode(outputs, skip_special_tokens=True)
print(f"배치 크기: {len(prompts)}")
print(f"총 추론 시간: {inference_time:.2f}초")
print(f"프롬프트당 평균: {inference_time/len(prompts):.2f}초")
return responses
# 테스트
prompts = [
"Python의 장점을 설명해줘:",
"머신러닝과 딥러닝의 차이는:",
"좋은 코드를 작성하는 방법은:"
]
results = batch_inference(prompts)
"현재 추론 레이턴시가 평균 2초인데, KV Cache와 배치 처리를 적용하면 0.5초까지 줄일 수 있습니다. vLLM으로 전환하면 throughput도 3배 정도 개선될 거예요."
"Training은 역전파로 가중치를 업데이트하고, Inference는 고정된 가중치로 예측만 합니다. 추론 시에는 torch.no_grad()로 gradient 계산을 끄고, use_cache=True로 KV Cache를 활성화해서 속도를 높입니다."
"INT8 양자화를 적용하면 메모리는 50% 줄고 속도는 2배 빨라지지만, 정확도 손실이 1~2% 있어요. 서비스 특성에 따라 FP16이나 INT4 중 선택해야 합니다."
gradient 계산이 활성화되어 메모리를 2배 이상 소비하고 속도도 느려집니다. 추론 시에는 반드시 비활성화하세요.
요청마다 개별 추론하면 GPU 활용률이 낮아집니다. 가능하면 배치로 묶어서 처리하세요.
use_cache=True와 FP16/INT8 양자화만 적용해도 추론 속도가 2~3배 개선됩니다.