개요

클라우드 LLM API는 편리하지만 비용, 데이터 프라이버시, 지연 시간 면에서 한계가 있습니다. 특히 기업 환경에서는 민감한 데이터를 외부 서버로 전송할 수 없는 경우가 많습니다. 이런 요구를 충족하는 것이 로컬 LLM 운영입니다.

2025년 현재, Llama 3.3, Mistral, Qwen 2.5 등 오픈 모델의 성능이 크게 향상되었고, Ollama와 vLLM 같은 도구로 쉽게 배포할 수 있게 되었습니다. 이 글에서는 로컬 LLM을 설치하고 프로덕션 수준으로 운영하는 방법을 안내합니다.

핵심 개념: Ollama vs vLLM

  • Ollama: 개인 개발자와 소규모 팀을 위한 간편 LLM 실행 도구. Docker처럼 모델을 pull하고 바로 실행. macOS/Linux/Windows 지원. 개발 및 프로토타이핑에 최적.
  • vLLM: 프로덕션급 고성능 LLM 서빙 엔진. PagedAttention으로 메모리 효율 극대화. OpenAI 호환 API 제공. 배치 처리와 높은 동시성 지원.

간단히 말해, Ollama는 개발 편의성, vLLM은 프로덕션 성능에 초점을 맞춥니다.

실전 예제: 설치부터 API 서빙까지

1. Ollama로 빠르게 시작하기

# macOS 설치
brew install ollama

# 또는 Linux
curl -fsSL https://ollama.ai/install.sh | sh

# 모델 다운로드 및 실행
ollama pull llama3.3:70b
ollama pull mistral:7b
ollama pull codellama:13b

# 대화형 실행
ollama run llama3.3:70b

# API 서버로 실행 (기본 포트 11434)
ollama serve

# API 호출 예시
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.3:70b",
  "prompt": "Python으로 퀵소트를 구현해줘",
  "stream": false
}'

2. Python에서 Ollama 사용

import ollama

# 기본 대화
response = ollama.chat(
    model='llama3.3:70b',
    messages=[
        {"role": "system", "content": "당신은 시니어 개발자입니다."},
        {"role": "user", "content": "FastAPI에서 미들웨어 구현 방법을 알려줘"}
    ]
)
print(response['message']['content'])

# 스트리밍 응답
stream = ollama.chat(
    model='llama3.3:70b',
    messages=[{"role": "user", "content": "Docker 컨테이너 최적화 방법"}],
    stream=True
)
for chunk in stream:
    print(chunk['message']['content'], end='', flush=True)

# 임베딩 생성 (RAG용)
embedding = ollama.embeddings(
    model='nomic-embed-text',
    prompt='로컬 LLM의 장점'
)
print(f"벡터 차원: {len(embedding['embedding'])}")

3. vLLM으로 프로덕션 서빙

# vLLM 설치
pip install vllm

# OpenAI 호환 API 서버 실행
python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-3.3-70B-Instruct \
  --tensor-parallel-size 2 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.9 \
  --port 8000

# 기존 OpenAI SDK로 그대로 사용 가능
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.chat.completions.create(
    model="meta-llama/Llama-3.3-70B-Instruct",
    messages=[{"role": "user", "content": "쿠버네티스 배포 전략을 설명해줘"}],
    temperature=0.7
)

활용 팁

  • GPU 메모리 계산: 7B 모델은 약 14GB(FP16), 70B 모델은 약 140GB 필요. 양자화(Q4)를 사용하면 약 1/4로 줄일 수 있습니다.
  • 양자화 활용: GGUF(Ollama)나 AWQ/GPTQ(vLLM) 양자화 모델을 사용하면 성능 손실은 5% 이내로 메모리를 크게 절약합니다.
  • 모델 선택 기준: 코딩은 CodeLlama/DeepSeek Coder, 한국어는 SOLAR/KULLM, 범용은 Llama 3.3이 추천됩니다.
  • 캐싱 전략: vLLM의 prefix caching을 활성화하면 동일한 시스템 프롬프트를 사용하는 요청의 처리 속도가 크게 향상됩니다.
  • 모니터링: Prometheus + Grafana로 토큰 처리량, 지연 시간, GPU 활용률을 모니터링하세요.

마무리

로컬 LLM은 비용 절감과 데이터 보안의 두 마리 토끼를 잡을 수 있는 현실적 선택지입니다. Ollama로 빠르게 프로토타이핑하고, 검증된 모델을 vLLM으로 프로덕션 배포하는 것이 가장 효율적인 워크플로우입니다. 오픈 모델의 발전 속도를 고려하면, 로컬 LLM은 앞으로 더욱 강력한 선택지가 될 것입니다.