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_TOKENal 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.
Comunidad de aprendizaje opcional: https://t.me/GyaanSetuAi
