Aller au contenu

🔄 Migrer d'Ollama vers vLLM


Quand migrer ?

Ollama reste le meilleur choix pour le développement solo et les petites équipes. La migration vers vLLM se justifie quand :

SignalSeuil indicatif
Utilisateurs simultanés> 5–10 (file d’attente visible)
Latence p95> 10 s pour un modèle 8B
Débit cible> 50 tok/s agrégés
Requêtes concurrentes> 20/min en pointe
SLA définiTTFT < 2 s garanti

Compatibilité API — ce qui change, ce qui ne change pas

Les deux services exposent une API compatible OpenAI sur /v1/. Dans la majorité des cas, seule l’URL de base change.

Ce qui ne change pas

# Avant (Ollama)
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
# Après (vLLM)
client = OpenAI(base_url="http://localhost:8000/v1", api_key="sk-votre-token")
# Le code qui suit est identique dans les deux cas
response = client.chat.completions.create(
model="llama3.1", # voir section "noms de modèles" ci-dessous
messages=[{"role": "user", "content": "Bonjour"}],
temperature=0.7,
max_tokens=500
)

Ce qui change

FonctionnalitéOllamavLLM
Port par défaut114348000
AuthentificationAucuneToken Bearer obligatoire en prod
Format modèleGGUF (natif)HuggingFace safetensors, AWQ, GPTQ
Endpoint pull modèlePOST /api/pullNon supporté (pré-chargement)
Endpoint generate (legacy)POST /api/generateNon supporté (utiliser /v1/)
StreamSupportéSupporté
EmbeddingsPOST /api/embeddingsPOST /v1/embeddings

Noms de modèles

Ollama utilise ses propres noms (llama3.2, qwen2.5:14b). vLLM utilise les identifiants HuggingFace (meta-llama/Llama-3.2-3B-Instruct), mais vous pouvez définir un alias avec --served-model-name pour conserver la compatibilité :

Fenêtre de terminal
# vLLM avec alias compatible Ollama
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--served-model-name llama3.1 \ # ← le client envoie "llama3.1", vLLM comprend
--port 8000

Conversion des modèles GGUF

vLLM ne lit pas nativement les fichiers GGUF. Deux options :

Option A — Télécharger les poids HuggingFace natifs (recommandé)

La plupart des modèles Ollama ont un équivalent HuggingFace officiel :

Modèle OllamaÉquivalent HuggingFace
llama3.2meta-llama/Llama-3.2-3B-Instruct
llama3.1:70bmeta-llama/Llama-3.1-70B-Instruct
qwen2.5:14bQwen/Qwen2.5-14B-Instruct
qwen2.5-coder:32bQwen/Qwen2.5-Coder-32B-Instruct
phi4microsoft/phi-4
deepseek-r1:70bdeepseek-ai/DeepSeek-R1-Distill-Llama-70B
Fenêtre de terminal
# Télécharger via Hugging Face CLI
pip install huggingface_hub
huggingface-cli login # token HF requis pour les modèles protégés (Llama)
huggingface-cli download meta-llama/Llama-3.1-8B-Instruct \
--local-dir /data/models/llama3.1-8b

Option B — Utiliser une version AWQ pré-quantifiée

Pour les modèles lourds (70B+), les versions AWQ sont plus légères et gérées nativement par vLLM3 :

Fenêtre de terminal
# AWQ 4-bit — qualité proche du BF16 avec ~25% de la VRAM
vllm serve hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4 \
--quantization awq_marlin \
--dtype half

Option C — Convertir un GGUF vers safetensors (avancé)

Si vous avez un modèle GGUF custom (fine-tuné, merged), la conversion est possible via llama.cpp :

Fenêtre de terminal
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
pip install -r requirements.txt
# Convertir GGUF → safetensors (dequantifie vers fp16)
python convert_hf_to_gguf.py --outtype f16 \
/path/to/model.gguf \
--outfile /path/to/output/model.safetensors

Stratégie de bascule sans interruption

