NVIDIA A10 GPU를 사용한 OKE에 vLLM 배포: 20분 만에 끝내는 설정 방법
요약
OCI(Oracle Cloud Infrastructure)의 OKE 환경에서 NVIDIA A10 GPU를 사용하여 vLLM 기반 Llama 3 추론 엔드포인트를 구축하는 방법을 설명합니다. AWS나 Azure 대비 저렴한 비용으로 GPU 인스턴스를 구성하고 배포하는 실무 가이드를 제공합니다.
핵심 포인트
- OCI A10 GPU 사용 시 AWS 대비 약 50% 이상의 비용 절감 가능
- OKE GPU 이미지를 활용하여 NVIDIA 드라이버 설치 번거로움 해결
- NVIDIA Device Plugin을 통한 Kubernetes GPU 리소스 스케줄링 설정
- vLLM을 활용한 OpenAI 호환 API 엔드포인트 신속 구축
지난달 저는 내부 도구를 위해 Llama 3 추론 엔드포인트를 구축해야 했습니다. 요구 사항은 간단했습니다. OpenAI와 호환되는 API, 자동 스케일링 기능, 그리고 팀의 커피 예산을 초과할 수 없어야 한다는 것이었습니다. AWS는 g5.xlarge에 대해 시간당 $3.06을 제시했습니다. Azure 역시 비슷한 견적을 내왔습니다.
그러다가 OCI의 GPU 셰이프를 살펴보았습니다. VM.GPU.A10.1은 24GB VRAM을 가진 단일 NVIDIA A10이며, 온디맨드(on-demand) 기준으로 시간당 $1.52였습니다. 절반 가격입니다. 그리고 프리엠티블(preemptible)로 사용하면요? 시간당 $0.46이었습니다. 라테 한 잔 값입니다.
제가 vLLM을 OKE에서 약 20분 만에 실행한 방법은 다음과 같습니다.
OKE 클러스터 설정
이미 OKE 클러스터가 있다면 이 부분은 건너뛰셔도 됩니다. 그렇지 않다면, 가장 빠른 경로는 다음과 같습니다:
# VCN 생성 (또는 기존 VCN 사용)
oci network vcn create \
--compartment-id $COMPARTMENT_ID \
...
핵심 부분은 GPU 노드 풀(node pool)입니다. OCI에는 여러 GPU 셰이프가 있지만, 추론(inference)의 경우 A10이 가장 적합합니다:
| Shape | GPU | VRAM | $/hr (on-demand) | $/hr (preemptible) |
|---|---|---|---|---|
| VM.GPU.A10.1 | 1x A10 | 24 GB | ~$1.52 | ~$0.46 |
| ... |
7B 파라미터 모델의 경우, A10 하나만으로 충분합니다. 70B 모델이라면 2xA10 또는 A100 베어 메탈(bare metal)을 사용해야 합니다.
# GPU 노드 풀 생성
oci ce node-pool create \
--cluster-id $CLUSTER_ID \
...
OKE GPU 이미지를 사용하는지 확인하세요. 이 이미지는 NVIDIA 드라이버와 nvidia-container-toolkit이 미리 설치되어 있습니다. 직접 드라이버 설치를 할 필요가 없습니다. 저를 믿으세요.
NVIDIA Device Plugin
OKE의 GPU 이미지는 이미 드라이버를 포함하고 있지만, Kubernetes에서 GPU를 스케줄링 가능한 리소스(schedulable resource)로 노출하려면 디바이스 플러그인(device plugin)이 필요합니다:
# nvidia-device-plugin.yaml
apiVersion: apps/v1
kind: DaemonSet
...
kubectl apply -f nvidia-device-plugin.yaml
GPU가 제대로 표시되는지 확인합니다:
kubectl get nodes -o json | jq '.items[].status.capacity[
# vllm-deployment.yaml
apiVersion: apps/v1
kind: Deployment
...
먼저 HuggingFace 토큰 Secret을 생성합니다:
kubectl create secret generic hf-token \
--from-literal=token=$HF_TOKEN
그 다음 배포합니다:
kubectl apply -f vllm-deployment.yaml
모델 다운로드에는 모델 크기에 따라 몇 분이 소요됩니다. 로그를 확인하세요:
kubectl logs -f deployment/vllm-llama3
모델 가중치 (model weights)를 로드하고, CUDA 커널 (CUDA kernels)을 컴파일한 후, 최종적으로 다음과 같은 메시지가 나타납니다:
INFO: Uvicorn running on http://0.0.0.0:8000
테스트하기
포트 포워딩 (Port-forward)을 수행하고 curl로 요청을 보냅니다:
kubectl port-forward svc/vllm-service 8000:8000
curl http://localhost:8000/v1/chat/completions \
...
이 API는 OpenAI와 호환됩니다. gpt-4와 통신하는 기존 코드는 베이스 URL (base URL)만 변경하면 됩니다.
배운 점
제가 직접 겪으며 고생했던 몇 가지 사항들입니다:
모델 다운로드 속도 — OKE 노드는 인터넷 대역폭 (bandwidth)이 좋지만, 16GB 모델을 처음 가져올 때는 시간이 걸립니다. 저는 결국 포드 (pod)가 재시작될 때 다시 다운로드하지 않도록 모델을 커스텀 Docker 이미지에 포함(baking)시켰습니다. 이는 별도의 블로그 포스트로 다룰 예정입니다.
메모리 여유 공간 (Memory headroom) — gpu-memory-utilization: 0.90 설정은 KV 캐시 (KV cache) 오버헤드를 위해 10%를 남겨둡니다. 효율적이라고 생각해서 이 값을 0.99로 설정하지 마세요. 트래픽이 급증할 때 vLLM이 OOM (Out of Memory) 오류를 일으킬 수 있습니다.
준비성 프로브 (Readiness probe) 타이밍 — initialDelaySeconds: 120이 길어 보일 수 있지만, A10에서 모델 로딩은 실제로 60~90초가 소요됩니다. 프로브가 너무 일찍 실행되면 Kubernetes가 포드를 무한 루프 상태로 재시작하게 됩니다.
선점형 인스턴스 (Preemptible instances) — 시간당 $0.46의 가격은 개발/스테이징 환경에서 놀라운 수준입니다. 프로덕션 (production) 환경에서는 온디맨드 (on-demand) 인스턴스를 사용하고, 오버플로 (overflow)용으로 두 번째 선점형 풀을 구성하세요. 비용 최적화에 관한 향후 포스트에서 이 내용을 다루겠습니다.
비용 비교
다양한 클라우드에서 Llama 3.1 8B를 실행할 때의 비용 (단일 GPU, 온디맨드 기준):
| 클라우드 (Cloud) | 셰이프 (Shape) | $/hr | $/month (24/7) |
|---|---|---|---|
| OCI | VM.GPU.A10.1 | $1.52 | ~$1,094 |
| ... |
OCI는 동일한 하드웨어 대비 가격이 대략 절반 수준입니다. 또한, 선점형 (Preemptible) 가격 정책을 활용하면 비운영 (Non-production) 워크로드의 경우 그 차이가 더욱 극적으로 나타납니다.
다음 단계 (What's Next)
이것은 가능한 가장 단순한 설정 — 하나의 모델, 하나의 GPU, 하나의 레플리카 (Replica) 구성입니다. 다음 포스트에서는 다음 내용을 다룰 예정입니다:
- 선점형 (Preemptible) GPU 풀과 스케일 투 제로 (Scale-to-zero)를 통한 비용 최적화
- vLLM의 LoRA 어댑터 (LoRA adapter) 지원을 활용한 멀티 모델 서빙 (Multi-model serving)
- OKE에서 OpenTelemetry를 사용한 GPU 사용률 모니터링
전체 YAML 파일은 제 GitHub에 있습니다. 만약 OCI에서 추론 (Inference)을 실행하고 계신다면, 어떤 셰이프 (Shapes)를 사용 중인지 꼭 듣고 싶습니다.
Pavan Madduri — CNCF Golden Kubestronaut, GPU/AI 인프라 도구 구축 중. GitHub | LinkedIn | Website | Google Scholar | ResearchGate
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기