Présentation de llama.cpp

llama.cpp est un projet open source en C++ créé par Georgi Gerganov qui permet de faire tourner des LLMs sur du matériel grand public, y compris les CPU. C'est le moteur sous-jacent d'Ollama, LM Studio et de nombreux autres outils. En l'utilisant directement, vous bénéficiez d'un contrôle total sur les paramètres d'inférence, de performances maximales, et de la flexibilité d'un outil en ligne de commande. llama.cpp supporte nativement CUDA (NVIDIA), Metal (Apple Silicon), Vulkan et ROCm (AMD).

Prérequis et dépendances

Pour compiler llama.cpp, vous aurez besoin de CMake (3.14+), d'un compilateur C++17 (GCC 11+ ou Clang 12+), et de Make ou Ninja. Sur macOS, les outils de développement Xcode Command Line Tools suffisent. Pour le support CUDA, le CUDA Toolkit doit être installé au préalable. Sur Windows, Microsoft Visual Studio Build Tools ou MinGW-w64 sont les options recommandées. La compilation prend généralement 2 à 5 minutes selon la machine.

Compilation avec optimisations

La compilation de base sans accélération matérielle utilise uniquement le CPU. Pour activer le GPU NVIDIA, ajoutez le flag `-DGGML_CUDA=ON` à CMake. Pour Apple Silicon, le support Metal est activé automatiquement sur macOS. Pour AMD (ROCm), utilisez `-DGGML_HIP=ON`. La compilation avec CUDA peut prendre 10-20 minutes supplémentaires selon le nombre d'architectures GPU ciblées. Les binaires compilés `llama-cli` et `llama-server` sont placés dans le dossier `build/bin/`.

Utilisation en ligne de commande

llama-cli est l'interface en ligne de commande principale permettant d'interagir avec un modèle en mode conversationnel ou par batch. Les paramètres les plus importants sont `-m` pour spécifier le modèle, `-n` pour le nombre de tokens à générer, `-ngl` pour le nombre de couches GPU, et `-c` pour la taille du contexte. Le mode interactif (`-i`) permet une conversation en temps réel. Pour la génération par lots, vous pouvez rediriger un prompt depuis stdin ou utiliser `-p`.

Serveur HTTP compatible OpenAI

llama-server démarre un serveur HTTP exposant une API REST compatible avec le format OpenAI sur le port 8080 par défaut. Ce serveur supporte le streaming, les embeddings, les complétions et le chat. Il peut gérer plusieurs requêtes en parallèle grâce au parallel decoding. Vous pouvez spécifier la VRAM maximale à utiliser, le nombre de slots parallèles, et activer le cache KV pour réutiliser les calculs de contexte. C'est la base pour construire des applications LLM performantes en production.

Optimisations avancées

Le cache KV (Key-Value cache) est crucial pour les applications avec de longs contextes ou de nombreux échanges : activez-le avec `--cache-type-k f16 --cache-type-v f16`. La quantisation du cache KV en Q8_0 ou Q4_0 réduit la consommation mémoire au prix d'une légère perte de précision. Le flash attention (`--flash-attn`) accélère significativement l'inférence sur les GPU NVIDIA récents. Pour les modèles de grande taille, le tensor splitting sur plusieurs GPU est supporté via `--tensor-split`.

Étapes pratiques

  1. Cloner le dépôt

    Récupérez le code source de llama.cpp depuis GitHub.

    {step.code}
  2. Compiler avec CMake

    Compilez llama.cpp avec les optimisations appropriées pour votre matériel.

    {step.code}
  3. Télécharger un modèle GGUF

    Téléchargez un modèle depuis HuggingFace. Vous pouvez utiliser huggingface-cli ou wget.

    {step.code}
  4. Lancer une inférence

    Testez l'inférence en mode non-interactif.

    {step.code}
  5. Démarrer le serveur HTTP

    Lancez le serveur compatible OpenAI pour intégrer llama.cpp dans vos applications.

    {step.code}
  6. Tester le serveur

    Envoyez une requête de test au serveur pour vérifier qu'il répond correctement.

    {step.code}