Logo VRAMfarm VRAMfarm
FR
S’inscrire

12 novembre 2026 · Équipe VRAMfarm

vLLM, Ollama ou llama.cpp : avec quoi faire tourner votre LLM, et les commandes

Trois terminaux côte à côte qui font tourner vLLM, Ollama et llama.cpp sur un même GPU loué : quel moteur choisir pour un LLM

Si vous êtes la seule personne à parler au modèle, les trois sont à peu près aussi rapides et c’est Ollama qui demande le moins de travail : une commande d’installation et un ollama run. Si un script envoie 50 requêtes en parallèle ou si dix collègues utilisent le même modèle, vLLM tire de la même carte environ 5 à 10 fois plus de tokens par seconde au total, et l’écart grandit avec la charge. llama.cpp, le moteur dont Ollama est issu, est celui qu’il vous faut quand vous voulez contrôler chaque octet : fichiers de quantification exacts, types de cache, couches qui restent sur le CPU.

Les trois tournent sur un serveur loué avec une image PyTorch vide, et les trois proposent une API compatible OpenAI. Les différences tiennent au batching, aux formats de fichiers et à la façon de gérer la mémoire.

La version courte

Ollama llama.cpp vLLM
Idéal pour Une personne, démarrage rapide, un chat privé Le contrôle, les tailles atypiques, les modèles plus gros que la carte Une API pour des applications, plusieurs utilisateurs, des traitements par lots
Installation Un script Compilation avec CUDA pip install vllm, adapté à la version CUDA
Formats de modèle GGUF, depuis sa propre bibliothèque ou Hugging Face GGUF BF16 d’origine, FP8, AWQ, GPTQ, bitsandbytes, NVFP4 sur Blackwell
Mémoire Prend ce dont le modèle a besoin ; déborde sur le CPU s’il en manque Exactement ce que vous fixez ; déchargement par couche Réserve 90 % de la carte au démarrage
Requêtes parallèles Une à quelques-unes à la fois (OLLAMA_NUM_PARALLEL) Slots, batching continu Batching continu, de quelques dizaines à quelques centaines
API compatible OpenAI Oui, port 11434, /v1 Oui, llama-server Oui, /v1
Plusieurs GPU Répartit les couches Répartit les couches ou les lignes Parallélisme tensoriel et pipeline
Démarrage après téléchargement Quelques secondes Quelques secondes 1 à 5 minutes

Ollama repose sur les mêmes fondations GGML que llama.cpp : leurs formats de fichiers, leurs niveaux de quantification et leur vitesse pour un seul utilisateur sont donc proches. Ce qu’Ollama ajoute, c’est le confort : une bibliothèque de modèles aux noms courts, la détection automatique du GPU, des modèles chargés à la demande. Ce qu’il cache, c’est le contrôle, et vous vous en apercevez le jour où un modèle tourne lentement et où vous devez comprendre pourquoi.

Vitesse : une conversation contre cinquante

Pour une seule conversation, la génération de texte est limitée par la bande passante mémoire : pour chaque nouveau token, la carte relit le modèle entier une fois. Le moteur compte moins que la taille du fichier. D’où un résultat inattendu : vLLM qui sert un modèle 8B dans son BF16 d’origine (16 Go) est plus lent pour un utilisateur qu’Ollama avec un fichier en 4 bits (5 Go), tout simplement parce qu’il lit trois fois plus d’octets par token.

Le batching change la donne. vLLM lit les poids une seule fois pour tout un lot de requêtes et ajoute les nouvelles requêtes au lot en cours à mesure que les anciennes se terminent : le débit total croît presque linéairement avec le nombre d’utilisateurs, jusqu’à épuisement du calcul ou de la mémoire de cache. Fourchettes indicatives pour un modèle 8B sur une RTX 4090, tirées du calcul de bande passante et de retours de la communauté, pas de nos propres benchmarks :

Configuration 1 utilisateur 16 utilisateurs simultanés, total Par utilisateur à 16
Ollama, Q4_K_M 100–150 tokens/s 100–300 (un ou quelques-uns servis à la fois, les autres attendent) lent et irrégulier
llama.cpp, Q4_K_M, 16 slots 100–150 300–700 20–45
vLLM, BF16 45–60 600–1 200 40–75
vLLM, AWQ 4 bits 100–140 800–1 500 50–90

La vitesse pour un utilisateur est largement suffisante sur chaque ligne : on lit à 5 à 8 tokens par seconde. L’écart se creuse avec la charge : un bot de support, un outil interne pour une équipe, ou un traitement par lots qui classe 100 000 descriptions de produits pendant la nuit. Pour ces usages, vLLM est le bon moteur, et le coût par million de tokens montre l’effet sur la facture.

