Kubernetes에서 구축하는 첫 번째 LLM API

Kubernetes에서 LLM을 실행하는 것은 일반적인 웹 앱을 실행하는 것과는 다릅니다. 단순히 요청 수에 따라 스케일링하는 것이 아니라, GPU 용량과 모델 가중치(weights)를 기준으로 스케일링해야 합니다.

이 가이드에서는 모델을 GPU 노드에 배포하고, 이를 API로 노출한 뒤, curl 요청을 통해 호출하는 과정을 다룹니다.

다음 도구들을 사용합니다:

  • 모델: Qwen/Qwen2.5-1.5B-Instruct
  • 엔진: vLLM
  • 인프라: NVIDIA GPU 지원 기능이 포함된 Kubernetes

1단계: GPU 용량 확인

시작하기 전에 Kubernetes가 하드웨어를 인식하고 있는지 확인하세요. 다음 명령어를 실행합니다: kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu

만약 GPU 컬럼이 비어 있다면 중단하세요. 먼저 NVIDIA device plugin을 해결해야 합니다.

2단계: 모델 액세스 보안 설정

공개 모델이라 하더라도 Hugging Face 토큰을 사용하세요. 이렇게 하면 나중에 프라이빗 모델로 교체하기가 더 쉬워집니다.

  • 네임스페이스 생성: kubectl create namespace llm-demo
  • 토큰을 위한 Secret 생성: kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"

3단계: 모델 서버 배포

vLLM은 복잡한 작업을 대신 처리해주기 때문에 사용합니다. vLLM은 배칭(batching), 토큰화(tokenization), 그리고 OpenAI 호환 API를 관리합니다.

다음의 주요 요구 사항을 포함하여 deployment 파일을 생성합니다:

  • GPU 1개 요청: nvidia.com/gpu: 1
  • /dev/shm 마운트: 모델 서버가 충돌하는 것을 방지하려면 공유 메모리(shared memory)가 필요합니다.
  • Secret 사용: HF_TOKEN을 컨테이너로 전달합니다.

설정을 적용합니다: kubectl apply -f qwen-vllm.yaml

4단계: API 검증

"Running" 상태만 믿지 마세요. Pod가 "Running" 상태이더라도 거대한 모델 파일을 다운로드 중일 수 있습니다. 로그를 확인하세요: kubectl logs -n llm-demo -f deployment/qwen-vllm

서버가 8000번 포트에서 리스닝(listening) 상태가 될 때까지 기다립니다.

포트 포워딩으로 테스트합니다: kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000

curl 요청을 실행합니다:

curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "Qwen/Qwen2.5-1.5B-Instruct",
  "messages": [{"role": "user", "content": "Explain Kubernetes in two sentences."}],
  "max_tokens": 120
}'

목표 달성:

이제 단순한 GPU 용량 확보를 넘어 실제로 작동하는 API를 구축했습니다. 다음 사항들을 증명한 것입니다:

  • Kubernetes가 GPU 워크로드를 스케줄링함.
  • 컨테이너가 하드웨어에 액세스할 수 있음.
  • 모델 서버가 가중치를 메모리에 로드함.
  • API가 표준 요청에 응답함.

만약 이 과정이 실패한다면, 스케일링이나 라우팅을 아무리 잘해도 소용이 없습니다. 먼저 기초를 다지세요.

Source: https://dev.to/the-persistent-engineer/your-first-llm-api-on-kubernetes-from-model-to-curl-request-4l1j

선택 사항 학습 커뮤니티: https://t.me/GyaanSetuAi