RunPod · vLLM · TEI · 내부 검증 리포트

PPS LLM Serving — LLM·OCR·임베딩 3모델 배포 & 동작 테스트

대상 레포 jodal-eval-ai/pps-llm-serving (main) · 작성 2026-07-13 · 개인용 (noindex)
TL;DR

1테스트 결과 — 3모델 전부 통과

LLM
kanana-2-30b-a3b
A100 80GB · FP8 MoE(활성3B)
✓ "서울" · in16/out2 tok
OCR / Vision
Chandra 9B
A6000 48GB · Qwen3-VL·BF16
✓ "OK" 응답
Embedding
KURE-v1
A4000 16GB · TEI·BGE-M3
✓ dim=1024

2레포 배포 방식 (최신 main)

Docker + compose 프로필 방식. 모델별 Dockerfile → compose 서비스(profile) → ./scripts/up.sh --<model>. 각 모델 GPU 1장·tensor-parallel-size 1, on-prem DGX에서 프로필 스위칭 전제. LLM 5종 + Vision 4종(Chandra 포함) + 임베딩 3종.

역할모델엔진핵심 서빙 인자
LLMkakaocorp/kanana-2-30b-a3b-instructvLLM--quantization fp8 --dtype auto · 0.95 · 32K · chunked-prefill
OCRdatalab-to/chandra (9B)vLLM--dtype bfloat16 · 0.90 · 32K · served-name chandra
임베딩nlpai-lab/KURE-v1TEI--dtype float16 --max-batch-tokens 8192 · 이미지 태그 GPU cap 종속

기존 추정과 다른 2가지: kanana는 FP8(BF16 아님), 임베딩은 vLLM이 아닌 TEI(GPU compute-cap에 맞는 이미지 태그 필수 — A4000=86-1.8).

3모델별 최적 GPU (실제 config 기반)

역할VRAM 실수요최적 GPU과금근거
LLM (FP8)~30GB + KVL40S 48GB~$0.86/hrFP8 → 80GB 불필요. Ada native FP8 가속
OCR (BF16 9B)~24–30GBA6000 / L40S 48GB~$0.49/hrvision 버퍼 여유. 24GB는 빠듯
임베딩 (TEI)~2.3GBA4000 16GB~$0.25/hrTEI 경량. 이미지 태그를 GPU에 맞춤
핵심 인사이트

LLM VRAM은 "활성 3B"가 아니라 전체 30B 파라미터 기준(MoE는 전 expert 상주). 단, 이 레포는 FP8 양자화라 ~30GB로 떨어져 A100 80GB가 과함 → L40S 48GB가 최적. BF16 가정으로 A100을 잡던 이전 판단이 뒤집힌 지점.

4디버깅 함정 — 403 오탐

근본 원인

RunPod 프록시 {podId}-8000.proxy.runpod.netPython-urllib/3.x User-Agent 요청을 403 Forbidden으로 차단한다. raw 프로브가 전부 403을 받아 "컨테이너 기동 실패"로 오판했으나, 실제 pod는 정상이었음. 브라우저 UA(Mozilla/5.0…)로 붙으니 3개 모두 200 + 실추론 성공. vLLM 어댑터·ai-engine(정상 UA)은 처음부터 통과.

# 오탐 (403)
urllib.request.urlopen("https://<pod>-8000.proxy.runpod.net/v1/models")
#  → HTTP 403 Forbidden

# 정상 — 브라우저 UA 헤더 추가
Request(url, headers={"User-Agent": "Mozilla/5.0 ..."})
#  → 200 OK

5로컬 파이프라인 end-to-end 검증

OrbStack docker로 postgres·redis·minio·ai-engine 기동 → .env의 LLM URL 9곳을 pod로 리포인트 → ai-engine 라우팅 파이프라인 왕복 확인.

POST http://localhost:8200/online/llm/complete  (purpose=rfp-structure)
→ {"text":"서울","model":"kakaocorp/kanana-2-30b-a3b-instruct",
   "input_tokens":18,"output_tokens":2,"finish_reason":"stop"}

경로: ai-engine(Docker) → purpose 라우팅 → RunPod kanana(vLLM) → 응답 복귀. /online/health·/online/eval-chatbot/health 모두 ok.

6정리 (테스트 후)

권장 배포 조합 (재현 시)

L40S(LLM·FP8) + A6000(OCR·chandra) + A4000(임베딩·KURE TEI) ≈ $1.6/hr
· vLLM 프로브는 반드시 브라우저 UA · 임베딩 TEI 이미지 태그는 GPU cap 매칭