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éremplissagePrefillDécodageDecode
ParallélisableParallelisableouiyesnonno
Limité parLimited byle calculcomputela bande passante mémoirememory bandwidth
MétriqueMetricTTFTtokens/s
Levier principalMain levertaille de lot, réutilisation de préfixebatch size, prefix reusequantification, déport GPUquantization, GPU offload

2. Les 10 leviers, classés par effetThe 10 levers, ranked by effect

#LevierLeverllama.cppOllamaEffetEffect
1Déport GPUGPU offload-ngl Nnum_gpu×15 mesurémeasured (4,15 → 63,93 tok/s)
2Quantification des poidsWeight quantizationchoix du GGUFGGUF choicechoix du tagtag choice~×2–4 (Q8 → Q4)
3Réutilisation de préfixePrefix reuseactivé par défauton by defaultactivé par défauton by defaultTTFT RAG : secondes → dizaines de msRAG TTFT: seconds → tens of ms
4Taille de la fenêtreWindow size-c Nnum_ctxlibère de la VRAM (voir fiche mémoire)frees VRAM (see memory sheet)
5Quantification du cache KVKV cache quantization--cache-type-k/v q8_0via Modelfile/optionsvia Modelfile/options÷2 ou ÷4 sur le cache÷2 or ÷4 on the cache
6Slots parallèlesParallel slots--parallel NOLLAMA_NUM_PARALLELdébit ↑, latence individuelle ↓throughput ↑, per-request latency ↓
7Lot de prefillPrefill batch-b N / -ub Nnum_batchTTFT ↓ sur longs contextesTTFT ↓ on long contexts
8Threads CPUCPU threads-t Nnum_thread= cœurs physiques, pas logiques= physical cores, not logical
9Flash attention-faautoautoempreinte attention ↓, contexte ↑attention footprint ↓, context ↑
10Décodage spéculatifSpeculative decodingmodèle brouillondraft modelsupport partielpartial support×1,5–3 sur certains usageson some workloads

3. Méthodologie — 7 règlesMethodology — 7 rules

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)

ConfigurationConfigurationTTFTprefilldecodetokens/s
llama3.1:8b · num_gpu=0 (CPU 8 cœurs)542 ms213 ms28 933 ms4,15
llama3.1:8b · num_gpu=999 (1× RTX 3060)385 ms16 ms1 877 ms63,93
Mistral-7B Q4 · llama.cpp build CPU (même client)Mistral-7B Q4 · llama.cpp CPU build (same client)261 ms4,07
Modèle métier support-json:v1 (Modelfile)Custom model support-json:v1 (Modelfile)27 ms / 140 tok/ 140 tok65,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.