Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.

« Llama.cpp » : différence entre les versions

De Le Wiki de Lug
Aucun résumé des modifications
 
(24 versions intermédiaires par le même utilisateur non affichées)
Ligne 5 : Ligne 5 :
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU.  
* RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU.  
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples :  
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples :  
** qwen2.5:7b (Q4) ≈ 4–5 Go ** qwen2.5:14b (Q4) ≈ 8–10 Go  
** qwen2.5:7b (Q4) ≈ 4–5 Go  
** qwen2.5:14b (Q4) ≈ 8–10 Go  
** llama3:70b (Q4) ≈ 35–40 Go  
** llama3:70b (Q4) ≈ 35–40 Go  
* Utiliser un SSD/NVMe améliore fortement les temps de chargement.  
* Utiliser un SSD/NVMe améliore fortement les temps de chargement.  
Ligne 90 : Ligne 91 :


=== Téléchargement d’un modèle (format GGUF) ===
=== Téléchargement d’un modèle (format GGUF) ===
==== Téléchargement via le client Hugging Face (méthode recommandée) ====
On installe les dépendances (Debian) :
# apt install -y python3-full python3-venv
On installe <code>huggingface_hub</code> dans un environnement virtuel Python :
# python3 -m venv /opt/huggingface-venv
# /opt/huggingface-venv/bin/pip install -U "huggingface_hub[cli]"
# ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf
On crée le dossier destiné à accueillir les modèles :
# mkdir -p /opt/models
Puis on télécharge le modèle :
# hf download <font color=blue>NOM_DU_REPO</font> --include "<font color=blue>*VERSION_OU_QUANT*.gguf</font>" --include "<font color=blue>mmproj-BF16.gguf</font>" --local-dir <font color=blue>/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT</font>
{{Méta bandeau
  | niveau = information
  | icône = information
  | texte  =
Pour les modèles multimodaux, ajouter le fichier <code>mmproj</code>. Par défaut, <code>mmproj-BF16.gguf</code> est recommandé. Si le modèle n'est pas multimodal, cette option n'est pas nécessaire.
}}
Exemple :
# hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include "*UD-Q8_K_XL*.gguf" --include "mmproj-BF16.gguf" --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL
==== Via llama-cli ====
Plateformes de modèles :
Plateformes de modèles :
* [https://huggingface.co/models Hugging Face] Plateforme principale.
* [https://huggingface.co/models Hugging Face] Plateforme principale.
Ligne 128 : Ligne 160 :
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = loupe
   | texte  = Le dossier `snapshots/<hash>` dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier `.gguf` pour simplifier son utilisation.
   | texte  = Le dossier <code>snapshots/<hash></code> dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier <code>.gguf</code> pour simplifier son utilisation.
}}
}}
Explication :
Explication :
Ligne 149 : Ligne 181 :
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = loupe
   | texte  = Le dossier `snapshots/<hash>` dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier `.gguf` pour simplifier son utilisation.
   | texte  = Le dossier <code>snapshots/<hash></code> dépend du téléchargement Hugging Face et varie selon les versions. Il est recommandé de créer un lien symbolique vers le fichier <code>.gguf</code> pour simplifier son utilisation.
}}
}}
Le serveur est accessible via :
Le serveur est accessible via :
Ligne 230 : Ligne 262 :


