<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lugwiki.stcgrupo.es/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Le Wiki de Lug - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lugwiki.stcgrupo.es/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Sp%C3%A9cial:Contributions/Admin"/>
	<updated>2026-06-30T18:24:43Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4091</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4091"/>
		<updated>2026-06-30T14:55:42Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* SearXNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
=== [[IA_MCP#SearXNG|SearXNG]] ===&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 concise: |-&lt;br /&gt;
   You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
   - For search suggestions, use mcp_searxng_searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use mcp_searxng_searxng_instance_info.&lt;br /&gt;
   - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   - Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use mcp_searxng_searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use mcp_searxng_searxng_web_search with categories=videos.&lt;br /&gt;
   - For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4090</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4090"/>
		<updated>2026-06-30T14:51:09Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* SearXNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
=== [[IA_MCP#SearXNG|SearXNG]] ===&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 concise: |-&lt;br /&gt;
   You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
   - For search suggestions, use mcp_searxng_searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use mcp_searxng_searxng_instance_info.&lt;br /&gt;
   - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   - Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use mcp_searxng_searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use mcp_searxng_searxng_web_search with categories=videos.&lt;br /&gt;
   - For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not mention tool names or internal tool calls in the final answer unless the user asks for technical details.&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4089</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4089"/>
		<updated>2026-06-30T14:50:56Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* SearXNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
=== [[IA_MCP#SearXNG|SearXNG]] ===&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = En Docker, si le port est exposé mais que le serveur MCP ne répond pas, vérifier que le serveur écoute sur &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; avec &amp;lt;code&amp;gt;MCP_HTTP_HOST=0.0.0.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 concise: |-&lt;br /&gt;
   You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &lt;br /&gt;
   TOOLS:&lt;br /&gt;
   - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
   - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
   - For search suggestions, use mcp_searxng_searxng_search_suggestions.&lt;br /&gt;
   - For SearXNG instance capabilities, categories, engines, locales, and plugins, use mcp_searxng_searxng_instance_info.&lt;br /&gt;
   - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
   RULES:&lt;br /&gt;
   - Respond in the same language as the user.&lt;br /&gt;
   - Do not invent tool results.&lt;br /&gt;
   - If a tool fails, say so explicitly.&lt;br /&gt;
   - Do not promise to continue later, follow up later, or say that results are still coming.&lt;br /&gt;
   - When the user asks multiple questions, use the tools needed, then answer all requested items in one final structured response.&lt;br /&gt;
   - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
   - This includes weather, news, prices, schedules, releases, availability, rankings, versions, and other facts that may have changed.&lt;br /&gt;
   - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
   - Use search categories when relevant.&lt;br /&gt;
   - For image searches, use mcp_searxng_searxng_web_search with categories=images.&lt;br /&gt;
   - For video searches, use mcp_searxng_searxng_web_search with categories=videos.&lt;br /&gt;
   - For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
   - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
   - Do not mention tool names or internal tool calls in the final answer unless the user asks for technical details.&lt;br /&gt;
   - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4088</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4088"/>
		<updated>2026-06-30T14:35:47Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* = SearXNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
=== [[IA_MCP#SearXNG|SearXNG]] ===&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = En Docker, si le port est exposé mais que le serveur MCP ne répond pas, vérifier que le serveur écoute sur &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; avec &amp;lt;code&amp;gt;MCP_HTTP_HOST=0.0.0.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 TOOLS:&lt;br /&gt;
 - For current, recent, upcoming, or uncertain information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
 - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
 - For search suggestions, use mcp_searxng_searxng_search_suggestions.&lt;br /&gt;
 - For SearXNG instance capabilities, categories, engines, locales, and plugins, use mcp_searxng_searxng_instance_info.&lt;br /&gt;
 - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
 RULES:&lt;br /&gt;
 - Respond in the same language as the user.&lt;br /&gt;
 - Do not invent tool results.&lt;br /&gt;
 - If a tool fails, say so.&lt;br /&gt;
 - Use search categories when relevant.&lt;br /&gt;
 - For image searches, use mcp_searxng_searxng_web_search with categories=images.&lt;br /&gt;
 - For video searches, use mcp_searxng_searxng_web_search with categories=videos.&lt;br /&gt;
 - For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
 - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
 - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Prompt plus strict :&lt;br /&gt;
&lt;br /&gt;
 TOOLS:&lt;br /&gt;
 - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
 - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
 - For vague or ambiguous searches, use mcp_searxng_searxng_search_suggestions to refine the query.&lt;br /&gt;
 - To discover available SearXNG categories, engines, locales, plugins, or instance capabilities, use mcp_searxng_searxng_instance_info.&lt;br /&gt;
 - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
 RULES:&lt;br /&gt;
 - Respond in the same language as the user.&lt;br /&gt;
 - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
 - This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
 - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
 - For current, recent, time-sensitive, or uncertain factual details such as dates, prices, schedules, availability, versions, or percentages, use a tool result from the current turn.&lt;br /&gt;
 - Do not invent tool results.&lt;br /&gt;
 - If a tool fails, say so explicitly.&lt;br /&gt;
 - Use search categories when relevant.&lt;br /&gt;
 - For image searches, use mcp_searxng_searxng_web_search with categories=images.&lt;br /&gt;
 - For video searches, use mcp_searxng_searxng_web_search with categories=videos.&lt;br /&gt;
 - For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
 - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
 - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4087</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4087"/>
		<updated>2026-06-30T14:30:36Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* SearXNG */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
=== [[IA_MCP#SearXNG|SearXNG]] ==&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = En Docker, si le port est exposé mais que le serveur MCP ne répond pas, vérifier que le serveur écoute sur &amp;lt;code&amp;gt;0.0.0.0&amp;lt;/code&amp;gt; avec &amp;lt;code&amp;gt;MCP_HTTP_HOST=0.0.0.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
Le serveur &amp;lt;code&amp;gt;ihor-sokoliuk/mcp-searxng&amp;lt;/code&amp;gt; expose notamment les outils suivants :&lt;br /&gt;
&lt;br /&gt;
 searxng_web_search&lt;br /&gt;
 searxng_search_suggestions&lt;br /&gt;
 searxng_instance_info&lt;br /&gt;
 web_url_read&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
 TOOLS:&lt;br /&gt;
 - For current, recent, upcoming, or uncertain information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
 - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
 - For search suggestions, use mcp_searxng_searxng_search_suggestions.&lt;br /&gt;
 - For SearXNG instance capabilities, categories, engines, locales, and plugins, use mcp_searxng_searxng_instance_info.&lt;br /&gt;
 - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
 RULES:&lt;br /&gt;
 - Respond in the same language as the user.&lt;br /&gt;
 - Do not invent tool results.&lt;br /&gt;
 - If a tool fails, say so.&lt;br /&gt;
 - Use search categories when relevant.&lt;br /&gt;
 - For image searches, use mcp_searxng_searxng_web_search with categories=images.&lt;br /&gt;
 - For video searches, use mcp_searxng_searxng_web_search with categories=videos.&lt;br /&gt;
 - For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
 - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
 - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Prompt plus strict :&lt;br /&gt;
&lt;br /&gt;
 TOOLS:&lt;br /&gt;
 - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
 - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
 - For vague or ambiguous searches, use mcp_searxng_searxng_search_suggestions to refine the query.&lt;br /&gt;
 - To discover available SearXNG categories, engines, locales, plugins, or instance capabilities, use mcp_searxng_searxng_instance_info.&lt;br /&gt;
 - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
 RULES:&lt;br /&gt;
 - Respond in the same language as the user.&lt;br /&gt;
 - Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
 - This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
 - If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
 - For current, recent, time-sensitive, or uncertain factual details such as dates, prices, schedules, availability, versions, or percentages, use a tool result from the current turn.&lt;br /&gt;
 - Do not invent tool results.&lt;br /&gt;
 - If a tool fails, say so explicitly.&lt;br /&gt;
 - Use search categories when relevant.&lt;br /&gt;
 - For image searches, use mcp_searxng_searxng_web_search with categories=images.&lt;br /&gt;
 - For video searches, use mcp_searxng_searxng_web_search with categories=videos.&lt;br /&gt;
 - For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
 - For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
 - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4086</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4086"/>
		<updated>2026-06-30T14:24:08Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* MCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#SearXNG|SearXNG]] ==&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur MCP SearXNG (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche). Vérifier également que le port correspond bien à celui exposé par le conteneur MCP SearXNG.&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Prompt plus strict :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
- This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
- If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
- For current, recent, time-sensitive, or uncertain factual details such as dates, prices, schedules, availability, versions, or percentages, use a tool result from the current turn.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so explicitly.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
* Recommandation :&lt;br /&gt;
&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
Décocher :&lt;br /&gt;
&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=IA_MCP&amp;diff=4085</id>
		<title>IA MCP</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=IA_MCP&amp;diff=4085"/>
		<updated>2026-06-30T14:18:07Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sources de serveurs MCP importantes :&lt;br /&gt;
* [https://hub.docker.com/mcp Hub MCP Docker]&lt;br /&gt;
* [https://mcpservers.org/fr/ Awesome MCP Servers]&lt;br /&gt;
&lt;br /&gt;
Ces plateformes recensent des serveurs MCP prêts à l’emploi permettant d’étendre les capacités d’une IA (web, fichiers, APIs, etc.).&lt;br /&gt;
= [https://mcpservers.org/fr/servers/ihor-sokoliuk/mcp-searxng SearXNG] =&lt;br /&gt;
Un serveur MCP qui intègre l’API SearXNG, permettant aux assistants IA d’effectuer des recherches sur le web.&lt;br /&gt;
&lt;br /&gt;
Fonctionnalités :&lt;br /&gt;
&lt;br /&gt;
* Recherche web : requêtes générales, actualités, articles, avec pagination.  &lt;br /&gt;
* Lecture de contenu d’URL : extraction avancée du contenu avec pagination, filtrage par section et extraction des titres.  &lt;br /&gt;
* Cache intelligent : le contenu des URLs est mis en cache avec une durée de vie (TTL) pour améliorer les performances et éviter les requêtes redondantes.  &lt;br /&gt;
* Pagination : permet de choisir la page de résultats à récupérer.  &lt;br /&gt;
* Filtrage temporel : filtre les résultats par période (jour, mois, année).  &lt;br /&gt;
* Sélection de la langue : filtre les résultats selon la langue souhaitée.  &lt;br /&gt;
* Safe Search : contrôle le niveau de filtrage du contenu dans les résultats de recherche.&lt;br /&gt;
== Installation ==&lt;br /&gt;
Via [[Docker|Docker]]&lt;br /&gt;
 # mkdir -p /opt/mcp-searxng&lt;br /&gt;
 # vi /opt/mcp-searxng/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   mcp-searxng:&lt;br /&gt;
     image: isokoliuk/mcp-searxng:latest&lt;br /&gt;
     container_name: mcp-searxng&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     environment:&lt;br /&gt;
       - SEARXNG_URL=http://&amp;lt;font color = blue&amp;gt;IP_SEARXNG&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
       - MCP_HTTP_PORT=&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;&lt;br /&gt;
       - MCP_HTTP_HOST=0.0.0.0&lt;br /&gt;
       - USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36&lt;br /&gt;
       - URL_READER_USER_AGENT=Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
       # pour ecouter sur une interface specifique :&lt;br /&gt;
       # - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;3000&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 # docker compose -f /opt/mcp-searxng/docker-compose.yml --project-directory /opt/mcp-searxng up -d&lt;br /&gt;
* Test :&lt;br /&gt;
 # curl http://&amp;lt;font color=blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/health&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4084</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4084"/>
		<updated>2026-06-30T14:02:36Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Cas particulier : bundle certifi du venv Hermes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
===== Automatiser le remplacement du certificat du venv =====&lt;br /&gt;
On édite le service Hermes :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python&amp;lt;font color = green&amp;gt;3.11&amp;lt;/font&amp;gt;/site-packages/certifi/cacert.pem&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis recharger systemd et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#SearXNG|SearXNG]] ==&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche)&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
 TOOLS:&lt;br /&gt;
 - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
 - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
 - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
 RULES:&lt;br /&gt;
 - Respond in the same language as the user.&lt;br /&gt;
 - Do not invent tool results.&lt;br /&gt;
 - If a tool fails, say so.&lt;br /&gt;
 - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
-----&lt;br /&gt;
* Prompt plus développé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
- This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
- If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
- Never provide exact numbers, dates, times, prices, percentages, or similar factual details unless they come from a tool result in the current turn.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so explicitly.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Recommandation :&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
Décocher :&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
&lt;br /&gt;
== [[IA_MCP#MCP_SearXNG_Enhanced_Server_(HTTP_Edition)|MCP SearXNG Enhanced Server (HTTP Edition)]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;8000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche)&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, or uncertain information, first use mcp_searxng_get_current_datetime, then use mcp_searxng_search_web.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_get_website.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so.&lt;br /&gt;
- Use search categories when relevant.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
- For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
- For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Prompt plus développé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, first use mcp_searxng_get_current_datetime, then use mcp_searxng_search_web.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_get_website.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tools first.&lt;br /&gt;
- This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
- If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
- Never provide exact numbers, dates, times, prices, percentages, or similar factual details unless they come from a tool result in the current turn.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so explicitly.&lt;br /&gt;
- Use search categories when relevant.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
- For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
- For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Recommandation :&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
Décocher :&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Accueil&amp;diff=4083</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Accueil&amp;diff=4083"/>
		<updated>2026-06-26T20:09:53Z</updated>

		<summary type="html">&lt;p&gt;Admin : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-bandeau&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Baneau wiki 2.png|frameless|1000px|link=|alt=Le Wiki de Lug — Une pieuvre, huit bras, trop de projets.]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tiles&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-ia&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile ia.webp|link=page_IA|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Page dédiée à l&#039;IA&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;LLM locaux, agents, outils et tests.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-linux&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile linux.webp|link=page_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Linux&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Commandes, optimisations, scripts et réglages en vrac.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-proxmox&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile proxmox.webp|link=page_ProxMox|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;ProxMox&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;VM, LXC, stockage, réseau et sauvegardes.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-mediawiki&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile mediawiki.webp|link=MediaWiki|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;MediaWiki&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Moteur de wiki libre pour organiser la documentation.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-jellyfin&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile jellyfin.webp|link=MediaWiki|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Jellyfin&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Serveur libre pour organiser et diffuser ses médias.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-nextcloud&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile nextcloud.webp|link=Nextcloud|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Nextcloud&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Cloud personnel libre pour fichiers, contacts et calendriers.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-docker&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile docker.webp|link=page_Docker|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Docker&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Plateforme de conteneurs pour déployer et isoler des services.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-wireguard&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile wireguard.webp|link=WireGuard_LXC_Alpine_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;WireGuard&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;VPN léger et rapide pour connexions sécurisées.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-prometheus&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile prometheus.webp|link=Prometheus|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Prometheus&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Supervision, métriques, alertes et tableaux de bord.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-syncthing&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile syncthing.webp|link=Syncthing|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Syncthing&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Synchronisation de fichiers libre entre plusieurs appareils.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-rustdesk&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile rustdesk.webp|link=RustDesk|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;RustDesk&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Bureau à distance libre et sécurisé.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-reverseproxy&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile reverseproxy.webp|link=Nginx_ReverseProxy_LXC_Alpine_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Proxy inverse Nginx&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;HTTPS, redirections et accès sécurisé aux services.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-caddy&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile caddy.webp|link=caddy_ReverseProxy|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Proxy inverse Caddy&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;HTTPS automatique, configuration simple et accès sécurisé aux services.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-ca&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile ca.webp|link=Serveur_CA_LXC_Alpine_Linux|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Serveur CA&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Gestion des certificats, signatures et confiance interne.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-searxng&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile searxng.webp|link=SearXNG|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;SearXNG&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Recherche web privée et auto-hébergée.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-moonlightweb&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile moonlightweb.webp|link=moonlight_web_stream|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;Moonlight Web&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Accès web au streaming Moonlight depuis vos appareils.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-truenas&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile truenas.webp|link=page_TrueNAS|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;TrueNAS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Stockage NAS, ZFS, partages et optimisations.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-suitecrm&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile suitecrm.webp|link=SuiteCRM|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;SuiteCRM&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;CRM libre pour gestion client et suivi commercial.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-prestashop&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile prestashop.webp|link=PrestaShop|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;PrestaShop&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Solution e-commerce pour gérer une boutique en ligne.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-zoneminder&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile zoneminder.webp|link=ZoneMinder|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;ZoneMinder&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Solution NVR libre et historique pour caméras IP.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile accueil-tile-large accueil-tile-retrogaming&amp;quot;&amp;gt;&lt;br /&gt;
[[Fichier:Tuile retrogaming.webp|link=page_RetroGaming|class=accueil-tile-img]]&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-title&amp;quot;&amp;gt;RetroGaming&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;accueil-tile-desc&amp;quot;&amp;gt;Jeux rétro, ROMs, streaming et organisation de ludothèque.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Fichier:Tuile_caddy.webp&amp;diff=4082</id>
		<title>Fichier:Tuile caddy.webp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Fichier:Tuile_caddy.webp&amp;diff=4082"/>
		<updated>2026-06-26T20:07:41Z</updated>

		<summary type="html">&lt;p&gt;Admin : Tuile caddy..&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Tuile caddy..&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4081</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4081"/>
		<updated>2026-06-26T18:09:59Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Activer le serveur API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si &amp;lt;code&amp;gt;API_SERVER_HOST=0.0.0.0&amp;lt;/code&amp;gt; : l’API est accessible sur le réseau. Définir impérativement une clé &amp;lt;code&amp;gt;API_SERVER_KEY&amp;lt;/code&amp;gt; longue et aléatoire, au minimum 16 caractères, idéalement générée avec &amp;lt;code&amp;gt;openssl rand -hex 32&amp;lt;/code&amp;gt;. Limiter aussi l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
}}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#SearXNG|SearXNG]] ==&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche)&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
 TOOLS:&lt;br /&gt;
 - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
 - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
 - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
 RULES:&lt;br /&gt;
 - Respond in the same language as the user.&lt;br /&gt;
 - Do not invent tool results.&lt;br /&gt;
 - If a tool fails, say so.&lt;br /&gt;
 - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
-----&lt;br /&gt;
* Prompt plus développé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
- This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
- If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
- Never provide exact numbers, dates, times, prices, percentages, or similar factual details unless they come from a tool result in the current turn.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so explicitly.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Recommandation :&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
Décocher :&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
&lt;br /&gt;
== [[IA_MCP#MCP_SearXNG_Enhanced_Server_(HTTP_Edition)|MCP SearXNG Enhanced Server (HTTP Edition)]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;8000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche)&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, or uncertain information, first use mcp_searxng_get_current_datetime, then use mcp_searxng_search_web.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_get_website.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so.&lt;br /&gt;
- Use search categories when relevant.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
- For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
- For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Prompt plus développé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, first use mcp_searxng_get_current_datetime, then use mcp_searxng_search_web.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_get_website.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tools first.&lt;br /&gt;
- This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
- If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
- Never provide exact numbers, dates, times, prices, percentages, or similar factual details unless they come from a tool result in the current turn.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so explicitly.&lt;br /&gt;
- Use search categories when relevant.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
- For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
- For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Recommandation :&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
Décocher :&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4080</id>
		<title>Hermes</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Hermes&amp;diff=4080"/>
		<updated>2026-06-26T18:05:42Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Utiliser une CA privée avec Hermes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prérequis =&lt;br /&gt;
(Hermes seul)&lt;br /&gt;
* Une machine ou VM dédiée (LXC compatible)&lt;br /&gt;
Pour un Hermes de base (sans LLM local) :&lt;br /&gt;
* RAM :&lt;br /&gt;
** 1 Go → minimum (test uniquement)&lt;br /&gt;
** 2 Go → recommandé&lt;br /&gt;
** 4 Go -&amp;gt; confortable&lt;br /&gt;
* CPU / vCPU :&lt;br /&gt;
** 1 vCPU → suffisant&lt;br /&gt;
** 2 vCPU → recommandé&lt;br /&gt;
* Espace disque :&lt;br /&gt;
** 5 Go → minimum&lt;br /&gt;
** 10 Go → confortable&lt;br /&gt;
* GPU :&lt;br /&gt;
** Inutile&lt;br /&gt;
= Installation Hermes (service dédié) =&lt;br /&gt;
&lt;br /&gt;
== Installation (Debian) ==&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install curl git&lt;br /&gt;
 # curl -fsSL &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;How would you like to set up Hermes?&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt; &amp;lt;font color = lightgreen&amp;gt;(○) Quick setup — provider, model &amp;amp; messaging (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Ollama local :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
 API key [optional]:&lt;br /&gt;
&lt;br /&gt;
 Detected model: &amp;lt;font color = green&amp;gt;mon_model&amp;lt;/font&amp;gt;&lt;br /&gt;
 Use this model? [Y/n]: &amp;lt;font color = blue&amp;gt;Y&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Context length in tokens [leave blank for auto-detect]:&lt;br /&gt;
&lt;br /&gt;
 Display name [192.168.2.216:11434]: &amp;lt;font color = blue&amp;gt;Ollama&amp;lt;/font&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Llama.cpp :&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Select provider:&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;lt;font color = lightgreen&amp;gt;(○) Custom endpoint (enter URL manually)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 Custom OpenAI-compatible endpoint configuration:&lt;br /&gt;
 API base URL [e.g. &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;api.example.com/v1]: http&amp;lt;font color = red&amp;gt;s&amp;lt;/font&amp;gt;://&amp;lt;font color = blue&amp;gt;IP_OLLAMA&amp;lt;/font&amp;gt;:&amp;lt;font color = green&amp;gt;11434&amp;lt;/font&amp;gt;/v1&lt;br /&gt;
-----&lt;br /&gt;
Remplir les options désirées puis fin de l&#039;installation :&lt;br /&gt;
 Launch hermes chat now? [Y/n]: &amp;lt;font color = blue&amp;gt;y&amp;lt;/font&amp;gt;&lt;br /&gt;
Ensuite, inscrire Hermes comme service pour qu&#039;il se lance automatiquement :&lt;br /&gt;
-----&lt;br /&gt;
* Sur une machine physique ou VM :&lt;br /&gt;
 # hermes gateway install --system&lt;br /&gt;
* Dans un LXC :&lt;br /&gt;
 # hermes gateway install --system --run-as-user root&lt;br /&gt;
-----&lt;br /&gt;
 # systemctl enable hermes-gateway.service      &lt;br /&gt;
 # systemctl start hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
=== Activer le serveur API ===&lt;br /&gt;
On édite le fichier :&lt;br /&gt;
 # vi ~/.hermes/.env&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_ENABLED=true&lt;br /&gt;
 API_SERVER_KEY=&amp;quot;&amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
 # pour autoriser toutes les interfaces :&lt;br /&gt;
 API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;0.0.0.0&amp;lt;/font&amp;gt;&lt;br /&gt;
 # pour autoriser une seule interface :&lt;br /&gt;
 # API_SERVER_HOST=&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;&lt;br /&gt;
 API_SERVER_PORT=&amp;lt;font color = green&amp;gt;8642&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  = Si API_SERVER_HOST=0.0.0.0 : L’API est accessible sur le réseau. Limiter l’accès via firewall ou réseau privé recommandé.&lt;br /&gt;
 }}&lt;br /&gt;
On relance le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
Pour tester :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/health&lt;br /&gt;
Doit renvoyer :&lt;br /&gt;
 {&amp;quot;status&amp;quot;:&amp;quot;ok&amp;quot;}&lt;br /&gt;
Pour vérifier le modèle exposé :&lt;br /&gt;
 # curl http://&amp;lt;font color = blue&amp;gt;IP_HERMES&amp;lt;/font&amp;gt;:8642/v1/models -H &amp;quot;Authorization: Bearer &amp;lt;font color = blue&amp;gt;maclefsecrete&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
=== Retarder le démarrage de Hermes au boot pour laisser le temps aux autres services de se lancer ===&lt;br /&gt;
&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 ExecStartPre=/bin/sh -c &#039;uptime=$(cut -d. -f1 /proc/uptime); [ &amp;quot;$uptime&amp;quot; -lt 120 ] &amp;amp;&amp;amp; sleep 30 || true&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Cette commande ajoute une pause de 30 secondes uniquement si la machine a démarré depuis moins de 120 secondes.&lt;br /&gt;
Cela permet d’éviter que Hermes tente de se connecter trop tôt à certains services encore en cours de démarrage.&lt;br /&gt;
}}&lt;br /&gt;
=== Utiliser une CA privée avec Hermes ===&lt;br /&gt;
Si Hermes doit se connecter à un service HTTPS signé par une CA privée locale, il peut être nécessaire d’indiquer explicitement à Python et aux bibliothèques HTTP quel bundle de certificats utiliser.&lt;br /&gt;
&lt;br /&gt;
Éditer l’override systemd du service :&lt;br /&gt;
 # systemctl edit hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ajouter dans la zone d’édition (partie supérieure du fichier) :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Anything between here and the comment below will become the contents of the drop-in file&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;[Service]&lt;br /&gt;
 Environment=&amp;quot;SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&lt;br /&gt;
 Environment=&amp;quot;CURL_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;### Edits below this comment will be discarded&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explication rapide :&lt;br /&gt;
* &amp;lt;code&amp;gt;SSL_CERT_FILE&amp;lt;/code&amp;gt; : utilisé par Python / OpenSSL&lt;br /&gt;
* &amp;lt;code&amp;gt;REQUESTS_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par la bibliothèque Python &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;CURL_CA_BUNDLE&amp;lt;/code&amp;gt; : utilisé par &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; et parfois comme variable de repli&lt;br /&gt;
&lt;br /&gt;
Puis recharger et redémarrer le service :&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
==== Cas particulier : bundle certifi du venv Hermes ====&lt;br /&gt;
Dans certains cas, le runtime Python embarqué par Hermes peut continuer à utiliser le bundle interne de certifi au lieu du magasin système.&lt;br /&gt;
&lt;br /&gt;
Si curl valide déjà le certificat avec /etc/ssl/certs/ca-certificates.crt mais que Hermes/OpenAI/httpx échoue avec CERTIFICATE_VERIFY_FAILED, on peut remplacer le bundle certifi du venv Hermes par le bundle système.&lt;br /&gt;
&lt;br /&gt;
Sauvegarder le bundle actuel :&lt;br /&gt;
 # cp /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem.bak&lt;br /&gt;
&lt;br /&gt;
Remplacer par le bundle système :&lt;br /&gt;
 # cp /etc/ssl/certs/ca-certificates.crt /root/.hermes/hermes-agent/venv/lib/python3.11/site-packages/certifi/cacert.pem&lt;br /&gt;
&lt;br /&gt;
Attention : cette modification peut être écrasée lors d’une mise à jour de Hermes, du venv Python ou du paquet certifi.&lt;br /&gt;
&lt;br /&gt;
=== Éditer le prompt système ===&lt;br /&gt;
Dans le fichier de configuration :&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
On édite ou vérifie le profil utilisé dans la section &amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  display:&lt;br /&gt;
   compact: false&amp;lt;/font&amp;gt;&lt;br /&gt;
   personality: &amp;lt;font color = green&amp;gt;kawaii&amp;lt;/font&amp;gt;&lt;br /&gt;
   &amp;lt;font color = grey&amp;gt;resume_display: full&lt;br /&gt;
 ...&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis on modifie le prompt système via le profil correspondant dans la section &amp;lt;code&amp;gt;agent&amp;lt;/code&amp;gt; :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
 agent:&lt;br /&gt;
   max_turns: 90&lt;br /&gt;
   gateway_timeout: 1800&lt;br /&gt;
   restart_drain_timeout: 60&lt;br /&gt;
   api_max_retries: 3&lt;br /&gt;
   service_tier: &#039;&#039;&lt;br /&gt;
   tool_use_enforcement: auto&lt;br /&gt;
   gateway_timeout_warning: 900&lt;br /&gt;
   gateway_notify_interval: 600&lt;br /&gt;
   verbose: false&lt;br /&gt;
   reasoning_effort: medium&amp;lt;/font&amp;gt;&lt;br /&gt;
   personalities:&lt;br /&gt;
     helpful: You are a helpful, friendly AI assistant.&lt;br /&gt;
     concise: You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
Enfin, on redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
⚠️ Attention, pour que les lignes contenant &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; ne soient pas interprétées comme des personnalités dans le fichier YAML, il faut écrire le prompt sous forme de bloc multiligne avec le symbole &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;, en respectant l&#039;indentation. Exemple :&lt;br /&gt;
     &amp;lt;font color = cyan&amp;gt;concise&amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;: |&amp;lt;/font&amp;gt;&lt;br /&gt;
       You are a concise assistant. Keep responses brief and to the point.&lt;br /&gt;
       TOOLS:&lt;br /&gt;
       - For current, recent, uncertain, or factual information, use mcp_searxng_searxng_web_search.&lt;br /&gt;
       - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
       - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
       RULES:&lt;br /&gt;
       - Respond in the same language as the user.&lt;br /&gt;
       - Do not invent tool results.&lt;br /&gt;
       - If a tool fails, say so.&lt;br /&gt;
       - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
=== Signal ===&lt;br /&gt;
Signal est une messagerie instantanée axée sur la confidentialité.&lt;br /&gt;
Tous les messages et appels y sont chiffrés de bout en bout par défaut via le Signal Protocol, de sorte que ni Signal ni un tiers ne peuvent en lire le contenu. Signal se distingue également par une collecte de données très limitée, l’absence de publicité et de traqueurs, ainsi qu’un effort particulier pour réduire les métadonnées accessibles au service.&lt;br /&gt;
&lt;br /&gt;
Signal permet de relier Hermes à la messagerie chiffrée Signal.&lt;br /&gt;
La connexion ne se fait pas directement avec le téléphone, mais via &amp;lt;code&amp;gt;signal-cli&amp;lt;/code&amp;gt; exécuté en mode daemon HTTP, auquel Hermes se connecte ensuite.&lt;br /&gt;
&lt;br /&gt;
* Installation :&lt;br /&gt;
==== Via [[Docker|Docker]] ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =  Installation séparée (Docker sur autre machine) : Les images et fichiers audio générés par Hermes ne peuvent pas être envoyés en pièces jointes natives, signal-cli n&#039;a pas accès au cache local de Hermes (/root/.hermes/image_cache/). Seules les URLs brutes seront transmises.&lt;br /&gt;
Pour les pièces jointes natives (images, audio TTS, vidéos), installer signal-cli sur le même serveur qu&#039;Hermes via [[Hermes#Native|l&#039;installation native]].&lt;br /&gt;
 }}&lt;br /&gt;
 # mkdir -p /opt/signal-cli&lt;br /&gt;
 # vi /opt/signal-cli/docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
 services:&lt;br /&gt;
   signal-cli:&lt;br /&gt;
     image: registry.gitlab.com/packaging/signal-cli/signal-cli-jre:latest&lt;br /&gt;
     container_name: signal-cli&lt;br /&gt;
     restart: unless-stopped&lt;br /&gt;
     command: daemon --http 0.0.0.0:8080&lt;br /&gt;
     ports:&lt;br /&gt;
       - &amp;quot;&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;:8080:8080&amp;quot; # Remplacer par IP du serveur, ou 127.0.0.1 pour restreindre acces local uniquement&lt;br /&gt;
     volumes:&lt;br /&gt;
       - signal-cli-data:/var/lib/signal-cli&lt;br /&gt;
     tmpfs:&lt;br /&gt;
       - /tmp:exec&lt;br /&gt;
 &lt;br /&gt;
 volumes:&lt;br /&gt;
   signal-cli-data:&lt;br /&gt;
&lt;br /&gt;
  # docker compose -f /opt/signal-cli/docker-compose.yml --project-directory /opt/signal-cli up -d&lt;br /&gt;
* Connexion au téléphone :&lt;br /&gt;
Installer &amp;lt;code&amp;gt;qrencode&amp;lt;/code&amp;gt; :&lt;br /&gt;
 # apt install qrencode&lt;br /&gt;
&lt;br /&gt;
Dans le terminal :&lt;br /&gt;
 # docker exec signal-cli signal-cli link -n &amp;quot;&amp;lt;font color = blue&amp;gt;HermesAgent&amp;lt;/font&amp;gt;&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 3 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
&lt;br /&gt;
==== Native ====&lt;br /&gt;
* Installation :&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install tar qrencode openjdk-&amp;lt;font color = green&amp;gt;25&amp;lt;/font&amp;gt;-jre-headless&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Si l&#039;installation échoue, vérifier la compatibilité Java : &amp;lt;code&amp;gt;signal-cli --version&amp;lt;/code&amp;gt;. En cas d&#039;erreur &amp;lt;code&amp;gt;UnsupportedClassVersionError&amp;lt;/code&amp;gt;, installer la version Java requise via &amp;lt;code&amp;gt;apt install openjdk-&amp;lt;font color = blue&amp;gt;XX&amp;lt;/font&amp;gt;-jre-headless&amp;lt;/code&amp;gt;.&lt;br /&gt;
 }}&lt;br /&gt;
On Installe le programme :&lt;br /&gt;
 # cd /tmp&lt;br /&gt;
 # VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 # curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 # tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 # ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/&lt;br /&gt;
 # rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
Appareillage du téléphone :&lt;br /&gt;
 # signal-cli link -n &amp;quot;HermesAgent&amp;quot; &amp;gt; /tmp/signal-link.txt 2&amp;gt;&amp;amp;1 &amp;amp; sleep 5 &amp;amp;&amp;amp; grep -o &#039;sgnl://[^ ]*&#039; /tmp/signal-link.txt | qrencode -t ANSIUTF8 &amp;amp;&amp;amp; wait&lt;br /&gt;
Puis scanner le QR code avec l’application Signal via &amp;lt;code&amp;gt;Paramètres&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;Appareils associés&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On créé un service :&lt;br /&gt;
 # vi /etc/systemd/system/signal-cli.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=signal-cli daemon&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/usr/local/bin/signal-cli --account +&amp;lt;font color = blue&amp;gt;VOTRE_NUMERO&amp;lt;/font&amp;gt; daemon --http 127.0.0.1:8080&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable --now signal-cli&lt;br /&gt;
 # systemctl status signal-cli&lt;br /&gt;
* Connecter Hermes à Signal :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = gold&amp;gt;Connect a messaging platform? (Telegram, Discord, etc.)&amp;lt;/font&amp;gt;&lt;br /&gt;
 -&amp;gt; &amp;lt;font color = lightgreen&amp;gt;●) Set up messaging now (recommended)&amp;lt;/font&amp;gt;&lt;br /&gt;
Puis redémarrer le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
* Communiquer avec le serveur via Signal (depuis le téléphone dans l&#039;application Signal) :&lt;br /&gt;
** Appuyer sur l’icône ✏️ (nouveau message)&lt;br /&gt;
** Tout en haut de la liste, &amp;quot;Note to Self&amp;quot; ou votre propre nom apparaît&lt;br /&gt;
** Taper votre message : Hermes répond dans cette même conversation&lt;br /&gt;
** (Optionnel) taper &amp;lt;code&amp;gt;/sethome&amp;lt;/code&amp;gt; pour définir le canal par défaut pour les notifications et les tâches planifiées.&lt;br /&gt;
==== Mise à jour automatique ====&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =   Il est recommandé de mettre à jour l&#039;application Signal au moins tous les trois mois.&lt;br /&gt;
 }}&lt;br /&gt;
* Version native :&lt;br /&gt;
On créé un script :&lt;br /&gt;
 # vi /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 systemctl stop signal-cli&lt;br /&gt;
 cd /tmp&lt;br /&gt;
 &lt;br /&gt;
 # Télécharger la nouvelle version&lt;br /&gt;
 VERSION=$(curl -Ls -o /dev/null -w %{url_effective} &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/latest | sed &#039;s/^.*\/v//&#039;)&lt;br /&gt;
 curl -L -O &amp;quot;&amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz&amp;quot;&lt;br /&gt;
 tar xf &amp;quot;signal-cli-${VERSION}.tar.gz&amp;quot; -C /opt&lt;br /&gt;
 ln -sf &amp;quot;/opt/signal-cli-${VERSION}/bin/signal-cli&amp;quot; /usr/local/bin/signal-cli&lt;br /&gt;
 rm /tmp/signal-cli-${VERSION}.tar.gz&lt;br /&gt;
 &lt;br /&gt;
 # Vérifier la compatibilité Java&lt;br /&gt;
 if ! signal-cli --version &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
     # Extraire la version Java requise depuis l&#039;erreur&lt;br /&gt;
     REQUIRED=$(signal-cli --version 2&amp;gt;&amp;amp;1 | grep -o &#039;class file version [0-9]*&#039; | grep -o &#039;[0-9]*&#039;)&lt;br /&gt;
     # Convertir class version en version Java (class 69 = Java 25, 65 = Java 21, etc.)&lt;br /&gt;
     JAVA_VERSION=$((REQUIRED - 44))&lt;br /&gt;
     echo &amp;quot;Java $JAVA_VERSION requis, installation...&amp;quot;&lt;br /&gt;
     apt install -y openjdk-${JAVA_VERSION}-jre-headless&lt;br /&gt;
     update-alternatives --set java /usr/lib/jvm/java-${JAVA_VERSION}-openjdk-amd64/bin/java&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 systemctl start signal-cli&lt;br /&gt;
&lt;br /&gt;
 # chmod +x /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
On ajoute le script au crontab :&lt;br /&gt;
 # crontab -e&lt;br /&gt;
Ajouter :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
 0 3 1 * * /usr/local/bin/update-signal-cli.sh&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* 0 → minute 0&lt;br /&gt;
* 3 → 3h du matin&lt;br /&gt;
* 1 → le 1er du mois&lt;br /&gt;
* * → tous les mois&lt;br /&gt;
* * → peu importe le jour de la semaine&lt;br /&gt;
}}&lt;br /&gt;
* Version docker :&lt;br /&gt;
Voir [[Watchtower]] pour la mise à jour automatique de tous les containers Docker. (tuto à faire..)&lt;br /&gt;
&lt;br /&gt;
= Commandes =&lt;br /&gt;
* Lancer l’interface interactive :&lt;br /&gt;
 # hermes&lt;br /&gt;
&lt;br /&gt;
* Choisir le modèle et le provider LLM :&lt;br /&gt;
 # hermes model&lt;br /&gt;
&lt;br /&gt;
* Configurer les outils disponibles :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
&lt;br /&gt;
* Modifier une configuration spécifique :&lt;br /&gt;
 # hermes config set&lt;br /&gt;
&lt;br /&gt;
* Démarrer le gateway (Telegram, Discord, etc.) :&lt;br /&gt;
 # hermes gateway&lt;br /&gt;
&lt;br /&gt;
* Lancer le script de configuration complet :&lt;br /&gt;
 # hermes setup&lt;br /&gt;
&lt;br /&gt;
* Migrer depuis OpenClaw :&lt;br /&gt;
 # hermes claw migrate&lt;br /&gt;
&lt;br /&gt;
* Mettre à jour Hermes :&lt;br /&gt;
 # hermes update&lt;br /&gt;
&lt;br /&gt;
* Diagnostiquer les problèmes :&lt;br /&gt;
 # hermes doctor&lt;br /&gt;
= MCP =&lt;br /&gt;
== [[IA_MCP#SearXNG|SearXNG]] ==&lt;br /&gt;
&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;3000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche)&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
 TOOLS:&lt;br /&gt;
 - For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
 - To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
 - For system tasks, use terminal.&lt;br /&gt;
 &lt;br /&gt;
 RULES:&lt;br /&gt;
 - Respond in the same language as the user.&lt;br /&gt;
 - Do not invent tool results.&lt;br /&gt;
 - If a tool fails, say so.&lt;br /&gt;
 - Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
-----&lt;br /&gt;
* Prompt plus développé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, use mcp_searxng_searxng_web_search.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_web_url_read.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tool first.&lt;br /&gt;
- This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
- If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
- Never provide exact numbers, dates, times, prices, percentages, or similar factual details unless they come from a tool result in the current turn.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so explicitly.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Recommandation :&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
Décocher :&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;br /&gt;
&lt;br /&gt;
== [[IA_MCP#MCP_SearXNG_Enhanced_Server_(HTTP_Edition)|MCP SearXNG Enhanced Server (HTTP Edition)]] ==&lt;br /&gt;
 # vi ~/.hermes/config.yaml&lt;br /&gt;
&lt;br /&gt;
On inscrit le serveur (créer la section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; si absente) :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&lt;br /&gt;
 mcp_servers:&amp;lt;/font&amp;gt;&lt;br /&gt;
   searxng:&lt;br /&gt;
     url: &amp;quot;http://&amp;lt;font color=blue&amp;gt;IP_MCP&amp;lt;/font&amp;gt;:&amp;lt;font color=green&amp;gt;8000&amp;lt;/font&amp;gt;/mcp&amp;quot;&lt;br /&gt;
 &amp;lt;font color=grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  = La section &amp;lt;code&amp;gt;mcp_servers&amp;lt;/code&amp;gt; doit être au niveau racine (tout à gauche)&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
On redémarre le service :&lt;br /&gt;
 # systemctl restart hermes-gateway.service&lt;br /&gt;
&lt;br /&gt;
Ou depuis Hermes :&lt;br /&gt;
 /reload-mcp&lt;br /&gt;
&lt;br /&gt;
Test :&lt;br /&gt;
 # hermes mcp list&lt;br /&gt;
 # hermes mcp test searxng&lt;br /&gt;
* Prompt système recommandé (voir [[#Éditer_le_prompt_système|Éditer le prompt système]]) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, or uncertain information, first use mcp_searxng_get_current_datetime, then use mcp_searxng_search_web.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_get_website.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so.&lt;br /&gt;
- Use search categories when relevant.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
- For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
- For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Prompt plus développé :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
TOOLS:&lt;br /&gt;
- For current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions, first use mcp_searxng_get_current_datetime, then use mcp_searxng_search_web.&lt;br /&gt;
- To read a specific URL, use mcp_searxng_get_website.&lt;br /&gt;
- For system tasks, use terminal.&lt;br /&gt;
&lt;br /&gt;
RULES:&lt;br /&gt;
- Respond in the same language as the user.&lt;br /&gt;
- Never answer current, recent, upcoming, time-sensitive, location-specific, or uncertain factual questions without using the required tools first.&lt;br /&gt;
- This includes weather, news, prices, schedules, releases, availability, rankings, and other facts that may have changed.&lt;br /&gt;
- If no tool result is available, say you cannot verify and do not guess.&lt;br /&gt;
- Never provide exact numbers, dates, times, prices, percentages, or similar factual details unless they come from a tool result in the current turn.&lt;br /&gt;
- Do not invent tool results.&lt;br /&gt;
- If a tool fails, say so explicitly.&lt;br /&gt;
- Use search categories when relevant.&lt;br /&gt;
- Do not use tools for simple rewriting, translation, or opinion unless needed.&lt;br /&gt;
- For image results, output direct image URLs using markdown image syntax: ![](URL)&lt;br /&gt;
- For video results, output links in this format: 🎬 [Titre de la vidéo](URL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
* Recommandation :&lt;br /&gt;
Il est recommandé de désactiver le service natif correspondant :&lt;br /&gt;
 # hermes tools&lt;br /&gt;
Décocher :&lt;br /&gt;
 🔍 Web Search &amp;amp; Scraping  (web_search, web_extract)  [no API key]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4079</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4079"/>
		<updated>2026-06-26T16:22:47Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Support de SSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
=== Support de SSL ===&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y build-essential cmake ninja-build libssl-dev pkg-config&lt;br /&gt;
Il faut rajouter &amp;lt;code&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/code&amp;gt; aux options de compilation, exemple avec CUDA :&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON &amp;lt;font color = green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt;&lt;br /&gt;
Après compilation, on peut vérifier que le binaire est bien lié à OpenSSL :&lt;br /&gt;
 # ldd /opt/ik_llama.cpp/build/bin/llama-server | grep -Ei &#039;ssl|crypto&#039;&lt;br /&gt;
On doit voir apparaître &amp;lt;code&amp;gt;libssl&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;libcrypto&amp;lt;/code&amp;gt;. Si rien n’apparaît, le support SSL n’a pas été compilé correctement.&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL contexte long 131072 — KV Cache Q4/Q4 + Hadamard ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 1024 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q4_0 \&lt;br /&gt;
  -ctv q4_0 \&lt;br /&gt;
  --k-cache-hadamard \&lt;br /&gt;
  --v-cache-hadamard \&lt;br /&gt;
  --spec-type ngram-map-k4v:n_max=64,n_min=2,ngram_size_n=16,ngram_size_m=24,ngram_min_hits=1 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-format none \&lt;br /&gt;
  --reasoning-budget 16192 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --slot-save-path /kv_cache/ \&lt;br /&gt;
  --ctx-checkpoints-interval 1024 \&lt;br /&gt;
  --ctx-checkpoints 64 \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4078</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4078"/>
		<updated>2026-06-26T16:20:08Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Support de SSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
=== Support de SSL ===&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y build-essential cmake ninja-build libssl-dev pkg-config&lt;br /&gt;
Il faut rajouter &amp;lt;code&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/code&amp;gt; aux options de compilation, exemple avec CUDA :&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON &amp;lt;font color = green&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL contexte long 131072 — KV Cache Q4/Q4 + Hadamard ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 1024 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q4_0 \&lt;br /&gt;
  -ctv q4_0 \&lt;br /&gt;
  --k-cache-hadamard \&lt;br /&gt;
  --v-cache-hadamard \&lt;br /&gt;
  --spec-type ngram-map-k4v:n_max=64,n_min=2,ngram_size_n=16,ngram_size_m=24,ngram_min_hits=1 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-format none \&lt;br /&gt;
  --reasoning-budget 16192 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --slot-save-path /kv_cache/ \&lt;br /&gt;
  --ctx-checkpoints-interval 1024 \&lt;br /&gt;
  --ctx-checkpoints 64 \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4077</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4077"/>
		<updated>2026-06-26T16:19:47Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Support de SSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
=== Support de SSL ===&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y build-essential cmake ninja-build libssl-dev pkg-config&lt;br /&gt;
Il faut rajouter &amp;lt;code&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/code&amp;gt; aux options de compilation, exemple avec CUDA :&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON -DLLAMA_OPENSSL=ON&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL contexte long 131072 — KV Cache Q4/Q4 + Hadamard ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 1024 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q4_0 \&lt;br /&gt;
  -ctv q4_0 \&lt;br /&gt;
  --k-cache-hadamard \&lt;br /&gt;
  --v-cache-hadamard \&lt;br /&gt;
  --spec-type ngram-map-k4v:n_max=64,n_min=2,ngram_size_n=16,ngram_size_m=24,ngram_min_hits=1 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-format none \&lt;br /&gt;
  --reasoning-budget 16192 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --slot-save-path /kv_cache/ \&lt;br /&gt;
  --ctx-checkpoints-interval 1024 \&lt;br /&gt;
  --ctx-checkpoints 64 \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4076</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4076"/>
		<updated>2026-06-26T16:19:05Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Emplacement des binaires */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
=== Support de SSL ===&lt;br /&gt;
On installe les dépendances si nécessaire :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y build-essential cmake ninja-build libssl-dev pkg-config&lt;br /&gt;
Il faut rajouter &amp;lt;code&amp;gt;-DLLAMA_OPENSSL=ON&amp;lt;/code&amp;gt; aux options de compilation, exemple avec CUDA :&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL contexte long 131072 — KV Cache Q4/Q4 + Hadamard ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 1024 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q4_0 \&lt;br /&gt;
  -ctv q4_0 \&lt;br /&gt;
  --k-cache-hadamard \&lt;br /&gt;
  --v-cache-hadamard \&lt;br /&gt;
  --spec-type ngram-map-k4v:n_max=64,n_min=2,ngram_size_n=16,ngram_size_m=24,ngram_min_hits=1 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-format none \&lt;br /&gt;
  --reasoning-budget 16192 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --slot-save-path /kv_cache/ \&lt;br /&gt;
  --ctx-checkpoints-interval 1024 \&lt;br /&gt;
  --ctx-checkpoints 64 \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4075</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4075"/>
		<updated>2026-06-26T15:20:16Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* systemd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL contexte long 131072 — KV Cache Q4/Q4 + Hadamard ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 1024 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q4_0 \&lt;br /&gt;
  -ctv q4_0 \&lt;br /&gt;
  --k-cache-hadamard \&lt;br /&gt;
  --v-cache-hadamard \&lt;br /&gt;
  --spec-type ngram-map-k4v:n_max=64,n_min=2,ngram_size_n=16,ngram_size_m=24,ngram_min_hits=1 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-format none \&lt;br /&gt;
  --reasoning-budget 16192 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --slot-save-path /kv_cache/ \&lt;br /&gt;
  --ctx-checkpoints-interval 1024 \&lt;br /&gt;
  --ctx-checkpoints 64 \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4074</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4074"/>
		<updated>2026-06-26T15:18:27Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL contexte long 131072 — KV Cache Q4/Q4 + Hadamard ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q4_0 \&lt;br /&gt;
  -ctv q4_0 \&lt;br /&gt;
  --k-cache-hadamard \&lt;br /&gt;
  --v-cache-hadamard \&lt;br /&gt;
  --spec-type ngram-map-k4v:n_max=64,n_min=2,ngram_size_n=16,ngram_size_m=24,ngram_min_hits=1 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-format none \&lt;br /&gt;
  --reasoning-budget 16192 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --slot-save-path /kv_cache/ \&lt;br /&gt;
  --ctx-checkpoints-interval 1024 \&lt;br /&gt;
  --ctx-checkpoints 64 \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4073</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4073"/>
		<updated>2026-06-26T15:17:37Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q4_0 \&lt;br /&gt;
  -ctv q4_0 \&lt;br /&gt;
  --k-cache-hadamard \&lt;br /&gt;
  --v-cache-hadamard \&lt;br /&gt;
  --spec-type ngram-map-k4v:n_max=64,n_min=2,ngram_size_n=16,ngram_size_m=24,ngram_min_hits=1 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-format none \&lt;br /&gt;
  --reasoning-budget 16192 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --slot-save-path /kv_cache/ \&lt;br /&gt;
  --ctx-checkpoints-interval 1024 \&lt;br /&gt;
  --ctx-checkpoints 64 \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4072</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4072"/>
		<updated>2026-06-26T15:10:25Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 1024 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5881.19 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  267129.32 ms / 131072 tokens (    2.04 ms per token,   490.67 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   14659.30 ms /   256 runs   (   57.26 ms per token,    17.46 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  281884.19 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4071</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4071"/>
		<updated>2026-06-26T14:52:22Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    5827.98 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  284432.30 ms / 131072 tokens (    2.17 ms per token,   460.82 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =   29489.92 ms /   512 runs   (   57.60 ms per token,    17.36 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  314109.07 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4070</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4070"/>
		<updated>2026-06-26T14:46:13Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4069</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4069"/>
		<updated>2026-06-26T14:43:13Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_S context long (131072) NGRAM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_XL context long (131072) NGRAM KV Cache Q4/Q4 ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_XL/Qwen3.6-27B-UD-Q4_K_XL.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 32768 --no-mmap -ctk q4_0 -ctv q4_0 --k-cache-hadamard --v-cache-hadamard -n 2 -nrep 1&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4068</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4068"/>
		<updated>2026-06-26T14:22:34Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* unsloth/Qwen3.6-27B-GGUF */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Q4_K_S context long (131072) NGRAM ====&lt;br /&gt;
[https://www.reddit.com/r/LocalAIStack/comments/1udk2vp/running_qwen36_27b_35b_locally_with_llamacpp/ source]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4067</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4067"/>
		<updated>2026-06-26T14:11:35Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_S context long (131072) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;br /&gt;
===== systemd =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=ik_llama.cpp server&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=root&lt;br /&gt;
WorkingDirectory=/opt/ik_llama.cpp&lt;br /&gt;
ExecStart=/opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf \&lt;br /&gt;
  --mmproj /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/mmproj-BF16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -sm graph \&lt;br /&gt;
  --tensor-split 1,1 \&lt;br /&gt;
  --max-gpu 2 \&lt;br /&gt;
  -gr \&lt;br /&gt;
  -t 6 \&lt;br /&gt;
  -tb 6 \&lt;br /&gt;
  -b 1024 \&lt;br /&gt;
  -ub 512 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --image-min-tokens 1024 \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons                                                                                                                                                                              à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
Restart=always&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4066</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4066"/>
		<updated>2026-06-23T12:34:52Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q4_K_S context long (131072) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -gr -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4721.53 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  280210.46 ms / 131072 tokens (    2.14 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;467.76 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28434.88 ms /   512 runs   (   55.54 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  308825.96 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 973 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4065</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4065"/>
		<updated>2026-06-23T12:24:58Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Tests en vrac */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
=== unsloth/Qwen3.6-27B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q4_K_S context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench -m /opt/models/Qwen3.6-27B-GGUF/Q4_K_S/Qwen3.6-27B-Q4_K_S.gguf -ngl 999 -sm graph --tensor-split 1,1 --max-gpu 2 -t 6 -tb 6 -b 1024 -ub 512 -c 131072 --no-mmap -ctk q8_0 -ctv q8_0  -n 2 -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =    4726.94 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  285353.02 ms / 131072 tokens (    2.18 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;459.33 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   28398.46 ms /   512 runs   (   55.47 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;18.03 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  313933.71 ms / 131584 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 505 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 969 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4064</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4064"/>
		<updated>2026-06-23T10:12:26Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Tests en vrac */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;680.08 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.95 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4063</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4063"/>
		<updated>2026-06-23T10:11:58Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q6_K_XL context long (131072) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 131072   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     147.88 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  192731.43 ms / 131072 tokens (    1.47 ms per token,   680.08 tokens per second)&lt;br /&gt;
 llama_print_timings:        eval time =    9863.68 ms /   256 runs   (   38.53 ms per token,    25.95 tokens per second)&lt;br /&gt;
 llama_print_timings:       total time =  202622.70 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4062</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4062"/>
		<updated>2026-06-23T10:08:57Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q6_K_XL context long (131072) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     265.75 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  199207.13 ms / 131072 tokens (    1.52 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;657.97 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   10236.38 ms /   256 runs   (   39.99 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  209469.85 ms / 131328 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4061</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4061"/>
		<updated>2026-06-23T10:08:32Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q6_K_XL context max (262144) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;br /&gt;
==== Q6_K_XL context long (131072) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
llama_print_timings:        load time =     265.75 ms&lt;br /&gt;
llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
llama_print_timings: prompt eval time =  199207.13 ms / 131072 tokens (    1.52 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;657.97 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
llama_print_timings:        eval time =   10236.38 ms /   256 runs   (   39.99 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;25.01 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
llama_print_timings:       total time =  209469.85 ms / 131328 tokens&lt;br /&gt;
~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
~ggml_backend_cuda_context: have 630 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4060</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4060"/>
		<updated>2026-06-23T09:56:45Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Tests en vrac */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 28   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     251.16 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  478864.73 ms / 262144 tokens (    1.83 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;547.43 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   22001.10 ms /   512 runs   (   42.97 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;23.27 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  500956.66 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 477 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;br /&gt;
&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4059</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4059"/>
		<updated>2026-06-23T09:45:58Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Tests en vrac */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     242.63 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  467729.40 ms / 262144 tokens (    1.78 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;560.46 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   21223.46 ms /   512 runs   (   41.45 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;24.12 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  489042.57 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     173.76 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  524310.41 ms / 262144 tokens (    2.00 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;499.98 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24036.52 ms /   512 runs   (   46.95 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.30 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  548440.06 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 490 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 631 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4058</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4058"/>
		<updated>2026-06-23T09:42:04Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Q6_K_XL context max (262144) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     242.63 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  467729.40 ms / 262144 tokens (    1.78 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;560.46 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   21223.46 ms /   512 runs   (   41.45 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;24.12 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  489042.57 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 30   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4057</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4057"/>
		<updated>2026-06-23T09:33:16Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Tests en vrac */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     242.63 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  467729.40 ms / 262144 tokens (    1.78 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;560.46 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   21223.46 ms /   512 runs   (   41.45 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;24.12 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  489042.57 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;br /&gt;
==== Q6_K_XL context max (262144) ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q6_K_XL/Qwen3.6-35B-A3B-UD-Q6_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 29   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     255.09 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  517871.24 ms / 262144 tokens (    1.98 ms per token,   &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;506.20 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   24000.88 ms /   512 runs   (   46.88 ms per token,    &#039;&#039;&#039;&amp;lt;font color = green&amp;gt;21.33 tokens per second&amp;lt;/font&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  541964.21 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 483 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 630 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4056</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4056"/>
		<updated>2026-06-23T09:15:12Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Remarques */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;br /&gt;
== Tests en vrac ==&lt;br /&gt;
=== unsloth/Qwen3.6-35B-A3B-GGUF ===&lt;br /&gt;
* i5 9600k&lt;br /&gt;
* 32gb RAM&lt;br /&gt;
* 2x 3060 12gb&lt;br /&gt;
==== Q5_K_XL ====&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-sweep-bench   -m /opt/models/Qwen3.6-35B-A3B-GGUF/UD-Q5_K_XL/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf   -ngl 999   -sm graph   --tensor-split 1,1   --max-gpu 2 -gr  --n-cpu-moe 26   --defer-experts   -t 6   -tb 6   -b 4096   -ub 4096   -c 262144   --cache-ram 2048    --no-mmap   -ctk q8_0   -ctv q8_0 --k-cache-hadamard --v-cache-hadamard  -n 8   -nrep 1&lt;br /&gt;
&lt;br /&gt;
 llama_print_timings:        load time =     242.63 ms&lt;br /&gt;
 llama_print_timings:      sample time =       0.00 ms /     1 runs   (    0.00 ms per token,      inf tokens per second)&lt;br /&gt;
 llama_print_timings: prompt eval time =  467729.40 ms / 262144 tokens (    1.78 ms per token,   &#039;&#039;&#039;560.46 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:        eval time =   21223.46 ms /   512 runs   (   41.45 ms per token,    &#039;&#039;&#039;24.12 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 llama_print_timings:       total time =  489042.57 ms / 262656 tokens&lt;br /&gt;
 ~ggml_backend_cuda_context: have 463 graphs&lt;br /&gt;
 ~ggml_backend_cuda_context: have 628 graphs&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4055</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4055"/>
		<updated>2026-06-22T15:30:06Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Sélectionner les GPU visibles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4054</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4054"/>
		<updated>2026-06-22T15:29:54Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Exemple simple avec deux GPU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4053</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4053"/>
		<updated>2026-06-22T15:29:40Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Multi-GPU via sm graph */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de `--tensor-split` sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4052</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4052"/>
		<updated>2026-06-22T15:29:17Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Remarques */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode `graph` cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode `graph` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de `--tensor-split` sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4051</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4051"/>
		<updated>2026-06-22T15:29:04Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Surveillance de la VRAM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode `graph` cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode `graph` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de `--tensor-split` sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de `--tensor-split`.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4050</id>
		<title>Ik llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Ik_llama.cpp&amp;diff=4050"/>
		<updated>2026-06-22T15:28:34Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Multi-GPU via sm graph */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/ikawrakow/ik_llama.cpp Source github]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prérequis ==&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = grave&lt;br /&gt;
  | icône = grave&lt;br /&gt;
  | texte  =&lt;br /&gt;
ik_llama.cpp requiert un CPU avec support AVX2 (Intel Haswell / 2013 ou plus récent). Les CPU plus anciens (ex: Ivy Bridge, Sandy Bridge) supportent AVX mais pas AVX2 et ne peuvent pas compiler ik_llama correctement.&lt;br /&gt;
CPUs incompatibles : Intel Xeon E5 v1/v2, Core i7 3xxx/4xxx première gen...&lt;br /&gt;
CPUs compatibles : Intel Core i5/i7/i9 depuis 2013, Xeon E5 v3+, AMD Ryzen toutes générations&lt;br /&gt;
Pour ces configurations, utiliser [[Llama.cpp|llama.cpp]] standard à la place.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* Un GPU est recommandé, idéalement NVIDIA avec le plus de VRAM possible. ik_llama.cpp met particulièrement l’accent sur CUDA, le multi-GPU et les configurations hybrides GPU/CPU. Comme llama.cpp, il permet de répartir une partie du modèle entre GPU et CPU si la VRAM est insuffisante, au prix d’une baisse de performances. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]]&lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles pour les gros modèles, souvent inutilisables en pratique pour un usage interactif.&lt;br /&gt;
* VRAM recommandée : dépend du niveau d’offload GPU et de la taille du contexte utilisé. Pour un usage optimal, prévoir environ la taille du modèle quantifié + 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.&lt;br /&gt;
* 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 ou si l’on utilise une configuration hybride GPU/CPU.&lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèles que vous allez utiliser ou tester. Exemples :&lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go&lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go&lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go&lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement des modèles.&lt;br /&gt;
* CPU / vCPU recommandés :&lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés, notamment pour la gestion du serveur, du KV cache et d’un éventuel offload partiel CPU.&lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées sur les modèles importants.&lt;br /&gt;
* 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, notamment en 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 ou Q5 est généralement considéré comme le meilleur compromis entre performances, consommation de VRAM et qualité de réponse.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install build-essential git libcurl4-openssl-dev curl libgomp1 cmake&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ikawrakow/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/ik_llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
Si processeur avec instructions AVX512 (certains CPU Zen 4 / Zen 5 etc..) :&lt;br /&gt;
&lt;br /&gt;
([https://github.com/ikawrakow/ik_llama.cpp/blob/main/docs/build.md Source]) &lt;br /&gt;
 # cmake -B build -DCMAKE_BUILD_TYPE=Release \&lt;br /&gt;
     -DGGML_NATIVE=ON \&lt;br /&gt;
     -DGGML_AVX512=ON \&lt;br /&gt;
     -DGGML_AVX512_VBMI=ON \&lt;br /&gt;
     -DGGML_AVX512_VNNI=ON \&lt;br /&gt;
     -DGGML_AVX512_BF16=ON&lt;br /&gt;
 # cmake --build build --config Release&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.3&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
Pour mettre à jour ik_llama.cpp, arrêter d&#039;abord les services ou processus qui utilisent les binaires :&lt;br /&gt;
&lt;br /&gt;
 # pkill -f llama-server&lt;br /&gt;
&lt;br /&gt;
Se placer dans le dossier du projet :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/ik_llama.cpp&lt;br /&gt;
&lt;br /&gt;
Récupérer la dernière version du dépôt :&lt;br /&gt;
&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Par sécurité, supprimer l&#039;ancien dossier de compilation avant de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler avec la même méthode que lors de l&#039;installation.&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour CPU uniquement ===&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Mise à jour GPU NVIDIA CUDA ===&lt;br /&gt;
Si nécessaire, vérifier le chemin de nvcc :&lt;br /&gt;
&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Puis recompiler avec CUDA :&lt;br /&gt;
&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-13.3/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_NATIVE=ON -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build --config Release -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Les nouveaux binaires seront disponibles dans :&lt;br /&gt;
&lt;br /&gt;
 /opt/ik_llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
Vérifier la version compilée :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --version&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Se reporter à la page de [[Llama.cpp#Téléchargement_d’un_modèle_(format_GGUF)|llama.cpp]]&lt;br /&gt;
=== Particularités de ik_llama ===&lt;br /&gt;
==== Télécharger un modèle ====&lt;br /&gt;
Préférer le [[Llama.cpp#Téléchargement_via_le_client_Hugging_Face_(méthode_recommandée)|téléchargement via le client Hugging Face]]&lt;br /&gt;
==== Multi-GPU via sm graph ====&lt;br /&gt;
&lt;br /&gt;
ik_llama.cpp dispose d&#039;un mode de répartition multi-GPU spécifique appelé &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Contrairement au mode classique &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;, qui répartit les couches du modèle entre les GPU, le mode `graph` cherche à répartir le graphe de calcul lui-même entre plusieurs GPU. L&#039;objectif est de mieux utiliser plusieurs cartes en parallèle, notamment lorsque le modèle est trop gros pour une seule carte ou lorsque plusieurs GPU doivent travailler simultanément.&lt;br /&gt;
&lt;br /&gt;
Ce mode est surtout intéressant avec plusieurs GPU. Sur une seule carte graphique, il n&#039;a généralement pas d&#039;intérêt.&lt;br /&gt;
&lt;br /&gt;
===== Vérifier la disponibilité de l&#039;option =====&lt;br /&gt;
&lt;br /&gt;
Les options disponibles peuvent varier selon la version compilée. Vérifier d&#039;abord que le binaire supporte bien le mode `graph` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;split&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server --help | grep -i &amp;quot;graph&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===== Exemple simple avec deux GPU =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs de `--tensor-split` sont des proportions. Pour deux GPU identiques, on peut utiliser :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
ou simplement :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 1,1&lt;br /&gt;
&lt;br /&gt;
Les deux indiquent une répartition équilibrée.&lt;br /&gt;
&lt;br /&gt;
===== Exemple avec GPU de tailles différentes =====&lt;br /&gt;
&lt;br /&gt;
Exemple avec une carte de 24 Go et une carte de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 24,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Cela indique à ik_llama.cpp de répartir davantage de charge vers la carte disposant de plus de VRAM.&lt;br /&gt;
&lt;br /&gt;
===== Sélectionner les GPU visibles =====&lt;br /&gt;
&lt;br /&gt;
Il est possible de limiter les GPU visibles avec `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU physiques 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Attention : lorsque &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt; est utilisé, les GPU sont renumérotés par CUDA.&lt;br /&gt;
&lt;br /&gt;
Ainsi :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
signifie que le GPU physique 1 devient le GPU 0 pour ik_llama.cpp, et que le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
===== Choisir le GPU principal =====&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal utilisé par llama.cpp / ik_llama.cpp pour certaines allocations.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/ik_llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     --main-gpu 0 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est utilisé par l&#039;affichage ou par un autre service, il peut être utile de tester un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
===== Benchmark =====&lt;br /&gt;
&lt;br /&gt;
Comparer d&#039;abord un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Puis deux GPU en mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/ik_llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     -sm graph \&lt;br /&gt;
     --tensor-split 1,1 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Les valeurs à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
===== Surveillance de la VRAM =====&lt;br /&gt;
&lt;br /&gt;
Pendant les tests, surveiller l&#039;utilisation mémoire :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
En cas d&#039;erreur CUDA out of memory, essayer :&lt;br /&gt;
&lt;br /&gt;
* réduire `-c` ;&lt;br /&gt;
* réduire `-b` ;&lt;br /&gt;
* réduire `-ub` ;&lt;br /&gt;
* ajuster `--tensor-split` ;&lt;br /&gt;
* réduire `-ngl` ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
===== Remarques =====&lt;br /&gt;
&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; est surtout utile en multi-GPU.&lt;br /&gt;
* Les gains dépendent fortement du modèle, du quant, du PCIe, du contexte et du nombre de GPU.&lt;br /&gt;
* Deux GPU identiques sont plus simples à configurer.&lt;br /&gt;
* Avec des GPU différents, il peut être nécessaire de tester plusieurs valeurs de `--tensor-split`.&lt;br /&gt;
* Le mode &amp;lt;code&amp;gt;graph&amp;lt;/code&amp;gt; peut évoluer rapidement selon les versions de ik_llama.cpp. Il est donc recommandé de vérifier les options disponibles avec &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; après chaque mise à jour.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4049</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4049"/>
		<updated>2026-06-22T15:27:08Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Benchmark multi-GPU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec &amp;lt;code&amp;gt;llama-bench&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4048</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4048"/>
		<updated>2026-06-22T15:26:50Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Vérifier l&amp;#039;utilisation mémoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* diminuer &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* ajuster &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec `llama-bench` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4047</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4047"/>
		<updated>2026-06-22T15:26:13Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Sélectionner les GPU visibles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser &amp;lt;code&amp;gt;CUDA_VISIBLE_DEVICES&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer `-c` ;&lt;br /&gt;
* diminuer `-b` ;&lt;br /&gt;
* diminuer `-ub` ;&lt;br /&gt;
* ajuster `--tensor-split` ;&lt;br /&gt;
* réduire `-ngl` ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec `llama-bench` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4046</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4046"/>
		<updated>2026-06-22T15:26:00Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Choisir le GPU principal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt; permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer `-c` ;&lt;br /&gt;
* diminuer `-b` ;&lt;br /&gt;
* diminuer `-ub` ;&lt;br /&gt;
* ajuster `--tensor-split` ;&lt;br /&gt;
* réduire `-ngl` ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec `llama-bench` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4045</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4045"/>
		<updated>2026-06-22T15:25:48Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Répartition manuelle avec tensor-split */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt; sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre `--main-gpu` permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer `-c` ;&lt;br /&gt;
* diminuer `-b` ;&lt;br /&gt;
* diminuer `-ub` ;&lt;br /&gt;
* ajuster `--tensor-split` ;&lt;br /&gt;
* réduire `-ngl` ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec `llama-bench` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4044</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4044"/>
		<updated>2026-06-22T15:25:21Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Exemple simple avec deux GPU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser `--tensor-split`.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de `--tensor-split` sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre `--main-gpu` permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer `-c` ;&lt;br /&gt;
* diminuer `-b` ;&lt;br /&gt;
* diminuer `-ub` ;&lt;br /&gt;
* ajuster `--tensor-split` ;&lt;br /&gt;
* réduire `-ngl` ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec `llama-bench` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4043</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4043"/>
		<updated>2026-06-22T15:25:03Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Split mode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt; contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;row&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode &amp;lt;code&amp;gt;layer&amp;lt;/code&amp;gt; est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec `-ngl 999`, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser `--tensor-split`.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de `--tensor-split` sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre `--main-gpu` permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer `-c` ;&lt;br /&gt;
* diminuer `-b` ;&lt;br /&gt;
* diminuer `-ub` ;&lt;br /&gt;
* ajuster `--tensor-split` ;&lt;br /&gt;
* réduire `-ngl` ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec `llama-bench` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4042</id>
		<title>Llama.cpp</title>
		<link rel="alternate" type="text/html" href="https://lugwiki.stcgrupo.es/index.php?title=Llama.cpp&amp;diff=4042"/>
		<updated>2026-06-22T15:24:28Z</updated>

		<summary type="html">&lt;p&gt;Admin : /* Options principales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prérequis ==&lt;br /&gt;
* 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. [[GPU_Passthrough|Voir ce lien pour partager un GPU dans un LXC]] &lt;br /&gt;
* Les modèles peuvent fonctionner sur CPU uniquement, mais avec des performances très faibles (souvent inutilisables en pratique pour un usage interactif). &lt;br /&gt;
* 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. &lt;br /&gt;
* 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. &lt;br /&gt;
* Espace disque à prévoir en fonction du ou des modèle que vous allez utiliser ou tester, Exemples : &lt;br /&gt;
** qwen2.5:7b (Q4) ≈ 4–5 Go &lt;br /&gt;
** qwen2.5:14b (Q4) ≈ 8–10 Go &lt;br /&gt;
** llama3:70b (Q4) ≈ 35–40 Go &lt;br /&gt;
* Utiliser un SSD/NVMe améliore fortement les temps de chargement. &lt;br /&gt;
* CPU / vCPU recommandés : &lt;br /&gt;
** Avec GPU : 4 à 8 vCPU recommandés (gestion du KV cache et offload partiel CPU) &lt;br /&gt;
** Sans GPU : prévoir au minimum 8 à 16 vCPU, les performances restant très limitées. &lt;br /&gt;
* Note : Q4 correspond au niveau de &amp;quot;quantization&amp;quot;, 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.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
=== Prérequis système ===&lt;br /&gt;
Installer les dépendances nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install -y git build-essential cmake curl libcurl4-openssl-dev&lt;br /&gt;
&lt;br /&gt;
=== Récupération du projet ===&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # git clone &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;github.com/ggerganov/llama.cpp.git&lt;br /&gt;
&lt;br /&gt;
=== Compilation ===&lt;br /&gt;
Choisir une seule méthode de compilation selon le matériel disponible.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Méthode&lt;br /&gt;
! Description&lt;br /&gt;
! Recommandation&lt;br /&gt;
|-&lt;br /&gt;
| CPU uniquement&lt;br /&gt;
| Compilation sans accélération GPU.&lt;br /&gt;
| Non testé / déconseillé pour de gros modèles.&lt;br /&gt;
|-&lt;br /&gt;
| GPU NVIDIA CUDA&lt;br /&gt;
| Compilation avec accélération GPU via CUDA.&lt;br /&gt;
| Recommandé avec une carte NVIDIA compatible.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En cas de changement de méthode de compilation, supprimer le dossier de compilation avant de relancer CMake :&lt;br /&gt;
 # rm -rf /opt/llama.cpp/build&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option A — CPU uniquement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode ne nécessite pas de GPU compatible, mais les performances seront limitées.&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
! Option B — GPU NVIDIA CUDA&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
Cette méthode est recommandée avec une carte NVIDIA compatible CUDA.&lt;br /&gt;
&lt;br /&gt;
==== Installation du support GPU NVIDIA CUDA ====&lt;br /&gt;
(Optionnel) Vérifier la dernière version disponible du paquet cuda-keyring :&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/ | grep keyring&lt;br /&gt;
&lt;br /&gt;
Installer le dépôt CUDA NVIDIA :&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # wget &amp;lt;nowiki&amp;gt;https://&amp;lt;/nowiki&amp;gt;developer.download.nvidia.com/compute/cuda/repos/debian&amp;lt;font color=blue&amp;gt;13&amp;lt;/font&amp;gt;/x86_64/cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # dpkg -i cuda-keyring_&amp;lt;font color=blue&amp;gt;1.1-1&amp;lt;/font&amp;gt;_all.deb&lt;br /&gt;
 # apt update&lt;br /&gt;
&lt;br /&gt;
Installer le toolkit CUDA :&lt;br /&gt;
 # apt install -y cuda-toolkit&lt;br /&gt;
&lt;br /&gt;
==== Compilation avec support CUDA ====&lt;br /&gt;
Connaître les versions de nvcc installées :&lt;br /&gt;
 # find /usr /opt -name nvcc 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
Compiler llama.cpp avec le support CUDA :&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Emplacement des binaires ===&lt;br /&gt;
Les binaires seront disponibles dans :&lt;br /&gt;
 /opt/llama.cpp/build/bin/&lt;br /&gt;
&lt;br /&gt;
=== Téléchargement d’un modèle (format GGUF) ===&lt;br /&gt;
==== Téléchargement via le client Hugging Face (méthode recommandée) ====&lt;br /&gt;
&lt;br /&gt;
On installe les dépendances (Debian) :&lt;br /&gt;
&lt;br /&gt;
 # apt install -y python3-full python3-venv&lt;br /&gt;
&lt;br /&gt;
On installe &amp;lt;code&amp;gt;huggingface_hub&amp;lt;/code&amp;gt; dans un environnement virtuel Python :&lt;br /&gt;
&lt;br /&gt;
 # python3 -m venv /opt/huggingface-venv&lt;br /&gt;
 # /opt/huggingface-venv/bin/pip install -U &amp;quot;huggingface_hub[cli]&amp;quot;&lt;br /&gt;
 # ln -sf /opt/huggingface-venv/bin/hf /usr/local/bin/hf&lt;br /&gt;
&lt;br /&gt;
On crée le dossier destiné à accueillir les modèles :&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /opt/models&lt;br /&gt;
&lt;br /&gt;
Puis on télécharge le modèle :&lt;br /&gt;
&lt;br /&gt;
 # hf download &amp;lt;font color=blue&amp;gt;NOM_DU_REPO&amp;lt;/font&amp;gt; --include &amp;quot;&amp;lt;font color=blue&amp;gt;*VERSION_OU_QUANT*.gguf&amp;lt;/font&amp;gt;&amp;quot; --include &amp;quot;&amp;lt;font color=blue&amp;gt;mmproj-BF16.gguf&amp;lt;/font&amp;gt;&amp;quot; --local-dir &amp;lt;font color=blue&amp;gt;/opt/models/NOM_DU_MODELE/VERSION_OU_QUANT&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
Pour les modèles multimodaux, ajouter le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt;. Par défaut, &amp;lt;code&amp;gt;mmproj-BF16.gguf&amp;lt;/code&amp;gt; est recommandé. Si le modèle n&#039;est pas multimodal, cette option n&#039;est pas nécessaire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
&lt;br /&gt;
 # hf download unsloth/Qwen3.6-35B-A3B-MTP-GGUF --include &amp;quot;*UD-Q8_K_XL*.gguf&amp;quot; --include &amp;quot;mmproj-BF16.gguf&amp;quot; --local-dir /opt/models/Qwen3.6-35B-A3B-MTP-GGUF/UD-Q8_K_XL&lt;br /&gt;
&lt;br /&gt;
==== Via llama-cli ====&lt;br /&gt;
Plateformes de modèles :&lt;br /&gt;
* [https://huggingface.co/models Hugging Face] Plateforme principale.&lt;br /&gt;
&lt;br /&gt;
Quantization custom (souvent mieux optimisé) :&lt;br /&gt;
* [https://huggingface.co/bartowski bartowski GGUF models]&lt;br /&gt;
* [https://huggingface.co/unsloth Unsloth GGUF models]&lt;br /&gt;
* [https://huggingface.co/lmstudio-community LM Studio GGUF models]&lt;br /&gt;
* [https://huggingface.co/TheBloke TheBloke GGUF models]&lt;br /&gt;
Créer un dossier pour les modèles :&lt;br /&gt;
 # mkdir -p /opt/llama.cpp/models&lt;br /&gt;
On configure le dossier des modèles :&lt;br /&gt;
 # echo &#039;export LLAMA_CACHE=/opt/llama.cpp/models&#039; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
 # source ~/.bashrc&lt;br /&gt;
Exemple de chargement automatique d’un modèle depuis Hugging Face :&lt;br /&gt;
*Exemple avec Qwen/Qwen3-8B-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf Qwen/Qwen3-8B-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf bartowski/Jackrong_Qwen3.5-9B-Neo-GGUF:Q4_K_M -n 0&lt;br /&gt;
*Exemple avec HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive:Q4_K_M -n 0&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Une fois le modèle téléchargé, faire &amp;quot;/exit&amp;quot; pour quitter le CLI. Le paramètre &amp;quot;-n 0&amp;quot; empêche toute génération de texte : il ne doit être utilisé que pour le téléchargement ou les tests.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test rapide ===&lt;br /&gt;
Trouver le fichier .gguf :&lt;br /&gt;
 # find /opt/llama.cpp/models -iname &amp;quot;*.gguf&amp;quot;&lt;br /&gt;
Exemple avec Qwen3.5-9B-Uncensored-HauhauCS-Aggressive :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -p &amp;quot;Explique moi ce qu&#039;est llama.cpp&amp;quot;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Explication :&lt;br /&gt;
 -ngl : nombre de couches envoyées au GPU&lt;br /&gt;
 -c   : taille du contexte&lt;br /&gt;
&lt;br /&gt;
=== Mode serveur (API compatible OpenAI) ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ngl &amp;lt;font color = green&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; \&lt;br /&gt;
   --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = 0.0.0.0 pour autoriser toutes les interfaces réseau.&lt;br /&gt;
 }}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte  = Le dossier &amp;lt;code&amp;gt;snapshots/&amp;lt;hash&amp;gt;&amp;lt;/code&amp;gt; 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 &amp;lt;code&amp;gt;.gguf&amp;lt;/code&amp;gt; pour simplifier son utilisation.&lt;br /&gt;
}}&lt;br /&gt;
Le serveur est accessible via :&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;IP:8080&lt;br /&gt;
&lt;br /&gt;
=== Test API ===&lt;br /&gt;
 # curl &amp;lt;nowiki&amp;gt;http://&amp;lt;/nowiki&amp;gt;&amp;lt;font color = blue&amp;gt;localhost&amp;lt;/font&amp;gt;:8080/v1/chat/completions \&lt;br /&gt;
   -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
   -d &#039;{&lt;br /&gt;
     &amp;quot;model&amp;quot;: &amp;quot;local&amp;quot;,&lt;br /&gt;
     &amp;quot;messages&amp;quot;: [&lt;br /&gt;
       {&amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;, &amp;quot;content&amp;quot;: &amp;quot;Bonjour&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&#039;&lt;br /&gt;
=== API key ===&lt;br /&gt;
Pour activer une authentification par clé API, ajouter le paramètre &amp;lt;code&amp;gt;--api-key&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--api-key-file&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
 --api-key &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou :&lt;br /&gt;
&lt;br /&gt;
 --api-key-file /dossier/clef.txt&lt;br /&gt;
Le fichier contenant la clé API doit être stocké dans un emplacement non accessible aux autres utilisateurs, par exemple dans &amp;lt;code&amp;gt;/root/&amp;lt;/code&amp;gt; si le service tourne en root.&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 # chmod 600 /root/llama-api-key.txt&lt;br /&gt;
==== SSL ====&lt;br /&gt;
Pour que la clé API ne transite pas en clair sur le réseau, il convient d&#039;utiliser HTTPS.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = modéré&lt;br /&gt;
  | icône = modéré&lt;br /&gt;
  | texte  =&lt;br /&gt;
Certains services, comme Hermes, refusent les certificats auto-signés. Il faut alors utiliser soit un certificat émis par une autorité reconnue, soit [[Serveur_CA_LXC_Alpine_Linux|&#039;&#039;&#039;une CA privée&#039;&#039;&#039;]] dont le certificat public a été installé sur les machines clientes.&lt;br /&gt;
}}&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte =&lt;br /&gt;
Pour une utilisation avec Hermes, voir [[Hermes#Utiliser_une_CA_privée_avec_Hermes|&#039;&#039;&#039;Utiliser une CA privée avec Hermes&#039;&#039;&#039;]].&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; | Avec certificat auto-signé (déconseillé)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
* Créer un dossier de configuration :&lt;br /&gt;
 # mkdir -p /etc/llama-server&lt;br /&gt;
 # chmod 700 /etc/llama-server&lt;br /&gt;
&lt;br /&gt;
* Installer les outils nécessaires :&lt;br /&gt;
 # apt update &amp;amp;&amp;amp; apt upgrade&lt;br /&gt;
 # apt install openssl curl&lt;br /&gt;
&lt;br /&gt;
* Créer le fichier contenant l’API key si nécessaire :&lt;br /&gt;
 # vi /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;masuperclef&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/llama-server/api-keys.txt&lt;br /&gt;
&lt;br /&gt;
* Générer les fichiers SSL nécessaires :&lt;br /&gt;
 # openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \&lt;br /&gt;
   -keyout /etc/llama-server/server.key \&lt;br /&gt;
   -out /etc/llama-server/server.crt \&lt;br /&gt;
   -subj &amp;quot;/CN=&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot; \&lt;br /&gt;
   -addext &amp;quot;subjectAltName = IP:&amp;lt;font color = blue&amp;gt;IP_SERVEUR&amp;lt;/font&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Sécuriser les fichiers :&lt;br /&gt;
 # chmod 600 /etc/llama-server/server.key&lt;br /&gt;
 # chmod 644 /etc/llama-server/server.crt&lt;br /&gt;
|}&lt;br /&gt;
-----&lt;br /&gt;
* Ajouter à la configuration de llama.cpp :&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&lt;br /&gt;
  --port 8080&amp;lt;/font&amp;gt; \&lt;br /&gt;
  --api-key-file /etc/llama-server/api-keys.txt \&lt;br /&gt;
  --ssl-key-file /etc/llama-server/server.key \&lt;br /&gt;
  --ssl-cert-file /etc/llama-server/server.crt&lt;br /&gt;
 &amp;lt;font color = grey&amp;gt;...&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Optimisation (KV cache, performances, latence) ==&lt;br /&gt;
* Le paramètre de contexte (&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;) 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.&lt;br /&gt;
* En pratique, une valeur de &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt; constitue souvent un bon compromis sur un GPU de 12 Go. Augmenter à &amp;lt;code&amp;gt;4096&amp;lt;/code&amp;gt; peut améliorer la mémoire conversationnelle, mais au prix d’une consommation de VRAM plus importante.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; détermine le nombre de couches envoyées au GPU.&lt;br /&gt;
** Plus la valeur est élevée, plus les performances augmentent.&lt;br /&gt;
** Si la VRAM est insuffisante, réduire cette valeur permet de déporter une partie du modèle sur CPU.&lt;br /&gt;
** Il est possible d’utiliser &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; afin de laisser llama.cpp charger automatiquement le maximum de couches possible sur le GPU.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-fa&amp;lt;/code&amp;gt; active Flash Attention.&lt;br /&gt;
** Cette option améliore généralement les performances de traitement du prompt et réduit légèrement la latence.&lt;br /&gt;
** Elle est recommandée sur GPU NVIDIA récents.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; (batch size) influence la vitesse de traitement du prompt.&lt;br /&gt;
** Une valeur plus élevée peut améliorer les performances, mais augmente également la consommation de mémoire.&lt;br /&gt;
** En cas de manque de VRAM, réduire cette valeur peut stabiliser le serveur.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt; (micro-batch size) permet d’ajuster plus finement l’utilisation mémoire.&lt;br /&gt;
** Une valeur plus faible réduit les pics de consommation mémoire.&lt;br /&gt;
** Une valeur plus élevée peut améliorer légèrement les performances si la VRAM le permet.&lt;br /&gt;
* Le paramètre &amp;lt;code&amp;gt;-np&amp;lt;/code&amp;gt; (n_parallel) détermine le nombre de requêtes pouvant être traitées en parallèle.&lt;br /&gt;
** Une valeur élevée augmente la consommation de VRAM.&lt;br /&gt;
** Pour un usage personnel ou mono-utilisateur, &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt; est généralement recommandé.&lt;br /&gt;
** Des valeurs supérieures sont surtout utiles pour une API ou un usage multi-utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* Pour les modèles multimodaux / vision, le fichier &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sert à projeter les données image vers le modèle texte.&lt;br /&gt;
** Par défaut, les versions récentes de llama.cpp peuvent décharger ce projecteur multimodal sur le GPU.&lt;br /&gt;
** Cela améliore généralement la vitesse d’analyse des images, mais consomme un peu plus de VRAM.&lt;br /&gt;
** Si la VRAM est limitée, il est possible de forcer le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; à rester sur CPU avec :&lt;br /&gt;
&lt;br /&gt;
 # --no-mmproj-offload&lt;br /&gt;
&lt;br /&gt;
** Exemple :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele-vision.gguf \&lt;br /&gt;
     --mmproj /models/mmproj.gguf \&lt;br /&gt;
     --no-mmproj-offload \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
** Si aucune option &amp;lt;code&amp;gt;--mmproj&amp;lt;/code&amp;gt; n’est utilisée, &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; n’a pas d’intérêt.&lt;br /&gt;
** En pratique :&lt;br /&gt;
*** VRAM suffisante : laisser le comportement par défaut, avec le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; sur GPU.&lt;br /&gt;
*** VRAM limitée : tester &amp;lt;code&amp;gt;--no-mmproj-offload&amp;lt;/code&amp;gt; pour économiser de la VRAM, au prix d’une analyse d’image potentiellement plus lente.&lt;br /&gt;
&lt;br /&gt;
Exemple de configuration optimisée pour un GPU de 12 Go :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
   -m /opt/llama.cpp/models/&amp;lt;font color=blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -c 2048 \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -fa on \&lt;br /&gt;
   -b 1024 \&lt;br /&gt;
   -ub 512 \&lt;br /&gt;
   -np 1 \&lt;br /&gt;
   --host 0.0.0.0 \&lt;br /&gt;
   --port 8080&lt;br /&gt;
&lt;br /&gt;
Explication :&lt;br /&gt;
 -c    : taille du contexte&lt;br /&gt;
 -ngl  : nombre de couches envoyées au GPU&lt;br /&gt;
 -fa   : active Flash Attention&lt;br /&gt;
 -b    : taille du batch de traitement&lt;br /&gt;
 -ub   : taille du micro-batch&lt;br /&gt;
 -np   : nombre de requêtes traitées en parallèle&lt;br /&gt;
&lt;br /&gt;
* Si le serveur démarre correctement et qu’il reste de la marge en VRAM, il est possible d’augmenter progressivement &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt; ou le contexte.&lt;br /&gt;
* En cas d’erreur mémoire ou de performances instables :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt;&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Méthode d’ajustement recommandée ===&lt;br /&gt;
* Commencer avec :&lt;br /&gt;
** &amp;lt;code&amp;gt;-c 2048&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-fa on&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-b 512&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-ub 256&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-np 1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vérifier ensuite l’utilisation mémoire :&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
* Si la VRAM est presque saturée :&lt;br /&gt;
** réduire &amp;lt;code&amp;gt;-b&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis &amp;lt;code&amp;gt;-ub&amp;lt;/code&amp;gt;&lt;br /&gt;
** puis réduire &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; si nécessaire&lt;br /&gt;
* Si au contraire une marge importante reste disponible :&lt;br /&gt;
** essayer &amp;lt;code&amp;gt;-b 1024&amp;lt;/code&amp;gt;&lt;br /&gt;
** ou augmenter légèrement le contexte&lt;br /&gt;
&lt;br /&gt;
=== Remarques ===&lt;br /&gt;
* Contrairement à Ollama, llama.cpp ne décharge pas automatiquement le modèle après inactivité lorsque le serveur reste lancé.&lt;br /&gt;
* Le meilleur réglage dépend du modèle utilisé, du niveau de quantization, du contexte choisi et de la quantité de VRAM disponible.&lt;br /&gt;
* 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.&lt;br /&gt;
&lt;br /&gt;
== Multi-GPU ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
L&#039;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&#039;obtenir un gain de vitesse parfaitement linéaire.&lt;br /&gt;
&lt;br /&gt;
=== Vérifier les GPU disponibles ===&lt;br /&gt;
&lt;br /&gt;
Vérifier que les cartes NVIDIA sont bien visibles :&lt;br /&gt;
&lt;br /&gt;
 # nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Avec llama.cpp compilé avec CUDA, les GPU disponibles sont normalement détectés au lancement.&lt;br /&gt;
&lt;br /&gt;
=== Options principales ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Option&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-ngl&amp;lt;/code&amp;gt; ou &amp;lt;code&amp;gt;--gpu-layers&amp;lt;/code&amp;gt;&lt;br /&gt;
| Nombre de couches du modèle à envoyer sur GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--split-mode&amp;lt;/code&amp;gt;&lt;br /&gt;
| Méthode de répartition du modèle entre plusieurs GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--tensor-split&amp;lt;/code&amp;gt;&lt;br /&gt;
| Répartition manuelle de la charge entre les GPU.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;--main-gpu&amp;lt;/code&amp;gt;&lt;br /&gt;
| GPU principal utilisé notamment pour certaines allocations et opérations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Split mode ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre `--split-mode` contrôle la façon dont llama.cpp répartit le modèle entre plusieurs GPU.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode&lt;br /&gt;
! Description&lt;br /&gt;
! Usage conseillé&lt;br /&gt;
|-&lt;br /&gt;
| `none`&lt;br /&gt;
| Pas de répartition multi-GPU.&lt;br /&gt;
| À utiliser si un seul GPU doit être utilisé.&lt;br /&gt;
|-&lt;br /&gt;
| `layer`&lt;br /&gt;
| Répartit les couches du modèle entre les GPU.&lt;br /&gt;
| Mode classique et généralement le plus simple.&lt;br /&gt;
|-&lt;br /&gt;
| `row`&lt;br /&gt;
| Répartit certains tenseurs entre les GPU.&lt;br /&gt;
| Plus spécifique, à tester selon le modèle et le matériel.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
En pratique, le mode `layer` est souvent le plus simple pour commencer.&lt;br /&gt;
&lt;br /&gt;
=== Exemple simple avec deux GPU ===&lt;br /&gt;
&lt;br /&gt;
Lancer un serveur llama.cpp en utilisant plusieurs GPU :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer&lt;br /&gt;
&lt;br /&gt;
Avec `-ngl 999`, llama.cpp tente de charger le maximum de couches possible sur les GPU.&lt;br /&gt;
&lt;br /&gt;
=== Répartition manuelle avec tensor-split ===&lt;br /&gt;
&lt;br /&gt;
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&#039;utiliser `--tensor-split`.&lt;br /&gt;
&lt;br /&gt;
Exemple avec deux GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Exemple avec un GPU de 24 Go et un GPU de 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
Les valeurs de `--tensor-split` sont des proportions. Il n&#039;est pas obligatoire d&#039;indiquer exactement la VRAM en Go, mais c&#039;est une méthode simple pour garder une répartition logique.&lt;br /&gt;
&lt;br /&gt;
Ainsi, ces deux exemples sont équivalents dans l&#039;idée :&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 24,12&lt;br /&gt;
&lt;br /&gt;
 # --tensor-split 2,1&lt;br /&gt;
&lt;br /&gt;
=== Choisir le GPU principal ===&lt;br /&gt;
&lt;br /&gt;
Le paramètre `--main-gpu` permet de choisir le GPU principal.&lt;br /&gt;
&lt;br /&gt;
Exemple avec le GPU 0 comme carte principale :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Si le GPU 0 est déjà utilisé par l&#039;affichage ou par un autre service, il peut être utile de choisir un autre GPU principal.&lt;br /&gt;
&lt;br /&gt;
=== Sélectionner les GPU visibles ===&lt;br /&gt;
&lt;br /&gt;
Pour limiter llama.cpp à certaines cartes NVIDIA, il est possible d&#039;utiliser `CUDA_VISIBLE_DEVICES`.&lt;br /&gt;
&lt;br /&gt;
Exemple pour n&#039;utiliser que les GPU 1 et 2 :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2 /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, les GPU visibles par llama.cpp seront renumérotés à partir de 0.&lt;br /&gt;
&lt;br /&gt;
Ainsi, avec :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=1,2&lt;br /&gt;
&lt;br /&gt;
le GPU physique 1 devient le GPU 0 pour llama.cpp, et le GPU physique 2 devient le GPU 1.&lt;br /&gt;
&lt;br /&gt;
=== Exemple avec trois GPU ===&lt;br /&gt;
&lt;br /&gt;
Exemple avec trois RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
Exemple avec une RTX 3090 24 Go et deux RTX 3060 12 Go :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 24,12,12 \&lt;br /&gt;
     --main-gpu 0&lt;br /&gt;
&lt;br /&gt;
=== Vérifier l&#039;utilisation mémoire ===&lt;br /&gt;
&lt;br /&gt;
Pendant le lancement et l&#039;inférence, surveiller la VRAM :&lt;br /&gt;
&lt;br /&gt;
 # watch -n 1 nvidia-smi&lt;br /&gt;
&lt;br /&gt;
Si une carte arrive en manque de mémoire, il faut réduire la charge :&lt;br /&gt;
&lt;br /&gt;
* diminuer `-c` ;&lt;br /&gt;
* diminuer `-b` ;&lt;br /&gt;
* diminuer `-ub` ;&lt;br /&gt;
* ajuster `--tensor-split` ;&lt;br /&gt;
* réduire `-ngl` ;&lt;br /&gt;
* utiliser un quant plus léger.&lt;br /&gt;
&lt;br /&gt;
=== Performances attendues ===&lt;br /&gt;
&lt;br /&gt;
Le multi-GPU dans llama.cpp ne donne pas toujours une accélération proportionnelle au nombre de GPU.&lt;br /&gt;
&lt;br /&gt;
En pratique :&lt;br /&gt;
&lt;br /&gt;
* 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 ;&lt;br /&gt;
* si le modèle ne tient pas sur un seul GPU, le multi-GPU peut permettre d&#039;éviter l&#039;offload CPU, ce qui améliore fortement les performances ;&lt;br /&gt;
* les performances dépendent beaucoup du PCIe, du modèle, du quant, du contexte et du mode de split ;&lt;br /&gt;
* deux GPU identiques sont plus simples à exploiter que deux GPU très différents.&lt;br /&gt;
&lt;br /&gt;
=== Résumé pratique ===&lt;br /&gt;
&lt;br /&gt;
Pour commencer avec deux GPU identiques :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12 \&lt;br /&gt;
     -c 4096 \&lt;br /&gt;
     -fa&lt;br /&gt;
&lt;br /&gt;
Pour un usage personnel, il est conseillé de garder :&lt;br /&gt;
&lt;br /&gt;
 # -np 1&lt;br /&gt;
&lt;br /&gt;
afin d&#039;éviter une consommation mémoire inutilement élevée.&lt;br /&gt;
&lt;br /&gt;
== Service systemd ==&lt;br /&gt;
&lt;br /&gt;
Création d&#039;un service pour automatiser le lancement du serveur llama.cpp, tout d&#039;abord créer un lien propre vers le modèle si nécessaire :&lt;br /&gt;
 # ln -s /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;models--HauhauCS--Qwen3.5-9B-Uncensored-HauhauCS-Aggressive/snapshots/1234567890abcdef1234567890abcdef12345678/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf&amp;lt;/font&amp;gt; /opt/llama.cpp/models/&amp;lt;font color = green&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créer le service :&lt;br /&gt;
 # vi /etc/systemd/system/llama-server.service&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=llama.cpp server&lt;br /&gt;
 After=network.target&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=simple&lt;br /&gt;
 User=root&lt;br /&gt;
 WorkingDirectory=/opt/llama.cpp&lt;br /&gt;
 ExecStart=/opt/llama.cpp/build/bin/llama-server -m /opt/llama.cpp/models/&amp;lt;font color = blue&amp;gt;qwen35-9b-uncensored-q4km.gguf&amp;lt;/font&amp;gt; -c &amp;lt;font color = green&amp;gt;2048&amp;lt;/font&amp;gt; -ngl &amp;lt;font color = green&amp;gt;999&amp;lt;/font&amp;gt; -fa &amp;lt;font color = green&amp;gt;on&amp;lt;/font&amp;gt; -b &amp;lt;font color = green&amp;gt;1024&amp;lt;/font&amp;gt; -ub &amp;lt;font color = green&amp;gt;512&amp;lt;/font&amp;gt; -np &amp;lt;font color = green&amp;gt;1&amp;lt;/font&amp;gt; --host &amp;lt;font color = green&amp;gt;0.0.0.0&amp;lt;/font&amp;gt; --port &amp;lt;font color = green&amp;gt;8080&amp;lt;/font&amp;gt;&lt;br /&gt;
 Restart=always&lt;br /&gt;
 RestartSec=5&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
 # systemctl daemon-reload&lt;br /&gt;
 # systemctl enable llama-server&lt;br /&gt;
 # systemctl start llama-server&lt;br /&gt;
== Proxy OpenClaw ==&lt;br /&gt;
[https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark Source]&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;utiliser un [https://github.com/ZengboJamesWang/Qwen3.5-35B-A3B-openclaw-dgx-spark/blob/master/proxy/llama-proxy.py proxy Python] afin de contourner certaines incompatibilités (rôles, outils, gestion du « thinking ») entre OpenClaw et llama.cpp.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
== Mise à jour ==&lt;br /&gt;
&lt;br /&gt;
Pour mettre à jour llama.cpp vers la dernière version disponible :&lt;br /&gt;
&lt;br /&gt;
 # cd /opt/llama.cpp&lt;br /&gt;
 # git pull&lt;br /&gt;
&lt;br /&gt;
Après une mise à jour, il est recommandé de supprimer l’ancien dossier de compilation puis de recompiler :&lt;br /&gt;
&lt;br /&gt;
 # rm -rf build&lt;br /&gt;
&lt;br /&gt;
Recompiler ensuite avec la même méthode que lors de l’installation initiale.&lt;br /&gt;
&lt;br /&gt;
=== Recompilation CPU uniquement ===&lt;br /&gt;
 # cmake -B build&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
=== Recompilation GPU NVIDIA CUDA ===&lt;br /&gt;
 # export CUDACXX=/usr/local/cuda-&amp;lt;font color=blue&amp;gt;13.2&amp;lt;/font&amp;gt;/bin/nvcc&lt;br /&gt;
 # cmake -B build -DGGML_CUDA=ON&lt;br /&gt;
 # cmake --build build -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
== Llama bench ==&lt;br /&gt;
* Commande de base :&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench&lt;br /&gt;
=== Exemple de test de stabilité avec MoE ===&lt;br /&gt;
On récupère la commande réellement exécutée par llama (le service doit être actif) : &lt;br /&gt;
 # tr &#039;\0&#039; &#039; &#039; &amp;lt; /proc/$(pidof llama-server)/cmdline&lt;br /&gt;
Résultat :&lt;br /&gt;
 /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 &amp;lt;font color = red&amp;gt;131072&amp;lt;/font&amp;gt; --cache-ram 2048 -np 1 --kv-unified -fa on --no-mmproj-offload --no-mmap &amp;lt;font color = red&amp;gt;-ncmoe&amp;lt;/font&amp;gt; 35 -ctk q8_0 -ctv q8_0 --reasoning on --jinja --chat-template-kwargs {&amp;quot;preserve_thinking&amp;quot;: true} --reasoning-budget 8096 --reasoning-budget-message D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;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&lt;br /&gt;
On peut entre autre voir les deux valeurs en rouge, à savoir la taille du context : 131072 et le nombre d&#039;experts automatiquement déchargé en RAM : 35, on commence par arrêter le service :&lt;br /&gt;
 # systemctl stop llama-server&lt;br /&gt;
Puis on lance le test :&lt;br /&gt;
  # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
   -m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot; \&lt;br /&gt;
   -ngl 999 \&lt;br /&gt;
   -t 8 \&lt;br /&gt;
   -b 4096 \&lt;br /&gt;
   -ub 4096 \&lt;br /&gt;
   -fa 1 \&lt;br /&gt;
   -mmp 0 \&lt;br /&gt;
   -ncmoe &amp;lt;font color = red&amp;gt;35&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -ctk q8_0 \&lt;br /&gt;
   -ctv q8_0 \&lt;br /&gt;
   -p 1000 \&lt;br /&gt;
   -n 128 \&lt;br /&gt;
   -d 0,16000,32000,64000,96000,&amp;lt;font color = red&amp;gt;120000&amp;lt;/font&amp;gt; \&lt;br /&gt;
   -r 3&lt;br /&gt;
Le dernier test utilisera environ :&lt;br /&gt;
&lt;br /&gt;
 120000 + 1000 + 128 = 121128 tokens&lt;br /&gt;
&lt;br /&gt;
Cela reste proche de la limite configurée de 131072 tokens, avec une marge d&#039;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.&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information commande de test :&lt;br /&gt;
* &amp;lt;code&amp;gt;/opt/llama.cpp/build/bin/llama-bench&amp;lt;/code&amp;gt; : lance l’outil de benchmark de &amp;lt;code&amp;gt;llama.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-m &amp;quot;/opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf&amp;quot;&amp;lt;/code&amp;gt; : indique le modèle GGUF à tester.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ngl 999&amp;lt;/code&amp;gt; : demande à envoyer un maximum de couches sur le GPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-t 8&amp;lt;/code&amp;gt; : utilise 8 threads CPU.&lt;br /&gt;
* &amp;lt;code&amp;gt;-b 4096&amp;lt;/code&amp;gt; : définit la taille de batch utilisée pour le traitement du prompt.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ub 4096&amp;lt;/code&amp;gt; : définit la taille du micro-batch, pour limiter la consommation mémoire.&lt;br /&gt;
* &amp;lt;code&amp;gt;-fa 1&amp;lt;/code&amp;gt; : active Flash Attention.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ncmoe 35&amp;lt;/code&amp;gt; : valeurs de &amp;lt;code&amp;gt;--n-cpu-moe&amp;lt;/code&amp;gt; ( pour tester plusieurs valeurs, exemple : &amp;lt;code&amp;gt;-ncmoe 24,26,28,31&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctk q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les clés (&amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Key&amp;lt;/i&amp;gt;). Ici, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; réduit la mémoire nécessaire par rapport au cache par défaut en &amp;lt;code&amp;gt;f16&amp;lt;/code&amp;gt;, tout en restant relativement conservateur sur la qualité.&lt;br /&gt;
* &amp;lt;code&amp;gt;-ctv q8_0&amp;lt;/code&amp;gt; : définit le type de quantification du cache KV pour les valeurs (&amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt;, pour &amp;lt;i&amp;gt;Value&amp;lt;/i&amp;gt;). Comme pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; permet de réduire fortement la consommation mémoire du contexte, ce qui aide à atteindre de grands contextes comme 64k ou 128k.&lt;br /&gt;
* &amp;lt;code&amp;gt;-p 1000&amp;lt;/code&amp;gt; : utilise un prompt de test de 1000 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;pp1000&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-n 128&amp;lt;/code&amp;gt; : génère 128 tokens. Dans les résultats, cela correspond à &amp;lt;code&amp;gt;tg128&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;-d 0,16000,32000,64000,96000,120000&amp;lt;/code&amp;gt; : teste plusieurs profondeurs de contexte, de 0 à 32000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;-r 3&amp;lt;/code&amp;gt; : répète chaque test 3 fois afin d’obtenir une mesure plus stable.&lt;br /&gt;
}}&lt;br /&gt;
-----&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = loupe&lt;br /&gt;
  | texte = Information tableau des résultats :&lt;br /&gt;
* &amp;lt;code&amp;gt;pp&amp;lt;/code&amp;gt; : vitesse de traitement du prompt, importante quand le contexte est long.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg&amp;lt;/code&amp;gt; : vitesse de génération des nouveaux tokens, généralement la valeur la plus importante pour la fluidité de réponse.&lt;br /&gt;
* &amp;lt;code&amp;gt;d0&amp;lt;/code&amp;gt; : contexte vide, équivalent à un nouveau chat.&lt;br /&gt;
* &amp;lt;code&amp;gt;d16000&amp;lt;/code&amp;gt; : contexte déjà chargé, proche d’un usage agent ou assistant avec historique important.&lt;br /&gt;
* &amp;lt;code&amp;gt;pp1000 @ d16000&amp;lt;/code&amp;gt; : traitement d’un prompt de 1000 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
* &amp;lt;code&amp;gt;tg128 @ d16000&amp;lt;/code&amp;gt; : génération de 128 tokens avec 16000 tokens déjà présents dans le contexte.&lt;br /&gt;
}}&lt;br /&gt;
=== Benchmark multi-GPU ===&lt;br /&gt;
&lt;br /&gt;
Tester les performances avec `llama-bench` :&lt;br /&gt;
&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Comparer avec un seul GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999&lt;br /&gt;
&lt;br /&gt;
Puis avec deux GPU :&lt;br /&gt;
&lt;br /&gt;
 # CUDA_VISIBLE_DEVICES=0,1 /opt/llama.cpp/build/bin/llama-bench \&lt;br /&gt;
     -m /models/modele.gguf \&lt;br /&gt;
     -ngl 999 \&lt;br /&gt;
     --split-mode layer \&lt;br /&gt;
     --tensor-split 12,12&lt;br /&gt;
&lt;br /&gt;
Les résultats à comparer sont principalement :&lt;br /&gt;
&lt;br /&gt;
 pp : prompt processing&lt;br /&gt;
 tg : token generation&lt;br /&gt;
&lt;br /&gt;
== Exemple de configuration d’un modèle MoE avec déchargement des experts en RAM ==&lt;br /&gt;
Machine de test :&lt;br /&gt;
* LXC Debian 13&lt;br /&gt;
* 8 vCPU (E5-2667 v2)&lt;br /&gt;
* RTX 3060 12GB (PCIe 3.0 x8)&lt;br /&gt;
* DDR3-1866&lt;br /&gt;
** À 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.&lt;br /&gt;
** 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.&lt;br /&gt;
=== Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL ===&lt;br /&gt;
 # /opt/llama.cpp/build/bin/llama-cli -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q5_K_XL&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-UD-Q5_K_XL.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Méta bandeau&lt;br /&gt;
  | niveau = information&lt;br /&gt;
  | icône = information&lt;br /&gt;
  | texte  =&lt;br /&gt;
* --mmproj : Charge le fichier projecteur multimodal. Il est utilisé pour les modèles capables de traiter des images ou d’autres entrées multimodales.&lt;br /&gt;
&lt;br /&gt;
* -ngl : Nombre de couches à offloader sur le GPU. Une valeur très élevée comme &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; revient en pratique à dire « mets sur le GPU tout ce qui peut y être placé ».&lt;br /&gt;
&lt;br /&gt;
* -t : Nombre de threads CPU utilisés pour l’inférence principale.&lt;br /&gt;
&lt;br /&gt;
* -tb : Nombre de threads CPU utilisés pour le traitement par batch. Cela peut améliorer le débit de préremplissage du contexte.&lt;br /&gt;
&lt;br /&gt;
* -b : Taille du batch logique. Plus elle est élevée, plus le traitement du prompt peut être rapide, mais cela augmente aussi les besoins en mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ub : Taille du micro-batch. C’est une sous-division du batch principal, utile pour ajuster plus finement l’équilibre entre débit et mémoire.&lt;br /&gt;
&lt;br /&gt;
* -c : Taille du contexte actif utilisée par le serveur. Elle détermine combien de tokens peuvent être conservés en mémoire dans la fenêtre de contexte.&lt;br /&gt;
&lt;br /&gt;
* --cache-ram : Taille maximale du cache en RAM, exprimée en MiB. Ce cache permet de conserver des états utiles pour éviter de tout recalculer inutilement.&lt;br /&gt;
&lt;br /&gt;
* -np : Nombre de slots serveur. Avec &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, une seule requête est traitée activement à la fois.&lt;br /&gt;
&lt;br /&gt;
* --kv-unified : Utilise un buffer KV unifié partagé entre les séquences. Cela peut améliorer la gestion du cache dans certains scénarios serveur.&lt;br /&gt;
&lt;br /&gt;
* -fa : Active Flash Attention, ce qui améliore généralement les performances mémoire et la vitesse sur GPU compatibles.&lt;br /&gt;
&lt;br /&gt;
* --no-mmproj-offload : Empêche l’offload du projecteur multimodal sur le GPU. Le &amp;lt;code&amp;gt;mmproj&amp;lt;/code&amp;gt; reste alors côté CPU/RAM.&lt;br /&gt;
&lt;br /&gt;
* --no-mmap : Désactive le memory mapping du fichier modèle. Le modèle est alors chargé plus directement en mémoire, ce qui peut parfois être préférable selon le stockage ou le comportement recherché.&lt;br /&gt;
&lt;br /&gt;
* -ncmoe : Définit combien d’experts MoE sont forcés côté CPU/RAM. C’est un réglage particulièrement utile pour les modèles Mixture-of-Experts sur des GPU limités en VRAM.&lt;br /&gt;
&lt;br /&gt;
* -ctk : Type de quantification du cache KV pour les clés. Ici &amp;lt;code&amp;gt;q8_0&amp;lt;/code&amp;gt; privilégie une bonne qualité tout en réduisant la pression mémoire.&lt;br /&gt;
&lt;br /&gt;
* -ctv : Type de quantification du cache KV pour les valeurs. Même logique que pour &amp;lt;code&amp;gt;-ctk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* --reasoning : Active le mode de raisonnement pris en charge par le serveur pour les modèles/templates compatibles.&lt;br /&gt;
&lt;br /&gt;
* --jinja : Active l’utilisation des chat templates Jinja, afin de formater correctement les messages pour les modèles qui en ont besoin.&lt;br /&gt;
&lt;br /&gt;
* --chat-template-kwargs : Passe des paramètres supplémentaires au template de chat. Ici, &amp;lt;code&amp;gt;{&amp;quot;preserve_thinking&amp;quot;: true}&amp;lt;/code&amp;gt; demande au template de préserver la partie de raisonnement lorsqu’elle est supportée.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget : Définit le budget maximal de tokens alloués au raisonnement interne.&lt;br /&gt;
&lt;br /&gt;
* --reasoning-budget-message : Message injecté lorsque le budget de raisonnement est atteint, afin d’inciter le modèle à conclure et passer à la réponse utile.&lt;br /&gt;
&lt;br /&gt;
* --temp : Température d’échantillonnage. Plus elle est basse, plus la réponse est déterministe.&lt;br /&gt;
&lt;br /&gt;
* --top-k : Limite l’échantillonnage aux &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; tokens les plus probables.&lt;br /&gt;
&lt;br /&gt;
* --top-p : Active un échantillonnage nucleus en conservant uniquement la masse de probabilité cumulée visée.&lt;br /&gt;
&lt;br /&gt;
* --min-p : Écarte les tokens dont la probabilité est trop faible.&lt;br /&gt;
&lt;br /&gt;
* --presence-penalty : Pénalité de présence. Elle pousse le modèle à introduire de nouveaux tokens ou idées plutôt que de répéter ce qui a déjà été dit.&lt;br /&gt;
&lt;br /&gt;
* --repeat-penalty : Pénalité de répétition. Elle réduit la probabilité de répéter les mêmes tokens.&lt;br /&gt;
&lt;br /&gt;
* --swa-full : Active le mode SWA complet lorsqu’il est pris en charge par le modèle ou le backend.&lt;br /&gt;
&lt;br /&gt;
* --cache-reuse : Définit un seuil de réutilisation du cache. Cela peut améliorer les performances sur des requêtes proches ou répétées.&lt;br /&gt;
}}&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4972.80 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 20377.31 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
Je veux une réponse qui distingue clairement :&lt;br /&gt;
&lt;br /&gt;
vitesse brute ;&lt;br /&gt;
latence initiale ;&lt;br /&gt;
fluidité perçue ;&lt;br /&gt;
fiabilité ;&lt;br /&gt;
confort à long terme.&lt;br /&gt;
&lt;br /&gt;
Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vitesse : (apres plusieurs essais mais a confirmer..)&lt;br /&gt;
 prompt eval time =    5194.60 ms /  2896 tokens (    1.79 ms per token,   557.50 tokens per second)&lt;br /&gt;
 eval time =   16383.19 ms /   284 tokens (   57.69 ms per token,    &#039;&#039;&#039;17.33 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   21577.79 ms /  3180 tokens&lt;br /&gt;
&lt;br /&gt;
=== Qwen3.6-35B-A3B-APEX-I-Balanced ===&lt;br /&gt;
 # /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&lt;br /&gt;
 # 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&lt;br /&gt;
 # 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&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ExecStart=/opt/llama.cpp/build/bin/llama-server \&lt;br /&gt;
  -m /opt/llama.cpp/models/Qwen3.6-35B-A3B-APEX-I-Balanced.gguf \&lt;br /&gt;
  --mmproj /opt/llama.cpp/models/mmproj-F16.gguf \&lt;br /&gt;
  -ngl 999 \&lt;br /&gt;
  -t 8 \&lt;br /&gt;
  -tb 16 \&lt;br /&gt;
  -b 4096 \&lt;br /&gt;
  -ub 4096 \&lt;br /&gt;
  -c 131072 \&lt;br /&gt;
  --cache-ram 2048 \&lt;br /&gt;
  -np 1 \&lt;br /&gt;
  --kv-unified \&lt;br /&gt;
  -fa on \&lt;br /&gt;
  --no-mmproj-offload \&lt;br /&gt;
  --no-mmap \&lt;br /&gt;
  -ncmoe 35 \&lt;br /&gt;
  -ctk q8_0 \&lt;br /&gt;
  -ctv q8_0 \&lt;br /&gt;
  --reasoning on \&lt;br /&gt;
  --jinja \&lt;br /&gt;
  --chat-template-kwargs &#039;{&amp;quot;preserve_thinking&amp;quot;: true}&#039; \&lt;br /&gt;
  --reasoning-budget 8096 \&lt;br /&gt;
  --reasoning-budget-message &amp;quot;D&#039;accord, assez réfléchi, plus d&#039;attente. Passons à l&#039;action.&amp;quot; \&lt;br /&gt;
  --temp 0.6 \&lt;br /&gt;
  --top-k 20 \&lt;br /&gt;
  --top-p 0.95 \&lt;br /&gt;
  --min-p 0.0 \&lt;br /&gt;
  --presence-penalty 0.0 \&lt;br /&gt;
  --repeat-penalty 1.0 \&lt;br /&gt;
  --swa-full \&lt;br /&gt;
  --cache-reuse 512 \&lt;br /&gt;
  --host 192.168.1.123 \&lt;br /&gt;
  --port 8080&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Test :&lt;br /&gt;
 # journalctl -u llama-server -n 200 --no-pager | grep -E &amp;quot;offloaded|model buffer|KV buffer|compute buffer|n_ctx|n_batch|n_ubatch&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 print_info: n_ctx_train           = 262144&lt;br /&gt;
 print_info: n_ctx_orig_yarn       = 262144&lt;br /&gt;
 load_tensors: offloaded 41/41 layers to GPU&lt;br /&gt;
 load_tensors:          CPU model buffer size =   333.44 MiB&lt;br /&gt;
 load_tensors:        CUDA0 model buffer size =  4763.95 MiB&lt;br /&gt;
 load_tensors:    CUDA_Host model buffer size = 19330.00 MiB&lt;br /&gt;
 llama_context: n_ctx         = 131072&lt;br /&gt;
 llama_context: n_ctx_seq     = 131072&lt;br /&gt;
 llama_context: n_batch       = 4096&lt;br /&gt;
 llama_context: n_ubatch      = 4096&lt;br /&gt;
 llama_context: n_ctx_seq (131072) &amp;lt; n_ctx_train (262144) -- the full capacity of the model will not be utilized&lt;br /&gt;
 llama_kv_cache:      CUDA0 KV buffer size =  1360.00 MiB&lt;br /&gt;
 sched_reserve:      CUDA0 compute buffer size =  3976.02 MiB&lt;br /&gt;
 sched_reserve:  CUDA_Host compute buffer size =  2112.42 MiB&lt;br /&gt;
 alloc_compute_meta:        CPU compute buffer size =   248.10 MiB&lt;br /&gt;
 slot   load_model: id  0 | task -1 | new slot, n_ctx = 131072&lt;br /&gt;
-----&lt;br /&gt;
 Explique pourquoi un système peut sembler rapide en usage normal, mais devenir frustrant dans un workflow réel.&lt;br /&gt;
 Je veux une réponse qui distingue clairement :&lt;br /&gt;
 &lt;br /&gt;
 vitesse brute ;&lt;br /&gt;
 latence initiale ;&lt;br /&gt;
 fluidité perçue ;&lt;br /&gt;
 fiabilité ;&lt;br /&gt;
 confort à long terme.&lt;br /&gt;
 &lt;br /&gt;
 Termine par une conclusion pratique en 5 lignes maximum.&lt;br /&gt;
Premier essai :&lt;br /&gt;
 prompt eval time =    5805.15 ms /  3969 tokens (    1.46 ms per token,   683.70 tokens per second)&lt;br /&gt;
 eval time =   12018.11 ms /   210 tokens (   57.23 ms per token,    &#039;&#039;&#039;17.47 tokens per second&#039;&#039;&#039;)&lt;br /&gt;
 total time =   17823.27 ms /  4179 tokens&lt;br /&gt;
Deuxième essai :&lt;br /&gt;
 prompt eval time =    5803.15 ms /  3969 tokens (    1.46 ms per token,   683.94 tokens per second)&lt;br /&gt;
 eval time =    9580.92 ms /   209 tokens (   45.84 ms per token,    &#039;&#039;&#039;21.81 tokens&#039;&#039;&#039; per second)&lt;br /&gt;
 total time =   15384.07 ms /  4178 tokens&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>