Ollama et vLLM : servir un modèle

Première leçon du cours Héberger des modèles d'IA en local, en accès libre : environ 20 minutes, 3 exercices et 3 questions de quiz. C'est la leçon de base du catalogue ; dans l'espace étudiant, elle est réécrite pour ton profil.

Objectifs

  • Expliquer pourquoi et quand héberger un modèle soi-même
  • Télécharger, lancer et interroger un modèle avec Ollama
  • Situer vLLM par rapport à Ollama et connaître son API compatible OpenAI

OllamavLLMAPI de serveur de modèles

Pourquoi héberger un modèle soi-même ?

Appeler un modèle chez un fournisseur cloud est simple : une clé, une requête, une facture au token. Héberger un modèle ouvert (dont les poids sont téléchargeables) sur sa propre machine répond à d’autres besoins :

  • confidentialité : les données ne quittent pas votre infrastructure ;
  • maîtrise des coûts : un coût de machine prévisible plutôt qu’un coût proportionnel à l’usage ;
  • indépendance : pas de changement de version imposé, fonctionnement hors ligne possible.

Les contreparties sont réelles : il faut une machine adaptée (souvent un GPU), installer, superviser, mettre à jour et sécuriser. Les modèles ouverts que l’on peut faire tourner sur une seule carte sont aussi, en général, moins performants que les plus grands modèles commerciaux sur les tâches difficiles. D’où l’architecture « local d’abord, cloud en secours » vue plus loin.

Ollama : démarrer en trois commandes

Ollama est un outil open source qui télécharge, gère et sert des modèles. Sous Linux, l’installation officielle se fait par un script, puis :

ollama serve &                 # démarre le serveur (souvent lancé comme service)
ollama pull qwen2.5:0.5b       # télécharge un petit modèle
ollama run qwen2.5:0.5b "Explique une boucle for en une phrase."
ollama list                    # modèles téléchargés
ollama ps                      # modèles chargés en mémoire, sur GPU ou CPU

Les modèles sont désignés par un nom et une étiquette (qwen2.5:0.5b) qui précise la taille et parfois la quantification. Sans GPU, Ollama fonctionne sur CPU, plus lentement : c’est suffisant pour apprendre avec un petit modèle.

L’API HTTP d’Ollama

Le serveur écoute par défaut sur 127.0.0.1:11434. Votre application l’interroge en HTTP :

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model": "qwen2.5:0.5b",
  "prompt": "Donne un synonyme de rapide.",
  "stream": false
}'

La réponse JSON contient le texte (response), un indicateur done et des mesures : prompt_eval_count et eval_count (tokens lus et générés), eval_duration et total_duration (en nanosecondes). D’autres routes existent : /api/chat pour une conversation, /api/tags pour la liste des modèles, /api/embed pour les embeddings.

Ollama expose aussi une API compatible OpenAI sous /v1 (par exemple /v1/chat/completions) : une bibliothèque cliente prévue pour OpenAI fonctionne en changeant l’URL de base.

vLLM : servir à grande échelle

vLLM est un moteur d’inférence open source conçu pour le débit sur GPU. Il regroupe dynamiquement les requêtes en cours (continuous batching) et gère la mémoire du cache d’attention par pages (PagedAttention), ce qui lui permet de servir efficacement de nombreuses requêtes simultanées.

vllm serve Qwen/Qwen2.5-7B-Instruct --max-model-len 8192 --api-key "$VLLM_API_KEY"
curl -s http://127.0.0.1:8000/v1/models -H "Authorization: Bearer $VLLM_API_KEY"

vLLM charge les modèles au format Hugging Face (désignés par organisation/modèle) et sert par défaut sur le port 8000 une API compatible OpenAI. Une image Docker officielle (vllm/vllm-openai) facilite le déploiement.

Lequel choisir ?

Critère Ollama vLLM
Mise en route très simple plus technique
Matériel CPU ou GPU GPU principalement
Format des modèles GGUF (quantifiés) Hugging Face, quantifications AWQ, GPTQ…
Point fort prototypage, petits volumes nombreuses requêtes simultanées