== Optimisation (KV cache, performances, latence) ==
== Optimisation (KV cache, performances, latence) ==
* Le paramètre de contexte (`-c`) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.
* Le paramètre de contexte (<code>-c</code>) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.
* En pratique, une valeur de `2048` constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à `4096` peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.
* En pratique, une valeur de <code>2048</code> constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à <code>4096</code> peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.
* Le paramètre `-ngl` détermine le nombre de couches envoyées au GPU.
* Le paramètre <code>-ngl</code> détermine le nombre de couches envoyées au GPU.
** Plus la valeur est élevée, plus les performances augmentent.
** Plus la valeur est élevée, plus les performances augmentent.
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.
** Il est possible d’utiliser `-ngl 999` afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.
** Il est possible d’utiliser <code>-ngl 999</code> afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.
* Le paramètre `-fa` active Flash Attention.
* Le paramètre <code>-fa</code> active Flash Attention.
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.
** Elle est recommandée sur GPU NVIDIA récents.
** Elle est recommandée sur GPU NVIDIA récents.
* Le paramètre `-b` (batch size) influence la vitesse de traitement du prompt.
* Le paramètre <code>-b</code> (batch size) influence la vitesse de traitement du prompt.
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.
* Le paramètre `-ub` (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.
* Le paramètre <code>-ub</code> (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.
** Une valeur plus faible réduit les pics de consommation mémoire.
** Une valeur plus faible réduit les pics de consommation mémoire.
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.
* Le paramètre `-np` (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.
* Le paramètre <code>-np</code> (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.
** Une valeur élevée augmente la consommation de VRAM.
** Une valeur élevée augmente la consommation de VRAM.
** Pour un usage personnel ou mono-utilisateur, `-np 1` est généralement recommandé.
** Pour un usage personnel ou mono-utilisateur, <code>-np 1</code> est généralement recommandé.
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.
* Pour les modèles multimodaux / vision, le fichier <code>mmproj</code> sert à projeter les données image vers le modèle texte.
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.
** Si la VRAM est limitée, il est possible de forcer le <code>mmproj</code> à rester sur CPU avec :
# --no-mmproj-offload
** Exemple :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele-vision.gguf \
    --mmproj /models/mmproj.gguf \
    --no-mmproj-offload \
    -ngl 999
** Si aucune option <code>--mmproj</code> n’est utilisée, <code>--no-mmproj-offload</code> n’a pas d’intérêt.
** En pratique :
*** VRAM suffisante : laisser le comportement par défaut, avec le <code>mmproj</code> sur GPU.
*** VRAM limitée : tester <code>--no-mmproj-offload</code> pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.


Exemple de configuration optimisée pour un GPU de 12 Go :
Exemple de configuration optimisée pour un GPU de 12 Go :
  # /opt/llama.cpp/build/bin/llama-server \
  # /opt/llama.cpp/build/bin/llama-server \
   -m /opt/llama.cpp/models/<font color = blue>models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf</font> \
   -m /opt/llama.cpp/models/<font color=blue>models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf</font> \
   -c 2048 \
   -c 2048 \
   -ngl 999 \
   -ngl 999 \
Ligne 270 : Ligne 322 :
  -np  : nombre de requêtes traitées en parallèle
  -np  : nombre de requêtes traitées en parallèle


* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement `-b` ou le contexte.
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement <code>-b</code> ou le contexte.
* En cas d’erreur mémoire ou de performances instables :
* En cas d’erreur mémoire ou de performances instables :
** réduire `-b`
** réduire <code>-b</code>
** réduire `-ngl`
** réduire <code>-ngl</code>
** réduire `-c`
** réduire <code>-c</code>


=== Méthode d’ajustement recommandée ===
=== Méthode d’ajustement recommandée ===
* Commencer avec :
* Commencer avec :
** `-c 2048`
** <code>-c 2048</code>
** `-ngl 999`
** <code>-ngl 999</code>
** `-fa on`
** <code>-fa on</code>
** `-b 512`
** <code>-b 512</code>
** `-ub 256`
** <code>-ub 256</code>
** `-np 1`
** <code>-np 1</code>
* Vérifier ensuite l’utilisation mémoire :
* Vérifier ensuite l’utilisation mémoire :
  # nvidia-smi
  # nvidia-smi
* Si la VRAM est presque saturée :
* Si la VRAM est presque saturée :
** réduire `-b`
** réduire <code>-b</code>
** puis `-ub`
** puis <code>-ub</code>
** puis réduire `-ngl` si nécessaire
** puis réduire <code>-ngl</code> si nécessaire
* Si au contraire une marge importante reste disponible :
* Si au contraire une marge importante reste disponible :
** essayer `-b 1024`
** essayer <code>-b 1024</code>
** ou augmenter légèrement le contexte
** ou augmenter légèrement le contexte


Ligne 298 : Ligne 350 :
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.
* Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.
== Multi-GPU ==
llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.
L'intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d'obtenir un gain de vitesse parfaitement linéaire.
=== Vérifier les GPU disponibles ===
Vérifier que les cartes NVIDIA sont bien visibles :
# nvidia-smi
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.
=== Options principales ===
{| class="wikitable"
! Option
! Description
|-
| <code>-ngl</code> ou <code>--gpu-layers</code>
| Nombre de couches du modèle à envoyer sur GPU.
|-
| <code>--split-mode</code>
| Méthode de répartition du modèle entre plusieurs GPU.
|-
| <code>--tensor-split</code>
| Répartition manuelle de la charge entre les GPU.
|-
| <code>--main-gpu</code>
| GPU principal utilisé notamment pour certaines allocations et opérations.
|}
=== Split mode ===
Le paramètre <code>--split-mode</code> contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.
{| class="wikitable"
! Mode
! Description
! Usage conseillé
|-
| <code>none</code>
| Pas de répartition multi-GPU.
| À utiliser si un seul GPU doit être utilisé.
|-
| <code>layer</code>
| Répartit les couches du modèle entre les GPU.
| Mode classique et généralement le plus simple.
|-
| <code>row</code>
| Répartit certains tenseurs entre les GPU.
| Plus spécifique, à tester selon le modèle et le matériel.
|}
En pratique, le mode <code>layer</code> est souvent le plus simple pour commencer.
=== Exemple simple avec deux GPU ===
Lancer un serveur llama.cpp en utilisant plusieurs GPU :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer
Avec <code>-ngl 999</code>, llama.cpp tente de charger le maximum de couches possible sur les GPU.
=== Répartition manuelle avec tensor-split ===
Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d'utiliser <code>--tensor-split</code>.
Exemple avec deux GPU de 12 Go :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12
Exemple avec un GPU de 24 Go et un GPU de 12 Go :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 24,12
Les valeurs de <code>--tensor-split</code> sont des proportions. Il n'est pas obligatoire d'indiquer exactement la VRAM en Go, mais c'est une méthode simple pour garder une répartition logique.
Ainsi, ces deux exemples sont équivalents dans l'idée :
# --tensor-split 24,12
# --tensor-split 2,1
=== Choisir le GPU principal ===
Le paramètre <code>--main-gpu</code> permet de choisir le GPU principal.
Exemple avec le GPU 0 comme carte principale :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12 \
    --main-gpu 0
Si le GPU 0 est déjà utilisé par l'affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.
=== Sélectionner les GPU visibles ===
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d'utiliser <code>CUDA_VISIBLE_DEVICES</code>.
Exemple pour n'utiliser que les GPU 1 et 2 :
# CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.
Ainsi, avec :
# CUDA_VISIBLE_DEVICES=1,2
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.
=== Exemple avec trois GPU ===
Exemple avec trois RTX 3060 12 Go :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12,12 \
    --main-gpu 0
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 24,12,12 \
    --main-gpu 0
=== Vérifier l'utilisation mémoire ===
Pendant le lancement et l'inférence, surveiller la VRAM :
# watch -n 1 nvidia-smi
Si une carte arrive en manque de mémoire, il faut réduire la charge :
* diminuer <code>-c</code> ;
* diminuer <code>-b</code> ;
* diminuer <code>-ub</code> ;
* ajuster <code>--tensor-split</code> ;
* réduire <code>-ngl</code> ;
* utiliser un quant plus léger.
=== Performances attendues ===
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.
En pratique :
* si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d'éviter l'offload CPU, ce qui améliore fortement les performances ;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.
=== Résumé pratique ===
Pour commencer avec deux GPU identiques :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12 \
    -c 4096 \
    -fa
Pour un usage personnel, il est conseillé de garder :
# -np 1
afin d'éviter une consommation mémoire inutilement élevée.


== Service systemd ==
== Service systemd ==
Ligne 416 : Ligne 663 :
* <code>tg128 @ d16000</code> : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.
* <code>tg128 @ d16000</code> : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.
}}
}}
=== Benchmark multi-GPU ===
Tester les performances avec <code>llama-bench</code> :
# /opt/llama.cpp/build/bin/llama-bench \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12
Comparer avec un seul GPU :
# CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \
    -m /models/modele.gguf \
    -ngl 999