Deux autres moteurs méritent d’être connus. SGLang est une alternative proche de vLLM, avec des formats similaires et un serveur compatible OpenAI, performant sur de nombreuses requêtes qui partagent un long préfixe. TensorRT-LLM tire le maximum des cartes NVIDIA de data center, mais demande plus de configuration. Si vous hésitez entre les trois premiers, vous n’avez besoin ni de l’un ni de l’autre.

Comment chacun gère la mémoire

La plupart des histoires de « c’était lent » et de « ça a planté » viennent de là.

Ollama déborde sur le CPU sans vous prévenir. Si le modèle et son contexte ne tiennent pas, Ollama déplace des couches vers la RAM système et continue à une fraction de la vitesse. Dans notre propre test, Qwen3 32B sur une carte de 24 Go avec un contexte de 32k a envoyé 18 % de ses couches sur le CPU et est tombé d’environ 30 tokens par seconde à 2,5. Lancez ollama ps : la colonne PROCESSOR doit indiquer 100% GPU. Réglez le contexte avec OLLAMA_CONTEXT_LENGTH, et rappelez-vous que OLLAMA_NUM_PARALLEL multiplie le cache : quatre slots parallèles à 8k de contexte demandent le cache de 32k.

llama.cpp fait exactement ce que vous lui dites. -ngl fixe le nombre de couches envoyées sur le GPU (99 veut dire toutes), -c fixe le contexte total, et -np le nombre de slots parallèles qui se le partagent : -c 32768 -np 4 donne à quatre utilisateurs environ 8k chacun. Pour les modèles mixture-of-experts qui ne tiennent pas, --n-cpu-moe garde une partie des poids des experts en RAM système tandis que les couches partagées restent sur le GPU, ce qui fait tourner de gros modèles MoE sur des cartes plus petites à une vitesse utilisable.

vLLM réserve la mémoire d’avance. Par défaut, il prend 90 % de la carte au démarrage et remplit avec du KV cache ce que les poids n’utilisent pas. Il vérifie ensuite qu’une requête au contexte maximal tient, et refuse de démarrer si ce n’est pas le cas ; le message d’erreur indique le plus grand contexte qui tiendrait. Réglez --max-model-len sur ce dont vous avez vraiment besoin, et baissez --gpu-memory-utilization si autre chose doit partager la carte. Le guide CUDA out of memory couvre le reste.

Ollama : commandes de démarrage

Sur un serveur PyTorch vide, dans le terminal Jupyter ou en SSH :

curl -fsSL https://ollama.com/install.sh | sh
OLLAMA_CONTEXT_LENGTH=8192 OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0 \
  ollama serve > /workspace/ollama.log 2>&1 &
ollama run qwen3:8b

N’importe quel GGUF de Hugging Face fonctionne aussi : ollama run hf.co/<user>/<repo>:Q4_K_M. L’API écoute sur le port 11434 :

curl http://localhost:11434/v1/chat/completions -H "Content-Type: application/json" \
  -d '{"model": "qwen3:8b", "messages": [{"role": "user", "content": "Hello"}]}'

Si vous voulez seulement une fenêtre de chat, vous n’avez besoin de rien de tout cela : l’application prête à l’emploi Private ChatGPT installe d’elle-même Ollama, un modèle Qwen3 ou MiMo et Open WebUI, comme l’explique votre propre ChatGPT avec Open WebUI.

llama.cpp : compiler une fois, puis lancer

llama.cpp doit être compilé avec CUDA. L’image du serveur contient le runtime CUDA mais pas le compilateur : installez donc d’abord la boîte à outils de NVIDIA. Elle télécharge quelques Go, qui comptent comme du trafic, et la compilation prend 5 à 15 minutes :

wget -q https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb && apt-get update -qq
apt-get install -y -qq cuda-toolkit-12-8 cmake git build-essential
export PATH=/usr/local/cuda-12.8/bin:$PATH

git clone https://github.com/ggml-org/llama.cpp /workspace/llama.cpp && cd /workspace/llama.cpp
cmake -B build -DGGML_CUDA=ON && cmake --build build --config Release -j

Téléchargez ensuite un GGUF et démarrez le serveur avec quatre slots parallèles :

pip install -U huggingface_hub
hf download <user>/<repo>-GGUF <model>-Q4_K_M.gguf --local-dir /workspace/models
./build/bin/llama-server -m /workspace/models/<model>-Q4_K_M.gguf \
  -ngl 99 -c 32768 -np 4 --flash-attn on --host 127.0.0.1 --port 8081

Sur nos serveurs, le port 8080 est occupé par Jupyter, d’où le 8081. llama-server sert l’API de type OpenAI sur /v1 et une page de chat simple à la racine. Si vous comptez réutiliser llama.cpp, gardez le dossier compilé /workspace/llama.cpp dans le dossier enregistré plutôt que de recompiler à chaque fois.

vLLM : une API en deux commandes