Comme les deux parlent le même dialecte OpenAI, on peut commencer avec Ollama et passer à vLLM quand la charge l’exige, sans réécrire l’application : seuls l’URL et les noms de modèles changent. Mesurez votre propre charge avant de décider : aucun chiffre générique ne remplace un test sur votre matériel.

À retenir

  • Héberger soi-même apporte confidentialité et maîtrise, au prix de l’exploitation.
  • Ollama : pull, run, list, ps, API sur le port 11434.
  • vLLM : orienté débit sur GPU, API compatible OpenAI sur le port 8000.
  • L’API compatible OpenAI permet de changer de serveur sans réécrire l’application.

Exercices

Les solutions et les tests restent sur le serveur. Dans l'espace étudiant, ton code est exécuté et corrigé, et le tuteur donne des indices avant la solution.

  1. TâcheDifficulté 12 indices

    Lancer et interroger Ollama

    Dans le terminal de l’exercice :

    1. Installez Ollama si la commande ollama est absente (script officiel), puis démarrez le serveur en arrière-plan : ollama serve > ollama.log 2>&1 &.
    2. Téléchargez le modèle qwen2.5:0.5b et vérifiez qu’il apparaît dans ollama list.
    3. Envoyez avec curl une requête non streamée à /api/generate demandant « Donne un synonyme de rapide. » et enregistrez la réponse dans reponse.json.
    4. Affichez le champ response avec python3 -c (module json).
    • `ollama list` affiche une ligne commençant par `qwen2.5:0.5b`
    • `curl -s http://127.0.0.1:11434/api/tags` renvoie un JSON contenant `qwen2.5:0.5b`
    • `reponse.json` est un objet JSON unique avec `"done": true`
    • Le champ `response` affiché est un texte non vide
  2. TâcheDifficulté 22 indices

    Lire les mesures d'une réponse

    Créez le fichier mesures.json avec ce contenu (réponse d’Ollama enregistrée lors d’un test) :

    {"model": "qwen2.5:0.5b", "response": "Véloce.", "done": true,
     "total_duration": 2150000000, "load_duration": 900000000,
     "prompt_eval_count": 34, "prompt_eval_duration": 250000000,
     "eval_count": 120, "eval_duration": 1000000000}

    Avec python3 -c, affichez : le nombre de tokens générés, la durée totale en secondes et la part de la durée totale consacrée au chargement du modèle (en pourcentage, arrondie à l’entier).

    • Le fichier `mesures.json` est un JSON valide (`python3 -m json.tool mesures.json` réussit)
    • Les durées sont converties de nanosecondes en secondes (division par 10^9)
    • Les trois valeurs sont affichées par une seule commande
  3. QCMDifficulté 21 indice

    Choisir le serveur

    Une équipe doit servir un modèle de 7 milliards de paramètres à une application interne qui reçoit régulièrement plusieurs dizaines de requêtes simultanées, sur un serveur GPU dédié. Quel choix est le plus adapté ?

    • Ollama sur CPU, pour éviter d'utiliser le GPU
    • vLLM sur le GPU, conçu pour le débit avec de nombreuses requêtes simultanées
    • Un script Python qui charge le modèle à chaque requête

Quiz de fin de leçon

  1. Sur quel port Ollama écoute-t-il par défaut ?

    • 8000
    • 11434
    • 8080
  2. Quel avantage apporte l’API compatible OpenAI d’Ollama et de vLLM ?

    • Elle rend les modèles plus précis
    • Elle permet de changer de serveur en modifiant l'URL et le nom du modèle, sans réécrire l'application
    • Elle supprime le besoin de GPU
  3. Que montre la commande ollama ps ?

    • Les modèles disponibles sur le site d'Ollama
    • Les modèles actuellement chargés en mémoire et où ils s'exécutent
    • Les processus système de la machine

La suite du cours

  1. Choisir un modèle et sa quantification20 min
  2. VRAM et débit20 min
  3. Passerelle « local d'abord, cloud en secours »20 min
  4. Sécuriser un serveur de modèles20 min

Héberger des modèles d'IA en local · Avancé · 1 h 40