Puis avec deux GPU :
# CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12
Les résultats à comparer sont principalement :
pp : prompt processing
tg : token generation


== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==

Dernière version du 22 juin 2026 à 15:27

Prérequis

  • Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. Contrairement à Ollama ou vLLM, llama.cpp permet cependant de répartir le modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. Voir ce lien pour partager un GPU dans un LXC
  • Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif).
  • VRAM recommandée : dépend du niveau d’offload GPU. Pour un usage optimal, prévoir environ la taille du modèle (en Q4) + 1 à 3 Go pour le KV cache. Il est toutefois possible de réduire la VRAM nécessaire en déportant une partie du modèle en RAM.
  • RAM recommandée : au minimum équivalente à la taille du modèle, idéalement 1,5 à 2 fois, notamment si une partie du modèle est exécutée sur CPU.
  • Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples :
    • qwen2.5:7b (Q4) ≈ 4–5 Go
    • qwen2.5:14b (Q4) ≈ 8–10 Go
    • llama3:70b (Q4) ≈ 35–40 Go
  • Utiliser un SSD/NVMe améliore fortement les temps de chargement.
  • CPU / vCPU recommandés :
    • Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU)
    • Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées.
  • Note : Q4 correspond au niveau de "quantization", c’est-à-dire une réduction de la précision numérique du modèle afin de diminuer son utilisation en mémoire (VRAM). Les niveaux vont généralement de Q1 à Q8 : Q8 est le plus précis (proche du modèle original), mais aussi le plus gourmand en ressources. À l’inverse, Q1 est très léger mais fortement dégradé. En pratique, Q4 (voire Q5) est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.

