Pular para o conteúdo principal

Model Inference Serving

Comece com KAITO pela simplicidade. Evolua para vLLM quando precisar extrair o máximo de throughput de GPUs caras.

Comparação de frameworks de serving​

FrameworkThroughputFacilidade de SetupMelhor Para
KAITOBom (configurações padrão)Trivial (1 YAML)Começar, modelos padrão
vLLMMais alto (PagedAttention)Médio (deploy manual)LLM serving em produção em escala
TGIAltoMédioModelos do ecossistema HuggingFace
TritonAlto (multi-framework)ComplexoMulti-model, serving multi-framework
CustomVariaDifícilModelos proprietários, requisitos especiais
Opinião

KAITO para simplicidade. vLLM para throughput máximo em LLM serving de produção. Essa é a árvore de decisão para 90% das equipes.

vLLM no AKS​

vLLM usa PagedAttention e continuous batching para atingir o maior tokens/segundo em hardware GPU. Se você está servindo LLMs em escala, este é o framework a ser usado.

apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-llama2
spec:
replicas: 1
selector:
matchLabels:
app: vllm-llama2
template:
metadata:
labels:
app: vllm-llama2
spec:
tolerations:
- key: "sku"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
containers:
- name: vllm
image: vllm/vllm-openai:latest
args:
- "--model"
- "meta-llama/Llama-2-7b-chat-hf"
- "--tensor-parallel-size"
- "1"
- "--max-model-len"
- "4096"
resources:
limits:
nvidia.com/gpu: 1
ports:
- containerPort: 8000
env:
- name: HUGGING_FACE_HUB_TOKEN
valueFrom:
secretKeyRef:
name: hf-token
key: token
nodeSelector:
workload: gpu
---
apiVersion: v1
kind: Service
metadata:
name: vllm-llama2
spec:
selector:
app: vllm-llama2
ports:
- port: 8000
targetPort: 8000
type: ClusterIP

Autoscaling de inference​

Use KEDA com métricas customizadas para escalar réplicas de inference com base na demanda real.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: vllm-scaler
spec:
scaleTargetRef:
name: vllm-llama2
minReplicaCount: 1
maxReplicaCount: 8
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus:9090
metricName: vllm_pending_requests
query: sum(vllm_num_requests_waiting)
threshold: "10"
informação

Escale com base na profundidade da fila (requests pendentes), não na utilização de GPU. A utilização de GPU permanece alta mesmo quando o throughput está adequado. A profundidade da fila indica quando os usuários estão realmente esperando.

Compartilhamento de GPU multi-model​

Uma GPU por modelo é desperdício para modelos pequenos ou endpoints com pouco tráfego. Opções:

EstratégiaComo FuncionaQuando Usar
Time-slicingAcesso round-robin à GPU entre containersMúltiplos modelos pequenos, latência aceitável
MIG (Multi-Instance GPU)Particiona fisicamente a A100 em fatias independentesIsolamento entre modelos, apenas A100/H100
Múltiplos modelos em um processovLLM/Triton servem múltiplos modelosMesmo framework, memória compartilhada
# NVIDIA time-slicing configuration (ConfigMap)
apiVersion: v1
kind: ConfigMap
metadata:
name: nvidia-device-plugin
namespace: kube-system
data:
config.yaml: |
version: v1
sharing:
timeSlicing:
resources:
- name: nvidia.com/gpu
replicas: 4

Isso faz cada GPU física aparecer como 4 GPUs agendáveis. Os pods compartilham a GPU via time-slicing.

Checklist de otimização de performance​

  1. Habilite continuous batching -- vLLM faz isso por padrão. TGI precisa de --max-batch-prefill-tokens.
  2. Defina o max model length apropriado -- Contexto menor = mais requests concorrentes.
  3. Use quantização para inference -- AWQ ou GPTQ reduzem memória, com perda mínima de qualidade.
  4. Tensor parallelism para modelos grandes -- Divida entre GPUs quando o modelo não cabe em uma.
  5. Pré-carregue modelos -- Use init containers ou PVCs com pesos em cache. Não faça download a cada início de pod.
Erro Comum

Baixar os pesos do modelo do HuggingFace a cada reinício do pod. Um modelo 13B tem 26GB. Use um PVC com pesos pré-baixados ou um init container que faça cache em um volume compartilhado.

Quando evoluir do KAITO para custom​

SinalAção
Precisa de quantização customizada (AWQ/GPTQ)Faça deploy do vLLM diretamente com modelo quantizado
Throughput insuficientevLLM com batch sizes e paralelismo ajustados
Modelo não está na lista de suportados do KAITODeploy manual necessário
Precisa de roteamento de requests entre modelosFaça deploy com Triton ou gateway customizado
Precisa servir 5+ modelos em GPUs compartilhadasTime-slicing + deploy customizado

Recursos​