pip install "vllm==0.11.0" "transformers>=4.56,<5"   # compilé pour CUDA 12.8
vllm serve Qwen/Qwen3-8B --max-model-len 16384 \
  --host 0.0.0.0 --port 8000 --api-key change-me > /workspace/vllm.log 2>&1 &

Un simple pip install vllm installe la dernière version avec sa propre build de PyTorch, et à l’automne 2026 cette build cible une version de CUDA plus récente que ce que gèrent les pilotes de nombreuses machines : le moteur ne démarre alors pas. C’est pourquoi la commande ci-dessus fixe vLLM 0.11.0 (PyTorch 2.8, CUDA 12.8), la version qu’utilise notre serveur vLLM ; sur une machine dont la fiche du catalogue indique CUDA 13 ou plus récent, vous pouvez prendre une version ultérieure. Vérifiez la version CUDA affichée avant le lancement ; les incompatibilités entre CUDA et le pilote expliquent comment lire ces chiffres. Le serveur vLLM prêt à l’emploi évite cette étape : vLLM y est installé dans une version adaptée à la machine, et il démarre de lui-même un modèle Qwen 7B. Pour y servir un autre modèle, lancez pkill -f "vllm serve" et démarrez votre propre commande sur le port 8000.

Depuis votre code, utilisez le client OpenAI standard avec votre propre adresse :

from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="change-me")
r = client.chat.completions.create(model="Qwen/Qwen3-8B",
    messages=[{"role": "user", "content": "Summarise this ticket: ..."}])
print(r.choices[0].message.content)

Les mêmes lignes, avec une autre URL de base, connectent un bot Telegram, un pipeline RAG ou une application existante écrite pour OpenAI.

Accéder à l’API depuis l’extérieur, et la garder en marche

Un serveur n’a pas d’IP publique à lui ; SSH, Jupyter et les applications passent par notre adresse, avec des ports attribués à ce serveur. Sur le serveur vLLM, le port 8000 est déjà publié, et le tableau de bord affiche l’adresse de l’API. Sur un serveur PyTorch vide, seuls SSH et Jupyter sont publiés : accédez donc à Ollama ou à llama.cpp par un tunnel SSH depuis votre ordinateur, ssh -p <port> -L 8081:localhost:8081 root@<address> (port et adresse sur la fiche du serveur ; le guide de la clé SSH explique comment configurer la clé), puis utilisez http://localhost:8081. Une image Docker personnalisée peut publier son propre port. Docker n’est pas disponible à l’intérieur du serveur, c’est pourquoi toutes les commandes ici installent avec pip ou un script.

Tout ce qui est accessible de l’extérieur a besoin d’une clé. vLLM accepte --api-key, llama.cpp accepte aussi --api-key, et Ollama n’a pas de clé à lui : gardez-le derrière un tunnel.

Démarrez les serveurs de longue durée avec nohup ... & et un fichier de log comme ci-dessus, ou dans tmux (apt-get install -y tmux, puis tmux new -s llm), pour qu’ils continuent quand vous fermez le navigateur ou la session SSH. Ils s’arrêtent avec le serveur : la facturation prend fin dans la minute où vous cliquez sur Arrêter, et le lancement suivant repart d’un disque vierge, à l’exception de ce que vous avez gardé dans le dossier enregistré.

Questions sur ce sujet

Puis-je appeler mon modèle depuis ma propre application ou un bot Telegram ?

Oui. Les trois exposent une API compatible OpenAI : toute bibliothèque ou tout framework de bot qui parle à OpenAI fonctionne dès que vous remplacez l’URL de base par celle de votre serveur et le nom du modèle par le vôtre. Prenez vLLM si le bot a beaucoup d’utilisateurs simultanés.

Utilisent-ils les deux GPU d’une machine à deux cartes ?

Ollama et llama.cpp répartissent d’eux-mêmes les couches sur les deux cartes : vous disposez de la mémoire des deux, mais d’un faible gain de vitesse pour un seul utilisateur. vLLM a besoin de --tensor-parallel-size 2, et il utilise alors la mémoire et la bande passante des deux cartes en même temps.

Pourquoi vLLM prend-il 90 % de la mémoire du GPU alors que le modèle est petit ?

C’est voulu : il réserve d’avance la mémoire du KV cache pour servir de nombreuses requêtes sans allouer en cours de route. Baissez-la avec --gpu-memory-utilization 0.6 si vous voulez faire tourner autre chose sur la même carte.

Puis-je simplement lancer l’image Docker officielle de vLLM ou d’Ollama ?

Pas à l’intérieur d’un serveur, car le serveur est lui-même un conteneur. Installez-les avec pip ou le script d’installation comme indiqué ici, ou lancez plutôt le serveur à partir de votre propre image Docker.

Trouvez le GPU qui convient à votre modèle

Choisissez un modèle et voyez la carte la moins chère avec assez de VRAM, facturée à la minute en euros.