Installation

Prérequis système

Installer les dépendances nécessaires :

# apt update && apt upgrade
# apt install -y git build-essential cmake curl libcurl4-openssl-dev

Récupération du projet

# cd /opt
# git clone https://github.com/ggerganov/llama.cpp.git

Compilation

Choisir une seule méthode de compilation selon le matériel disponible.

Méthode Description Recommandation
CPU uniquement Compilation sans accélération GPU. Non testé / déconseillé pour de gros modèles.
GPU NVIDIA CUDA Compilation avec accélération GPU via CUDA. Recommandé avec une carte NVIDIA compatible.

En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :

# rm -rf /opt/llama.cpp/build
Option A — CPU uniquement

Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.

# cd /opt/llama.cpp
# cmake -B build
# cmake --build build -j$(nproc)
Option B — GPU NVIDIA CUDA

Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.

Installation du support GPU NVIDIA CUDA

(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :

# curl https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64/ | grep keyring

Installer le dépôt CUDA NVIDIA :

# cd /opt
# wget https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64/cuda-keyring_1.1-1_all.deb
# dpkg -i cuda-keyring_1.1-1_all.deb
# apt update

Installer le toolkit CUDA :

# apt install -y cuda-toolkit

Compilation avec support CUDA

Connaître les versions de nvcc installées :

# find /usr /opt -name nvcc 2>/dev/null

Compiler llama.cpp avec le support CUDA :

# cd /opt/llama.cpp
# export CUDACXX=/usr/local/cuda-13.2/bin/nvcc
# cmake -B build -DGGML_CUDA=ON
# cmake --build build -j$(nproc)

Emplacement des binaires

Les binaires seront disponibles dans :

/opt/llama.cpp/build/bin/

Téléchargement d’un modèle (format GGUF)

Téléchargement via le client Hugging Face (méthode recommandée)

On installe les dépendances (Debian) :

# apt install -y python3-full python3-venv

On installe huggingface_hub dans un environnement virtuel Python :

# python3 -m venv /opt/huggingface-venv
# /opt/huggingface-venv/bin/pip install -U "huggingface_hub[cli]"
# ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf

On crée le dossier destiné à accueillir les modèles :

# mkdir -p /opt/models

Puis on télécharge le modèle :

# hf download NOM_DU_REPO --include "*VERSION_OU_QUANT*.gguf" --include "mmproj-BF16.gguf" --local-dir /opt/models/NOM_DU_MODELE/VERSION_OU_QUANT

Exemple :

# hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include "*UD-Q8_K_XL*.gguf" --include "mmproj-BF16.gguf" --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL

Via llama-cli

Plateformes de modèles :

Quantization custom (souvent mieux optimisé) :

Créer un dossier pour les modèles :

# mkdir -p /opt/llama.cpp/models

On configure le dossier des modèles :

# echo 'export LLAMA_CACHE=/opt/llama.cpp/models' >> ~/.bashrc
# source ~/.bashrc

Exemple de chargement automatique d’un modèle depuis Hugging Face :

  • Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :
# /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0
  • Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :
# /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0
  • Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :
# /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0

Test rapide

Trouver le fichier .gguf :

# find /opt/llama.cpp/models -iname "*.gguf"

Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :

# /opt/llama.cpp/build/bin/llama-cli \
  -m /opt/llama.cpp/models/models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf \
  -ngl 35 \
  -c 2048 \
  -p "Explique moi ce qu'est llama.cpp"

Explication :

-ngl : nombre de couches envoyées au GPU
-c   : taille du contexte

Mode serveur (API compatible OpenAI)

# /opt/llama.cpp/build/bin/llama-server \
  -m /opt/llama.cpp/models/models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf \
  -c 2048 \
  -ngl 35 \
  --host 0.0.0.0 \
  --port 8080

Le serveur est accessible via :

http://IP:8080

Test API

# curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "local",
    "messages": [
      {"role": "user", "content": "Bonjour"}
    ]
  }'

API key

Pour activer une authentification par clé API, ajouter le paramètre --api-key ou --api-key-file :

--api-key masuperclef

ou :

--api-key-file /dossier/clef.txt

Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans /root/ si le service tourne en root.

