La tua prima API LLM su Kubernetes
Eseguire un LLM su Kubernetes è diverso dal far girare una normale web app. Non si scala solo in base alle richieste. Si scala in base alla capacità della GPU e ai pesi del modello.
In questa guida, distribuirai un modello su un nodo GPU, lo esporrai come API e lo chiamerai tramite una richiesta curl.
Usiamo questi strumenti:
- Modello: Qwen/Qwen2.5-1.5B-Instruct
- Motore: vLLM
- Infrastruttura: Kubernetes con supporto GPU NVIDIA
Passaggio 1: Controlla la capacità della tua GPU
Prima di iniziare, assicurati che Kubernetes veda il tuo hardware. Esegui questo comando:
kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu
Se la colonna GPU è vuota, fermati. Devi prima risolvere il problema del tuo NVIDIA device plugin.
Passaggio 2: Assicura l'accesso al tuo modello Anche per i modelli pubblici, usa un token di Hugging Face. Questo renderà più facile passare a modelli privati in seguito.
- Crea un namespace:
kubectl create namespace llm-demo - Crea un Secret per il tuo token:
kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"
Passaggio 3: Distribuisci il server del modello Usiamo vLLM perché gestisce il lavoro pesante. Si occupa di batching, tokenizzazione e dell'API compatibile con OpenAI.
Crea un file di deployment con questi requisiti chiave:
- Richiesta 1 GPU:
nvidia.com/gpu: 1 - Monta
/dev/shm: I server dei modelli necessitano di memoria condivisa per evitare crash. - Usa i Secret: Passa il tuo
HF_TOKENal container.
Applica la tua configurazione:
kubectl apply -f qwen-vllm.yaml
Passaggio 4: Verifica l'API
Non fidarti dello stato "Running". Un pod risulta "Running" anche mentre sta ancora scaricando enormi file di modello. Monitora i log:
kubectl logs -n llm-demo -f deployment/qwen-vllm
Attendi finché non vedi il server in ascolto sulla porta 8000.
Testalo con il port-forwarding:
kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000
Esegui la tua richiesta 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
}'
L'obiettivo: Sei passato dalla semplice capacità GPU a un'API funzionante. Hai dimostrato che:
- Kubernetes pianifica il carico di lavoro della GPU.
- Il container può accedere all'hardware.
- Il server del modello carica i pesi in memoria.
- L'API risponde alle richieste standard.
Se questo ciclo fallisce, lo scaling e il routing non ti salveranno. Sistema prima le fondamenta.
Community di apprendimento opzionale: https://t.me/GyaanSetuAi