Phase 1 — Déploiement parallèle

Lancez vLLM sur un port différent (8001) en parallèle d’Ollama (11434). Ne touchez pas encore aux clients.

Fenêtre de terminal
# vLLM sur port 8001 (staging)
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--served-model-name llama3.2 \
--port 8001

Phase 2 — Qualification

Comparez les résultats sur vos prompts réels4 :

Fenêtre de terminal
# Script de comparaison A/B
for prompt in "Résume ce contrat" "Rédige un email" "Analyse ce code"; do
echo "=== Ollama ==="
curl -s http://localhost:11434/v1/chat/completions \
-d "{\"model\":\"llama3.2\",\"messages\":[{\"role\":\"user\",\"content\":\"$prompt\"}]}" \
| python3 -c "import sys,json; r=json.load(sys.stdin); print(r['choices'][0]['message']['content'][:200])"
echo "=== vLLM ==="
curl -s http://localhost:8001/v1/chat/completions \
-H "Authorization: Bearer sk-token" \
-d "{\"model\":\"llama3.2\",\"messages\":[{\"role\":\"user\",\"content\":\"$prompt\"}]}" \
| python3 -c "import sys,json; r=json.load(sys.stdin); print(r['choices'][0]['message']['content'][:200])"
done

Phase 3 — Bascule via reverse proxy

Modifiez uniquement la configuration du reverse proxy (Caddy ou Nginx), pas les clients.

Caddy — bascule du backend :

# Avant
reverse_proxy localhost:11434
# Après (changer uniquement cette ligne)
reverse_proxy localhost:8000

Rechargement à chaud de Caddy sans coupure :

Fenêtre de terminal
caddy reload --config Caddyfile

Phase 4 — Arrêt d’Ollama

Après 48h sans problème signalé :

Fenêtre de terminal
# Arrêter Ollama
sudo systemctl stop ollama
sudo systemctl disable ollama
# Libérer la mémoire des modèles en cache Ollama
# (optionnel, les fichiers GGUF restent sur disque)

Plan de rollback

Fenêtre de terminal
# 1. Redémarrer Ollama
sudo systemctl start ollama
# 2. Rebrancher le reverse proxy sur Ollama
# Modifier le backend dans Caddyfile/nginx.conf → port 11434
caddy reload --config Caddyfile
# 3. Vérifier
curl http://localhost/v1/models

Le rollback complet prend < 2 minutes si Ollama était simplement arrêté (pas désinstallé).


Checklist de migration

□ Équivalent HuggingFace identifié pour chaque modèle Ollama utilisé
□ Modèles téléchargés et chargés dans vLLM (test /health OK)
□ --served-model-name configuré pour la compatibilité des noms
□ Authentification Bearer Token configurée et testée côté clients
□ Déploiement parallèle validé (phase 1-2 complètes)
□ Performances comparées sur les prompts métier (débit, TTFT, qualité)
□ Monitoring Prometheus actif avant la bascule
□ Reverse proxy reconfiguré et rechargé sans coupure
□ Période de surveillance 48h post-bascule
□ Procédure de rollback documentée et testée

Voir aussi


Sources et Références

Footnotes

  1. vLLM Project, PagedAttention — Continuous Batching (gestion dynamique KV Cache, comparaison avec Ollama en concurrence). https://vllm.ai/blog/2023/06/20/vllm.html

  2. vLLM Project, OpenAI-Compatible Server (endpoints supportés /v1/chat/completions, /v1/completions, /v1/embeddings, --served-model-name). https://docs.vllm.ai/en/stable/serving/openai_compatible_server.html

  3. vLLM Project, Quantization — AWQ (AWQ Marlin kernel, performances vs GPTQ, modèles HuggingFace compatibles). https://docs.vllm.ai/en/stable/features/quantization/auto_awq.html

  4. vLLM Project, Benchmarks (scripts de benchmarking comparatif, latence et débit). https://docs.vllm.ai/en/stable/performance/benchmarks.html