Exemple :

# chmod 600 /root/llama-api-key.txt

SSL

Pour que la clé API ne transite pas en clair sur le réseau, il convient d'utiliser HTTPS.


Avec certificat auto-signé (déconseillé)
  • Créer un dossier de configuration :
# mkdir -p /etc/llama-server
# chmod 700 /etc/llama-server
  • Installer les outils nécessaires :
# apt update && apt upgrade
# apt install openssl curl
  • Créer le fichier contenant l’API key si nécessaire :
# vi /etc/llama-server/api-keys.txt
masuperclef
# chmod 600 /etc/llama-server/api-keys.txt
  • Générer les fichiers SSL nécessaires :
# openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout /etc/llama-server/server.key \
  -out /etc/llama-server/server.crt \
  -subj "/CN=IP_SERVEUR" \
  -addext "subjectAltName = IP:IP_SERVEUR"
  • Sécuriser les fichiers :
# chmod 600 /etc/llama-server/server.key
# chmod 644 /etc/llama-server/server.crt

  • Ajouter à la configuration de llama.cpp :
...
 --port 8080 \
 --api-key-file /etc/llama-server/api-keys.txt \
 --ssl-key-file /etc/llama-server/server.key \
 --ssl-cert-file /etc/llama-server/server.crt
...

