llama.cpp
llama.cpp est une bibliothèque open source en C/C++ qui permet d’exécuter l’inférence de LLM (Large Language Models) sur une très large gamme de matériel, du simple CPU de laptop aux GPU NVIDIA haut de gamme, en passant par les puces Apple Silicon et les accélérateurs AMD.
C’est le projet qui a démocratisé l’inférence locale de modèles de langage. Avant llama.cpp, faire tourner un LLM nécessitait un GPU puissant et un environnement Python avec PyTorch. Depuis mars 2023, date de sa création par Georgi Gerganov, llama.cpp a prouvé qu’un modèle de 7 milliards de paramètres pouvait fonctionner de manière fluide sur un MacBook, un PC gamer, voire un Raspberry Pi, grâce à une implémentation C/C++ pure sans dépendances lourdes et à des techniques de quantification agressives. Le projet cumule plus de 98 000 stars sur GitHub et constitue le moteur d’inférence sous-jacent de la plupart des outils d’IA locale comme Ollama, GPT4All et LM Studio.
- Créateur
- Georgi Gerganov (@ggerganov)
- Organisation
- ggml-org (rejoint Hugging Face)
- Licence
- Open Source MIT
- Langage
- C/C++ (bibliothèque ggml)
- Format modèle
- GGUF
- GitHub Stars
- ~98 600
- Backends GPU
- CUDA, Metal, Vulkan, ROCm/HIP, SYCL, CANN, OpenCL, MUSA
- Backends CPU
- AVX/AVX2/AVX-512/AMX (x86), NEON/i8MM/SVE/SME (ARM), RISC-V
- Plateformes
- Linux, macOS, Windows, Android, ChromeOS
- GitHub
- ggml-org/llama.cpp
Pourquoi llama.cpp est incontournable
llama.cpp occupe une position unique dans l’écosystème IA : c’est le moteur d’inférence de référence pour l’IA locale. Presque tous les outils grand public qui vous permettent de faire tourner un LLM sur votre machine l’utilisent en sous-couche. Quand vous lancez ollama run llama3, c’est llama.cpp qui fait le travail. Quand GPT4All génère une réponse, c’est llama.cpp qui calcule les tokens. Quand un développeur lance un serveur d’inférence local avec une API compatible OpenAI, c’est encore llama.cpp qui tourne derrière.
Cette position dominante s’explique par plusieurs facteurs. Le premier est la performance : l’implémentation C/C++ avec des optimisations assembleur pour chaque architecture CPU (AVX, NEON, SVE, AMX) et des backends GPU natifs (CUDA, Metal, Vulkan) offre des vitesses de génération que les frameworks Python ne peuvent pas égaler sur du matériel grand public. Le second est l’absence de dépendances : pas besoin de Python, de PyTorch, de CUDA Toolkit complet. Un binaire compilé et un fichier modèle suffisent. Le troisième est la quantification : llama.cpp a popularisé et perfectionné les techniques de quantification qui permettent de réduire la taille des modèles de 50 à 80% avec une perte de qualité minime.
Concepts clés
ggml : la bibliothèque de tenseurs
llama.cpp repose sur ggml, une bibliothèque de tenseurs écrite en C par Georgi Gerganov. ggml joue pour llama.cpp le rôle que PyTorch ou TensorFlow jouent pour l’entraînement de modèles, mais elle est optimisée exclusivement pour l’inférence. Elle fournit les opérations matricielles de base (multiplication, attention, normalisation) implémentées avec des instructions SIMD spécifiques à chaque architecture matérielle.
ggml est aussi le terrain d’expérimentation pour les nouveaux backends matériels : chaque fois qu’un nouveau type d’accélérateur doit être supporté (Hexagon de Qualcomm, Ascend de Huawei via CANN, Intel via SYCL), c’est dans ggml que l’implémentation est ajoutée.
GGUF : le format de fichier
Le format GGUF (GGML Universal File) est le format binaire utilisé par llama.cpp pour stocker les modèles. Introduit en août 2023 pour remplacer les formats antérieurs (GGML, GGJT), GGUF stocke dans un seul fichier les poids du modèle (potentiellement quantifiés), les métadonnées (architecture, taille de contexte, type de quantification) et le vocabulaire du tokenizer.
GGUF est devenu un standard de fait. Hugging Face propose des outils en ligne pour convertir et quantifier des modèles au format GGUF directement depuis le navigateur (GGUF-my-repo, GGUF-my-LoRA). La plupart des modèles open source populaires sont disponibles en GGUF pré-quantifié sur le Hub.
Quantification : de la théorie à la pratique
La quantification est ce qui rend l’inférence locale viable. Un modèle de 7 milliards de paramètres en FP16 (précision flottante 16 bits) pèse environ 14 Go et nécessite autant de RAM ou de VRAM. Quantifié en 4 bits (Q4), le même modèle descend à environ 4 Go, ce qui le rend exécutable sur un laptop standard.
llama.cpp supporte une gamme étendue de formats de quantification :
| Type | Bits/poids | Taille (7B) | Qualité relative | Notes |
|---|---|---|---|---|
| F16 | 16 | ~14 Go | Référence | Aucune perte, très gourmand |
| Q8_0 | 8 | ~7 Go | Quasi identique | Perte négligeable |
| Q6_K | 6.5 | ~5.5 Go | Excellente | Bon compromis pour machines musclées |
| Q5_K_M | 5.5 | ~5 Go | Très bonne | Populaire, haute qualité |
| Q4_K_M | 4.8 | ~4.4 Go | Bonne | Le sweet spot recommandé |
| Q4_0 | 4 | ~3.8 Go | Correcte | Le plus compact des Q4, accélération Vulkan |
| Q3_K_M | 3.9 | ~3.5 Go | Acceptable | Pour machines très limitées |
| Q2_K | 2.6 | ~2.8 Go | Dégradée | Perte notable, usage expérimental |
| IQ4_XS | 4.25 | ~3.9 Go | Bonne | Importance-based, meilleur que Q4_0 à taille égale |
| IQ2_XXS | 2.06 | ~2 Go | Limitée | Ultra-compact, iQuants expérimentaux |
Les « K-quants » (Q4_K_M, Q5_K_M, Q6_K) sont une innovation majeure de llama.cpp. Contrairement aux quantifications uniformes (Q4_0) qui appliquent le même nombre de bits à toutes les couches, les K-quants allouent plus de bits aux couches sensibles (attention) et moins aux couches moins critiques, ce qui améliore la qualité à taille égale.
Installation
Installation rapide
llama.cpp peut être installé de plusieurs façons. La méthode la plus rapide dépend de votre OS :
# macOS / Linux via Homebrew
brew install llama.cpp
# Arch Linux (avec support CUDA, ROCm ou Vulkan au choix)
yay -S llama.cpp-cuda # NVIDIA
yay -S llama.cpp-hip # AMD ROCm
yay -S llama.cpp-vulkan # Vulkan universel
# Nix
nix run github:ggerganov/llama.cpp
# Depuis les sources (toutes plateformes)
git clone --depth=1 https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config ReleasePour les binaires pré-compilés, la page Releases du dépôt GitHub propose des builds pour chaque plateforme et backend (CUDA 12.4, CUDA 13.1, ROCm 7.2, OpenVINO, macOS ARM/x64, etc.). Le dernier build au moment de la rédaction est le b8429 (19 mars 2026).
Compilation avec accélération GPU
Pour activer un backend GPU lors de la compilation depuis les sources, passez le flag correspondant à CMake :
# NVIDIA CUDA
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release
# AMD ROCm / HIP
cmake -B build -DGGML_HIP=ON
cmake --build build --config Release
# Apple Metal (activé par défaut sur macOS)
cmake -B build -DGGML_METAL=ON
cmake --build build --config Release
# Vulkan (universel NVIDIA + AMD)
cmake -B build -DGGML_VULKAN=ON
cmake --build build --config Release
# Intel SYCL (oneAPI)
cmake -B build -DGGML_SYCL=ON
cmake --build build --config ReleaseUtilisation : les outils principaux
llama-cli : le chat en ligne de commande
llama-cli est l’outil en ligne de commande pour interagir avec un modèle en mode conversationnel. L’utilisation la plus simple :
# Avec un fichier GGUF local
llama-cli -m ./Meta-Llama-3-8B-Instruct.Q4_K_M.gguf -cnv
# Ou directement depuis Hugging Face (téléchargement auto)
llama-cli -hf ggml-org/gemma-3-1b-it-GGUF -cnv
# Avec paramètres personnalisés
llama-cli -m model.gguf -cnv
-c 4096 # taille du contexte
-ngl 99 # nombre de couches offloadées sur GPU (99 = toutes)
--temp 0.7 # température
--top-p 0.9 # top-p samplingLe flag -cnv active le mode conversation. Les modèles qui embarquent un chat template dans leurs métadonnées l’utilisent automatiquement. Pour les autres, vous pouvez spécifier un template via --chat-template.
llama-server : le serveur API
C’est probablement l’outil le plus utilisé en production. llama-server lance un serveur HTTP qui expose des endpoints compatibles avec l’API OpenAI (/v1/chat/completions, /v1/completions, /v1/embeddings). Tout outil ou SDK conçu pour l’API OpenAI peut donc se connecter à llama-server en changeant simplement l’URL de base.
# Lancer le serveur
llama-server -m model.gguf -c 4096 -ngl 99 --port 8080
# Tester avec curl
curl http://localhost:8080/v1/chat/completions
-H "Content-Type: application/json"
-d '{
"model": "local",
"messages": [{"role": "user", "content": "Bonjour !"}],
"temperature": 0.7
}'llama-server inclut aussi une interface web minimaliste accessible via le navigateur à l’adresse du serveur. Elle permet de tester le modèle sans aucun client externe.
llama-quantize : convertir et quantifier
Si vous avez un modèle en FP16 ou F32 au format GGUF et que vous souhaitez le quantifier, llama-quantize fait le travail :
# Quantifier un modèle F16 en Q4_K_M
llama-quantize model-f16.gguf model-q4km.gguf Q4_K_M
# Autres formats populaires
llama-quantize model-f16.gguf model-q5km.gguf Q5_K_M
llama-quantize model-f16.gguf model-iq4xs.gguf IQ4_XSPour convertir un modèle depuis le format PyTorch/Safetensors (Hugging Face) vers GGUF, utilisez les scripts Python fournis dans le dépôt (convert_hf_to_gguf.py). Hugging Face propose aussi l’outil en ligne GGUF-my-repo qui fait cette conversion directement dans le navigateur.
Backends matériels : le panorama complet
L’un des atouts majeurs de llama.cpp est le nombre de backends supportés. Voici un panorama complet :
| Backend | Matériel | Maturité | Notes |
|---|---|---|---|
| CUDA | NVIDIA (Kepler+) | Excellent | Le backend le plus optimisé. Flash Attention, NVFP4, FP8. |
| Metal | Apple Silicon (M1+) | Excellent | First-class citizen. Mémoire unifiée = avantage naturel. |
| Vulkan | NVIDIA, AMD, Intel | Bon | Universel mais limité aux quants Q4_0/Q4_1/F16. |
| HIP/ROCm | AMD (RDNA2+, CDNA) | Bon | Basé sur le code CUDA porté. Fonctionne bien sur RX 7000, MI-series. |
| SYCL | Intel Arc, Xeon Max | Correct | Via Intel oneAPI. Support en progression. |
| CANN | Huawei Ascend | Correct | Backend pour les NPU Ascend 310/910. |
| OpenCL | Divers | Basique | Moins performant que les backends natifs. |
| MUSA | Moore Threads | Émergent | GPU chinois, support en développement. |
| RPC | Réseau | Expérimental | Distribuer l’inférence sur plusieurs machines. |
| CPU x86 | Intel/AMD | Excellent | AVX, AVX2, AVX-512, AMX (Sapphire Rapids+). |
| CPU ARM | Apple, Qualcomm, etc. | Excellent | NEON, i8MM, SVE, SVE2, SME, SME2. |
La possibilité d’offloader partiellement les couches du modèle est une fonctionnalité précieuse. Si votre GPU n’a pas assez de VRAM pour charger le modèle entier, vous pouvez spécifier le nombre de couches à envoyer sur le GPU avec -ngl. Les couches restantes sont calculées sur CPU. Par exemple, avec un modèle de 32 couches et un GPU de 6 Go de VRAM, vous pourriez offloader 20 couches sur GPU et garder 12 sur CPU. C’est plus lent qu’un offload complet, mais nettement plus rapide qu’une inférence 100% CPU.
Fonctionnalités avancées
Décodage spéculatif
Le décodage spéculatif est une technique d’accélération qui utilise un petit modèle « draft » (par exemple 1-3B paramètres) pour générer rapidement des tokens candidats, puis le gros modèle valide ou rejette ces tokens en une seule passe. Quand le taux d’acceptation est élevé (typiquement 60-80% pour des modèles de la même famille), le gain de vitesse peut atteindre 2 à 3×.
# Décodage spéculatif avec un draft model
llama-cli -m model-70b-q4.gguf
-md model-7b-q4.gguf # draft model
--draft-max 16 # nombre max de tokens spéculés
-ngl 99Flash Attention
Depuis avril 2024, llama.cpp intègre Flash Attention, une implémentation optimisée du mécanisme d’attention qui réduit significativement la consommation mémoire et accélère le traitement des longs contextes. Flash Attention est activé par défaut sur les backends qui le supportent (CUDA, Metal).
Quantification du KV-cache
Le KV-cache (key-value cache) stocke les résultats intermédiaires de l’attention pour éviter de les recalculer à chaque token. Sur les longs contextes, ce cache peut consommer plusieurs Go de mémoire. llama.cpp permet de quantifier le KV-cache à la volée (en Q8_0 ou Q4_0), ce qui réduit sa taille de 50 à 75% avec un impact minimal sur la qualité.
# Activer la quantification du KV-cache
llama-server -m model.gguf -c 8192 -ngl 99
--cache-type-k q8_0
--cache-type-v q4_0Grammaires et structured output
llama.cpp supporte les grammaires GBNF (Grammar-Based Notation Format) pour contraindre la sortie du modèle. Vous pouvez forcer le modèle à produire exclusivement du JSON valide, du XML, ou tout autre format structuré. C’est indispensable pour les applications qui intègrent un LLM dans un pipeline de traitement automatisé.
# Forcer la sortie en JSON via un schema
llama-server -m model.gguf --json-schema '{
"type": "object",
"properties": {
"sentiment": {"type": "string", "enum": ["positif", "négatif", "neutre"]},
"score": {"type": "number", "minimum": 0, "maximum": 1}
},
"required": ["sentiment", "score"]
}'Support multimodal
Depuis l’introduction de la bibliothèque libmtmd en avril 2025, llama.cpp supporte les modèles multimodaux (texte + images). Les modèles vision comme LLaVA, Qwen-VL, ou MiniCPM-V peuvent être exécutés localement, permettant de décrire des images ou de répondre à des questions visuelles.
Support Android et ChromeOS
Depuis décembre 2025, llama.cpp propose une accélération complète sur Android et ChromeOS via des bindings GUI natifs. Cela va au-delà de l’ancienne méthode qui consistait à cross-compiler et exécuter le CLI via ADB, en permettant le développement d’applications mobiles natives intégrant l’inférence LLM.
L’écosystème llama.cpp
llama.cpp a engendré un écosystème riche d’outils et de bindings :
| Outil / Binding | Description | Usage typique |
|---|---|---|
| Ollama | Gestionnaire de modèles avec API REST | Déploiement local simplifié |
| GPT4All | Application desktop avec chat et RAG | Utilisateurs non-techniques |
| LM Studio | IDE de LLM avec interface graphique | Exploration de modèles |
| llama-cpp-python | Bindings Python (API compatible OpenAI) | Intégration Python/LangChain |
| llama.vim / llama.vscode | Plugins d’autocomplétion pour éditeurs | Complétion de code locale |
| text-generation-webui | Interface web avec support multi-backend | Expérimentation avancée |
| koboldcpp | Fork orienté génération créative/RP | Écriture créative, jeux narratifs |
| Unsloth | Framework de fine-tuning avec export GGUF | Fine-tuning puis déploiement local |
Le fait que llama.cpp soit sous licence MIT et que ggml ait rejoint Hugging Face garantit la pérennité du projet et son intégration profonde dans l’écosystème open source. Hugging Face Inference Endpoints supporte désormais GGUF nativement.
Bindings Python : llama-cpp-python
Pour les développeurs Python, le package llama-cpp-python offre une interface haut niveau avec un serveur API compatible OpenAI intégré :
from llama_cpp import Llama
# Charger un modèle avec accélération GPU
llm = Llama(
model_path="./model-q4km.gguf",
n_ctx=4096, # taille du contexte
n_gpu_layers=-1, # -1 = toutes les couches sur GPU
verbose=False
)
# Génération simple
output = llm.create_chat_completion(
messages=[
{"role": "system", "content": "Vous êtes un assistant technique."},
{"role": "user", "content": "Explique le concept de quantization."}
],
temperature=0.7,
max_tokens=512
)
print(output["choices"][0]["message"]["content"])Le package supporte aussi le chargement direct depuis Hugging Face via Llama.from_pretrained(), les fichiers GGUF shardés, le streaming de tokens, les embeddings, et la quantification du KV-cache.
Performance et benchmarks
Vitesse de génération typique
Les performances varient énormément selon le matériel, le modèle et le format de quantification. Voici des ordres de grandeur pour un modèle 7B en Q4_K_M :
| Matériel | Prompt eval (tokens/s) | Génération (tokens/s) |
|---|---|---|
| Apple M3 Pro (18 Go) | ~180-250 | ~35-50 |
| NVIDIA RTX 4090 (24 Go) | ~500-800 | ~80-120 |
| NVIDIA RTX 3060 (12 Go) | ~150-250 | ~30-50 |
| AMD RX 7900 XTX (24 Go, Vulkan) | ~200-350 | ~40-60 |
| Intel Core i7-13700 (CPU seul) | ~30-60 | ~8-15 |
| Apple M1 (8 Go) | ~80-120 | ~15-25 |
NVIDIA a annoncé au CES 2026 des optimisations pour llama.cpp permettant des gains allant jusqu’à 35% sur la vitesse de génération grâce au support NVFP4, à l’échantillonnage GPU des tokens, et à des améliorations de gestion de la mémoire.
Architectures de modèles supportées
llama.cpp ne se limite plus aux modèles LLaMA. Le projet supporte la quasi-totalité des architectures populaires de LLM :
Parmi les architectures supportées, on trouve LLaMA (toutes versions Meta), Mistral et Mixtral (dense et MoE), Phi (Microsoft, versions 2/3/4), Gemma (Google), Qwen (Alibaba, y compris les variantes MoE comme Qwen3.5MoE), Command-R (Cohere), StarCoder (BigCode), Falcon, GPT-NeoX, StableLM, InternLM, DeepSeek (y compris les distillations R1), Granite (IBM), OLMoE, et bien d’autres. Le fichier HOWTO-add-model.md du dépôt documente la procédure pour ajouter le support d’une nouvelle architecture.
Historique du projet
Georgi Gerganov a créé llama.cpp le 10 mars 2023, quelques semaines après la publication des modèles LLaMA par Meta. L’objectif initial était de faire tourner LLaMA 7B sur un MacBook en quantification 4-bit, sans GPU dédié. Le projet a rapidement explosé, attirant des centaines de contributeurs.
Les étapes clés du projet incluent l’introduction du format GGUF en août 2023, le support Vulkan en septembre 2023 (ouvrant l’accélération GPU aux cartes AMD), l’arrivée de Flash Attention en avril 2024, le support multimodal via libmtmd en avril 2025, et l’accélération native Android/ChromeOS en décembre 2025.
En février 2025, Georgi Gerganov a annoncé que ggml.ai rejoignait Hugging Face. Le projet est depuis maintenu sous l’organisation ggml-org sur GitHub, avec une mission déclarée de rendre l’IA locale facile et efficace pour tous. Le dépôt compte plus de 1 000 contributeurs et les builds sont publiés quasi-quotidiennement (le build b8429 date du 19 mars 2026).
Limites et points d’attention
Malgré sa domination, llama.cpp a des limites à connaître. La première est la complexité de configuration : contrairement à Ollama qui abstrait tout, llama.cpp expose de nombreux paramètres (nombre de couches GPU, taille de batch, type de KV-cache, threads CPU) qui nécessitent un réglage pour obtenir des performances optimales. La courbe d’apprentissage est non négligeable pour un débutant.
La deuxième est la compatibilité Vulkan : le backend Vulkan, bien qu’universel, ne supporte pas les K-quants ni les I-quants, ce qui limite les options pour les utilisateurs AMD qui ne veulent pas installer ROCm (plus lourd à configurer).
La troisième est la gestion mémoire : sur des machines avec peu de RAM, il est facile de provoquer un crash en chargeant un modèle trop gros ou en configurant un contexte trop large. Le contexte par défaut a été réduit à 4096 tokens pour les builds CPU-only afin d’éviter ces situations.
La quatrième est le rythme de développement : avec des builds quasi-quotidiens et des changements fréquents de l’API interne, les projets qui dépendent directement de llama.cpp (et non d’une couche d’abstraction comme Ollama) doivent suivre de près les mises à jour et gérer les breaking changes occasionnels.
Questions fréquentes sur llama.cpp
Quelle est la différence entre llama.cpp et Ollama ?
Ollama est un outil de haut niveau qui utilise llama.cpp comme moteur d’inférence en interne. Ollama simplifie la gestion des modèles (téléchargement, mise à jour, configuration) et expose une API REST propre. llama.cpp est la bibliothèque et les outils bas niveau qui font le calcul réel. Si vous voulez un maximum de contrôle et de performance, utilisez llama.cpp directement. Si vous voulez simplement lancer un modèle local sans vous soucier de la configuration, utilisez Ollama.
llama.cpp supporte-t-il uniquement les modèles LLaMA ?
Non, malgré son nom. llama.cpp supporte la quasi-totalité des architectures de LLM populaires : LLaMA, Mistral, Mixtral, Phi, Gemma, Qwen, Command-R, DeepSeek, Falcon, Granite, StarCoder, et bien d’autres. Le nom historique est resté, mais le projet est devenu un moteur d’inférence universel pour les modèles au format GGUF.
Quel est le meilleur format de quantification pour llama.cpp ?
Q4_K_M est le format recommandé par défaut : il offre un excellent compromis entre taille du fichier, vitesse d’inférence et qualité des réponses. Si vous avez de la marge en mémoire, Q5_K_M ou Q6_K améliorent légèrement la qualité. Si vous êtes très contraint en mémoire, Q4_0 est le plus compact des formats 4-bit standard et bénéficie de l’accélération Vulkan.
Comment accélérer l’inférence avec llama.cpp ?
Par ordre d’impact : activez l’accélération GPU (-ngl 99 pour offloader toutes les couches), utilisez le backend natif de votre GPU (CUDA pour NVIDIA, Metal pour Mac, ROCm pour AMD plutôt que Vulkan), activez Flash Attention (par défaut sur les backends supportés), quantifiez le KV-cache pour les longs contextes, et testez le décodage spéculatif avec un petit draft model de la même famille. Sur CPU, assurez-vous que votre build utilise les extensions AVX2 ou AVX-512 de votre processeur.
llama.cpp peut-il servir en production ?
Oui. llama-server avec son API compatible OpenAI est utilisé en production par de nombreuses entreprises pour de l’inférence locale ou on-premise. Les points d’attention sont la gestion de la concurrence (un seul modèle par instance, mais plusieurs requêtes en parallèle sont gérées), le monitoring (pas de dashboard intégré, à coupler avec un outil externe), et les mises à jour fréquentes qui nécessitent des tests de régression. Pour du déploiement sérieux, Ollama ou vLLM (pour du GPU pur) offrent des couches d’abstraction plus adaptées à la production.