활용 사례

Ollama·vLLM으로 LLM API 서버 만들기

혼자 쓰거나 빠르게 시험할 때는 Ollama, 여러 명이 동시에 호출하는 사내 API라면 vLLM이 맞아요. 둘 다 OpenAI 호환 API라서 기존 코드의 주소와 모델 이름만 바꿔 연결할 수 있어요.

업데이트
  1. RTX 3090 24GB시간당 230원

    7~8B급 16비트 모델이나 14B급 8비트·4비트 모델을 서빙하기에 충분해요.

  2. GA102 20GB시간당 190원

    8B급 8비트·4비트 모델이나 14B급 4비트 모델을 올리기에 맞아요.

  3. AD103-32GB준비 중

    8B급 16비트 모델을 동시 요청 여유와 함께 올리고, 32B급 4비트 모델도 한 장에서 서빙할 수 있어요.

내 모델에 필요한 메모리는 LLM VRAM 계산기로 확인할 수 있어요.

LLM 서버를 직접 두면 좋은 경우

공개 모델을 직접 서빙하면 데이터가 내 서버 밖으로 나가지 않고, 모델과 버전도 직접 정해요. 파인튜닝한 모델도 그대로 올릴 수 있어요. 사내 문서 검색(RAG)이나 대량 문서 처리처럼 호출이 많거나 데이터를 밖으로 보내기 어려운 작업에 맞아요.

대신 서버 관리와 보안은 직접 챙겨야 해요. 작은 모델로 실제 업무 프롬프트를 돌려 보고, 품질이 모자라면 모델을 키우세요.

Ollama와 vLLM, 무엇을 고를까요

Ollama와 vLLM 비교
항목OllamavLLM
잘 맞는 상황개인 개발, 프로토타입, 소수 사용자여러 사용자가 동시에 쓰는 API, 대량 처리
모델 형식주로 GGUF 양자화 모델 (Ollama 라이브러리)Hugging Face 형식, AWQ·GPTQ·FP8 양자화 모델
동시 요청적은 수의 요청에 맞춰져 있어요여러 요청을 묶어 처리해요
기본 포트114348000
인증내장 인증 없음--api-key 옵션
GPU 메모리모델과 컨텍스트에 필요한 만큼 사용기본으로 VRAM의 약 90%를 미리 확보

Ollama로 모델과 프롬프트를 먼저 검증하고, 사용자가 늘면 vLLM으로 옮기는 방법도 있어요.

모델 크기별로 필요한 VRAM

필요한 메모리는 모델 가중치, KV 캐시(대화 맥락을 담아 두는 메모리), 런타임 여유를 더한 값이에요. KV 캐시는 요청마다 따로 잡혀서 동시 요청이 늘면 함께 늘어나요.

모델 크기별 추론 VRAM (컨텍스트 4K, 동시 요청 1개 기준 추정)
모델 크기16비트8비트4비트
8B약 19 GB약 11 GB약 7 GB
14B약 33 GB약 18 GB약 11 GB
32B약 71 GB약 38 GB약 23 GB
70B약 151 GB약 80 GB약 47 GB

같은 8B 16비트 모델도 동시 요청 8개가 각각 4K 컨텍스트를 쓰면 약 23GB라서 24GB GPU로는 빠듯해요. 이럴 때는 품질 손실이 비교적 작은 8비트나 AWQ 같은 4비트 모델을 검토해 보세요. 내 설정은 LLM VRAM 계산기로 확인할 수 있어요.

Ollama로 빠르게 시작하기

bash
curl -fsSL https://ollama.com/install.sh | sh
ollama run qwen3:8b

설치 스크립트가 Ollama를 systemd 서비스로 등록해 백그라운드에서 띄워요. ollama run은 모델을 내려받고 터미널 대화 창을 열어요. 기본 태그는 대부분 4비트 모델이라 8B급은 8GB 안팎의 VRAM에서도 짧은 컨텍스트로 돌아가요. 다른 모델은 Ollama 라이브러리에서 골라요.

API는 기본으로 서버 안(127.0.0.1:11434)에서만 열리고, OpenAI 호환 엔드포인트는 /v1 아래에 있어요.

bash
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3:8b",
    "messages": [{"role": "user", "content": "GPU 서버 점검 체크리스트를 세 줄로 정리해 줘."}]
  }'

모델 파일은 로컬 디스크에 저장돼서 서버를 삭제하면 사라져요. 볼륨에 두려면 서비스 설정에 OLLAMA_MODELS를 넣고, ollama 사용자에게 폴더 권한을 줘요.

bash
sudo mkdir -p /mnt/data/ollama/models
sudo chown -R ollama:ollama /mnt/data/ollama
sudo systemctl edit ollama.service
# 편집기가 열리면 아래 두 줄을 추가하고 저장해요
# [Service]
# Environment="OLLAMA_MODELS=/mnt/data/ollama/models"
sudo systemctl daemon-reload
sudo systemctl restart ollama
볼륨이 /mnt/data에 연결돼 있다고 가정했어요.

vLLM으로 OpenAI 호환 API 서버 만들기

vLLM은 자신에게 맞는 PyTorch 버전을 함께 설치하므로 가상 환경을 따로 만드세요. vllm serve에 Hugging Face 모델 ID를 넘기면 모델을 내려받아 8000번 포트에 API를 열어요.

bash
python3 -m venv ~/vllm-env
source ~/vllm-env/bin/activate
pip install vllm