Optimisation (KV cache, performances, latence)

  • Le paramètre de contexte (-c) influence directement la quantité de mémoire utilisée par le KV cache. Plus il est élevé, plus la consommation de VRAM augmente, ainsi que la latence de traitement du prompt.
  • En pratique, une valeur de 2048 constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à 4096 peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.
  • Le paramètre -ngl détermine le nombre de couches envoyées au GPU.
    • Plus la valeur est élevée, plus les performances augmentent.
    • Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.
    • Il est possible d’utiliser -ngl 999 afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.
  • Le paramètre -fa active Flash Attention.
    • Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.
    • Elle est recommandée sur GPU NVIDIA récents.
  • Le paramètre -b (batch size) influence la vitesse de traitement du prompt.
    • Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.
    • En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.
  • Le paramètre -ub (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.
    • Une valeur plus faible réduit les pics de consommation mémoire.
    • Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.
  • Le paramètre -np (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.
    • Une valeur élevée augmente la consommation de VRAM.
    • Pour un usage personnel ou mono-utilisateur, -np 1 est généralement recommandé.
    • Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.
  • Pour les modèles multimodaux / vision, le fichier mmproj sert à projeter les données image vers le modèle texte.
    • Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.
    • Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.
    • Si la VRAM est limitée, il est possible de forcer le mmproj à rester sur CPU avec :
# --no-mmproj-offload
    • Exemple :
# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele-vision.gguf \
    --mmproj /models/mmproj.gguf \
    --no-mmproj-offload \
    -ngl 999
    • Si aucune option --mmproj n’est utilisée, --no-mmproj-offload n’a pas d’intérêt.
    • En pratique :
      • VRAM suffisante : laisser le comportement par défaut, avec le mmproj sur GPU.
      • VRAM limitée : tester --no-mmproj-offload pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.

Exemple de configuration optimisée pour un GPU de 12 Go :

# /opt/llama.cpp/build/bin/llama-server \
  -m /opt/llama.cpp/models/models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf \
  -c 2048 \
  -ngl 999 \
  -fa on \
  -b 1024 \
  -ub 512 \
  -np 1 \
  --host 0.0.0.0 \
  --port 8080

Explication :

-c    : taille du contexte
-ngl  : nombre de couches envoyées au GPU
-fa   : active Flash Attention
-b    : taille du batch de traitement
-ub   : taille du micro-batch
-np   : nombre de requêtes traitées en parallèle
  • Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement -b ou le contexte.
  • En cas d’erreur mémoire ou de performances instables :
    • réduire -b
    • réduire -ngl
    • réduire -c

Méthode d’ajustement recommandée

  • Commencer avec :
    • -c 2048
    • -ngl 999
    • -fa on
    • -b 512
    • -ub 256
    • -np 1
  • Vérifier ensuite l’utilisation mémoire :
# nvidia-smi
  • Si la VRAM est presque saturée :
    • réduire -b
    • puis -ub
    • puis réduire -ngl si nécessaire
  • Si au contraire une marge importante reste disponible :
    • essayer -b 1024
    • ou augmenter légèrement le contexte

Remarques

  • Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.
  • Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.
  • Sur un petit GPU, il est généralement préférable de privilégier un contexte raisonnable et un nombre limité de requêtes parallèles.

Multi-GPU

llama.cpp peut utiliser plusieurs GPU afin de répartir le chargement du modèle lorsque celui-ci ne tient pas entièrement sur une seule carte graphique.

L'intérêt principal du multi-GPU avec llama.cpp est souvent de pouvoir charger un modèle plus gros en VRAM, plutôt que d'obtenir un gain de vitesse parfaitement linéaire.

Vérifier les GPU disponibles

Vérifier que les cartes NVIDIA sont bien visibles :

# nvidia-smi

Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.

Options principales

Option Description
-ngl ou --gpu-layers Nombre de couches du modèle à envoyer sur GPU.
--split-mode Méthode de répartition du modèle entre plusieurs GPU.
--tensor-split Répartition manuelle de la charge entre les GPU.
--main-gpu GPU principal utilisé notamment pour certaines allocations et opérations.

Split mode

Le paramètre --split-mode contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.

Mode Description Usage conseillé
none Pas de répartition multi-GPU. À utiliser si un seul GPU doit être utilisé.
layer Répartit les couches du modèle entre les GPU. Mode classique et généralement le plus simple.
row Répartit certains tenseurs entre les GPU. Plus spécifique, à tester selon le modèle et le matériel.

En pratique, le mode layer est souvent le plus simple pour commencer.

Exemple simple avec deux GPU

Lancer un serveur llama.cpp en utilisant plusieurs GPU :

# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer

Avec -ngl 999, llama.cpp tente de charger le maximum de couches possible sur les GPU.

Répartition manuelle avec tensor-split

Par défaut, llama.cpp peut répartir les couches de manière automatique. En cas de GPU avec des quantités de VRAM différentes, ou si une carte tombe en OOM, il peut être nécessaire d'utiliser --tensor-split.

Exemple avec deux GPU de 12 Go :

# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12

Exemple avec un GPU de 24 Go et un GPU de 12 Go :

# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 24,12

Les valeurs de --tensor-split sont des proportions. Il n'est pas obligatoire d'indiquer exactement la VRAM en Go, mais c'est une méthode simple pour garder une répartition logique.

Ainsi, ces deux exemples sont équivalents dans l'idée :

# --tensor-split 24,12
# --tensor-split 2,1

Choisir le GPU principal

Le paramètre --main-gpu permet de choisir le GPU principal.

Exemple avec le GPU 0 comme carte principale :

# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12 \
    --main-gpu 0

Si le GPU 0 est déjà utilisé par l'affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.

Sélectionner les GPU visibles

Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d'utiliser CUDA_VISIBLE_DEVICES.

Exemple pour n'utiliser que les GPU 1 et 2 :

# CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12

Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.

Ainsi, avec :

# CUDA_VISIBLE_DEVICES=1,2

le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.

Exemple avec trois GPU

Exemple avec trois RTX 3060 12 Go :

# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12,12 \
    --main-gpu 0

Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :

# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 24,12,12 \
    --main-gpu 0

Vérifier l'utilisation mémoire

Pendant le lancement et l'inférence, surveiller la VRAM :

# watch -n 1 nvidia-smi

Si une carte arrive en manque de mémoire, il faut réduire la charge :

  • diminuer -c ;
  • diminuer -b ;
  • diminuer -ub ;
  • ajuster --tensor-split ;
  • réduire -ngl ;
  • utiliser un quant plus léger.

Performances attendues

Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.

En pratique :

  • si le modèle tient déjà entièrement sur un seul GPU, ajouter un second GPU peut parfois ne pas améliorer les performances ;
  • si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d'éviter l'offload CPU, ce qui améliore fortement les performances ;
  • les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;
  • deux GPU identiques sont plus simples à exploiter que deux GPU très différents.

Résumé pratique

Pour commencer avec deux GPU identiques :

# /opt/llama.cpp/build/bin/llama-server \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12 \
    -c 4096 \
    -fa

Pour un usage personnel, il est conseillé de garder :

# -np 1

afin d'éviter une consommation mémoire inutilement élevée.

Service systemd

Création d'un service pour automatiser le lancement du serveur llama.cpp, tout d'abord créer un lien propre vers le modèle si nécessaire :

# ln -s /opt/llama.cpp/models/models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf /opt/llama.cpp/models/qwen35-9b-uncensored-q4km.gguf

Créer le service :

# vi /etc/systemd/system/llama-server.service
[Unit]
Description=llama.cpp server
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/llama.cpp
ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/qwen35-9b-uncensored-q4km.gguf -c 2048 -ngl 999 -fa on -b 1024 -ub 512 -np 1 --host 0.0.0.0 --port 8080
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl enable llama-server
# systemctl start llama-server

Proxy OpenClaw

Source

Il est possible d'utiliser un proxy Python afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.

Cependant, pour un usage stable, il est recommandé d’utiliser un backend nativement compatible tel que Ollama (usage personnel) ou vLLM (usage avancé / multi-utilisateurs).

Mise à jour

Pour mettre à jour llama.cpp vers la dernière version disponible :

# cd /opt/llama.cpp
# git pull

Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :

# rm -rf build

Recompiler ensuite avec la même méthode que lors de l’installation initiale.

Recompilation CPU uniquement

# cmake -B build
# cmake --build build -j$(nproc)

Recompilation GPU NVIDIA CUDA

# export CUDACXX=/usr/local/cuda-13.2/bin/nvcc
# cmake -B build -DGGML_CUDA=ON
# cmake --build build -j$(nproc)

Llama bench

  • Commande de base :
# /opt/llama.cpp/build/bin/llama-bench

Exemple de test de stabilité avec MoE

On récupère la commande réellement exécutée par llama (le service doit être actif) :

# tr '\0' ' ' < /proc/$(pidof llama-server)/cmdline

Résultat :

/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf --mmproj /opt/llama.cpp/models/mmproj-F16.gguf -ngl 999 -t 8 -tb 16 -b 4096 -ub 4096 -c 131072 --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap -ncmoe 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {"preserve_thinking": true} --reasoning-budget 8096 --reasoning-budget-message D'accord, assez réfléchi, plus d'attente. Passons à l'action. --temp 0.6 --top-k 20 --top-p 0.95 --min-p 0.0 --presence-penalty 0.0 --repeat-penalty 1.0 --swa-full --cache-reuse 512 --host IP_SERVEUR --port 8080 --api-key-file /etc/llama-server/api-keys.txt --ssl-key-file /etc/llama-server/server.key --ssl-cert-file /etc/llama-server/server.crt

On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d'experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :

# systemctl stop llama-server

Puis on lance le test :

 # /opt/llama.cpp/build/bin/llama-bench \
  -m "/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf" \
  -ngl 999 \
  -t 8 \
  -b 4096 \
  -ub 4096 \
  -fa 1 \
  -mmp 0 \
  -ncmoe 35 \
  -ctk q8_0 \
  -ctv q8_0 \
  -p 1000 \
  -n 128 \
  -d 0,16000,32000,64000,96000,120000 \
  -r 3

Le dernier test utilisera environ :

120000 + 1000 + 128 = 121128 tokens

Cela reste proche de la limite configurée de 131072 tokens, avec une marge d'environ 9944 tokens. Si ce test ne plante pas et que les performances restent cohérentes, la configuration devrait tenir en mémoire et être raisonnablement stable avec ce niveau de contexte.


Benchmark multi-GPU

Tester les performances avec llama-bench :

# /opt/llama.cpp/build/bin/llama-bench \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12

Comparer avec un seul GPU :

# CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \
    -m /models/modele.gguf \
    -ngl 999

Puis avec deux GPU :

# CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \
    -m /models/modele.gguf \
    -ngl 999 \
    --split-mode layer \
    --tensor-split 12,12

Les résultats à comparer sont principalement :

pp : prompt processing
tg : token generation

Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM

Machine de test :

  • LXC Debian 13
  • 8 vCPU (E5-2667 v2)
  • RTX 3060 12GB (PCIe 3.0 x8)
  • DDR3-1866
    • À noter que la mémoire des experts déchargés en RAM est consommée sur l’hôte, et non comptabilisée dans le LXC, car elle transite via le pilote Nvidia.
    • Dans une VM ou sur une machine physique, prévoir au minimum la taille du modèle en RAM, avec idéalement 30 à 50 % de marge supplémentaire selon le contexte, le KV cache et les buffers.

Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL

# /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL
# ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf
# ln -s /opt/llama.cpp/models/models--unsloth--Qwen3.6-35B-A3B-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj-BF16.gguf /opt/llama.cpp/models/mmproj-F16.gguf
ExecStart=/opt/llama.cpp/build/bin/llama-server \
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \
  -ngl 999 \
  -t 8 \
  -tb 16 \
  -b 4096 \
  -ub 4096 \
  -c 131072 \
  --cache-ram 2048 \
  -np 1 \
  --kv-unified \
  -fa on \
  --no-mmproj-offload \
  --no-mmap \
  -ncmoe 35 \
  -ctk q8_0 \
  -ctv q8_0 \
  --reasoning on \
  --jinja \
  --chat-template-kwargs '{"preserve_thinking": true}' \
  --reasoning-budget 8096 \
  --reasoning-budget-message "D'accord, assez réfléchi, plus d'attente. Passons à l'action." \
  --temp 0.6 \
  --top-k 20 \
  --top-p 0.95 \
  --min-p 0.0 \
  --presence-penalty 0.0 \
  --repeat-penalty 1.0 \
  --swa-full \
  --cache-reuse 512 \
  --host 192.168.1.123 \
  --port 8080
  • Test :
# journalctl -u llama-server -n 200 --no-pager | grep -E "offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch"
print_info: n_ctx_train           = 262144
print_info: n_ctx_orig_yarn       = 262144
load_tensors: offloaded 41/41 layers to GPU
load_tensors:        CUDA0 model buffer size =  4972.80 MiB
load_tensors:    CUDA_Host model buffer size = 20377.31 MiB
llama_context: n_ctx         = 131072
llama_context: n_ctx_seq     = 131072
llama_context: n_batch       = 4096
llama_context: n_ubatch      = 4096
llama_context: n_ctx_seq (131072) < n_ctx_train (262144) -- the full capacity of the model will not be utilized
llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB
sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB
sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB
alloc_compute_meta:        CPU compute buffer size =   248.10 MiB
slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072

Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.
Je veux une réponse qui distingue clairement :

vitesse brute ;
latence initiale ;
fluidité perçue ;
fiabilité ;
confort à long terme.

Termine par une conclusion pratique en 5 lignes maximum.

Vitesse : (apres plusieurs essais mais a confirmer..)

prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)
eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    17.33 tokens per second)
total time =   21577.79 ms /  3180 tokens

