vLLM

Servez un LLM à poids ouverts avec vLLM sur une machine Node Lodge. Installation avec uv, serveur compatible OpenAI, requêtes par tunnel SSH.

Servez un modèle à poids ouverts derrière une API compatible OpenAI.

GPU : 24 Go de VRAM ou plus pour le modèle 7B ci-dessous. Voir Inférence LLM pour le dimensionnement.

1. Vérifier le GPU

nvidia-smi

L’en-tête indique le pilote et la version CUDA la plus récente qu’il prend en charge.

2. Installer

curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env

uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto

--torch-backend=auto choisit la version de PyTorch adaptée au pilote installé.

3. Servir

Démarrez le serveur dans tmux pour qu’il survive aux déconnexions :

tmux new -s vllm
source .venv/bin/activate
vllm serve Qwen/Qwen2.5-7B-Instruct --max-model-len 8192

Détachez la session avec Ctrl+b d. Le premier démarrage télécharge les poids dans ~/.cache/huggingface. Le serveur est prêt quand il indique dans ses journaux qu’il écoute sur le port 8000.

Options utiles :

Option Usage
--tensor-parallel-size 2 Répartit le modèle sur 2 GPU dans les offres multi-GPU
--max-model-len 8192 Plafonne la longueur de contexte pour que le cache KV tienne en VRAM
--gpu-memory-utilization 0.90 Part de la VRAM que vLLM peut utiliser
--api-key <secret> Exige un jeton Bearer à chaque requête

Les modèles à accès restreint (Llama, Gemma) demandent un jeton Hugging Face :

export HF_TOKEN=hf_...

4. Interroger depuis la machine

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-7B-Instruct",
    "messages": [{"role": "user", "content": "Say hello in five words."}],
    "max_tokens": 32
  }'

5. Interroger depuis votre ordinateur

Seul SSH est ouvert en entrée. Redirigez le port 8000 :

ssh -N -L 8000:localhost:8000 ubuntu@203.0.113.42

Pointez ensuite n’importe quel client compatible OpenAI vers http://localhost:8000/v1 :

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="unused")
reply = client.chat.completions.create(
    model="Qwen/Qwen2.5-7B-Instruct",
    messages=[{"role": "user", "content": "Say hello in five words."}],
)
print(reply.choices[0].message.content)

Donnez à api_key la valeur de votre secret si vous avez démarré le serveur avec --api-key.

6. Terminer

Copiez ce dont vous avez besoin, puis sélectionnez End session. Les poids téléchargés sont supprimés avec la machine.

Référence : documentation vLLM.

Fait partie d'un cas d'usage : Inférence LLM, avec ce que garantit une session.

Les résultats apparaissent pendant la saisie. Les flèches permettent de les parcourir.