Benchmark CPU · Petits modèles IA
Score = Ø Qualité × Ø Vitesse, pondéré par le français (+⅓). Le podium récompense les modèles offrant le meilleur équilibre qualité/vitesse/français.
| # | Modèle | Qualité | Vitesse | Français | Score |
|---|---|---|---|---|---|
| 🥇 | gemma3:4b | 4.9/10 | 8.2 tok/s | 6.3/10 | 48.6 |
| 🥈 | llama3.2:3b | 5.5/10 | 5.9 tok/s | 7.5/10 | 40.6 |
| 🥉 | qwen3:4b | 3.8/10 | 8.2 tok/s | 3.3/10 | 34.6 |
| 4 | llama3.1:8b | 4.8/10 | 5.5 tok/s | 7.7/10 | 33.2 |
| 5 | phi4-mini | 4.7/10 | 5.4 tok/s | 6.9/10 | 31.2 |
| 6 | qwen2.5-coder:7b | 4.6/10 | 5.3 tok/s | 7.1/10 | 30.1 |
| 7 | qwen3:8b | 4.9/10 | 5.0 tok/s | 5.5/10 | 29.0 |
| 8 | mistral:7b | 5.6/10 | 3.4 tok/s | 7.5/10 | 23.8 |
| 9 | qwen3.5-4b | 3.3/10 | 4.7 tok/s | 3.5/10 | 17.3 |
| 10 | qwen3.5-4b-mtp | 3.3/10 | 4.3 tok/s | 3.5/10 | 15.8 |
| 11 | deepseek-r1:7b | 3.5/10 | 1.8 tok/s | 3.4/10 | 7.0 |
| Verdict |
|---|
Top 3 des modèles par justesse et qualité de réponse dans chaque catégorie de test. Score /10 basé sur : justesse, français, complétude.
Débit moyen (tok/s) et qualité des réponses par catégorie de test. Les valeurs en vert indiquent le meilleur score de la colonne.
| Catégorie | gemma3 4b | llama3.2 3b | qwen3 4b | llama3.1 8b | mistral 7b | phi4-mini | qwen2.5-coder 7b | qwen3 8b | qwen3.5-4b | qwen3.5-4b-mtp | deepseek-r1 7b |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Raisonnement (coq) | 2.0 | 1.3 | 5.1 | 0.8 | 1.3 | 1.3 | 1.0 | 3.1 | 4.3 | 4.0 | 3.7 |
| Code (palindrome) | 10.5 | 4.5 | 8.9 | 6.5 | 2.9 | 4.8 | 7.2 | 6.0 | 4.6 | 3.7 | 1.2 |
| Grammaire | 10.3 | 7.1 | 9.6 | 6.8 | 2.6 | 7.8 | 2.5 | 6.0 | 4.6 | 4.0 | 1.4 |
| Traduction | 10.2 | 7.7 | 10.0 | 4.8 | 3.5 | 7.9 | 5.2 | 5.0 | 5.6 | 4.1 | 0.8 |
| Latence (hello) | 4.4 | 3.5 | 9.1 | 6.3 | 4.1 | 2.7 | 5.8 | 5.4 | 5.2 | 3.9 | 0.2 |
| Analyse code | 10.1 | 11.1 | 8.7 | 6.9 | 5.3 | 8.0 | 5.7 | 5.4 | 7.0 | 6.3 | 6.1 |
| Résumé long | 10.3 | 5.1 | 8.5 | 4.2 | 3.9 | 6.2 | 6.5 | 4.9 | 4.5 | 4.1 | 1.9 |
| Analyse logs | 10.5 | 5.7 | 9.0 | 6.1 | 3.0 | 7.9 | 6.1 | 4.6 | 4.3 | 4.4 | 0.2 |
| Rédaction article | 9.9 | 8.6 | 8.4 | 6.8 | 3.9 | 5.1 | 7.3 | 5.8 | 3.9 | 4.7 | — |
| Latence pure | 2.6 | 3.6 | 3.8 | 4.9 | 3.0 | 0.7 | 5.8 | 3.1 | 2.4 | 2.6 | 1.1 |
| Raisonnement (docker) | 9.5 | 7.2 | 8.7 | 6.5 | 3.9 | 7.4 | 5.6 | 6.2 | 4.8 | 5.0 | 1.7 |
| Ø tok/s | 8.2 | 5.9 | 8.2 | 5.5 | 3.4 | 5.4 | 5.3 | 5.0 | 4.7 | 4.3 | 1.8 |
| Catégorie | gemma3 4b | llama3.2 3b | qwen3 4b | llama3.1 8b | mistral 7b | phi4-mini | qwen2.5-coder 7b | qwen3 8b | qwen3.5-4b | qwen3.5-4b-mtp | deepseek-r1 7b |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Raisonnement (coq) | 10.0 | 2.0 | 2.0 | 2.0 | 2.0 | 2.0 | 2.0 | 10.0 | 2.0 | 2.0 | 2.0 |
| Code (palindrome) | 7.0 | 7.0 | 5.0 | 9.0 | 7.0 | 7.0 | 9.0 | 7.0 | 3.0 | 3.0 | 7.0 |
| Grammaire | 3.0 | 7.0 | 3.0 | 3.0 | 7.0 | 5.0 | 3.0 | 3.0 | 3.0 | 3.0 | 3.0 |
| Traduction | 5.0 | 5.0 | 3.0 | 5.0 | 7.0 | 3.0 | 5.0 | 5.0 | 3.0 | 3.0 | 3.0 |
| Latence (hello) | 3.0 | 3.0 | 3.0 | 5.0 | 7.0 | 3.0 | 5.0 | 3.0 | 3.0 | 3.0 | 3.0 |
| Analyse code | 4.0 | 8.0 | 4.0 | 3.0 | 4.0 | 8.0 | 3.0 | 3.0 | 4.0 | 4.0 | 3.0 |
| Résumé long | 4.0 | 6.0 | 4.0 | 3.0 | 6.0 | 4.0 | 3.0 | 5.0 | 4.0 | 4.0 | 4.0 |
| Analyse logs | 4.0 | 6.0 | 6.0 | 5.0 | 6.0 | 6.0 | 5.0 | 3.0 | 4.0 | 4.0 | 3.0 |
| Rédaction article | 5.0 | 7.0 | 3.0 | 5.0 | 5.0 | 5.0 | 5.0 | 7.0 | 3.0 | 3.0 | 3.0 |
| Latence pure | 3.0 | 3.0 | 3.0 | 8.0 | 3.0 | 3.0 | 8.0 | 3.0 | 3.0 | 3.0 | 3.0 |
| Raisonnement (docker) | 6.0 | 6.0 | 6.0 | 5.0 | 8.0 | 6.0 | 3.0 | 5.0 | 4.0 | 4.0 | 4.0 |
| Ø Qualité | 4.9 | 5.5 | 3.8 | 4.8 | 5.6 | 4.7 | 4.6 | 4.9 | 3.3 | 3.3 | 3.5 |
Cliquez sur chaque domaine pour voir la réponse complète de chaque modèle.
Question : « Un coq pond un œuf sur un toit penché. De quel côté tombe ? » — Attend : un coq ne pond pas.
| Modèle | Résultat | Réponse |
|---|---|---|
| gemma3:4b | OK | « Les coqs ne pondent pas d'œufs — seules les poules pondent. » Compréhension parfaite du piège. |
| mistral:7b | OK | « Il ne tombe pas, les coqs ne pondent pas d'oeufs. » Réponse courte et correcte. |
| phi4-mini | OK | Comprend la blague, explique le mécanisme fictif. Réponse détaillée et humoristique. |
| qwen3:8b | OK | « Le coq ne pond pas d'oeufs... » Correct mais avec CoT préalable. |
| llama3.2:3b | NON | « Il tombe du côté où il est assis. » Ne comprend pas le piège. |
| llama3.1:8b | NON | « L'œuf roule vers le bord du toit... » Analyse physique mais rate le piège. |
| qwen2.5-coder:7b | NON | « L'oeuf tombe du côté de la pente. » Raté. |
| qwen3:4b | NON | CoT en anglais puis réponse erronée. |
| qwen3.5-4b | NON | Thinking process anglais, conclusion erronée. |
| qwen3.5-4b-mtp | NON | Thinking process anglais, conclusion erronée. |
| deepseek-r1:7b | NON | CoT très long, réponse vide. |
| Modèle | Réponse (extrait) |
|---|---|
| gemma3:4b | def is_palindrome(s): s = ''.join(c.lower() for c in s if c.isalnum()) return s == s[::-1] |
| llama3.1:8b | def is_palindrome(s): cleaned = ''.join(c.lower() for c in s if c.isalnum()) return cleaned == cleaned[::-1] |
| llama3.2:3b | def is_palindrome(s): return s == s[::-1] (trop simple, sans nettoyage) |
| mistral:7b | def is_palindrome(s): return s == s[::-1] avec explications détaillées |
| phi4-mini | def is_palindrome(s): cleaned = ''.join(char.lower() for char in s if char.isalnum()); return cleaned == cleaned[::-1] |
| qwen2.5-coder:7b | def is_palindrome(s): return s == s[::-1] (sans nettoyage) |
| qwen3:4b | def is_palindrome(s): s = re.sub(...) avec import re |
| qwen3:8b | CoT puis code correct |
| qwen3.5-4b | Thinking process puis code |
| qwen3.5-4b-mtp | Thinking process puis code |
| deepseek-r1:7b | CoT très long, code basique |
Tous les modèles produisent un code fonctionnel avec des variations mineures.
| Modèle | Qualité | Réponse (extrait) |
|---|---|---|
| llama3.1:8b | Excellent | « J'ai mangé et ensuite je suis allé au cinéma avec mes amis. » + détail des erreurs. |
| llama3.2:3b | Excellent | « J'ai mangé puis je suis allé au cinéma... » Correction précise de l'auxiliaire. |
| mistral:7b | Excellent | Liste les erreurs (auxiliaire, participe passé) + version corrigée. |
| phi4-mini | Correct | « J'ai mangé puis je suis allé... » Correct mais réponse courte. |
| gemma3:4b | Correct | Corrige l'auxiliaire, réponse concise. |
| qwen2.5-coder:7b | Correct | Correction littérale, moins naturelle. |
| qwen3:4b | Faible | CoT en anglais avant correction. |
| qwen3:8b | Correct | CoT puis correction correcte. |
| deepseek-r1:7b | Faible | CoT très long, correction sommaire. |
| Modèle | Réponse |
|---|---|
| llama3.1:8b | « Le renard brun rapide saute par-dessus le chien paresseux. » — Parfait, idiomatique. |
| gemma3:4b | « Le rapide renard brun saute par-dessus le chien paresseux. » — Correct, léger anglicisme d'ordre. |
| llama3.2:3b | « Le renard brun rapide saute au-dessus du chien paresseux. » — Correct. |
| mistral:7b | « Le renard brun rapide saute par-dessus le chien paresseux. » — Correct. |
| phi4-mini | « Le rapide renard brun saute par-dessus le chien paresseux. » — Correct mais littéral. |
| qwen2.5-coder:7b | « Le renard brun rapide saute par-dessus le chien paresseux. » — Correct. |
| qwen3:8b | CoT puis traduction correcte. |
| deepseek-r1:7b | CoT très long (>3s) pour une traduction correcte mais lent. |
| Modèle | Qualité | Réponse (extrait) |
|---|---|---|
| phi4-mini | Excellent | Analyse complète : bugs potentiels, problèmes perf, suggestions. Très structuré. |
| llama3.2:3b | Excellent | « Utilise un cache dictionary, tri par score, filtre les éléments... » Clair et concis. |
| gemma3:4b | Correct | 3 points d'amélioration : gestion erreurs, complexité, type hints. |
| llama3.1:8b | Correct | Identifie eval() dangereux, fichiers non fermés, division par zéro. |
| mistral:7b | Correct | Analyse des risques, suggestions d'amélioration. |
| qwen3:4b | Faible | CoT anglais avant analyse. |
| deepseek-r1:7b | Faible | CoT très long, réponse quasi vide. |
| Modèle | Qualité | Réponse (extrait) |
|---|---|---|
| mistral:7b | Excellent | 5 points clés identifiés, 3 thèmes principaux. Synthèse professionnelle en français parfait. |
| llama3.2:3b | Excellent | Résumé structuré : évolution, coûts, démocratisation, défis, futur. Clair. |
| llama3.1:8b | Excellent | Synthèse en 3 phrases : essor des LLMs depuis 2020, défis, modèles compacts. |
| gemma3:4b | Correct | Plus court (2-3 phrases). Capte l'essentiel. |
| qwen3:8b | Correct | CoT puis résumé correct en français. |
| phi4-mini | Correct | 3 thèmes : accélération LLM, coûts, démocratisation. |
| deepseek-r1:7b | Faible | CoT en anglais >200 tokens pour 1 phrase en français. |
| Modèle | Qualité | Réponse (extrait) |
|---|---|---|
| llama3.2:3b | Excellent | Cause racine identifiée : épuisement connexions PostgreSQL. Chronologie claire. |
| llama3.1:8b | Excellent | Analyse complète : perte connexion DB, timeout, redémarrage api-gateway. Structure pro. |
| qwen3:4b | Correct | Analyse correcte malgré le CoT préalable. |
| mistral:7b | Correct | Diagnostic correct : connexions PostgreSQL saturées. |
| phi4-mini | Correct | « Cause Racine : surcharge des connexions PostgreSQL. » Clair et direct. |
| deepseek-r1:7b | Correct | Analyse détaillée malgré le CoT. |
| Modèle | Qualité | Réponse (extrait) |
|---|---|---|
| phi4-mini | Excellent | Article complet : accessibilité, confidentialité, coûts, performance. Ton pro, français irréprochable. |
| qwen3:8b | Excellent | « Les petits modèles d'IA : une puissance à portée de main. » Article bien structuré. |
| llama3.1:8b | Excellent | 5-6 phrases, ton engageant, arguments solides. Français parfait. |
| gemma3:4b | Correct | Plus concis. Capte les points clés. |
| llama3.2:3b | Correct | Article court mais complet. |
| qwen2.5-coder:7b | Correct | « Les petits modèles d'IA permettent une utilisation optimisée... » Correct. |
| Modèle | Qualité | Réponse (extrait) |
|---|---|---|
| gemma3:4b | Excellent | Explique clairement la perte d'isolation réseau en mode host. Propose réseau personnalisé. |
| llama3.2:3b | Excellent | « Le mode host partage la stack réseau de l'hôte, les conteneurs perdent leurs IP virtuelles. » |
| mistral:7b | Excellent | « Je comprends votre problème, c'est un classique... » 2 solutions bien expliquées. |
| phi4-mini | Excellent | Diagnostic précis : isolation réseau, perte de résolution DNS. Solutions concrètes. |
| deepseek-r1:7b | Excellent | Analyse complète malgré le CoT : réseau bridge vs host, solutions. |
| llama3.1:8b | Correct | « Problème classique : en mode host + perte communication via noms de conteneur. » |
| qwen3:4b | Correct | Analyse correcte avec CoT. |
| qwen3:8b | Correct | CoT puis réponse correcte. |
Benchmark exécuté sur Ubuntu 24.04.4 LTS (kernel 6.8.0-136), Docker 29.6.2, Ollama 0.32.1 en conteneur Docker. Chaque bloc ci-dessous est indépendant et copiable.
# Installer Docker sur Ubuntu curl -fsSL https://get.docker.com | sh # Lancer Ollama en Docker docker run -d --name ollama --restart unless-stopped -v ollama_data:/root/.ollama -p 127.0.0.1:11434:11434 ollama/ollama:0.32.1 # Vérification docker exec ollama ollama --version docker exec ollama ollama list
curl -fsSL https://ollama.com/install.sh | sh # Vérification ollama --version
# 11 modèles (37 Go total) docker exec ollama ollama pull gemma3:4b docker exec ollama ollama pull llama3.2:3b docker exec ollama ollama pull qwen3:4b docker exec ollama ollama pull llama3.1:8b docker exec ollama ollama pull mistral:7b docker exec ollama ollama pull phi4-mini docker exec ollama ollama pull qwen2.5-coder:7b docker exec ollama ollama pull qwen3:8b docker exec ollama ollama pull qwen3.5-4b docker exec ollama ollama pull qwen3.5-4b-mtp docker exec ollama ollama pull deepseek-r1:7b # Vérification docker exec ollama ollama listSi Ollama est installé directement (sans Docker), retirer
docker exec ollama.
#!/bin/bash
MODELES="gemma3:4b llama3.2:3b qwen3:4b llama3.1:8b mistral:7b phi4-mini qwen2.5-coder:7b qwen3:8b qwen3.5-4b qwen3.5-4b-mtp deepseek-r1:7b"
for M in $MODELES; do
echo "=== $M ==="
for test in "raisonnement_coq|Un coq pond un oeuf sur le toit d'une grange. De quel cote tombe l'oeuf ?|100" "code_palindrome|Ecris une fonction Python is_palindrome(s). Donne juste le code.|100" "grammaire_francais|Corrige: J'ai mange et ensuite j'ai alle au cinema avec mes amis.|80" "traduction|Traduis en francais: The quick brown fox jumps over the lazy dog|100" "latence_hello|Dis simplement bonjour.|20"; do
IFS='|' read -r n p t <<< "$test"
curl -s http://127.0.0.1:11434/api/generate -H "Content-Type: application/json" -d "{"model":"$M","prompt":"$p","options":{"num_predict":$t,"temperature":0.7},"stream":false}"
echo ""
done
# Decharger le modele
curl -s http://127.0.0.1:11434/api/generate -H "Content-Type: application/json" -d "{"model":"$M","prompt":"x","keep_alive":0,"stream":false}" > /dev/null
done
#!/bin/bash # Meme structure que le bloc C # Tests: analyse_code (300t), resume_long (400t), analyse_logs (350t), redaction_article (500t), latence_pure (5t) # Modeles et dechargement identiques au bloc C # Voir le fichier batch5.csv pour les prompts complets
#!/bin/bash
MODELES="gemma3:4b llama3.2:3b qwen3:4b llama3.1:8b mistral:7b phi4-mini qwen2.5-coder:7b qwen3:8b qwen3.5-4b qwen3.5-4b-mtp deepseek-r1:7b"
for M in $MODELES; do
curl -s http://127.0.0.1:11434/api/generate -H "Content-Type: application/json" -d "{"model":"$M","prompt":"Explique pourquoi changer le network Docker de bridge a host peut empecher les conteneurs de communiquer entre eux.","options":{"num_predict":300,"temperature":0.7},"stream":false}"
echo ""
curl -s http://127.0.0.1:11434/api/generate -H "Content-Type: application/json" -d "{"model":"$M","prompt":"x","keep_alive":0,"stream":false}" > /dev/null
done
Plateforme de test : VPS KVM4 · 16 Go RAM · 4 vCPU · CPU only · Ubuntu 24.04.4 LTS · Docker 29.6.2 · Ollama 0.32.1
Données brutes : batch5.csv (141 lignes) · 11 catégories · temps, tokens, tok/s, réponses complètes
Modèle exclu : qwen3.5-9b (OOM avec 16 Go RAM)