Qwen3.6-35B-A3B-APEX-I-Balanced

# /opt/llama.cpp/build/bin/llama-cli --hf-repo mudler/Qwen3.6-35B-A3B-APEX-GGUF --hf-file Qwen3.6-35B-A3B-APEX-I-Balanced.gguf
# ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf
# ln -s /opt/llama.cpp/models/models--mudler--Qwen3.6-35B-A3B-APEX-GGUF/snapshots/1234567890abcdef1234567890abcdef12345678/mmproj.gguf /opt/llama.cpp/models/mmproj-F16.gguf
ExecStart=/opt/llama.cpp/build/bin/llama-server \
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \
  -ngl 999 \
  -t 8 \
  -tb 16 \
  -b 4096 \
  -ub 4096 \
  -c 131072 \
  --cache-ram 2048 \
  -np 1 \
  --kv-unified \
  -fa on \
  --no-mmproj-offload \
  --no-mmap \
  -ncmoe 35 \
  -ctk q8_0 \
  -ctv q8_0 \
  --reasoning on \
  --jinja \
  --chat-template-kwargs '{"preserve_thinking": true}' \
  --reasoning-budget 8096 \
  --reasoning-budget-message "D'accord, assez réfléchi, plus d'attente. Passons à l'action." \
  --temp 0.6 \
  --top-k 20 \
  --top-p 0.95 \
  --min-p 0.0 \
  --presence-penalty 0.0 \
  --repeat-penalty 1.0 \
  --swa-full \
  --cache-reuse 512 \
  --host 192.168.1.123 \
  --port 8080
  • Test :