export HF_HOME=/mnt/data/hf-cache
export VLLM_API_KEY=$(openssl rand -hex 32)
echo "$VLLM_API_KEY"

vllm serve Qwen/Qwen3-8B \
  --host 127.0.0.1 \
  --max-model-len 8192 \
  --api-key "$VLLM_API_KEY"
모델 ID는 예시예요. 출력된 API 키는 따로 보관하세요.
  • --host 127.0.0.1: 서버 안에서만 접속을 받아요. 빼면 서버의 모든 네트워크 주소에서 받아요.
  • --max-model-len: 최대 컨텍스트 길이예요. 기본값이 길면 시작할 때 KV 캐시 공간이 모자라다는 오류가 날 수 있어요.
  • --api-key: 요청 헤더에 같은 키가 있어야 응답해요.
  • --gpu-memory-utilization: 미리 확보할 VRAM 비율이에요. 기본값이 0.9라서 nvidia-smi에 90% 가까이 보여도 정상이에요.

다른 터미널에서 호출한다면 그 터미널에도 VLLM_API_KEY를 넣어 두세요. 다른 옵션은 vLLM 문서에 있어요.

bash
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $VLLM_API_KEY" \
  -d '{
    "model": "Qwen/Qwen3-8B",
    "messages": [{"role": "user", "content": "사내 휴가 신청 절차를 요약해 줘."}],
    "max_tokens": 512
  }'

OpenAI Python SDK 코드는 base_url, api_key, 모델 이름만 바꾸면 대부분 그대로 동작해요. 일부 파라미터는 지원 범위가 다르니 실제 요청으로 확인하세요.

python
import os

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key=os.environ["VLLM_API_KEY"],
)

response = client.chat.completions.create(
    model="Qwen/Qwen3-8B",
    messages=[{"role": "user", "content": "회의록을 세 줄로 요약해 줘."}],
)
print(response.choices[0].message.content)

API를 외부에 열기 전에 확인할 것

Ollama에는 인증이 없고, vLLM도 --api-key 없이 띄우면 누구나 호출할 수 있어요. 이런 API를 공인 포트로 그대로 열면 다른 사람이 내 GPU를 쓰거나 주고받는 데이터를 볼 수 있어요.

  • 혼자 쓰거나 개발 중이라면 SSH 터널을 쓰세요. 내 PC에서 아래 명령을 실행하면 내 PC의 localhost:8000이 서버의 API로 연결돼요.
  • 다른 서비스에서 호출해야 한다면 vLLM의 --api-key를 켜고, 앞단에 HTTPS를 처리하는 리버스 프록시를 두세요.
  • Ollama를 밖에서 써야 한다면 OLLAMA_HOST로 바로 열지 말고, 인증을 붙인 프록시 뒤에 두세요.
bash
ssh -N -L 8000:127.0.0.1:8000 <사용자>@<서버 주소>
Ollama라면 포트 번호를 11434로 바꿔요.

서버 생성부터 삭제까지

  1. GPU를 골라 서버를 생성해요

    모델 크기와 사용자 수로 필요한 VRAM을 정하고, 모델 캐시를 둘 볼륨을 연결해요.

  2. SSH로 접속해 설치하고 실행해요

    Ollama는 서비스로 실행되고, vLLM은 tmux 안에서 실행하면 SSH가 끊겨도 계속 동작해요.

  3. 터널이나 프록시로 연결해 테스트해요

    실제 업무 프롬프트로 품질과 응답 속도를 확인해요.

  4. 설정과 기록을 볼륨에 남겨요

    실행 명령, 모델 버전, 테스트 결과를 볼륨에 두면 다음 서버에서 같은 조건을 다시 만들 수 있어요.

  5. 쓰지 않을 때는 서버를 삭제해요

    켜 둔 시간 전체가 요금이고, 중지해도 요금이 나가요. 쓰는 시간이 정해져 있다면 그때만 서버를 만들고 모델은 볼륨에서 불러오세요.

Shelf에서는

Shelf의 서버와 스토리지는 국내 시설에 있어서, 서빙하는 모델과 주고받는 데이터를 국내에 둘 수 있어요. 지금 생성할 수 있는 GPU는 RTX 3090과 GA102 20GB예요. AD103-32GB와 A100 80GB는 준비 중이에요. 시간당 요금은 요금 안내에서 확인하세요.

  • SSH 키로 접속하고, 다른 서비스와 연결해야 할 때는 공인 포트를 쓸 수 있어요.
  • 볼륨에 둔 모델은 다른 GPU 서버에 연결해 다시 내려받지 않고 써요. 설치 환경은 저장 이미지로 남길 수 있어요.
  • 볼륨과 저장 이미지는 서버를 삭제해도 남고, 저장 요금이 따로 있어요.
  • 서버 요금은 생성한 시점부터 1시간 단위로 계산돼요.

자주 묻는 질문

Ollama와 vLLM 중 어느 쪽이 더 빠른가요?

동시 요청이 많을수록 요청을 묶어 처리하는 vLLM이 처리량에서 유리해요. 한 명이 쓸 때는 차이가 작을 수 있으니 실제 프롬프트로 비교해 보세요.

70B 모델도 서빙할 수 있나요?

4비트로 양자화해도 약 47GB가 필요해서, 한 장으로는 80GB급 GPU가 있어야 해요. 32GB GPU에서는 32B급 4비트 모델이 현실적인 상한이에요.

GPU 서버가 필요할 때

필요한 GPU와 개발 환경을 골라 시간 단위로 시작해요.