Sua Primeira API de LLM no Kubernetes
Executar um LLM no Kubernetes é diferente de executar um aplicativo web padrão. Você não escala apenas por requisições. Você escala por capacidade de GPU e pesos do modelo.
Neste guia, você implantará um modelo em um nó de GPU, o exporá como uma API e o chamará com uma requisição curl.
Usamos estas ferramentas:
- Modelo: Qwen/Qwen2.5-1.5B-Instruct
- Engine: vLLM
- Infraestrutura: Kubernetes com suporte a GPU NVIDIA
Passo 1: Verifique sua capacidade de GPU
Antes de começar, certifique-se de que o Kubernetes reconhece seu hardware. Execute este comando:
kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu
Se a coluna GPU estiver vazia, pare. Você deve corrigir seu plugin de dispositivo NVIDIA primeiro.
Passo 2: Proteja o acesso ao seu modelo Mesmo para modelos públicos, use um token do Hugging Face. Isso facilita a troca para modelos privados posteriormente.
- Crie um namespace:
kubectl create namespace llm-demo - Crie um Secret para o seu token:
kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"
Passo 3: Implante o servidor do modelo Usamos o vLLM porque ele cuida do trabalho pesado. Ele gerencia o batching, a tokenização e a API compatível com a OpenAI.
Crie um arquivo de deployment com estes requisitos principais:
- Solicite 1 GPU:
nvidia.com/gpu: 1 - Monte
/dev/shm: Servidores de modelos precisam de memória compartilhada para evitar falhas. - Use Secrets: Passe seu
HF_TOKENpara o container.
Aplique sua configuração:
kubectl apply -f qwen-vllm.yaml
Passo 4: Verifique a API
Não confie no status "Running". Um pod está em "Running" enquanto ainda está baixando arquivos de modelo massivos. Acompanhe seus logs:
kubectl logs -n llm-demo -f deployment/qwen-vllm
Aguarde até ver o servidor ouvindo na porta 8000.
Teste com port-forwarding:
kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000
Execute sua requisição 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
}'
O Objetivo: Você passou da capacidade bruta de GPU para uma API funcional. Você provou que:
- O Kubernetes agenda a carga de trabalho da GPU.
- O container pode acessar o hardware.
- O servidor do modelo carrega os pesos na memória.
- A API responde a requisições padrão.
Se este ciclo falhar, o escalonamento e o roteamento não o salvarão. Corrija a base primeiro.
Optional learning community: https://t.me/GyaanSetuAi