# journalctl -u llama-server -n 200 --no-pager | grep -E "offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch"
print_info: n_ctx_train           = 262144
print_info: n_ctx_orig_yarn       = 262144
load_tensors: offloaded 41/41 layers to GPU
load_tensors:          CPU model buffer size =   333.44 MiB
load_tensors:        CUDA0 model buffer size =  4763.95 MiB
load_tensors:    CUDA_Host model buffer size = 19330.00 MiB
llama_context: n_ctx         = 131072
llama_context: n_ctx_seq     = 131072
llama_context: n_batch       = 4096
llama_context: n_ubatch      = 4096
llama_context: n_ctx_seq (131072) < n_ctx_train (262144) -- the full capacity of the model will not be utilized
llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB
sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB
sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB
alloc_compute_meta:        CPU compute buffer size =   248.10 MiB
slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072

Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.
Je veux une réponse qui distingue clairement :

vitesse brute ;
latence initiale ;
fluidité perçue ;
fiabilité ;
confort à long terme.

Termine par une conclusion pratique en 5 lignes maximum.

Premier essai :

prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)
eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    17.47 tokens per second)
total time =   17823.27 ms /  4179 tokens

Deuxième essai :

prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)
eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    21.81 tokens per second)
total time =   15384.07 ms /  4178 tokens
Sommaire