Zum Hauptinhalt springen
IA

Évaluer les modèles quantisés : perplexité, divergence KL & vraies évals de tâches

Comment savoir si IQ3_M est encore assez bon ? Mesurer la perte de qualité d'une quantisation – avec llama-perplexity, la divergence KL par rapport au modèle de base et une petite éval de tâches maison.

Alain Ritter 4
Évaluer les modèles quantisés : perplexité, divergence KL & vraies évals de tâches
Image de couverture : générée par IA

Dans le billet sur la quantisation j’ai fait tenir Qwen3-32B sur 16 Go – mais une question restait ouverte : comment savoir si IQ3_M n’est pas secrètement plus bête ? « Ça tourne et ça semble plausible » n’est pas une mesure. Voici les trois niveaux auxquels j’évalue réellement une quantisation.

Niveau 1 : la perplexité – utile mais trompeuse

La perplexité (PPL) mesure à quel point le modèle est « surpris » par du texte réel – plus bas vaut mieux. llama.cpp fournit l’outil :

# Récupérer un texte de test (p. ex. wikitext) une fois, puis mesurer par quant
./llama-perplexity -m qwen3-32b-bf16.gguf  -f wiki.test.raw -ngl 99
./llama-perplexity -m qwen3-32b-IQ3_M.gguf -f wiki.test.raw -ngl 99

On obtient typiquement quelque chose comme PPL = 6.41 (bf16) vs. PPL = 6.78 (IQ3_M). Le piège : la PPL est une moyenne sur du texte générique. Un modèle peut sembler quasi identique sur wikitext et pourtant s’effondrer sur vos tâches. La PPL est un détecteur de fumée, pas un verdict de qualité.

Niveau 2 : la divergence KL – la comparaison honnête

Bien plus parlante est la question : de combien la distribution de probabilité du modèle quantisé s’écarte-t-elle de celle de l’original ? C’est exactement ce que mesure la divergence KL – et llama.cpp sait la calculer directement contre un modèle de base.

# 1. Enregistrer une fois les logits de référence du modèle complet
./llama-perplexity -m qwen3-32b-bf16.gguf -f eval.txt \
  --kl-divergence-base qwen3-32b.kld -ngl 99

# 2. Comparer le modèle quantisé à cette référence
./llama-perplexity -m qwen3-32b-IQ3_M.gguf -f eval.txt \
  --kl-divergence-base qwen3-32b.kld --kl-divergence -ngl 99

Cela donne entre autres Mean KLD et – la valeur qui m’importe le plus – la part de tokens où la prédiction de tête change. Règle empirique tirée de ma pratique :

  • Mean KLD < 0,1 → pratiquement indistinguable de l’original.
  • 0,1–0,5 → utilisable, légère dérive.
  • > 0,5 → perte de qualité visible, quantisé trop agressivement.

Contrairement à la PPL, la KLD ne dit pas « le modèle est-il bon » mais « combien de l’original reste-t-il » – précisément la question de la quantisation.

Niveau 3 : une vraie éval de tâches – la seule qui compte

Au bout du compte, ce qui importe, c’est que le modèle résolve mes tâches. Pour ça je garde un petit jeu de prompts fixes à réponse vérifiable – une mini-éval que je lance contre chaque quant. Via l’endpoint llama-server, cela tient en quelques lignes de Python :

import json, urllib.request

CASES = [
    {"prompt": "Renvoie UNIQUEMENT le nombre : 17 * 23 =", "expect": "391"},
    {"prompt": "Réponds en un mot : capitale de l'Australie ?", "expect": "Canberra"},
    {"prompt": "JSON valide pour {name: Alain, annee: 2026}, l'objet seul :",
     "expect": '{"name": "Alain", "annee": 2026}'},
]

def ask(prompt: str) -> str:
    body = json.dumps({"prompt": prompt, "temperature": 0, "n_predict": 32}).encode()
    req = urllib.request.Request("http://localhost:8080/completion", body,
                                 {"Content-Type": "application/json"})
    return json.loads(urllib.request.urlopen(req).read())["content"].strip()

passed = sum(c["expect"] in ask(c["prompt"]) for c in CASES)
print(f"{passed}/{len(CASES)} réussis")

La clé, c’est temperature: 0 – déterministe, sinon on mesure du hasard. Les cas doivent toucher votre domaine : si vous utilisez le modèle pour du code, mettez des tâches de code (comme le texte de calibration imatrix dans le billet sur la quantisation). Pour des tâches plus floues, on remplace l’exact-match par un LLM-juge – mais alors délibérément avec un modèle plus fort comme correcteur.

Le workflow en une phrase

La PPL comme détecteur de fumée rapide, la divergence KL comme mesure honnête du « à quel point proche de l’original », et votre propre éval de tâches comme dernier mot. Seul ce trio transforme « ça a l’air correct » en décision : garder IQ3_M ou monter d’un cran après tout.

À rapprocher : quantiser Qwen3-32B à la main produit les modèles qui passent ici au banc d’essai.

[Top]

Publié le 26. Juli 2026 par Alain Ritter