Playbook de réglage & benchmarkTuning & benchmark playbook
Les leviers par ordre d'effet, leur nom dans chaque moteur, et la méthodologie de mesure qui ne se ment pas.Levers by order of effect, their name in each engine, and the measurement methodology that does not lie to you.
1. Les deux phases — ne pas les confondreThe two phases — do not confuse them
PréremplissagePrefill
DécodageDecode
ParallélisableParallelisable
ouiyes
nonno
Limité parLimited by
le calculcompute
la bande passante mémoirememory bandwidth
MétriqueMetric
TTFT
tokens/s
Levier principalMain lever
taille de lot, réutilisation de préfixebatch size, prefix reuse
1. ÉCHAUFFEMENT jetez le premier passage. Mesuré sur le lab : TTFT 8,2 s et
4,5 s à froid, contre 334-434 ms à chaud. Un premier passage
non échauffé mesure votre disque, pas votre modèle.
2. UNE SEULE VARIABLE À LA FOIS.
3. PROMPT ET SORTIE FIXES. temperature 0, seed fixe, même max_tokens.
4. N PASSAGES, MÉDIANE. jamais la moyenne (un pic la fausse), jamais 1 seul.
5. SÉPARER TTFT ET DÉBIT. deux métriques, deux causes, deux leviers.
6. MESURER SOUS CHARGE pour parler de débit. Un débit mono-requête ne dit
RIEN de la capacité d'un service.
7. NOTER LA CONFIGURATION AVEC LE RÉSULTAT. Un chiffre sans sa config
(modèle, quant, contexte, ngl, threads, moteur) est inutile.
4. Résultats mesurés sur le lab (2026-09-18)Results measured on the lab (2026-09-18)
ConfigurationConfiguration
TTFT
prefill
decode
tokens/s
llama3.1:8b · num_gpu=0 (CPU 8 cœurs)
542 ms
213 ms
28 933 ms
4,15
llama3.1:8b · num_gpu=999 (1× RTX 3060)
385 ms
16 ms
1 877 ms
63,93
Mistral-7B Q4 · llama.cpp build CPU (même client)Mistral-7B Q4 · llama.cpp CPU build (same client)
261 ms
—
—
4,07
Modèle métier support-json:v1 (Modelfile)Custom model support-json:v1 (Modelfile)
—
27 ms / 140 tok/ 140 tok
—
65,03
🎯 La phrase de genou à produire : « au-delà de N couches déportées, le débit cesse de progresser parce que la VRAM est saturée ». Sur le lab, 8 B Q4 en 8 k tient sur une carte (6,4 Go sur 12) ; le second GPU ne sert qu'aux modèles de 27 B et plus.The knee sentence to produce: "beyond N offloaded layers, throughput stops improving because VRAM is saturated". On the lab, 8 B Q4 at 8 k fits on one card (6.4 GB of 12); the second GPU only serves 27 B+ models.
5. Ce qui ne sert à rienWhat does not help
⛔ Optimiser le code Python qui appelle l'API (il attend 99,9 % du temps) · ajouter de la RAM quand la VRAM est pleine · overclocker le GPU pour le décodage (limité par la bande passante, pas la fréquence) · réduire max_tokens en croyant accélérer (raccourcit la sortie, pas la vitesse par token) · monter les threads au-delà des cœurs physiques (contention mémoire → le débit baisse).Optimising the Python code calling the API (it waits 99.9 % of the time) · adding RAM when VRAM is full · overclocking the GPU for decoding (bandwidth-limited, not clock-limited) · lowering max_tokens thinking it speeds things up (shortens output, not per-token speed) · raising threads beyond physical cores (memory contention → throughput falls).
6. Modèle de rapportReport template
Matériel : 1x RTX 3060 12 Go / CPU 8 coeurs / 23 Go RAM
Moteur : Ollama 0.32.13
Modèle : llama3.1:8b, Q4_K_M, 4,92 Go
Réglages : num_ctx=8192, num_gpu=999, threads=par défaut
Charge : 1 requête, prompt 40 tokens, sortie 180 tokens
Résultats : TTFT médian 369 ms (p95 434 ms)
Débit médian 63,7 tok/s (n=5, échauffement exclu)
Démarrage à froid : 4,5 s
Conclusion : convient à un usage interactif ; pour 10 utilisateurs
simultanés, mesurer --parallel et envisager vLLM.