🤖 AI/ML

Inference

추론

학습된 모델로 예측을 수행하는 과정. 학습(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 중 선택해야 합니다."

이 주제로 모의면접 보기 → WIA SOOM AI 면접 · 무료로 시작

⚠️ 흔한 실수 & 주의사항

❌
torch.no_grad() 없이 추론 실행

gradient 계산이 활성화되어 메모리를 2배 이상 소비하고 속도도 느려집니다. 추론 시에는 반드시 비활성화하세요.

❌
단건 처리로 API 호출

요청마다 개별 추론하면 GPU 활용률이 낮아집니다. 가능하면 배치로 묶어서 처리하세요.

✅
KV Cache와 양자화 적극 활용

use_cache=True와 FP16/INT8 양자화만 적용해도 추론 속도가 2~3배 개선됩니다.

🔗 관련 용어

📚 더 배우기