Tu primera API de LLM en Kubernetes

Ejecutar un LLM en Kubernetes es diferente a ejecutar una aplicación web estándar. No solo escalas por solicitudes. Escalas por capacidad de GPU y pesos del modelo.

En esta guía, desplegarás un modelo en un nodo de GPU, lo exponerás como una API y lo llamarás con una solicitud curl.

Usamos estas herramientas:

  • Modelo: Qwen/Qwen2.5-1.5B-Instruct
  • Motor: vLLM
  • Infraestructura: Kubernetes con soporte para GPU de NVIDIA

Paso 1: Comprueba tu capacidad de GPU Antes de comenzar, asegúrate de que Kubernetes detecte tu hardware. Ejecuta este comando: kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu

Si la columna GPU está vacía, detente. Primero debes solucionar el problema con tu plugin de dispositivo de NVIDIA.

Paso 2: Asegura el acceso a tu modelo Incluso para modelos públicos, utiliza un token de Hugging Face. Esto facilitará el cambio a modelos privados más adelante.

  • Crea un namespace: kubectl create namespace llm-demo
  • Crea un Secret para tu token: kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"

Paso 3: Despliega el servidor del modelo Usamos vLLM porque se encarga del trabajo pesado. Gestiona el batching, la tokenización y la API compatible con OpenAI.

Crea un archivo de despliegue con estos requisitos clave:

  • Solicitar 1 GPU: nvidia.com/gpu: 1
  • Montar /dev/shm: Los servidores de modelos necesitan memoria compartida para evitar fallos.
  • Usar Secrets: Pasa tu HF_TOKEN al contenedor.

Aplica tu configuración: kubectl apply -f qwen-vllm.yaml

Paso 4: Verifica la API No confíes en el estado "Running". Un pod aparece como "Running" mientras todavía está descargando archivos de modelo masivos. Observa tus logs: kubectl logs -n llm-demo -f deployment/qwen-vllm

Espera hasta que veas el servidor escuchando en el puerto 8000.

Pruébalo con port-forwarding: kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000

Ejecuta tu solicitud 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
}'

El objetivo: Has pasado de la capacidad bruta de GPU a una API funcional. Has demostrado que:

  • Kubernetes programa la carga de trabajo de la GPU.
  • El contenedor puede acceder al hardware.
  • El servidor del modelo carga los pesos en la memoria.
  • La API responde a solicitudes estándar.

Si este ciclo falla, el escalado y el enrutamiento no te salvarán. Primero arregla los cimientos.

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

Comunidad de aprendizaje opcional: https://t.me/GyaanSetuAi