Leçon 1 — Paysage LLM 2026 et déploiement
Comparatif APIs commerciales et modèles open-source, déploiement avec vLLM/TGI/Ollama, tokens et coûts.
Objectifs de la leçon
- Comparer LLM closed-source (OpenAI, Anthropic, Google, Mistral) et open-source (Llama 3, Mixtral, Qwen, DeepSeek)
- Comprendre tokens, context window, throughput, latency, coût
- Déployer un modèle open-source avec vLLM (paged attention)
- Choisir entre vLLM, Text Generation Inference (TGI), Ollama, llama.cpp
- Architecturer une API d'inférence production-grade
1. Paysage 2026 — les acteurs
1.1 APIs closed-source
| Modèle | Éditeur | Context | Prix (in/out par M tokens) |
| GPT-5 | OpenAI | 400 K | Variable, ~$5/$15 |
| Claude Opus 4.5 / 4.7 | Anthropic | 200 K / 1 M | ~$15/$75 |
| Claude Sonnet 4.5 | Anthropic | 200 K | ~$3/$15 |
| Claude Haiku 4.5 | Anthropic | 200 K | ~$0,80/$4 |
| Gemini 2.5 Pro | Google | 1-2 M | ~$1,25/$5 |
| Mistral Large 2 | Mistral | 128 K | ~$3/$9 |
1.2 Open-source 2026
| Modèle | Éditeur | Taille | Particularité |
| Llama 3.3 70B | Meta | 70B | Multilingue, licence ouverte commerciale |
| Mixtral 8x22B | Mistral | 141B (MoE 39B actifs) | Mixture-of-Experts, Apache 2.0 |
| Qwen 2.5 72B | Alibaba | 72B | Excellent en multilingue, code |
| DeepSeek-V3 | DeepSeek | 671B (MoE 37B actifs) | Open, performance frontière |
| Phi-4 | Microsoft | 14B | SLM (small language model) |
| Gemma 2 27B | Google | 27B | Licence Google |
Source 2026 : LMSYS Chatbot Arena — leaderboard ELO basé sur préférences humaines blind. Référence pour comparer la qualité.
2. Tokens et tokenization
Un LLM ne voit pas du texte mais des tokens (sous-mots via BPE / SentencePiece). En anglais ~ 4 caractères = 1 token. En français/chinois souvent plus de tokens par caractère.
| Modèle | Tokenizer | Vocab |
| GPT-4 / 5 | tiktoken (cl100k_base) | ~100 K |
| Claude | BPE custom | ~64 K |
| Llama 3 | tiktoken-based | 128 K |
| Mistral | SentencePiece | 32 K |
Compter des tokens (tiktoken)
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4o")
text = "Bonjour le monde, comment ça va ?"
tokens = enc.encode(text)
print(f"Tokens: {len(tokens)}") # ~10 tokens
print(f"Decoded: {[enc.decode([t]) for t in tokens]}")
3. Quand utiliser quoi ?
| Contexte | Recommandation |
| Prototypage rapide | API (Anthropic Claude Sonnet, GPT-5, Gemini Flash) |
| Production avec données sensibles (santé, finance, gouv.) | Open-source self-hosted ou Azure OpenAI / AWS Bedrock |
| Très haut volume, coûts dominants | Open-source self-hosted + quantization |
| Tâches simples (classification, extraction) | SLM (Phi-4, Llama 3.2 3B) ou Haiku/Mini |
| Frontière de performance (reasoning, code) | Claude Opus, GPT-5, Gemini 2.5 Pro |
| Latence ultra-faible (< 200 ms) | Modèle 7-13B local + Groq / Cerebras API |
4. vLLM — Le serveur d'inférence de référence
vLLM (UC Berkeley 2023) sert les LLMs open-source avec PagedAttention (analogue à OS paging pour la KV-cache) et continuous batching. Throughput 14-24× supérieur à HuggingFace TGI naïf.
Kwon W. et al., « Efficient Memory Management for Large Language Model Serving with PagedAttention », SOSP 2023, arXiv:2309.06180 · docs.vllm.ai
Servir Llama 3 8B avec vLLM
# Installation
pip install vllm
# Lancement serveur (OpenAI-compatible API)
vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
--host 0.0.0.0 --port 8000 \
--max-model-len 8192 \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.92
Appel client (compatible OpenAI SDK)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
resp = client.chat.completions.create(
model="meta-llama/Meta-Llama-3-8B-Instruct",
messages=[
{"role": "system", "content": "Tu es un assistant utile."},
{"role": "user", "content": "Résume Apache Spark en 2 phrases."}
],
max_tokens=200,
temperature=0.3,
stream=True
)
for chunk in resp:
print(chunk.choices[0].delta.content, end="")
5. Alternatives de serving
| Outil | Cible | Particularité |
| vLLM | GPU serveur | Throughput max, OpenAI-compatible |
| TGI (Hugging Face) | GPU serveur | Production HF Inference Endpoints |
| Ollama | Local dev (Mac/Linux/Win) | CLI ultra-simple, GGUF/llama.cpp |
| llama.cpp | CPU / Apple Silicon | C++, GGUF quantizé |
| SGLang | GPU serveur | Constraint decoding, structured output |
| LMDeploy | GPU serveur | NVIDIA-optimisé, TurboMind backend |
| Modal / Replicate / RunPod | Cloud GPU à la demande | SaaS, scale-to-zero |
6. Quantization pour l'inférence
Un Llama 3 70B en FP16 = 140 GB → impossible sur 1×A100 80 GB. La quantization réduit drastiquement la mémoire :
| Méthode | Bits | Mémoire (70B) | Qualité |
| FP16 / BF16 (baseline) | 16 | 140 GB | 100 % |
| FP8 (H100) | 8 | 70 GB | ~99 % |
| AWQ | 4 | ~40 GB | ~98-99 % |
| GPTQ | 4 | ~40 GB | ~97-99 % |
| Q4_K_M (GGUF) | ~4,5 | ~42 GB | ~99 % |
| Q2_K (GGUF) | ~2,5 | ~25 GB | Dégradée (perplexity +20 %) |
Recommandation 2026 : AWQ ou Q4_K_M pour servir un 70B sur 1×A100 80 GB. FP8 sur H100 si disponible. Éviter Q2/Q3 sauf prototype.
7. Latence et throughput
- Time To First Token (TTFT) : ~50-300 ms (prefill compute)
- Inter-Token Latency (ITL) : ~10-30 ms par token (decode)
- Throughput : tokens/s par GPU, jusqu'à 3 000+ sur Llama 8B sur H100
- Output speed perception : streaming > 30 tok/s = fluide pour l'utilisateur
8. API d'inférence production
Wrapper FastAPI avec rate limiting, auth, logging
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import APIKeyHeader
from pydantic import BaseModel
import httpx
from slowapi import Limiter
from slowapi.util import get_remote_address
app = FastAPI()
limiter = Limiter(key_func=get_remote_address)
api_key_header = APIKeyHeader(name="X-API-Key")
class ChatReq(BaseModel):
messages: list[dict]
max_tokens: int = 500
temperature: float = 0.3
def auth(key: str = Depends(api_key_header)):
if key not in VALID_KEYS:
raise HTTPException(401, "Invalid API key")
@app.post("/chat")
@limiter.limit("30/minute")
async def chat(req: ChatReq, _=Depends(auth)):
async with httpx.AsyncClient() as c:
r = await c.post("http://vllm:8000/v1/chat/completions",
json=req.dict(), timeout=60)
return r.json()
9. Coûts — règles d'orientation
| Volume | API closed (Sonnet) | Self-hosted 8B (H100) |
| 1 M tokens / mois | ~$18 | $200+ (1 GPU minimum) |
| 100 M tokens / mois | ~$1 800 | $1 000 (réservation) |
| 1 B tokens / mois | $18 000 | $3 000-5 000 |
| 10 B tokens / mois | $180 000 | $10 000-20 000 |
Anti-pattern : self-hoster un LLM "pour les économies" en dessous de 100 M tokens/mois. L'API reste moins chère et nettement moins coûteuse en personnel SRE/MLOps.
10. Synthèse et points-clés
- 2026 : Claude / GPT / Gemini dominent les API ; Llama 3.3, Mixtral, Qwen 2.5 dominent l'open-source
- Tokens ~ 4 caractères en anglais. Mesurer avec tiktoken
- vLLM = serveur de référence (PagedAttention, continuous batching)
- AWQ / GPTQ / GGUF Q4_K_M = quantization recommandée 2026
- Choisir API si < 100 M tokens/mois ou compliance non bloquante
- Streaming > 30 tok/s = perception fluide
- Wrapper FastAPI avec auth, rate-limit, observability obligatoire
Pour aller plus loin