<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Intelligence Artificielle (IA) &#8211; tazmenworld</title>
	<atom:link href="https://tazmenworld.com/category/ia-machine-learning-innovations-et-cas-dusage-it/feed/" rel="self" type="application/rss+xml" />
	<link>https://tazmenworld.com</link>
	<description>Mon site WordPress</description>
	<lastBuildDate>Sun, 14 Jun 2026 07:59:48 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>Comment remplacer ElevenLabs par XTTS en local et cloner sa propre voix</title>
		<link>https://tazmenworld.com/2026/06/14/comment-remplacer-elevenlabs-par-xtts-en-local-et-cloner-sa-propre-voix/</link>
					<comments>https://tazmenworld.com/2026/06/14/comment-remplacer-elevenlabs-par-xtts-en-local-et-cloner-sa-propre-voix/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Sun, 14 Jun 2026 07:59:48 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=331</guid>

					<description><![CDATA[Soyons clairs dès le départ : je n&#8217;utilise pas ElevenLabs au quotidien. La qualité est au sommet du marché, le clonage de voix est bluffant, et le multilingue tient parfaitement le français. Difficile de faire mieux côté rendu. Mais pour mon usage, l&#8217;abonnement est tout simplement trop cher au regard de ce que j&#8217;en ferais [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="576"  alt="" class="wp-image-340"/ loading="eager" fetchpriority="high" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/xtts-1024x576.jpeg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/xtts-1024x576.jpeg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts-300x169.jpeg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts-768x432.jpeg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts-1536x864.jpeg 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/xtts.jpeg 1672w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Soyons clairs dès le départ : je n&rsquo;utilise pas ElevenLabs au quotidien. La qualité est au sommet du marché, le clonage de voix est bluffant, et le multilingue tient parfaitement le français. Difficile de faire mieux côté rendu. Mais pour mon usage, l&rsquo;abonnement est tout simplement trop cher au regard de ce que j&rsquo;en ferais réellement.</p>



<p class="wp-block-paragraph">Le souci, c&rsquo;est qu&rsquo;il m&rsquo;arrive ponctuellement d&rsquo;en avoir besoin. Une voix off propre pour une vidéo, un test de clonage, une narration pour un article. Et là, deux choses bloquent. La première, c&rsquo;est le modèle économique. ElevenLabs fonctionne par abonnement avec un plafond de crédits, et le clonage de voix professionnel, celui qui donne le meilleur résultat, démarre à 22 dollars par mois sur le plan Creator. Le plan gratuit, lui, interdit tout usage commercial et impose une mention ElevenLabs dans tes productions, ce qui le rend inutilisable pour de la monétisation YouTube. Payer un abonnement mensuel pour un besoin occasionnel, ça n&rsquo;a aucun sens.</p>



<p class="wp-block-paragraph">La deuxième, c&rsquo;est la confidentialité. Pour cloner ma propre voix, je dois envoyer un échantillon de ma voix sur les serveurs d&rsquo;une société américaine. Or ta voix, c&rsquo;est une donnée biométrique. <strong>C&rsquo;est ce qu&rsquo;il y a de plus personnel, au même titre qu&rsquo;une empreinte digitale.</strong></p>



<p class="wp-block-paragraph">Alors j&rsquo;ai fait ce que je fais à chaque fois : j&rsquo;ai décidé de rapatrier la capacité sur ma propre machine. L&rsquo;objectif est simple. Avoir à disposition, à tout moment, une synthèse vocale française avec clonage de voix de qualité, sans abonnement, sans plafond, et sans que ma voix ne quitte mon réseau local. Je te préviens tout de suite : sur une carte Blackwell comme la RTX 5070 Ti, l&rsquo;installation par défaut plante. Et le contournement n&rsquo;est documenté nulle part en français. Voici donc le parcours complet, pièges compris.</p>



<h2 class="wp-block-heading">I. La quête de la souveraineté vocale</h2>



<p class="wp-block-paragraph">Pourquoi se compliquer la vie quand un service à 22 dollars par mois fait le travail ? La réponse tient en deux mots : maîtrise et confidentialité. En produisant mes voix sur ma propre station, je ne dépends plus d&rsquo;un quota de crédits, d&rsquo;une connexion internet ou d&rsquo;une politique de conservation que je ne contrôle pas. Et mon échantillon vocal reste chez moi, sur mon disque.</p>



<p class="wp-block-paragraph">Le moteur de tout ça, c&rsquo;est XTTS, le modèle de synthèse vocale de Coqui. Il fait du clonage de voix zero-shot multilingue, français inclus. Tu lui donnes 10 à 30 secondes d&rsquo;un échantillon, il génère ensuite n&rsquo;importe quel texte avec cette voix. Pour le piloter, j&rsquo;utilise AllTalk, un serveur qui enrobe XTTS avec une API compatible OpenAI, une interface web, et la gestion de plusieurs moteurs. C&rsquo;est le projet d&rsquo;<a href="https://github.com/erew123/alltalk_tts">erew123</a> sur GitHub.</p>



<p class="wp-block-paragraph">Ma configuration repose sur le matériel de ma <strong>Tazmen Station</strong> : un processeur <strong>AMD Ryzen 9 9900X</strong> épaulé par une carte <strong>NVIDIA GeForce RTX 5070 Ti</strong> avec <strong>16 Go de VRAM</strong>. Bonne nouvelle, XTTS en inférence ne mobilise qu&rsquo;environ <strong>4 Go de VRAM</strong>. Tu as donc largement la place de le faire cohabiter avec un modèle de langage ou de la génération d&rsquo;images sur la même carte.</p>



<p class="wp-block-paragraph">Le hic, c&rsquo;est que la 5070 Ti est une carte Blackwell. Et c&rsquo;est exactement là que l&rsquo;aventure commence.</p>



<h2 class="wp-block-heading">II. Le piège Blackwell</h2>



<p class="wp-block-paragraph">C&rsquo;est le point qui fait abandonner la moitié des gens, alors autant l&rsquo;attaquer en premier.</p>



<p class="wp-block-paragraph">L&rsquo;installation d&rsquo;AllTalk pose du <strong>PyTorch</strong> compilé pour <strong>CUDA 12.1</strong>. Ce build connaît les architectures GPU jusqu&rsquo;à sm_90, c&rsquo;est-à-dire la génération Hopper. Il ne connaît pas le sm_120 de Blackwell. Résultat concret : au premier chargement du modèle sur le GPU, c&rsquo;est le crash immédiat.</p>



<p class="wp-block-paragraph">Le contournement consiste à remplacer PyTorch par une version <strong>CUDA 12.8</strong>, qui elle gère Blackwell. En pratique, <strong>torch 2.7.0</strong> avec <strong>torchvision</strong> et <strong>torchaudio</strong> alignés sur la même version et le même canal cu128.</p>



<p class="wp-block-paragraph">Attention au piège dans le piège. Si tu installes torch et torchaudio sans verrouiller les versions, pip te choisit un torchaudio incompatible et tu te manges une erreur de symbole au démarrage du type <code>undefined symbol: torch_library_impl</code>. Il faut imposer les trois versions ensemble, dans l&rsquo;environnement Python d&rsquo;AllTalk, une fois l&rsquo;installation de base terminée :</p>



<p class="wp-block-paragraph">[CODE : fix_blackwell_cu128.sh]</p>



<pre class="wp-block-code"><code>pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu128</code></pre>



<p class="wp-block-paragraph">La vérification immédiate, et celle qui doit devenir un réflexe, c&rsquo;est de confirmer que le GPU est bien vu :</p>



<p class="wp-block-paragraph">[CODE : verif_gpu.sh]</p>



<pre class="wp-block-code"><code>python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"</code></pre>



<p class="wp-block-paragraph">Tu dois obtenir <code>2.7.0+cu128</code>, <code>True</code>, et le nom de ta carte. Si tu as ça, le sm_120 est géré et le plus dur est derrière toi.</p>



<figure class="wp-block-image size-large"><img width="1024" height="170"  alt="" class="wp-image-339"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-13-1024x170.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-13-1024x170.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-13-300x50.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-13-768x127.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-13.png 1165w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">III. L&rsquo;installation : attention à la branche</h2>



<p class="wp-block-paragraph">Première erreur que j&rsquo;ai commise, et que tu vas éviter. Le <code>git clone</code> standard tire la branche <code>master</code>, qui correspond à AllTalk <strong>V1</strong>. La V1 n&rsquo;a pas d&rsquo;interface graphique complète, pas de RVC, et son API renvoie les URLs dans un format différent qui casse l&rsquo;intégration avec certains outils. J&rsquo;ai perdu un bon moment dessus avant de comprendre.</p>



<p class="wp-block-paragraph">La version que tu veux, la <strong>V2</strong>, vit sur la branche <code>alltalkbeta</code>. La nuance n&rsquo;est écrite nulle part de façon évidente, alors note la bien :</p>



<p class="wp-block-paragraph">[CODE : install_alltalk_v2.sh]</p>



<pre class="wp-block-code"><code>git clone -b alltalkbeta https://github.com/erew123/alltalk_tts
cd alltalk_tts
chmod +x atsetup.sh
./atsetup.sh</code></pre>



<p class="wp-block-paragraph">Tu choisis l&rsquo;option <strong>Standalone Application</strong>, puis l&rsquo;installation de base. Le script crée un environnement Python isolé et tire toutes les dépendances. C&rsquo;est long, laisse mouliner.</p>



<figure class="wp-block-image size-full"><img width="968" height="701"  alt="" class="wp-image-332"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51.png 968w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51-300x217.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-12-11-06-51-768x556.png 768w" sizes="auto, (max-width: 968px) 100vw, 968px" /></figure>



<p class="wp-block-paragraph">Deux avertissements qui m&rsquo;ont coûté du temps. Au premier lancement, un compte à rebours de 60 secondes télécharge un modèle <strong>Piper</strong> par défaut. Si tu ne fais rien, tu te retrouves avec Piper, qui est un moteur correct mais sans clonage de voix. Choisis bien le moteur <strong>xtts</strong> dans le menu de démarrage. Et surtout, <strong>ne lance jamais AllTalk en root</strong>, sinon ton environnement Python se retrouve avec des fichiers root-owned et tu galères ensuite à chaque commande.</p>



<h2 class="wp-block-heading">IV. Les correctifs de dépendances</h2>



<p class="wp-block-paragraph">Le remplacement de PyTorch chamboule l&rsquo;arbre des dépendances. Trois ajustements à faire, et un bug propre à la branche beta à corriger.</p>



<p class="wp-block-paragraph">Premier point, <strong>setuptools</strong>. La réinstallation de torch monte setuptools en version récente, qui a supprimé le module <code>pkg_resources</code>. Sauf que la version de <strong>librosa</strong> embarquée par XTTS en a encore besoin. Sans ça, crash au démarrage avec <code>ModuleNotFoundError: No module named 'pkg_resources'</code>. Le correctif tient en une ligne :</p>



<p class="wp-block-paragraph">[CODE : fix_setuptools.sh]</p>



<pre class="wp-block-code"><code>pip install "setuptools&lt;81"</code></pre>



<p class="wp-block-paragraph">Deuxième point, les <strong>dépendances système</strong>. Le log d&rsquo;AllTalk te signale trois manques. Le plus important, c&rsquo;est <strong>espeak-ng</strong> : XTTS s&rsquo;en sert pour la phonémisation, ce n&rsquo;est pas optionnel. Les deux autres relèvent du confort, <strong>ffmpeg</strong> pour le transcodage des sorties audio et <strong>libaio</strong> pour faire taire un avertissement :</p>



<p class="wp-block-paragraph">[CODE : fix_deps_systeme.sh]</p>



<pre class="wp-block-code"><code>sudo apt install espeak-ng ffmpeg libaio-dev</code></pre>



<p class="wp-block-paragraph">Troisième point, un <strong>bug propre à la V2 beta</strong>. Quand tu changes de moteur depuis l&rsquo;interface, le code tente un appel chaîné <code>change_engine(...).save()</code> qui plante avec une <code>AttributeError</code>, parce que la méthode ne renvoie pas l&rsquo;objet attendu. On sépare proprement les deux appels :</p>



<p class="wp-block-paragraph">[CODE : patch_change_engine.sh]</p>



<pre class="wp-block-code"><code>sed -i 's/tts_engines_config.change_engine(requested_engine).save()/tts_engines_config.change_engine(requested_engine)\n        tts_engines_config.save()/' ~/alltalk_tts/tts_server.py</code></pre>



<p class="wp-block-paragraph">Une note de dépannage utile. Sur la V1, j&rsquo;avais aussi dû patcher le chargement des modèles à cause du passage de PyTorch 2.6 en <code>weights_only=True</code> par défaut, qui refuse les classes personnalisées de Coqui. Sur la V2, le fork de coqui-tts gère déjà ce cas et le modèle charge sans rien toucher. Si jamais tu vois une <code>UnpicklingError</code> au chargement, c&rsquo;est ce point précis qu&rsquo;il faut corriger.</p>



<h2 class="wp-block-heading">V. Le modèle XTTS et le basculement de moteur</h2>



<p class="wp-block-paragraph">Si le moteur xtts est sélectionné mais que le modèle n&rsquo;a jamais été téléchargé, AllTalk cherche le dossier <code>models/xtts/</code> et ne trouve rien. Tu télécharges le modèle, soit depuis l&rsquo;onglet <strong>TTS Engines Settings</strong> de l&rsquo;interface, soit en ligne de commande depuis le dépôt officiel sur Hugging Face :</p>



<p class="wp-block-paragraph">[CODE : telecharger_modele_xtts.sh]</p>



<pre class="wp-block-code"><code>mkdir -p ~/alltalk_tts/models/xtts/xttsv2_2.0.3
cd ~/alltalk_tts/models/xtts/xttsv2_2.0.3
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/model.pth
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/config.json
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/vocab.json
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/speakers_xtts.pth
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/dvae.pth
wget https://huggingface.co/coqui/XTTS-v2/resolve/main/mel_stats.pth</code></pre>



<p class="wp-block-paragraph">Compte environ 2 Go au total, le fichier <code>model.pth</code> faisant à lui seul près de 1,8 Go. Ensuite, dans l&rsquo;interface, onglet <strong>Generate TTS</strong>, tu passes <strong>Available Engines</strong> sur <strong>xtts</strong> puis tu cliques <strong>Change Model</strong>.</p>



<p class="wp-block-paragraph">L&rsquo;interface web d&rsquo;AllTalk est accessible sur le port 7852, et l&rsquo;API sur le port 7851. C&rsquo;est cette API compatible OpenAI qui te permettra ensuite de brancher XTTS sur tes propres scripts ou sur n8n.</p>



<p class="wp-block-paragraph">Côté performance, sur ma <strong>RTX 5070 Ti</strong>, le modèle charge en 5 à 6 secondes. Et la génération tape entre <strong>0,2 et 0,5 seconde pour une phrase courte</strong>. C&rsquo;est largement sous le temps réel, et franchement comparable à ce que je constatais sur ElevenLabs, sans la latence réseau.</p>



<figure class="wp-block-image size-large"><img width="1024" height="487"  alt="" class="wp-image-341"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-14-1024x487.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-14-1024x487.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-14-300x143.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-14-768x365.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-14.png 1411w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">VI. Cloner sa voix : tout se joue sur l&rsquo;échantillon</h2>



<p class="wp-block-paragraph">C&rsquo;est le coeur du sujet, et c&rsquo;est aussi là que tout le monde se plante. <strong>Le clonage XTTS est aussi bon que ton échantillon. Ni plus, ni moins.</strong> Un clone moyen vient presque toujours d&rsquo;un sample bâclé, pas du modèle.</p>



<p class="wp-block-paragraph">Les règles à respecter pour un bon échantillon :</p>



<ol class="wp-block-list">
<li>Format <strong>mono</strong>, <strong>22050 Hz</strong>, <strong>16 bits</strong>.</li>



<li>Durée de <strong>10 à 30 secondes</strong>. Au-delà de 60 secondes, la qualité ne s&rsquo;améliore plus et l&rsquo;encodage ralentit.</li>



<li>Voix <strong>francophone</strong> si tu veux du français propre. Un locuteur anglophone clone un accent anglais sur ton texte français.</li>



<li><strong>Aucun bruit de fond</strong>, aucune respiration bruyante, aucun raclement de gorge, aucun silence en début ou en fin.</li>



<li><strong>Ton naturel et neutre</strong>. Si ton sample est joyeux ou agressif, le clone le sera aussi.</li>
</ol>



<p class="wp-block-paragraph">Une parenthèse cybersécurité qui devrait te faire réfléchir, parce que ce chiffre n&rsquo;est pas anodin. <strong>10 à 30 secondes de voix suffisent à produire un clone convaincant.</strong> C&rsquo;est exactement pour cette raison qu&rsquo;il ne faut jamais parler en premier quand tu reçois un appel suspect ou un numéro inconnu. Un simple « allô, oui, qui est à l&rsquo;appareil ? » peut donner à un escroc assez de matière pour cloner ta voix, et s&rsquo;en servir ensuite pour piéger un proche au téléphone, par exemple en simulant un appel de détresse. Le réflexe à prendre : laisse l&rsquo;interlocuteur se présenter d&rsquo;abord, et ne meuble pas le silence. La technologie qui te sert dans cet article peut tout aussi bien servir contre toi.</p>



<p class="wp-block-paragraph">Pour nettoyer un enregistrement, <strong>Audacity</strong> fait parfaitement le travail. Tu importes ton fichier, tu sélectionnes un passage de silence, puis Effect, Noise Reduction, Get Noise Profile, et tu appliques la réduction sur l&rsquo;ensemble. Tu coupes les respirations à la souris, tu normalises à -3 dB, et tu exportes en WAV mono 22050 Hz 16 bits.</p>



<p class="wp-block-paragraph">Si tu veux juste convertir un fichier existant au bon format, <strong>ffmpeg</strong> suffit :</p>



<p class="wp-block-paragraph">[CODE : convertir_sample.sh]</p>



<pre class="wp-block-code"><code>ffmpeg -i source.mp3 -ar 22050 -ac 1 -sample_fmt s16 ~/alltalk_tts/voices/mavoix.wav</code></pre>



<p class="wp-block-paragraph">Tu déposes le fichier dans le dossier <code>~/alltalk_tts/voices/</code>, tu cliques <strong>Refresh Settings</strong> dans l&rsquo;interface, et ta voix apparaît dans la liste. Sélectionne la, tape une phrase de test, et écoute le résultat.dans l&rsquo;interface, et votre voix apparaît dans la liste. Sélectionnez la, tapez une phrase de test, et écoutez le résultat.</p>



<figure class="wp-block-image size-large"><img width="1024" height="524"  alt="" class="wp-image-338"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-1024x524.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-1024x524.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-300x153.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-768x393.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1-1536x786.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-09-05-47-1.png 2004w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Voici le résultat 😀 </p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo.mp3"></audio></figure>



<h2 class="wp-block-heading">VII. Affiner le rendu</h2>



<p class="wp-block-paragraph">Si le clone n&rsquo;est pas à la hauteur malgré un bon échantillon, deux réglages dans l&rsquo;onglet <strong>Generate TTS</strong>.</p>



<p class="wp-block-paragraph">La <strong>température</strong>. Plus elle est basse, entre 0,5 et 0,65, plus le rendu colle à ton sample. Plus elle est haute, entre 0,75 et 0,85, plus c&rsquo;est expressif, mais ça peut dériver.</p>



<p class="wp-block-paragraph">La <strong>repetition penalty</strong>. La valeur par défaut à 10 est extrême. Descends à 2 ou 3 pour un rendu nettement plus naturel.</p>



<figure class="wp-block-image size-large"><img width="1024" height="388"  alt="" class="wp-image-334"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-1024x388.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-1024x388.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-300x114.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1-768x291.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/Capture-decran-du-2026-06-14-08-47-01-1.png 1255w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Si ça ne suffit toujours pas, deux options plus lourdes existent. Le <strong>mode multi-sample</strong>, où tu fournis plusieurs fichiers WAV d&rsquo;une même personne pour stabiliser le clone. Et le <strong>fine-tuning</strong>, où tu entraînes réellement XTTS sur ta voix avec 2 à 20 minutes d&rsquo;audio propre, pour obtenir un modèle dédié bien supérieur au zero-shot. Sur une 5070 Ti, cet entraînement prend une demi-heure environ. Je détaillerai cette partie dans un article séparé, parce qu&rsquo;elle mérite son propre guide.</p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo2.mp3"></audio></figure>



<h2 class="wp-block-heading">VIII. Les cas d&rsquo;usage concrets</h2>



<p class="wp-block-paragraph">Une fois XTTS en place, ça ouvre plusieurs workflows qui remplacent directement ce que je faisais sur ElevenLabs :</p>



<ol class="wp-block-list">
<li><strong>Voix off pour mes vidéos YouTube</strong>. J&rsquo;écris le script, je génère les pistes avec ma voix clonée, je monte dans mon éditeur. Zéro crédit consommé.</li>



<li><strong>Lecture audio de mes articles de blog</strong>. Via l&rsquo;API d&rsquo;AllTalk branchée sur n8n, je génère automatiquement une version audio de chaque article.</li>



<li><strong>Génération de faux podcasts</strong>. Un modèle de langage local écrit un dialogue à deux voix, XTTS le synthétise avec deux échantillons différents.</li>



<li><strong>Doublage de mes propres vidéos en français</strong>. C&rsquo;est le pipeline le plus puissant. On chaîne une transcription avec Whisper, une traduction avec un modèle local, puis une régénération en français avec ma propre voix.<br></li>
</ol>



<p class="wp-block-paragraph">Chacun de ces workflows mérite son propre tutoriel, et j&rsquo;y reviendrai dans la suite de cette série.</p>



<p class="wp-block-paragraph">Voici un exemple en anglais:<br></p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo3.mp3"></audio></figure>



<p class="wp-block-paragraph">en espagnole:<br></p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo4.mp3"></audio></figure>



<p class="wp-block-paragraph">En allemand:<br></p>



<figure class="wp-block-audio"><audio controls src="https://tazmenworld.com/wp-content/uploads/2026/06/demo5.mp3"></audio></figure>



<p class="wp-block-paragraph">est ça entre très bien dans un workfload n8n</p>



<h2 class="wp-block-heading">IX. Démarrage automatique avec systemd</h2>



<p class="wp-block-paragraph">Pour ne pas relancer le serveur à la main à chaque démarrage, un service <strong>systemd</strong>. Tu crées le fichier <code>/etc/systemd/system/alltalk.service</code> :</p>



<p class="wp-block-paragraph">[CODE : alltalk.service]</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=AllTalk TTS Server
After=network.target

&#91;Service]
Type=simple
User=ton_user
WorkingDirectory=/home/ton_user/alltalk_tts
ExecStart=/home/ton_user/alltalk_tts/start_alltalk.sh
Restart=on-failure
RestartSec=10

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p class="wp-block-paragraph">Puis tu l&rsquo;actives :</p>



<p class="wp-block-paragraph">[CODE : activer_service.sh]</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload
sudo systemctl enable alltalk
sudo systemctl start alltalk</code></pre>



<p class="wp-block-paragraph">AllTalk démarre désormais au boot, en arrière plan, avec relance automatique en cas de crash. Un détail qui m&rsquo;a piégé deux fois : à l&rsquo;arrêt manuel, le sous-process moteur a tendance à survivre et à garder le port 7851 occupé, ce qui bloque le redémarrage. Avant de relancer, vérifie avec <code>lsof -i:7851</code> que le port est libre, et au besoin libère le avec <code>kill $(lsof -t -i:7851)</code>.</p>



<h2 class="wp-block-heading">X. Conclusion : le bilan de la liberté</h2>



<p class="wp-block-paragraph">Après ce parcours de correctifs et de réglages, est-ce que le jeu en vaut la chandelle ? Pour moi, c&rsquo;est un oui franc.</p>



<p class="wp-block-paragraph">Soyons lucides, ElevenLabs garde une longueur d&rsquo;avance sur la qualité brute, surtout sur les nuances émotionnelles les plus fines. Mais XTTS en local atteint un niveau largement suffisant pour de la voix off, du doublage et de la lecture d&rsquo;articles. Et il le fait sans abonnement, sans plafond de crédits, et sans que ma voix ne quitte ma machine. Pour quelqu&rsquo;un qui prend ses données au sérieux, c&rsquo;est le point de rupture.</p>



<p class="wp-block-paragraph">Voici comment je résume la comparaison après plusieurs jours d&rsquo;utilisation :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Caractéristique</strong></th><th><strong>ElevenLabs (Cloud)</strong></th><th><strong>XTTS Local + AllTalk</strong></th></tr></thead><tbody><tr><td><strong>Vie privée &amp; biométrie</strong></td><td>Échantillon vocal envoyé sur serveurs tiers (US)</td><td>Souveraineté totale, ta voix ne quitte pas ton réseau</td></tr><tr><td><strong>Coût mensuel</strong></td><td>À partir de 22 $/mois pour le clonage pro</td><td>0 € une fois le matériel acquis</td></tr><tr><td><strong>Quota</strong></td><td>Plafond de crédits, payé que tu l&rsquo;atteignes ou non</td><td>Génération illimitée</td></tr><tr><td><strong>Droits commerciaux</strong></td><td>Plan gratuit interdit + attribution imposée</td><td>Aucune restriction, aucune mention obligatoire</td></tr><tr><td><strong>Qualité</strong></td><td>Référence du marché, nuances émotionnelles au top</td><td>Très bonne, suffisante pour la majorité des usages</td></tr><tr><td><strong>Matériel requis</strong></td><td>Une simple connexion internet</td><td>GPU dédié (<strong>RTX 5070 Ti</strong>, 16 Go de VRAM)</td></tr><tr><td><strong>Clonage de voix</strong></td><td>Instantané et professionnel</td><td>Zero-shot, et fine-tuning possible en local</td></tr><tr><td><strong>Dépendance</strong></td><td>Dépend du service et de la connexion</td><td>Autonomie complète, fonctionne hors ligne</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">L&rsquo;installation n&rsquo;est pas plug and play sur une carte Blackwell, je ne vais pas te mentir. Mais une fois les correctifs passés, c&rsquo;est stable, rapide, et entièrement à toi. <strong>Le plus gros levier de qualité reste l&rsquo;échantillon : un bon enregistrement propre vaut tous les réglages du monde.</strong></p>



<p class="wp-block-paragraph">Dans le prochain article de cette série, je détaille les workflows en profondeur : la voix off, la lecture d&rsquo;articles via n8n, le faux podcast, et surtout le doublage de mes propres vidéos YouTube en chaînant Whisper, traduction et XTTS. La route vers l&rsquo;IA locale est encore longue, et on continue à en dessiner les contours.</p>



<p class="wp-block-paragraph">A bientôt Louis 🐇 🤜 🤛 🐰</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/06/14/comment-remplacer-elevenlabs-par-xtts-en-local-et-cloner-sa-propre-voix/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Quel matériel et pour quel prix en 2026 pour faire de l&#8217;IA en local</title>
		<link>https://tazmenworld.com/2026/06/11/quel-materiel-et-pour-quel-prix-en-2026-pour-faire-de-lia-en-local/</link>
					<comments>https://tazmenworld.com/2026/06/11/quel-materiel-et-pour-quel-prix-en-2026-pour-faire-de-lia-en-local/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 06:30:52 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<category><![CDATA[Non classé]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=318</guid>

					<description><![CDATA[Fais le tour des réseaux sociaux et tu tomberas vite sur le même argument, répété en boucle : « l&#8217;IA en local, c&#8217;est gratuit, tu ne paies pas les tokens ». C&#8217;est l&#8217;argument massue, celui qui fait briller les yeux et sortir la carte bleue. Sauf que c&#8217;est faux. L&#8217;IA en local, tu la paies [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="575"  alt="" class="wp-image-328"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-1024x575.jpeg" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-1024x575.jpeg 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-300x168.jpeg 300w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-768x431.jpeg 768w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout-1536x863.jpeg 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/ia-local-cout.jpeg 1672w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Fais le tour des réseaux sociaux et tu tomberas vite sur le même argument, répété en boucle : « l&rsquo;IA en local, c&rsquo;est gratuit, tu ne paies pas les tokens ». C&rsquo;est l&rsquo;argument massue, celui qui fait briller les yeux et sortir la carte bleue.</p>



<p class="wp-block-paragraph">Sauf que c&rsquo;est faux. L&rsquo;IA en local, <strong>tu la paies deux fois</strong> : une fois à l&rsquo;achat du matériel, et une deuxième fois en consommation électrique, mois après mois, tant que la machine tourne. Le cloud te facture au token ; le local te facture en watts. Dans les deux cas, il y a un compteur qui tourne. Il est juste moins visible côté local, parce qu&rsquo;il se planque dans ta facture EDF au lieu d&rsquo;arriver par mail à la fin du mois.</p>



<p class="wp-block-paragraph">Et tu risques d&rsquo;être surpris par le montant. Plus loin dans l&rsquo;article, je te montre ma propre facture sur douze mois, relevé fournisseur à l&rsquo;appui. Spoiler : ce n&rsquo;est pas anodin.</p>



<p class="wp-block-paragraph">Ça ne veut pas dire que le local est une mauvaise idée. Au contraire, sur certains usages c&rsquo;est imbattable, et tu gardes la main sur tes données et tes modèles sans dépendre d&rsquo;une API qui peut changer ses CGU ou ses prix du jour au lendemain. Ça veut juste dire qu&rsquo;il faut acheter en connaissance de cause, avec les deux factures en tête, pas une seule.</p>



<p class="wp-block-paragraph">Donc avant de claquer un budget, posons les bases. Et la première règle, celle qui détermine tout le reste, tient en une phrase : en IA locale, <strong>tu n&rsquo;achètes pas de la puissance de calcul, tu achètes de la mémoire</strong>.</p>



<h2 class="wp-block-heading">La règle de base : la mémoire d&rsquo;abord</h2>



<p class="wp-block-paragraph">Toute la littérature sérieuse 2026 dit la même chose. Tu choisis d&rsquo;abord la quantité de mémoire (VRAM sur un GPU, ou mémoire unifiée sur un mini-PC / un Mac), et ensuite seulement le reste.</p>



<p class="wp-block-paragraph">Les repères à garder en tête :</p>



<ul class="wp-block-list">
<li><strong>8–16 Go</strong> : modèles 7B en quantifié. Du RAG léger, des petits agents, de l&rsquo;expérimentation.</li>



<li><strong>24 Go</strong> : 32B utilisables en Q4/Q5 (Qwen 2.5-Coder 32B, Mistral Small). Le vrai point de bascule pour bosser sérieusement.</li>



<li><strong>40 Go+ ou mémoire unifiée 64–192 Go</strong> : 70B quantifiés (Llama 3.3 70B, DeepSeek R1 distill 70B, Qwen 2.5 72B), voire du 120B en 4-bit.</li>
</ul>



<p class="wp-block-paragraph">Un détail qu&rsquo;on oublie souvent : <strong>la bande passante mémoire détermine ta vitesse en tokens/seconde</strong>. Une RTX 3090 tape dans les ~936 Go/s, un boîtier AMD à mémoire unifiée plafonne souvent autour de ~120 Go/s, un Mac M4 Pro est à 273 Go/s. À mémoire égale, ça change tout sur le ressenti en inférence. Avoir 64 Go ne sert à rien si le modèle crache 4 tok/s.</p>



<h2 class="wp-block-heading">Les familles de matériel</h2>



<p class="wp-block-paragraph">Avant les tranches de budget, il faut distinguer <strong>les formes de produit</strong>, parce qu&rsquo;on compare souvent des trucs qui n&rsquo;ont rien à voir.</p>



<p class="wp-block-paragraph"><strong>GPU grand public (GeForce).</strong> Le meilleur rapport perf/prix pour du LLM + image classique. RTX 3060, 4060 Ti, 3090, 4090, 5090. Le marché de l&rsquo;occasion est ton ami.</p>



<p class="wp-block-paragraph"><strong>Mini-PC IA à mémoire unifiée.</strong> Ryzen AI Max (Strix Halo), Minisforum, GMKtec, Mac mini/Studio. Beaucoup de mémoire, faible conso, format compact. En contrepartie, une bande passante plus faible que les gros GPU (sauf Apple).</p>



<p class="wp-block-paragraph"><strong>Cartes data center détournées.</strong> Tesla P100, T4, P4, V100 récupérées d&rsquo;occasion et collées dans une tour ATX. Beaucoup de VRAM pour pas cher, mais c&rsquo;est un truc de bricoleur Linux (cooling à ajouter, drivers data center, pas de sortie vidéo).</p>



<p class="wp-block-paragraph"><strong>Edge / embarqué (Jetson).</strong> Orin Nano, AGX Orin, Thor. Conso ultra-basse, format NUC, parfait pour de l&rsquo;always-on silencieux ou du RAG embarqué. Pas pour du gros LLM à la maison.</p>



<p class="wp-block-paragraph"><strong>Stations IA compactes premium.</strong> DGX Spark, Mac Studio haut de gamme. 128 Go+ de mémoire unifiée, cher, mais redoutable en perf/watt.</p>



<h2 class="wp-block-heading">Par tranche de budget</h2>



<p class="wp-block-paragraph">Petite précaution avant de lire : les prix ci-dessous sont des prix observés mi-2026 sur le marché français/européen (occasion comprise). Ça bouge vite, parfois dans le mauvais sens : les Jetson Orin Nano ont pris une grosse hausse ces derniers mois, et le marché de l&rsquo;occasion réserve des absurdités (un Mac mini M1 d&rsquo;occasion peut coûter plus cher qu&rsquo;un M4 neuf… cherchez la logique).</p>



<h3 class="wp-block-heading">Moins de 400 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="788"  alt="" class="wp-image-322" style="aspect-ratio:1.2994888127422661;width:292px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-8-1024x788.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-8-1024x788.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-8-300x231.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-8-768x591.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-8.png 1254w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">L&rsquo;entrée de gamme. Tu vises du 7B quantifié et du RAG léger.</p>



<ul class="wp-block-list">
<li><strong>RTX 3060 12 Go d&rsquo;occasion</strong> : le classique. CUDA partout, ça marche, point.</li>



<li><strong>Tesla P4 8 Go</strong> ou <strong>P100 16 Go d&rsquo;occasion</strong> (~150–250 €) : énormément de VRAM par euro, mais cooling DIY et drivers data center.</li>



<li><strong>Tesla V100 32 Go sur AliExpress (~350 €)</strong> : le vrai bon plan VRAM/prix du moment, mais c&rsquo;est réservé aux bricoleurs. Voir l&rsquo;encadré dédié plus bas, parce qu&rsquo;il y a un piège électrique sérieux.</li>



<li><strong>Jetson Orin Nano (~350 €)</strong> : si tu veux un truc qui consomme 7 W et tourne en permanence. Attention, le prix a fortement grimpé ces derniers mois, ce n&rsquo;est plus le kit à 99 $ avant.</li>
</ul>



<p class="wp-block-paragraph">À ce niveau, ne rêve pas de génération d&rsquo;image lourde ni de 32B. C&rsquo;est un terrain de jeu, pas une station de prod.</p>



<h3 class="wp-block-heading">400 – 900 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="827"  alt="" class="wp-image-323" style="aspect-ratio:1.2382026633852146;width:353px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-9-1024x827.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-9-1024x827.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-9-300x242.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-9-768x620.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-9.png 1254w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Le sweet spot pour débuter sérieusement. 16 Go de VRAM ou un mini-PC milieu de gamme.</p>



<ul class="wp-block-list">
<li><strong>RTX 4060 Ti 16 Go</strong> ou <strong>RX 7600 XT 16 Go</strong> : 7–13B confortables et de l&rsquo;image raisonnable (SDXL, Flux en presets corrects).</li>



<li><strong>Tesla T4 16 Go</strong> : 70 W, excellente en perf/watt, parfaite pour un serveur d&rsquo;inférence allumé H24.</li>



<li><strong>Mini-PC Ryzen AI 32 Go</strong> : polyvalent, basse conso, mais attention au support GPU sous Linux (j&rsquo;y reviens plus bas).</li>
</ul>



<h3 class="wp-block-heading">900 – 1 800 €</h3>



<figure class="wp-block-image size-full is-resized"><img width="600" height="518"  alt="" class="wp-image-324" style="width:281px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-10.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-10.png 600w, https://tazmenworld.com/wp-content/uploads/2026/06/image-10-300x259.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>



<p class="wp-block-paragraph">Là, tu passes en 24 Go et tu peux faire du ComfyUI sérieux + du 32B. C&rsquo;est la tranche des <strong>GPU 24 Go d&rsquo;occasion</strong>, et clairement la plus rentable.</p>



<ul class="wp-block-list">
<li><strong>RTX 3090 24 Go d&rsquo;occasion (700–1 000 €)</strong> : LE meilleur achat, toutes catégories confondues. 24 Go, ~936 Go/s, compatibilité parfaite. Le neuf ne sert à rien ici, prends de l&rsquo;occasion. Si tu ne devais retenir qu&rsquo;une carte, c&rsquo;est elle.</li>



<li><strong>RTX 4090 24 Go d&rsquo;occasion (1 000–1 100 €)</strong> : même VRAM que la 3090 mais plus de patate, notamment en image. Là aussi le neuf est inutile.</li>



<li><strong>Tesla P100 32 Go</strong> : encore plus de VRAM pour pas cher, mais idle médiocre (voir section conso).</li>



<li><strong>Mini-PC à mémoire unifiée 64 Go</strong> type <strong>Minisforum AI X1 Pro</strong> (~1 100 $) : tu charges des modèles jusqu&rsquo;à ~50B en Q4 sans GPU dédié. Le piège : ~120 Go/s de bande passante, donc compte 15–25 tok/s sur un Qwen 14B Q4. C&rsquo;est lent mais ça tient en RAM ce qu&rsquo;un GPU 24 Go ne tiendra jamais.</li>
</ul>



<h3 class="wp-block-heading">1 800 – 3 000 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="434"  alt="" class="wp-image-325" style="aspect-ratio:2.359479850669964;width:277px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-11-1024x434.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-11-1024x434.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-11-300x127.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-11-768x326.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-11.png 1089w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">La tranche de la <strong>mémoire unifiée compacte</strong> et de l&rsquo;edge costaud. Beaucoup de mémoire, faible conso, format de bureau, mais on troque la vitesse des gros GPU contre la capacité.</p>



<ul class="wp-block-list">
<li><strong>Beelink SER9 (HX-370, ~2 300 €)</strong> : mini-PC Ryzen AI, basse conso (~7–9 W idle).</li>



<li><strong>Minisforum Strix Halo 64 Go (~2 300 €)</strong> : le modèle 128 Go n&rsquo;est toujours pas dispo, on est cantonné au 64 Go pour l&rsquo;instant. TDP modulable 45–120 W.</li>



<li><strong>Mac mini M4 64 Go (~2 800 €)</strong> : 70B quantifiés accessibles, idle dérisoire (~4–8 W), perf/watt imbattable. L&rsquo;option la plus propre pour un nœud LLM always-on costaud.</li>



<li><strong>Jetson AGX Orin 64 Go (~2 400 € avec boîtier)</strong> : si tu fais de l&rsquo;edge sérieux ou du RAG embarqué.</li>
</ul>



<h3 class="wp-block-heading">Plus de 3 000 €</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="824"  alt="" class="wp-image-326" style="aspect-ratio:1.2434030224569432;width:400px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-12-1024x824.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-12-1024x824.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-12-300x241.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-12-768x618.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-12.png 1226w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Le haut du panier. C&rsquo;est là que le 70B confortable, le 120B en 4-bit et l&rsquo;image lourde deviennent vraiment fluides, mais le ticket d&rsquo;entrée fait mal.</p>



<ul class="wp-block-list">
<li><strong>RTX 5090 32 Go (3 500–5 000 €)</strong> : la puissance brute. 32 Go GDDR7, ~575 W rien que pour la carte. Réserve-la si tu fais de l&rsquo;image lourde ou du training.</li>



<li><strong>Mac Studio M4 (à partir de ~4 400 € selon config)</strong> : jusqu&rsquo;à 192 Go unifiée, 70B quantifiés + vidéo + IA, idle ridicule. Le compromis perf/watt le plus propre pour une station.</li>



<li><strong>DGX Spark (~5 000 €)</strong> : 128 Go unifiée (GB10), écosystème CUDA natif dans un format de bureau.</li>



<li><strong>Multi-GPU 4× 3090</strong> en rack : 96 Go de VRAM totale pour qui veut du 70B+ sans compromis. C&rsquo;est plus un labo qu&rsquo;une machine perso, et la facture électrique suit (voir plus bas).</li>
</ul>



<h2 class="wp-block-heading">Le prix de la mémoire : la variable qui va tout chambouler</h2>



<p class="wp-block-paragraph">Tous les prix ci-dessus sont une photo à l&rsquo;instant T, et cette photo va se dégrader. On a passé l&rsquo;article à répéter que tu achètes de la mémoire avant tout : il faut donc parler du fait que la mémoire est en pleine crise de prix.</p>



<p class="wp-block-paragraph">Depuis fin 2025, la DRAM et la NAND flambent. Les tarifs ont été multipliés par 3 à 4 en moins d&rsquo;un an. La cause tient en trois lettres : la HBM, cette mémoire ultra-rapide qui équipe les accélérateurs IA des data centers (NVIDIA H100/H200/B200, AMD MI300…). Les trois seuls fabricants mondiaux (Samsung, SK Hynix, Micron) ont réorienté leurs capacités vers cette HBM à forte marge, au détriment de la DDR4, DDR5, LPDDR5 et de la NAND grand public. Résultat : moins d&rsquo;offre, des stocks tendus, des prix qui s&rsquo;envolent. Et ça ne s&rsquo;arrête pas à la RAM système : la GDDR des cartes graphiques est touchée par le même effet, donc les GPU sont aussi concernés.</p>



<p class="wp-block-paragraph">Et ce n&rsquo;est pas fini. Micron annonce +50 à 60 % sur la DRAM dès le premier trimestre 2026, TrendForce table sur +58 à 63 % de plus au deuxième trimestre. Pour résorber la pénurie, il faudrait augmenter la production de 12 % par an d&rsquo;ici 2027 ; les plans industriels actuels ne prévoient que 7,5 %. L&rsquo;écart ne se comble pas par magie : une nouvelle usine de semi-conducteurs met des années à monter en cadence. Les prévisions convergent vers une tension qui dure au moins jusqu&rsquo;en 2027, avec un plateau des prix cette année-là et une éventuelle détente seulement à partir de 2028. Les plus pessimistes (Counterpoint) évoquent 2030.</p>



<figure class="wp-block-image size-large"><img width="1024" height="542"  alt="" class="wp-image-321"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-7-1024x542.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-7-1024x542.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7-300x159.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7-768x406.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7-1536x812.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/image-7.png 1830w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Donc oui, il y a eu de légères respirations sur certains tarifs, mais la tendance de fond est haussière, et elle va le rester un moment. Ça a deux conséquences très concrètes pour toi.</p>



<p class="wp-block-paragraph">D&rsquo;abord, <strong>les configs gourmandes en mémoire vont coûter de plus en plus cher</strong>. Un mini-PC 128 Go de mémoire unifiée ou une carte à grosse VRAM, c&rsquo;est exactement ce que le marché s&rsquo;arrache. Si ton projet en dépend, le surcoût ne fera que grimper.</p>



<p class="wp-block-paragraph">Ensuite, et c&rsquo;est là que je vais à contre-courant du discours ambiant : <strong>dans pas mal de cas, le calcul honnête, c&rsquo;est de ne pas acheter maintenant</strong>. À ces prix-là, monter une vraie config locale revient cher, et on sait que la mémoire restera tendue jusqu&rsquo;en 2027-2028. Une stratégie tout à fait défendable, c&rsquo;est donc : j&rsquo;attends deux ans que le marché se détende, et en attendant j&rsquo;utilise les API. Tu paies au token sur la période, mais tu n&rsquo;immobilises pas 3 000 ou 5 000 € dans une machine achetée au pic, qui aura perdu de la valeur quand les prix mémoire seront retombés. Pour un usage modéré, l&rsquo;addition API sur deux ans peut largement rester sous le coût d&rsquo;achat + électricité d&rsquo;une grosse config.</p>



<p class="wp-block-paragraph">Si malgré tout tu veux du local tout de suite, <strong>l&rsquo;occasion est ta meilleure protection</strong>. Une RTX 3090 ou 4090 d&rsquo;occasion, avec sa VRAM déjà soudée et payée au prix d&rsquo;hier, te met à l&rsquo;abri de la flambée. C&rsquo;est l&rsquo;arbitrage à faire : soit tu passes par l&rsquo;occasion maintenant, soit tu encaisses le coût API quelque temps et tu investis quand le marché aura soufflé. Ce qui n&rsquo;a pas de sens, c&rsquo;est d&rsquo;acheter du neuf gourmand en mémoire en plein pic.</p>



<p class="wp-block-paragraph">Dernier point à connaître : à partir de 2026, <strong>la disponibilité risque de devenir un problème avant même le prix</strong>. Si tu choisis la voie « j&rsquo;achète maintenant », garde en tête que trouver le composant pourra être plus compliqué que le payer.</p>



<h2 class="wp-block-heading">Inférence vs diffusion : ce que ça change</h2>



<p class="wp-block-paragraph">On mélange trop souvent les deux usages, alors qu&rsquo;ils ne sollicitent pas le matériel pareil.</p>



<p class="wp-block-paragraph"><strong>Inférence LLM.</strong> C&rsquo;est dominé par la <strong>bande passante mémoire</strong>. Le modèle doit être lu en entier à chaque token généré. D&rsquo;où l&rsquo;importance de la VRAM (pour faire rentrer le modèle) ET de la bande passante (pour le lire vite). Une P100 à 16 Go fera tourner un 32B Q4, mais ses ~550 Go/s la rendent plus lente qu&rsquo;une 3090.</p>



<p class="wp-block-paragraph"><strong>Diffusion / génération d&rsquo;image.</strong> Là, l&rsquo;architecture du GPU compte davantage. Les Tensor Cores modernes (FP8, etc.) accélèrent énormément. C&rsquo;est pour ça qu&rsquo;une Pascal (P100) fait tourner ComfyUI mais reste sensiblement plus lente qu&rsquo;une 3090/4090/5090 sur le même workflow. En image, l&rsquo;ancienneté de l&rsquo;archi se paie cash.</p>



<p class="wp-block-paragraph">Conclusion pratique : si ton truc c&rsquo;est le LLM, optimise la mémoire et la bande passante. Si c&rsquo;est l&rsquo;image, oriente-toi vers une archi récente (Ampere minimum, idéalement Ada/Blackwell).</p>



<h2 class="wp-block-heading">La consommation : le truc que personne ne regarde</h2>



<p class="wp-block-paragraph">C&rsquo;est l&rsquo;angle mort des tableaux VRAM/prix. Si ta machine tourne H24 pour Ollama, n8n ou ComfyUI, deux chiffres comptent : la conso <strong>idle</strong> (machine allumée, modèle pas chargé) et la conso <strong>en calcul</strong>.</p>



<p class="wp-block-paragraph"><strong>Attention, point crucial</strong> : les chiffres ci-dessous sont <strong>pour la carte seule</strong>. C&rsquo;est toute la config qui consomme. CPU, carte mère, RAM, ventilation, alim avec son rendement : ajoute facilement 100 à 250 W sous charge par-dessus le GPU. Une config autour d&rsquo;une RTX 5090 dépasse le plus souvent <strong>1 000 W</strong> à pleine charge. Donc quand tu lis « 575 W » pour la 5090, lis plutôt « 1 000 W au mur » pour la machine complète.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">GPU (carte seule)</th><th class="has-text-align-left" data-align="left">Mémoire</th><th class="has-text-align-right" data-align="right">Idle</th><th class="has-text-align-right" data-align="right">Calcul</th><th class="has-text-align-left" data-align="left">Verdict 24/7</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Tesla T4</td><td class="has-text-align-left" data-align="left">16 Go</td><td class="has-text-align-right" data-align="right">~36 W</td><td class="has-text-align-right" data-align="right">~70–75 W</td><td class="has-text-align-left" data-align="left">Excellent serveur sobre</td></tr><tr><td class="has-text-align-left" data-align="left">Tesla P100</td><td class="has-text-align-left" data-align="left">16 Go</td><td class="has-text-align-right" data-align="right">~25–30 W</td><td class="has-text-align-right" data-align="right">~250 W</td><td class="has-text-align-left" data-align="left">Bricolable, idle moyen</td></tr><tr><td class="has-text-align-left" data-align="left">Tesla V100</td><td class="has-text-align-left" data-align="left">16–32 Go</td><td class="has-text-align-right" data-align="right">~40–50 W</td><td class="has-text-align-right" data-align="right">~250 W</td><td class="has-text-align-left" data-align="left">Puissant, mauvaise veille</td></tr><tr><td class="has-text-align-left" data-align="left">RTX 3090</td><td class="has-text-align-left" data-align="left">24 Go</td><td class="has-text-align-right" data-align="right">~10–30 W</td><td class="has-text-align-right" data-align="right">~350 W</td><td class="has-text-align-left" data-align="left">Bon ratio polyvalent</td></tr><tr><td class="has-text-align-left" data-align="left">RTX 4090</td><td class="has-text-align-left" data-align="left">24 Go</td><td class="has-text-align-right" data-align="right">~4–29 W</td><td class="has-text-align-right" data-align="right">~450–480 W</td><td class="has-text-align-left" data-align="left">Fort, lourd en charge</td></tr><tr><td class="has-text-align-left" data-align="left">RTX 5090</td><td class="has-text-align-left" data-align="left">32 Go</td><td class="has-text-align-right" data-align="right">~45–100 W</td><td class="has-text-align-right" data-align="right">~575 W</td><td class="has-text-align-left" data-align="left">Config complète &gt;1 000 W</td></tr><tr><td class="has-text-align-left" data-align="left">Jetson Orin Nano</td><td class="has-text-align-left" data-align="left">8 Go</td><td class="has-text-align-right" data-align="right">~2,5–7 W</td><td class="has-text-align-right" data-align="right">~7–15 W</td><td class="has-text-align-left" data-align="left">Top edge always-on</td></tr><tr><td class="has-text-align-left" data-align="left">Jetson AGX Orin</td><td class="has-text-align-left" data-align="left">64 Go</td><td class="has-text-align-right" data-align="right">~15–20 W</td><td class="has-text-align-right" data-align="right">~30–60 W</td><td class="has-text-align-left" data-align="left">Bon compromis edge costaud</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Côté boîtiers compacts, l&rsquo;intérêt c&rsquo;est que les chiffres sont <strong>système complet</strong> (pas de tour à ajouter autour) :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Plateforme (système complet)</th><th class="has-text-align-left" data-align="left">Mémoire</th><th class="has-text-align-right" data-align="right">Idle</th><th class="has-text-align-right" data-align="right">Charge</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Mac mini M4</td><td class="has-text-align-left" data-align="left">16–64 Go</td><td class="has-text-align-right" data-align="right">~4–8 W</td><td class="has-text-align-right" data-align="right">~30–40 W</td></tr><tr><td class="has-text-align-left" data-align="left">Mac Studio M4</td><td class="has-text-align-left" data-align="left">36–192 Go</td><td class="has-text-align-right" data-align="right">~6–10 W</td><td class="has-text-align-right" data-align="right">~170–220 W</td></tr><tr><td class="has-text-align-left" data-align="left">DGX Spark</td><td class="has-text-align-left" data-align="left">128 Go</td><td class="has-text-align-right" data-align="right">~22–25 W</td><td class="has-text-align-right" data-align="right">~240 W (max système)</td></tr><tr><td class="has-text-align-left" data-align="left">Beelink SER9 (HX-370)</td><td class="has-text-align-left" data-align="left">32–64 Go</td><td class="has-text-align-right" data-align="right">~7–9 W</td><td class="has-text-align-right" data-align="right">~78 W</td></tr><tr><td class="has-text-align-left" data-align="left">Minisforum Strix Halo (Ryzen AI Max+ 395)</td><td class="has-text-align-left" data-align="left">jusqu&rsquo;à 128 Go</td><td class="has-text-align-right" data-align="right">~9–12 W</td><td class="has-text-align-right" data-align="right">~120 W</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">C&rsquo;est aussi là que les boîtiers compacts à mémoire unifiée prennent leur revanche sur les gros GPU : un Mac mini ou un Strix Halo te fait tourner un 70B en consommant ce qu&rsquo;une tour avec 5090 brûle au repos. Si ton usage c&rsquo;est l&rsquo;always-on, le perf/watt écrase la perf brute.</p>



<p class="wp-block-paragraph">Le truc à retenir, qui n&rsquo;apparaît jamais dans un tableau prix/VRAM : <strong>une P100 ou une V100 est souvent bloquée en état de perf élevé au repos</strong>, donc son idle est mauvais. Géniale pour bricoler et calculer, beaucoup moins pour un serveur domestique qui passe sa vie à attendre. Ça se rattrape sous Linux en réglant les p-states (voir l&rsquo;astuce dans l&rsquo;encadré V100 plus bas), mais c&rsquo;est un réglage à faire, ce n&rsquo;est pas automatique. À l&rsquo;inverse, une T4, un Jetson ou un Mac mini sont imbattables pour de l&rsquo;always-on sans rien toucher.</p>



<p class="wp-block-paragraph">Règle simple de lecture :</p>



<ul class="wp-block-list">
<li><strong>Tu calcules souvent</strong> : 3090/4090/5090, peu importe l&rsquo;idle.</li>



<li><strong>Tu veux un nœud IA allumé toute la journée</strong> : Mac mini, Jetson, T4. La sobriété prime.</li>
</ul>



<h3 class="wp-block-heading">Rien n&rsquo;est gratuit : la facture, en vrai</h3>



<p class="wp-block-paragraph">Petite parenthèse vécue, parce que c&rsquo;est facile de raisonner en watts sans jamais regarder la note. Voici ma conso réelle sur 12 mois (relevé fournisseur, en € par mois) :</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">Mois</th><th class="has-text-align-right" data-align="right">€</th><th class="has-text-align-left" data-align="left">Mois</th><th class="has-text-align-right" data-align="right">€</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">Juil. 2025</td><td class="has-text-align-right" data-align="right">86</td><td class="has-text-align-left" data-align="left">Janv. 2026</td><td class="has-text-align-right" data-align="right">215</td></tr><tr><td class="has-text-align-left" data-align="left">Août 2025</td><td class="has-text-align-right" data-align="right">92</td><td class="has-text-align-left" data-align="left">Févr. 2026</td><td class="has-text-align-right" data-align="right">209</td></tr><tr><td class="has-text-align-left" data-align="left">Sept. 2025</td><td class="has-text-align-right" data-align="right">97</td><td class="has-text-align-left" data-align="left">Mars 2026</td><td class="has-text-align-right" data-align="right">193</td></tr><tr><td class="has-text-align-left" data-align="left">Oct. 2025</td><td class="has-text-align-right" data-align="right">116</td><td class="has-text-align-left" data-align="left">Avr. 2026</td><td class="has-text-align-right" data-align="right">164</td></tr><tr><td class="has-text-align-left" data-align="left">Nov. 2025</td><td class="has-text-align-right" data-align="right">149</td><td class="has-text-align-left" data-align="left">Mai 2026</td><td class="has-text-align-right" data-align="right">86</td></tr><tr><td class="has-text-align-left" data-align="left">Déc. 2025</td><td class="has-text-align-right" data-align="right">195</td><td class="has-text-align-left" data-align="left"><strong>Total</strong></td><td class="has-text-align-right" data-align="right"><strong>~1 601</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">J&rsquo;ai commencé à utiliser ma 5070 mi-octobre, et la courbe grimpe à partir de là. En mai, je suis passé sur des API pour une partie du travail, et la facture retombe à 86 €, exactement le niveau d&rsquo;avant la 5070.</p>



<figure class="wp-block-image size-large"><img width="1024" height="404"  alt="" class="wp-image-320"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-6-1024x404.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-6-1024x404.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-6-300x118.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-6-768x303.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-6.png 1428w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Et là, pas d&rsquo;échappatoire : <strong>je me chauffe au bois</strong> :D. Le pic hivernal n&rsquo;est donc pas un artefact du chauffage électrique. Le seul gros changement sur la période, c&rsquo;est la machine qui s&rsquo;est mise à tourner pour faire de l&rsquo;IA. La corrélation est limpide : GPU allumé mi-octobre, la facture décolle ; bascule sur API en mai, elle redescend à son niveau de départ. Il reste bien quelques variations saisonnières mineures (éclairage, jours plus courts), mais elles ne pèsent pas 100 € par mois. Le coupable, c&rsquo;est le calcul local.</p>



<p class="wp-block-paragraph">Mais le message de fond tient : <strong>rien n&rsquo;est gratuit</strong>. La machine locale a un coût électrique réel et récurrent, et l&rsquo;API a un coût au token. L&rsquo;IA locale n&rsquo;est pas « gratuite » par opposition au cloud : tu déplaces juste la dépense de la facture API vers la facture EDF. À toi de voir laquelle correspond à ton usage et à ton volume.</p>



<h3 class="wp-block-heading">Encadré bricoleur : la Tesla V100 32 Go (~350 €)</h3>



<figure class="wp-block-image size-large is-resized"><img width="1024" height="1024"  alt="" class="wp-image-319" style="width:489px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/06/image-5-1024x1024.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/06/image-5-1024x1024.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-300x300.png 300w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-150x150.png 150w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-768x768.png 768w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5-1536x1536.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/06/image-5.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">C&rsquo;est le meilleur ratio VRAM/prix du moment, mais ça se mérite. Avant de cliquer sur AliExpress, tu dois savoir trois choses :</p>



<ul class="wp-block-list">
<li><strong>L&rsquo;alimentation est piégeuse.</strong> Le connecteur n&rsquo;est pas un PCIe standard, il y a une modif/adaptateur à faire. Mal branchée, <strong>tu risques de cramer la carte mère</strong>. Les adaptateurs se trouvent en ligne, mais c&rsquo;est une manip à ne pas rater.</li>



<li><strong>Ventilation passive.</strong> Comme toutes les cartes data center, pas de ventilo intégré. Il faut ajouter un shroud + ventilateur sinon ça monte en température.</li>



<li><strong>Idle à programmer sous Linux.</strong> Par défaut elle reste bloquée en état de perf élevé (P0), donc elle tire 40 W et plus au repos pour ne rien faire. Sans réglage des p-states, ton idle est catastrophique pour du 24/7.</li>
</ul>



<p class="wp-block-paragraph"><strong>Astuce : dompter les p-states.</strong> Le problème touche toutes les cartes data center (P100, V100, T4…) : par défaut elles ne redescendent pas en basse conso au repos. Deux approches.</p>



<p class="wp-block-paragraph">D&rsquo;abord, active le persistence mode pour fiabiliser le comportement des clocks :</p>



<p class="wp-block-paragraph">bash</p>



<pre class="wp-block-code"><code>sudo nvidia-smi -pm 1</code></pre>



<p class="wp-block-paragraph">Ensuite, le plus simple et le plus propre : le démon <strong><code>nvidia-pstated</code></strong> (open-source, dispo sur GitHub). Il surveille l&rsquo;utilisation du GPU et force la carte en p-state bas (P8) dès qu&rsquo;elle est inactive, puis la repasse en P0 sous charge, automatiquement, sans bricoler tes clocks à la main. Sur une P100/V100, ça fait tomber l&rsquo;idle de ~40 W à une dizaine de watts. Tu le lances en service systemd et tu n&rsquo;y penses plus.</p>



<p class="wp-block-paragraph">Alternative manuelle si tu veux verrouiller les fréquences toi-même (<code>nvidia-smi -lgc</code>), mais tu plafonnes alors les perfs et c&rsquo;est moins souple que le démon. Pour un serveur allumé en permanence, <code>nvidia-pstated</code> est de loin la meilleure option : c&rsquo;est lui qui transforme une carte « mauvais idle » en carte 24/7 acceptable.</p>



<p class="wp-block-paragraph">En clair : 350 € pour 32 Go, c&rsquo;est imbattable, mais c&rsquo;est un projet Linux à part entière, pas un achat plug-and-play. Si tu n&rsquo;es pas à l&rsquo;aise avec le tuning matériel, reste sur une 3090 d&rsquo;occasion.</p>



<h2 class="wp-block-heading">Compatibilité : le piège PyTorch / CUDA</h2>



<p class="wp-block-paragraph">C&rsquo;est là que beaucoup se font avoir. Avoir 64 Go de mémoire unifiée ne sert à rien si ta stack logicielle ne sait pas l&rsquo;exploiter au GPU. Petit tour par écosystème.</p>



<p class="wp-block-paragraph"><strong>NVIDIA / CUDA.</strong> Le standard de fait. PyTorch, vLLM, Ollama, ComfyUI : sur de l&rsquo;Ampere ou de l&rsquo;Ada (3090, 4090…), tout marche nativement, builds officiels, zéro galère. C&rsquo;est la raison numéro un pour rester sur du NVIDIA si tu fais du dev ou du training, pas juste de l&rsquo;inférence.</p>



<p class="wp-block-paragraph">Sauf qu&rsquo;il y a une grosse exception, et elle est contre-intuitive : <strong>la série RTX 5000 (Blackwell) est aujourd&rsquo;hui le moins bon choix CUDA</strong>. Ces cartes utilisent une nouvelle compute capability, sm_120, et les versions stables de PyTorch ne sont compilées que jusqu&rsquo;à sm_90 (Hopper). Concrètement, sur une 5070 / 5080 / 5090 fraîchement montée, tu te prends souvent un <code>CUDA error: no kernel image is available for execution on the device</code>, ou pire, un fallback silencieux sur le CPU. Le seul moyen d&rsquo;en tirer quelque chose, c&rsquo;est de passer par les builds <strong>nightly</strong> (cu128/cu129, Python 3.13 conseillé) ou de compiler PyTorch depuis les sources. Ça fonctionne, mais ce n&rsquo;est pas une version stable définitive.</p>



<p class="wp-block-paragraph">Et ça dure. La série 50 est sortie début 2025 ; on est mi-2026 et le support officiel de sm_120 dans le PyTorch stable n&rsquo;est toujours pas là. Les demandes côté PyTorch (dont une qui cite nommément la 5070 Ti) sont encore ouvertes. Plus d&rsquo;un an à bricoler du nightly pour faire tourner une carte vendue, entre autres, pour l&rsquo;IA : c&rsquo;est le monde à l&rsquo;envers. Et le plus cocasse, c&rsquo;est qu&rsquo;on parle déjà de la suite : les fuites (Kopite7kimi, relayé par Wccftech) annoncent une génération RTX 60 sous architecture Rubin pour le second semestre 2027. Autrement dit, NVIDIA prépare déjà la relève alors que la génération actuelle n&rsquo;est toujours pas correctement prise en charge par la stack logicielle. Bref, si tu veux du NVIDIA sans prise de tête logicielle, une 3090 ou 4090 d&rsquo;occasion t&rsquo;évitera ces galères ; la 5090 ne se justifie que si tu as vraiment besoin de sa puissance brute et que le tuning logiciel ne te fait pas peur.</p>



<p class="wp-block-paragraph"><strong>AMD / ROCm.</strong> Sur les gros GPU AMD dédiés, ROCm progresse et PyTorch a ses builds. Mais sur les <strong>iGPU Ryzen AI récents (Strix Halo compris), le support ROCm reste partiel en 2026</strong>. Ollama tourne très bien en CPU+RAM, mais sans accélération GPU complète. Donc le mini-PC AMD 64 Go que tu lorgnes : il chargera de gros modèles, mais souvent en s&rsquo;appuyant sur le CPU. À garder en tête avant d&rsquo;acheter.</p>



<p class="wp-block-paragraph"><strong>Apple / Metal / MLX.</strong> PyTorch a un backend MPS qui fonctionne, mais tous les ops ne sont pas couverts. Pour Apple Silicon, le vrai chemin c&rsquo;est <strong>MLX</strong> (le framework d&rsquo;Apple) ou Ollama/llama.cpp. La bonne nouvelle : la grosse bande passante mémoire (273 Go/s sur M4 Pro) compense, et le perf/watt est excellent.</p>



<p class="wp-block-paragraph"><strong>Pascal (P100/V100).</strong> CUDA-capable, donc Ollama/vLLM/ComfyUI tournent. Mais c&rsquo;est de l&rsquo;archi ancienne : pas de FP8, pas de Tensor Cores modernes, et il faut surveiller que les versions récentes de PyTorch ne lâchent pas le support des vieilles compute capabilities (sm_60/sm_70). Plus les drivers <strong>data center</strong> (pas GeForce) et le cooling DIY. C&rsquo;est jouable, mais ce n&rsquo;est clairement pas plug-and-play.</p>



<p class="wp-block-paragraph"><strong>Jetson.</strong> Écosystème Linux embarqué (JetPack), pas Windows. CUDA présent mais parfois plus limité que sur GPU desktop côté bibliothèques. Parfait pour de l&rsquo;edge, pas pour reproduire ta station de dev.</p>



<h2 class="wp-block-heading">En résumé : quel matériel pour quel besoin</h2>



<ul class="wp-block-list">
<li><strong>Découvrir, RAG léger, 7B, petit budget.</strong> RTX 3060 12 Go d&rsquo;occasion, ou une Tesla P4/T4 si tu acceptes le bricolage. T4 si c&rsquo;est pour du H24 sobre. Et si tu es à l&rsquo;aise avec le tuning matériel, la V100 32 Go à ~350 € est imbattable en VRAM/prix.</li>



<li><strong>Bosser sérieusement, 32B, ComfyUI, le meilleur rapport qualité/prix.</strong> La <strong>RTX 3090 24 Go d&rsquo;occasion (700–1 000 €)</strong>. Sans hésiter. CUDA natif, 24 Go, bande passante correcte. Le neuf ne sert à rien.</li>



<li><strong>Charger de gros modèles 70B sans exploser le budget GPU.</strong> Un mini-PC à mémoire unifiée 64–128 Go (Minisforum, Strix Halo, ~2 300 €). En acceptant la lenteur et le support GPU partiel sous Linux.</li>



<li><strong>Nœud IA allumé en permanence, basse conso.</strong> Mac mini M4 (~2 800 € en 64 Go) ou Jetson. Conso de N100, moteur IA en plus.</li>



<li><strong>70B confortable, perf/watt propre, format bureau.</strong> Mac Studio M4 (~4 400 €) ou DGX Spark (~5 000 €), si le budget suit.</li>



<li><strong>Image lourde, puissance brute, training.</strong> RTX 4090 d&rsquo;occasion (~1 000–1 100 €) ou 5090 (3 500–5 000 €), archi récente obligatoire, sans oublier que la config 5090 complète tape dans les 1 000 W.</li>
</ul>



<p class="wp-block-paragraph">Le bon réflexe : pars de ton usage réel (inférence ? image ? always-on ?), déduis la mémoire dont tu as besoin, vérifie que ta stack supporte le matériel <strong>au GPU</strong>, et seulement après regarde le prix. Dans cet ordre. La machine la plus tape-à-l&rsquo;œil sur le papier n&rsquo;est pas forcément celle qui tournera le mieux chez toi.</p>



<p class="wp-block-paragraph">Et garde en tête les deux factures et le calendrier. À l&rsquo;achat, la mémoire est en pleine flambée et la tendance reste haussière jusqu&rsquo;en 2027-2028 : à ces prix-là, le calcul le plus malin n&rsquo;est pas forcément d&rsquo;acheter aujourd&rsquo;hui. Pour beaucoup, attendre deux ans que le marché se détende et tenir avec les API entre-temps coûte moins cher que d&rsquo;immobiliser plusieurs milliers d&rsquo;euros dans une machine achetée au pic. Si tu veux quand même du local maintenant, passe par l&rsquo;occasion, pas par du neuf gourmand en mémoire. En consommation, un GPU qui tourne, c&rsquo;est une centaine d&rsquo;euros par mois sur ta facture, chiffre réel à l&rsquo;appui. L&rsquo;IA en local n&rsquo;est pas gratuite. Elle peut valoir largement le coup, mais en connaissance de cause, les deux factures posées sur la table, et parfois la meilleure décision c&rsquo;est juste d&rsquo;attendre.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/06/11/quel-materiel-et-pour-quel-prix-en-2026-pour-faire-de-lia-en-local/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Comment remplacer Perplexity par Mistral en local</title>
		<link>https://tazmenworld.com/2026/04/30/comment-remplacer-perplexity-par-mistral-en-local/</link>
					<comments>https://tazmenworld.com/2026/04/30/comment-remplacer-perplexity-par-mistral-en-local/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 22:06:46 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<category><![CDATA[Non classé]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=240</guid>

					<description><![CDATA[Je l&#8217;avoue : Perplexity est devenu, en l&#8217;espace de quelques mois, mon réflexe quotidien. C&#8217;est l&#8217;outil qui m&#8217;a fait oublier la liste interminable de liens bleus de Google pour me proposer des réponses synthétisées, sourcées et presque toujours pertinentes. Pourtant, plus je l&#8217;utilisais, plus une certaine gêne s&#8217;installait. À chaque requête, j&#8217;envoie un fragment de [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-260"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/Image_8411l08411l08411-1024x572.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/Image_8411l08411l08411-1024x572.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_8411l08411l08411-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_8411l08411l08411-768x429.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_8411l08411l08411-1536x857.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_8411l08411l08411-2048x1143.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Je l&rsquo;avoue : Perplexity est devenu, en l&rsquo;espace de quelques mois, mon réflexe quotidien. C&rsquo;est l&rsquo;outil qui m&rsquo;a fait oublier la liste interminable de liens bleus de Google pour me proposer des réponses synthétisées, sourcées et presque toujours pertinentes. Pourtant, plus je l&rsquo;utilisais, plus une certaine gêne s&rsquo;installait. À chaque requête, j&rsquo;envoie un fragment de mes réflexions, de mes projets et de ma vie privée sur des serveurs dont je ne contrôle ni l&rsquo;accès, ni la politique de conservation.</p>



<p class="wp-block-paragraph">Aujourd&rsquo;hui, je refuse de « louer » mon intelligence et ma vie privée à une boîte noire. J&rsquo;ai décidé de reprendre les commandes en construisant ma propre alternative souveraine. L&rsquo;objectif est simple : obtenir la même puissance de recherche et de synthèse, mais de manière totalement privée, sans abonnement, et en exploitant la puissance de calcul qui dort dans mon propre bureau.</p>



<h2 class="wp-block-heading">La quête de la souveraineté numérique</h2>



<p class="wp-block-paragraph">Pourquoi s&#8217;embêter à configurer sa propre machine quand un service à 20 dollars par mois fait le travail ? La réponse tient en un mot : la maîtrise. En installant ma propre « Tazmen Station », je ne dépends plus d&rsquo;une connexion internet pour réfléchir ou d&rsquo;une mise à jour logicielle qui pourrait brider les capacités de mon modèle favori.</p>



<p class="wp-block-paragraph">Ma configuration repose sur un matériel que j&rsquo;ai choisi pour ses capacités de calcul : un processeur <strong>AMD Ryzen 9 9900X</strong> épaulé par une carte <strong>NVIDIA GeForce RTX 5070 Ti</strong>. C&rsquo;est cette dernière qui est le véritable moteur de mon installation. Avec ses <strong>13 Go de mémoire vidéo (VRAM)</strong> mobilisés, elle me permet de faire tourner des modèles sophistiqués comme <strong>Mistral-Nemo 12B</strong> avec une fluidité déconcertante.</p>



<figure class="wp-block-image size-large"><img width="1024" height="599"  alt="" class="wp-image-244"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-21-1024x599.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-21-1024x599.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-21-300x176.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-21-768x449.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-21.png 1109w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Le projet que je vais vous détailler n&rsquo;est pas une simple curiosité technique. C&rsquo;est un système de production robuste. Pour y parvenir, j&rsquo;ai assemblé une pile logicielle cohérente à l&rsquo;aide de conteneurs Docker :</p>



<ul class="wp-block-list">
<li><strong>SearXNG</strong> : Mon détective privé qui interroge le web à ma place, anonymement.</li>



<li><strong>Ollama</strong> : Le moteur qui héberge mes modèles de langage.</li>



<li><strong>Open WebUI</strong> : L&rsquo;interface élégante qui lie le tout et me permet de dialoguer avec mes données.</li>
</ul>



<p class="wp-block-paragraph">[CODE : arborescence_projet.txt]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>~/tazmen-ai-station/
├── docker-compose.yml     # L'orchestrateur de mes services
├── open-webui/            # Mes données d'interface et historiques
├── mcpo/                  # Le bridge pour les outils avancés
└── searxng/               # Ma configuration de recherche privée
    └── settings.yml       # Le réglage fin de mes moteurs de recherche</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">~/tazmen-ai-station/</span></span>
<span class="line"><span style="color: #A3BE8C">├── docker-compose.yml</span><span style="color: #D8DEE9FF">     </span><span style="color: #616E88"># L&#39;orchestrateur de mes services</span></span>
<span class="line"><span style="color: #A3BE8C">├── open-webui/</span><span style="color: #D8DEE9FF">            </span><span style="color: #616E88"># Mes données d&#39;interface et historiques</span></span>
<span class="line"><span style="color: #A3BE8C">├── mcpo/</span><span style="color: #D8DEE9FF">                  </span><span style="color: #616E88"># Le bridge pour les outils avancés</span></span>
<span class="line"><span style="color: #A3BE8C">└── searxng/</span><span style="color: #D8DEE9FF">               </span><span style="color: #616E88"># Ma configuration de recherche privée</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #A3BE8C">└── settings.yml</span><span style="color: #D8DEE9FF">       </span><span style="color: #616E88"># Le réglage fin de mes moteurs de recherche</span></span></code></pre></div>



<p class="wp-block-paragraph">En tant qu&rsquo;utilisateur passionné par la sécurité et l&rsquo;IA, je ne cherche pas seulement à obtenir une réponse, mais à comprendre comment elle est générée. Dans ce guide, je vais vous montrer comment j&rsquo;ai transformé une simple machine Ubuntu en un pôle d&rsquo;intelligence capable de tenir tête aux solutions propriétaires les plus en vue. Nous n&rsquo;allons pas seulement installer des logiciels ; nous allons bâtir un écosystème où chaque octet de donnée reste sous notre contrôle exclusif.</p>



<p class="wp-block-paragraph">Préparez votre terminal. Nous allons voir comment transformer radicalement votre manière de chercher l&rsquo;information, sans jamais compromettre votre confidentialité.</p>



<h2 class="wp-block-heading">II. SearXNG : Le cerveau qui murmure à l’oreille du Web</h2>



<p class="wp-block-paragraph">Pour que mon installation puisse réellement rivaliser avec Perplexity, il me fallait un moyen d&rsquo;interroger le web sans que les moteurs de recherche ne sachent qui je suis ni ce que je cherche. C&rsquo;est ici qu&rsquo;intervient <strong>SearXNG</strong>.</p>



<p class="wp-block-paragraph" id="p-rc_3a7d666432e8f79f-23">Je décris souvent SearXNG comme un moteur de recherche métacognitif. Contrairement à Google ou Bing, il ne possède pas son propre index de pages web. C’est un agrégateur : quand je lui pose une question, il va interroger simultanément des dizaines d’autres moteurs (Google, DuckDuckGo, Bing, Qwant) à ma place<sup></sup>. Il récupère les résultats, les nettoie, supprime les doublons et me les présente de manière structurée.</p>



<h3 class="wp-block-heading">L&rsquo;anonymat par procuration</h3>



<p class="wp-block-paragraph" id="p-rc_3a7d666432e8f79f-24">Le génie de SearXNG réside dans sa capacité à faire écran entre moi et les géants du web. Puisque c&rsquo;est mon serveur local qui envoie les requêtes, les moteurs de recherche voient l&rsquo;adresse IP de mon instance et non la mienne. En configurant correctement le fichier <code>settings.yml</code>, je m&rsquo;assure qu&rsquo;aucune donnée de profilage n&rsquo;est transmise<sup></sup>. C&rsquo;est la base indispensable pour garantir que mes recherches sur la <strong>sécurité</strong> ou l&rsquo;<strong>IA</strong> ne finissent pas dans une base de données publicitaire.</p>



<figure class="wp-block-image size-large"><img width="1024" height="425"  alt="" class="wp-image-246"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-23-1024x425.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-23-1024x425.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-23-300x125.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-23-768x319.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-23-1536x638.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-23-2048x850.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Pourquoi c’est la pièce maîtresse du puzzle ?</h3>



<p class="wp-block-paragraph">Un modèle comme Mistral, aussi brillant soit-il, possède une limite de connaissances fixée au moment de son entraînement. Pour lui donner une « mémoire vive » du web actuel, j&rsquo;utilise le <strong>RAG (Retrieval-Augmented Generation)</strong>.</p>



<p class="wp-block-paragraph" id="p-rc_3a7d666432e8f79f-25">SearXNG est le fournisseur officiel de ce contexte. Dans ma configuration, Open WebUI envoie la requête utilisateur à SearXNG, récupère les 5 meilleurs extraits (snippets) et les injecte directement dans le prompt de Mistral<sup></sup>. C&rsquo;est ce mécanisme qui permet d&rsquo;obtenir des réponses sur le programme TV de demain ou sur une faille de sécurité découverte il y a trois heures.</p>



<p class="wp-block-paragraph">[CODE : Extrait de configuration des moteurs dans settings.yml]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>engines:
  - name: google
    engine: google
    shortcut: go
  - name: bing
    engine: bing
    shortcut: bi
  - name: brave
    engine: brave
    shortcut: br
    categories: &#91;general, web&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">engines</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">google</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">engine</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">google</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">shortcut</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">go</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bing</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">engine</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bing</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">shortcut</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bi</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">brave</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">engine</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">brave</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">shortcut</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">br</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">categories</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span><span style="color: #A3BE8C">general</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">web</span><span style="color: #ECEFF4">&#93;</span></span></code></pre></div>



<p class="wp-block-paragraph" id="p-rc_3a7d666432e8f79f-26">Dans mon fichier <code>settings.yml</code>, j&rsquo;ai pris soin d&rsquo;activer des moteurs comme <strong>Bing</strong> et <strong>Brave</strong> pour ne pas dépendre uniquement de Google, qui a parfois tendance à bloquer les requêtes automatisées. Cette diversité est ce qui rend le système robuste : si un moteur fait défaut, les autres prennent le relais pour fournir l&rsquo;information à Mistral. </p>



<figure class="wp-block-image size-large"><img width="1024" height="303"  alt="" class="wp-image-245"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-22-1024x303.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-22-1024x303.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-22-300x89.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-22-768x227.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-22-1536x454.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-22.png 1597w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Sans cette brique, mon IA locale serait une encyclopédie figée dans le passé. Avec SearXNG, elle devient un analyste capable de lire le web en temps réel tout en respectant ma vie privée.</p>



<h2 class="wp-block-heading">II. L&rsquo;Infrastructure : Poser les fondations avec Docker</h2>



<p class="wp-block-paragraph" id="p-rc_ead4c7521dab0df2-36">Pour bâtir ma propre station d&rsquo;IA, j&rsquo;ai choisi la voie de la propreté et de la modularité : <strong>Docker Compose</strong>. L&rsquo;idée n&rsquo;est pas de transformer mon installation Ubuntu en un tas de dépendances Python incohérentes, mais de compartimenter chaque outil dans son propre conteneur. Cela me permet de tout démarrer ou d&rsquo;éteindre l&rsquo;ensemble de ma machine de recherche en une seule commande<sup></sup>.</p>



<h3 class="wp-block-heading">Architecture du flux de données</h3>



<p class="wp-block-paragraph">Avant de regarder le code, il est crucial de comprendre comment mes outils discutent entre eux. Voici le chemin parcouru par une simple question comme « Quel est le dernier driver NVIDIA pour Linux ? » :</p>



<figure class="wp-block-image size-full"><img width="859" height="643"  alt="" class="wp-image-247"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-24.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-24.png 859w, https://tazmenworld.com/wp-content/uploads/2026/04/image-24-300x225.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-24-768x575.png 768w" sizes="auto, (max-width: 859px) 100vw, 859px" /></figure>



<h3 class="wp-block-heading">Le fichier de configuration : Analyse du docker-compose.yml</h3>



<p class="wp-block-paragraph" id="p-rc_ead4c7521dab0df2-37">Voici le cœur de ma <strong>Tazmen Station</strong>. J&rsquo;y ai regroupé tous les services nécessaires, de l&rsquo;interface au moteur de recherche, en passant par le pont MCP pour les outils étendus<sup></sup>.</p>



<p class="wp-block-paragraph">[CODE : docker-compose.yml]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>name: tazmen-ai-station

services:
  # Moteur d'IA : Ollama gère le chargement et l'exécution de Mistral
  ollama:
    image: ollama/ollama
    container_name: ollama
    volumes:
      - /media/DATA/LLM/models:/root/.ollama # Stockage externe pour mes modèles
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: &#91;'0'&#93; # Cible ma RTX 5070 Ti
              capabilities: &#91;gpu&#93;
    restart: unless-stopped

  # Recherche Web : L'agrégateur privé
  searxng:
    container_name: searxng
    image: searxng/searxng:latest
    ports:
      - "8080:8080"
    volumes:
      - ./searxng:/etc/searxng
    restart: unless-stopped

  # Interface : Le portail qui orchestre le RAG
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    depends_on:
      - ollama
      - searxng
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
      - ENABLE_RAG_WEB_SEARCH=True
      - RAG_WEB_SEARCH_ENGINE=searxng
      - SEARXNG_QUERY_URL=http://searxng:8080/search?q=&lt;query>
      - RAG_WEB_SEARCH_RESULT_COUNT=5 # Nombre de sources lues par l'IA
    restart: unless-stopped</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tazmen-ai-station</span></span>
<span class="line"></span>
<span class="line"><span style="color: #8FBCBB">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88"># Moteur d&#39;IA : Ollama gère le chargement et l&#39;exécution de Mistral</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">ollama</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ollama/ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/media/DATA/LLM/models:/root/.ollama</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Stockage externe pour mes modèles</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">deploy</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">resources</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">reservations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">devices</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">driver</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nvidia</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">device_ids</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">0</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">&#93;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Cible ma RTX 5070 Ti</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">capabilities</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span><span style="color: #A3BE8C">gpu</span><span style="color: #ECEFF4">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88"># Recherche Web : L&#39;agrégateur privé</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">searxng</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">searxng</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">searxng/searxng:latest</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8080:8080</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./searxng:/etc/searxng</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88"># Interface : Le portail qui orchestre le RAG</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">open-webui</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ghcr.io/open-webui/open-webui:main</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">open-webui</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">depends_on</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">searxng</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3000:8080</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">OLLAMA_BASE_URL=http://ollama:11434</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ENABLE_RAG_WEB_SEARCH=True</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">RAG_WEB_SEARCH_ENGINE=searxng</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">SEARXNG_QUERY_URL=http://searxng:8080/search?q=&lt;query&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">RAG_WEB_SEARCH_RESULT_COUNT=5</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Nombre de sources lues par l&#39;IA</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span></code></pre></div>



<h3 class="wp-block-heading">Le point critique : L&rsquo;accès au GPU</h3>



<p class="wp-block-paragraph" id="p-rc_ead4c7521dab0df2-38">Pour que ce système soit réactif, il n&rsquo;y a pas de secret : il faut que Docker puisse voir la carte graphique. Dans mon cas, c&rsquo;est une <strong>RTX 5070 Ti</strong>. Dans le service <code>ollama</code>, la section <code>deploy.resources.reservations</code> est indispensable. Sans elle, c&rsquo;est mon <strong>Ryzen 9 9900X</strong> qui prendrait tout le travail sur ses épaules, et la génération de texte deviendrait péniblement lente.</p>



<p class="wp-block-paragraph" id="p-rc_ead4c7521dab0df2-39">J&rsquo;ai également déporté le stockage des modèles sur un disque dur dédié via le volume <code>/media/DATA/LLM/models</code>. C&rsquo;est une astuce de vieux routier de l&rsquo;IA : les modèles comme Mistral pèsent plusieurs gigaoctets et je préfère ne pas encombrer ma partition système Ubuntu.</p>



<figure class="wp-block-image size-large"><img width="1024" height="341"  alt="" class="wp-image-248"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-25-1024x341.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-25-1024x341.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-25-300x100.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-25-768x256.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-25-1536x512.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-25-2048x682.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph" id="p-rc_ead4c7521dab0df2-40">Une fois ce fichier prêt, un simple <code>sudo docker compose up -d</code> met en route toute la mécanique. L&rsquo;interface devient accessible sur le port 3000 de ma machine, prête à recevoir mes premières questions. </p>



<h2 class="wp-block-heading">IV. Configurer SearXNG : Le réglage de précision</h2>



<p class="wp-block-paragraph">Avoir un conteneur qui tourne, c&rsquo;est bien. Avoir un moteur qui répond exactement à ce que Mistral attend, c&rsquo;est mieux. Pour transformer SearXNG en une source de données fiable, je dois descendre dans les soutes et éditer le fichier <code>settings.yml</code>. C&rsquo;est ici que je définis quels moteurs interroger et comment formater les réponses pour qu&rsquo;elles soient digestes pour mon IA.</p>



<h3 class="wp-block-heading">La clé de voûte : La sécurité et l&rsquo;accès</h3>



<p class="wp-block-paragraph" id="p-rc_109101a035ca8487-70">La première chose que j&rsquo;ai configurée, c&rsquo;est la <code>secret_key</code><sup></sup>. C&rsquo;est elle qui sécurise les communications de mon instance. Pour cet article, je l&rsquo;ai remplacée par une valeur générique, mais dans mon installation réelle, j&rsquo;utilise une chaîne de caractères complexe générée aléatoirement.</p>



<p class="wp-block-paragraph" id="p-rc_109101a035ca8487-71">Un point technique m&rsquo;a demandé un peu de recherche : la méthode de communication. Par défaut, SearXNG utilise souvent <code>POST</code>, mais pour assurer une compatibilité totale avec le module de recherche d&rsquo;Open WebUI, j&rsquo;ai forcé le passage en <code>GET</code><sup></sup>. C&rsquo;est un détail qui peut éviter bien des maux de tête lors des premiers tests de connexion.</p>



<p class="wp-block-paragraph">[CODE : Configuration serveur dans settings.yml]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>server:
  port: 8080
  bind_address: "0.0.0.0"
  secret_key: "VOTRE_CLE_ALÉATOIRE_ICI" # À anonymiser impérativement
  method: "GET" # Indispensable pour Open WebUI</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">server</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">port</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8080</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">bind_address</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">0.0.0.0</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">secret_key</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">VOTRE_CLE_ALÉATOIRE_ICI</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># À anonymiser impérativement</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">method</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">GET</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Indispensable pour Open WebUI</span></span></code></pre></div>



<h3 class="wp-block-heading">Sortie JSON : Le langage de l&rsquo;IA</h3>



<p class="wp-block-paragraph" id="p-rc_109101a035ca8487-72">Pour que Mistral puisse « lire » les résultats de recherche, SearXNG ne doit pas seulement lui envoyer une page HTML pleine de bannières et de menus. J&rsquo;ai donc activé le format <code>json</code> dans la section <code>formats</code><sup></sup>. Cela permet à Open WebUI de recevoir une structure de données propre, contenant uniquement le titre, l&rsquo;URL et l&rsquo;extrait du site.</p>



<h3 class="wp-block-heading">Le choix des moteurs : Sortir de la bulle Google</h3>



<p class="wp-block-paragraph" id="p-rc_109101a035ca8487-73">C&rsquo;est sans doute la partie la plus gratifiante du réglage. Google est puissant, mais il déteste qu&rsquo;on l&rsquo;interroge via un script et il finit souvent par bloquer les requêtes avec des Captchas<sup></sup>. Pour rendre ma station robuste, j&rsquo;ai diversifié mes sources.</p>



<p class="wp-block-paragraph" id="p-rc_109101a035ca8487-74">J&rsquo;ai activé <strong>Bing</strong>, <strong>Qwant</strong> et <strong>Brave</strong>. En multipliant les moteurs, je m&rsquo;assure que si l&rsquo;un d&rsquo;eux boude ma requête, les autres fourniront quand même du grain à moudre à mon modèle. J&rsquo;ai également gardé <strong>DuckDuckGo</strong> actif pour sa pertinence globale. </p>



<figure class="wp-block-image size-large"><img width="1024" height="657"  alt="" class="wp-image-250"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-27-1024x657.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-27-1024x657.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-27-300x192.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-27-768x493.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-27-1536x985.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-27.png 1643w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">[CODE : Activation des moteurs dans settings.yml]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>engines:
  - name: google
    engine: google
    shortcut: go
    disabled: false # On le garde, mais on ne compte pas que sur lui
  - name: bing
    engine: bing
    shortcut: bi
    disabled: false
  - name: brave
    engine: brave
    shortcut: br
    disabled: false
  - name: qwant
    engine: qwant
    shortcut: qw
    disabled: false</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">engines</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">google</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">engine</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">google</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">shortcut</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">go</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">disabled</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># On le garde, mais on ne compte pas que sur lui</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bing</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">engine</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bing</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">shortcut</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bi</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">disabled</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">brave</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">engine</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">brave</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">shortcut</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">br</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">disabled</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">qwant</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">engine</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">qwant</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">shortcut</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">qw</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">disabled</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">false</span></span></code></pre></div>



<h3 class="wp-block-heading">Le filtrage et l&rsquo;autocomplétion</h3>



<p class="wp-block-paragraph" id="p-rc_109101a035ca8487-75">Pour affiner l&rsquo;expérience, j&rsquo;ai réglé le <code>safe_search</code> sur <code>0</code> (pour avoir les résultats bruts) et activé l&rsquo;autocomplétion via Google pour m&rsquo;aider à formuler mes recherches plus rapidement. J&rsquo;ai aussi veillé à ce que le temps de bannissement en cas d&rsquo;échec (<code>ban_time_on_fail</code>) soit assez court pour que le système se rétablisse vite si un moteur me bloque temporairement. </p>



<p class="wp-block-paragraph">Avec ces réglages, mon instance SearXNG n&rsquo;est plus un simple site web de recherche ; elle devient une API privée et ultra-rapide qui alimente mon cerveau numérique en temps réel. Nous avons maintenant un moteur de recherche qui parle le même langage que notre IA.</p>



<h2 class="wp-block-heading">V. Le Mariage : Lier Open WebUI, Ollama et Mistral</h2>



<p class="wp-block-paragraph">C’est ici que la magie opère. Jusqu’à présent, nous avons des moteurs puissants qui tournent chacun dans leur coin. Pour créer mon propre « Perplexity », je dois faire d&rsquo;<strong>Open WebUI</strong> le chef d&rsquo;orchestre de ma station. C&rsquo;est lui qui va recevoir mes questions, décider s&rsquo;il doit aller sur le web, et demander à Mistral de rédiger la synthèse finale.</p>



<h3 class="wp-block-heading">L’interface comme centre de commande</h3>



<p class="wp-block-paragraph" id="p-rc_8c4d4be7351ee485-82">Dans mon installation, Open WebUI n&rsquo;est pas qu&rsquo;une simple peau esthétique posée sur un modèle. C&rsquo;est le point de ralliement. Pour que la liaison soit parfaite, j&rsquo;ai configuré les variables d&rsquo;environnement directement dans le <code>docker-compose.yml</code><sup></sup>.</p>



<p class="wp-block-paragraph" id="p-rc_8c4d4be7351ee485-83">Le réglage le plus sensible concerne le <strong>RAG (Retrieval-Augmented Generation)</strong>. J&rsquo;ai activé la recherche web en pointant vers l&rsquo;URL interne de mon conteneur SearXNG<sup></sup>. Comme ils partagent le même réseau Docker, ils communiquent à une vitesse fulgurante.</p>



<p class="wp-block-paragraph">[CODE : Configuration RAG dans docker-compose.yml]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Variables cruciales pour le mariage technique
- ENABLE_RAG_WEB_SEARCH=True
- RAG_WEB_SEARCH_ENGINE=searxng
- SEARXNG_QUERY_URL=http://searxng:8080/search?q=&lt;query>
- RAG_WEB_SEARCH_RESULT_COUNT=5 # Ma recommandation pour ne rien rater
- RAG_WEB_SEARCH_CONCURRENT_REQUESTS=10</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Variables cruciales pour le mariage technique</span></span>
<span class="line"><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ENABLE_RAG_WEB_SEARCH=True</span></span>
<span class="line"><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">RAG_WEB_SEARCH_ENGINE=searxng</span></span>
<span class="line"><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">SEARXNG_QUERY_URL=http://searxng:8080/search?q=&lt;query&gt;</span></span>
<span class="line"><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">RAG_WEB_SEARCH_RESULT_COUNT=5</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Ma recommandation pour ne rien rater</span></span>
<span class="line"><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">RAG_WEB_SEARCH_CONCURRENT_REQUESTS=10</span></span></code></pre></div>



<h3 class="wp-block-heading">Le choix du modèle : Mistral-Nemo 12B</h3>



<p class="wp-block-paragraph" id="p-rc_8c4d4be7351ee485-84">Pourquoi avoir choisi <strong>Mistral-Nemo 12B</strong> plutôt qu&rsquo;un modèle plus imposant ? Pour une question d&rsquo;équilibre technique. Sur ma carte <strong>RTX 5070 Ti</strong>, ce modèle occupe environ <strong>13 Go de VRAM</strong> lorsqu&rsquo;il est chargé en précision 8-bit (q8_0)<sup></sup>.</p>



<p class="wp-block-paragraph" id="p-rc_8c4d4be7351ee485-85">C&rsquo;est le « sweet spot » : le modèle est assez intelligent pour comprendre des contextes de recherche complexes, tout en laissant assez de place en mémoire vidéo pour que la génération soit quasi instantanée. Si je prenais un modèle plus gros, je risquerais de saturer ma carte et de voir mes performances s&rsquo;effondrer, forçant le système à s&rsquo;appuyer sur le processeur<sup></sup>.</p>



<figure class="wp-block-image size-large"><img width="1024" height="328"  alt="" class="wp-image-253"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-30-1024x328.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-30-1024x328.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-30-300x96.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-30-768x246.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-30.png 1353w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img width="1024" height="495"  alt="" class="wp-image-252"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-29-1024x495.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-29-1024x495.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-29-300x145.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-29-768x371.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-29.png 1370w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">La liaison SearXNG : Le test de vérité</h3>



<p class="wp-block-paragraph">Une fois les services lancés, je me rends dans les paramètres d&rsquo;Open WebUI pour tester la connexion. Il y a un petit indicateur visuel qui confirme que le « Web Search » est actif.</p>



<p class="wp-block-paragraph" id="p-rc_8c4d4be7351ee485-86">Ma petite astuce perso : j&rsquo;ai augmenté le nombre de résultats à <strong>5</strong><sup></sup>. Par défaut, beaucoup d&rsquo;outils s&rsquo;arrêtent à 3. Mais pour des sujets pointus comme la <strong>sécurité informatique</strong>, avoir deux sources supplémentaires permet souvent de dénicher le détail technique qui fait la différence entre une réponse vague et une solution précise.</p>



<figure class="wp-block-video"><video height="810" style="aspect-ratio: 1440 / 810;" width="1440" controls src="https://tazmenworld.com/wp-content/uploads/2026/04/search.mp4" class="lws-optimize-lazyload"></video></figure>



<h3 class="wp-block-heading">Le System Prompt : Donner une personnalité à l&rsquo;IA</h3>



<p class="wp-block-paragraph">Pour que Mistral se comporte comme un analyste et non comme un simple perroquet, j&rsquo;ai affiné son <strong>System Prompt</strong> dans l&rsquo;interface. Je lui demande explicitement de :</p>



<ol start="1" class="wp-block-list">
<li>Analyser systématiquement les sources fournies par SearXNG.</li>



<li>Citer chaque source avec un lien cliquable.</li>



<li>Préciser si les informations trouvées semblent contradictoires ou incomplètes.</li>
</ol>



<p class="wp-block-paragraph">C&rsquo;est cette couche finale qui transforme une suite de conteneurs Docker en un véritable assistant de recherche. Je ne lui demande pas simplement de « savoir », je lui demande de « chercher » avec la rigueur d&rsquo;un documentaliste.</p>



<h2 class="wp-block-heading">VI. Optimisations avancées : Devenir un Power User</h2>



<p class="wp-block-paragraph">Une fois que la liaison entre mon interface et mes moteurs est établie, je ne m&rsquo;arrête pas là. Pour que l&rsquo;expérience dépasse réellement celle d&rsquo;un outil grand public, je dois affiner la qualité des données que Mistral ingère. C&rsquo;est la différence entre une réponse « correcte » et une analyse de niveau expert.</p>



<h3 class="wp-block-heading">Filtrage des sources : Nettoyer le bruit</h3>



<p class="wp-block-paragraph" id="p-rc_928509796eabf825-92">Le web est rempli de sites de basse qualité, de fermes à contenus ou de pages saturées de publicités qui polluent le contexte envoyé à mon IA. Dans mon fichier <code>settings.yml</code>, j&rsquo;ai la possibilité d&rsquo;affiner ce que SearXNG considère comme pertinent<sup></sup>.</p>



<p class="wp-block-paragraph" id="p-rc_928509796eabf825-93">Je privilégie une approche chirurgicale : j&rsquo;augmente le poids (weight) des sources que je juge fiables, comme les dépôts de documentation technique ou les sites académiques, tout en réduisant la visibilité des sites trop généralistes<sup></sup>. C&rsquo;est ce qui permet à mon assistant de ne pas se perdre dans des tutoriels obsolètes quand je lui demande une information sur une bibliothèque Python précise.</p>



<figure class="wp-block-image size-large"><img width="1024" height="709"  alt="" class="wp-image-255"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-31-1024x709.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-31-1024x709.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-31-300x208.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-31-768x532.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-31.png 1504w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Prompt Engineering : Créer l&rsquo;Assistant Chercheur</h3>



<p class="wp-block-paragraph">Le secret d&rsquo;une bonne synthèse réside dans le <strong>System Prompt</strong>. Dans Open WebUI, je ne laisse pas le champ vide. J&rsquo;ai conçu un modèle de prompt qui force Mistral à adopter une démarche scientifique. Je lui demande de comparer les sources entre elles : « Si deux sites se contredisent sur une version logicielle, mentionne-le explicitement et cherche une troisième source pour arbitrer. »</p>



<p class="wp-block-paragraph" id="p-rc_928509796eabf825-94">Cette instruction change tout. L&rsquo;IA ne se contente plus de résumer ; elle vérifie la cohérence des informations qu&rsquo;elle extrait du web via SearXNG<sup></sup>.</p>



<p class="wp-block-paragraph">[CODE : chercheur_expert_prompt.txt]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Tu es un analyste technique de haut niveau. 
Ta mission est de synthétiser les résultats de recherche fournis. 
1. Ignore les publicités et les contenus promotionnels.
2. Priorise les documentations officielles et les forums spécialisés.
3. Cite systématiquement tes sources entre crochets &#91;Source X&#93;.
4. Si les informations sont datées de plus de deux ans, précise-le comme un risque potentiel.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">Tu es un analyste technique de haut niveau.</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #A3BE8C">Ta mission est de synthétiser les résultats de recherche fournis.</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #A3BE8C">1. Ignore les publicités et les contenus promotionnels.</span></span>
<span class="line"><span style="color: #A3BE8C">2. Priorise les documentations officielles et les forums spécialisés.</span></span>
<span class="line"><span style="color: #A3BE8C">3. Cite systématiquement tes sources entre crochets &#91;Source X&#93;.</span></span>
<span class="line"><span style="color: #A3BE8C">4. Si les informations sont datées de plus de deux ans, précise-le comme un risque potentiel.</span></span></code></pre></div>



<h3 class="wp-block-heading">Gestion de la performance et de la VRAM</h3>



<p class="wp-block-paragraph" id="p-rc_928509796eabf825-95">Travailler en local signifie gérer ses ressources. Avec ma <strong>RTX 5070 Ti</strong>, je surveille constamment l&rsquo;occupation de la mémoire vidéo via l&rsquo;outil <code>nvtop</code><sup></sup>. Pour éviter que le système ne ralentisse lors de recherches complexes qui génèrent beaucoup de texte, j&rsquo;ai ajusté la taille du contexte (Context Window) à environ 8 000 tokens.</p>



<p class="wp-block-paragraph" id="p-rc_928509796eabf825-96">C&rsquo;est largement suffisant pour contenir les 5 extraits de recherche de SearXNG et ma propre conversation, tout en gardant une vitesse de génération fulgurante sur mes 13 Go de VRAM disponibles. Si je montais trop haut, la carte pourrait saturer, entrainant une chute drastique des performances au profit du processeur.</p>



<figure class="wp-block-image size-large"><img width="1024" height="752"  alt="" class="wp-image-256"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-32-1024x752.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-32-1024x752.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-32-300x220.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-32-768x564.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-32-1536x1128.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-32.png 1764w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Le réglage fin des concurrent requests</h3>



<p class="wp-block-paragraph" id="p-rc_928509796eabf825-97">Dans mon <code>docker-compose.yml</code>, j&rsquo;ai fixé <code>RAG_WEB_SEARCH_CONCURRENT_REQUESTS</code> à <strong>10</strong>. Pourquoi ? Parce que SearXNG est capable d&rsquo;interroger plusieurs moteurs en même temps. En autorisant 10 requêtes simultanées, je m&rsquo;assure que la phase de recherche ne prend que quelques millisecondes. Mon IA reçoit ses données presque instantanément, ce qui rend l&rsquo;interaction aussi fluide, voire plus, qu&rsquo;avec un service en ligne. </p>



<p class="wp-block-paragraph">Toutes ces petites touches font que ma machine ne se contente pas d&rsquo;imiter un service existant ; elle s&rsquo;adapte précisément à mes besoins et à mon matériel.</p>



<h2 class="wp-block-heading">VII. Démonstration de cas d&rsquo;usage réels</h2>



<p class="wp-block-paragraph">Installer toute cette artillerie est une chose, mais la vraie question demeure : est-ce que ça tient la route face à Perplexity au quotidien ? Pour le savoir, j&rsquo;ai soumis ma station à plusieurs tests intensifs. Voici comment se comporte ce duo Mistral-SearXNG sur des terrains où l&rsquo;on attend normalement des services payants au tournant.</p>



<h3 class="wp-block-heading">Cas d&rsquo;usage n°1 : La veille en cybersécurité</h3>



<p class="wp-block-paragraph">En tant que passionné de <strong>sécurité</strong>, je cherche souvent des détails sur des failles fraîchement découvertes. J&rsquo;ai posé la question suivante : <em>« Quelles sont les dernières vulnérabilités signalées sur Ollama ou les frameworks d&rsquo;IA locale cette semaine ? »</em></p>



<p class="wp-block-paragraph" id="p-rc_2951e23daf06491c-110">Grâce à SearXNG, mon système n&rsquo;est pas allé interroger une base de données statique. Il a fouillé GitHub, des blogs spécialisés et des sites de CVE. Mistral-Nemo a ensuite synthétisé les résultats en isolant les vecteurs d&rsquo;attaque potentiels. </p>



<p class="wp-block-paragraph" id="p-rc_2951e23daf06491c-111"><strong>Le verdict :</strong> La réponse est arrivée en moins de 10 secondes. Là où Perplexity m&rsquo;aurait parfois noyé sous des sources généralistes, ma configuration locale a privilégié les dépôts techniques parce que j&rsquo;ai configuré mes moteurs pour cela<sup></sup>.</p>



<figure class="wp-block-image size-large"><img width="1024" height="427"  alt="" class="wp-image-257"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-33-1024x427.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-33-1024x427.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-33-300x125.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-33-768x320.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-33-1536x641.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-33.png 1685w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Cas d&rsquo;usage n°2 : La vie pratique (Le test du programme TV)</h3>



<p class="wp-block-paragraph">C&rsquo;est le test ultime pour vérifier la fraîcheur des données : <em>« Il y a quoi demain soir sur TF1 ? »</em> Pour une IA classique, c&rsquo;est une question piège. Pour mon installation, c&rsquo;est une routine de recherche web.</p>



<p class="wp-block-paragraph" id="p-rc_2951e23daf06491c-112">Open WebUI a lancé SearXNG, qui a récupéré les grilles horaires de plusieurs sites de programmes TV<sup></sup>. Mistral a lu ces extraits et m&rsquo;a présenté une réponse claire, avec les horaires précis.</p>



<figure class="wp-block-image size-large"><img width="1024" height="532"  alt="" class="wp-image-258"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-34-1024x532.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-34-1024x532.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-34-300x156.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-34-768x399.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-34-1536x798.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-34.png 1748w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Le verdict :</strong> La précision est identique à celle d&rsquo;un moteur commercial. La seule différence ? Personne d&rsquo;autre que moi ne sait que j&rsquo;ai prévu de regarder un documentaire ou un film demain soir. Ma vie privée est préservée pour une information pourtant banale.</p>



<h3 class="wp-block-heading">Cas d&rsquo;usage n°3 : Développement et Hardware</h3>



<p class="wp-block-paragraph">J&rsquo;ai testé une requête technique sur mon propre matériel : <em>« Quelles sont les optimisations recommandées pour faire tourner Mistral-Nemo sur une RTX 5070 Ti sous Ubuntu ? »</em></p>



<p class="wp-block-paragraph" id="p-rc_2951e23daf06491c-113">Le système a croisé des benchmarks récents et des discussions sur des forums spécialisés. Il m&rsquo;a suggéré d&rsquo;utiliser des versions quantifiées (q8_0) pour occuper environ 13 Go de VRAM et conserver une réactivité maximale. C&rsquo;est exactement ce que j&rsquo;ai constaté en surveillant mon outil <code>nvtop</code>. </p>



<figure class="wp-block-image size-large"><img width="1024" height="589"  alt="" class="wp-image-259"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-35-1024x589.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-35-1024x589.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-35-300x173.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-35-768x442.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-35.png 1120w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Bilan de performance</h3>



<p class="wp-block-paragraph">Après plusieurs jours d&rsquo;utilisation intensive, voici mon constat :</p>



<ul class="wp-block-list">
<li><strong>Rapidité :</strong> Sur ma machine (Ryzen 9 9900X et RTX 5070 Ti), la génération est quasi instantanée après la phase de recherche web qui prend environ 2 secondes. </li>



<li><strong>Pertinence :</strong> En passant à 5 sources de recherche au lieu de 3, j&rsquo;ai éliminé la majorité des réponses incomplètes que j&rsquo;avais au début de mes tests.</li>



<li><strong>Confidentialité :</strong> C&rsquo;est le point de rupture total avec les solutions cloud. Je peux poser des questions sur des codes sources privés ou des documents sensibles sans aucune crainte.</li>
</ul>



<p class="wp-block-paragraph">[CODE : exemple_reponse_sourcee.json]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{
  "question": "Dernière version stable de SearXNG ?",
  "reponse": "La version actuelle est disponible sur GitHub...",
  "sources": &#91;
    {"titre": "SearXNG Releases", "url": "https://github.com/searxng/searxng/releases"},
    {"titre": "Documentation officielle", "url": "https://docs.searxng.org/"}
  &#93;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">question</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Dernière version stable de SearXNG ?</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">reponse</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">La version actuelle est disponible sur GitHub...</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">sources</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">titre</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SearXNG Releases</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">url</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://github.com/searxng/searxng/releases</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">titre</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Documentation officielle</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">url</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://docs.searxng.org/</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&#93;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">En résumé, remplacer Perplexity n&rsquo;est pas seulement une déclaration d&rsquo;indépendance ; c&rsquo;est un gain réel en précision et en tranquillité d&rsquo;esprit pour quiconque prend ses données au sérieux.</p>



<h2 class="wp-block-heading">VIII. Conclusion : Le bilan de la liberté</h2>



<p class="wp-block-paragraph">Après avoir parcouru ce long chemin de configuration, de réglages de fichiers YAML et de tests de requêtes, je me pose souvent la question : est-ce que le jeu en vaut la chandelle ? La réponse, pour moi, est un grand « oui ».</p>



<p class="wp-block-paragraph">Remplacer Perplexity par une solution locale n&rsquo;est pas seulement un défi technique gratifiant. C&rsquo;est un acte de reprise de contrôle. En voyant ma <strong>RTX 5070 Ti</strong> grimper à 79% de charge pour synthétiser en quelques secondes une réponse complexe, je ressens une satisfaction que seul le « fait maison » peut procurer.</p>



<h3 class="wp-block-heading">Performance vs Praticité : L&rsquo;heure du bilan</h3>



<p class="wp-block-paragraph">Si l&rsquo;on regarde froidement les chiffres, voici ce que je retiens de ma <strong>Tazmen Station</strong> face aux solutions propriétaires :</p>



<ul class="wp-block-list">
<li><strong>Vie privée :</strong> C&rsquo;est la victoire par K.O. Aucune de mes données ne quitte mon réseau local. SearXNG agit comme un bouclier impénétrable entre mes intentions de recherche et les régies publicitaires.</li>



<li><strong>Vitesse :</strong> Grâce au couple <strong>Ryzen 9 9900X</strong> et GPU NVIDIA, la latence est extrêmement faible. Une fois la phase de recherche web terminée, Mistral-Nemo génère du texte à une vitesse qui n&rsquo;a rien à envier aux versions payantes de GPT ou Claude. </li>



<li><strong>Coût :</strong> Certes, l&rsquo;investissement matériel est là. Mais à 20 € par mois d&rsquo;abonnement économisés, ma station est rentabilisée sur la durée, sans compter qu&rsquo;elle me sert aussi pour d&rsquo;autres tâches lourdes.</li>



<li><strong>Précision :</strong> En forçant le système à lire 5 sources via SearXNG au lieu des 3 habituelles, j&rsquo;ai obtenu une profondeur d&rsquo;analyse qui m&rsquo;a bluffé, notamment sur les sujets de <strong>sécurité</strong>.</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Caractéristique</strong></td><td><strong>Perplexity (Cloud)</strong></td><td><strong>Mistral Local + SearXNG</strong></td></tr><tr><td><strong>Vie privée &amp; Sécurité</strong></td><td>Données traitées sur serveurs tiers (Cloud).</td><td>Souveraineté totale : aucune donnée ne quitte ton réseau local.</td></tr><tr><td><strong>Coût mensuel</strong></td><td>Environ 20 $ / mois pour la version Pro.</td><td>0 € (une fois le matériel acquis).</td></tr><tr><td><strong>Moteur de recherche</strong></td><td>Algorithme propriétaire (boîte noire).</td><td><strong>SearXNG</strong> : Agrégateur anonyme et transparent (Bing, Google, Brave, etc.).</td></tr><tr><td><strong>Contrôle du RAG</strong></td><td>Limité aux réglages de l&rsquo;interface.</td><td>Maîtrise totale du nombre de sources (ex: 5 sources) et du filtrage.</td></tr><tr><td><strong>Matériel requis</strong></td><td>Une simple connexion internet.</td><td>GPU dédié (<strong>RTX 5070 Ti</strong>) et CPU performant (<strong>Ryzen 9 9900X</strong>).</td></tr><tr><td><strong>Dépendance</strong></td><td>Dépend de la connexion et de la stabilité du service tiers.</td><td>Autonomie complète : fonctionne même hors-ligne (hors recherche web).</td></tr><tr><td><strong>Modèles de langage</strong></td><td>Modèles imposés (GPT-4, Claude, etc.).</td><td>Liberté de choix et de mise à jour (ex: <strong>Mistral-Nemo 12B</strong>).</td></tr><tr><td><strong>Performance (Inférence)</strong></td><td>Variable selon la charge des serveurs distants.</td><td>Quasi instantanée sur GPU local (13 Go de VRAM mobilisés).</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Et quoi après ?</h3>



<p class="wp-block-paragraph" id="p-rc_ba25ed05b53015be-130">Ce guide n&rsquo;est que le début. Avec cette infrastructure Docker solide, je peux maintenant explorer de nouveaux horizons<sup></sup>. L&rsquo;étape suivante pour moi sera d&rsquo;intégrer des agents autonomes capables d&rsquo;exécuter des tâches encore plus complexes à partir de mes recherches web.</p>



<p class="wp-block-paragraph">Bâtir sa propre IA, c&rsquo;est accepter de passer un peu de temps dans son terminal pour gagner une liberté qui n&rsquo;a pas de prix. J&rsquo;espère que ce guide vous aura donné les clés pour, vous aussi, transformer votre machine Ubuntu en une forteresse d&rsquo;intelligence privée.</p>



<p class="wp-block-paragraph">[CODE : commande_finale_restart.sh]</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Pour relancer l'ensemble après une mise à jour des modèles
sudo docker compose down &amp;&amp; sudo docker compose up -d --remove-orphans</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Pour relancer l&#39;ensemble après une mise à jour des modèles</span></span>
<span class="line"><span style="color: #A3BE8C">sudo docker compose down &amp;&amp; sudo docker compose up -d --remove-orphans</span></span></code></pre></div>



<p class="wp-block-paragraph">Merci de m&rsquo;avoir suivi dans cette exploration technique. Si vous avez des questions sur la configuration de votre GPU ou sur les subtilités de SearXNG, n&rsquo;hésitez pas à partager vos retours. La route vers l&rsquo;IA locale est vaste, et nous ne faisons que commencer à en dessiner les contours. </p>



<p class="wp-block-paragraph">A bientôt Louis 🐇 🤜 🤛 🐰</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/04/30/comment-remplacer-perplexity-par-mistral-en-local/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/04/search.mp4" length="2251368" type="video/mp4" />

			</item>
		<item>
		<title>La Chine est en train de dépasser les Américains sur l&#8217;IA, et &#8230;.. c&#8217;est une étude américaine qui le dit</title>
		<link>https://tazmenworld.com/2026/04/23/la-chine-est-en-train-de-depasser-les-americains-sur-lia-et-cest-une-etude-americaine-qui-le-dit/</link>
					<comments>https://tazmenworld.com/2026/04/23/la-chine-est-en-train-de-depasser-les-americains-sur-lia-et-cest-une-etude-americaine-qui-le-dit/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 15:05:21 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=232</guid>

					<description><![CDATA[Si tu suis mes articles sur l&#8217;optimisation hardware et le scripting headless, tu sais que je ne suis pas du genre à m&#8217;emballer pour les communiqués de presse lisses ou les promesses marketing. Mais aujourd&#8217;hui, on va lever le nez du terminal pour regarder un dossier qui va sérieusement bousculer nos habitudes. Le baromètre mondial [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="559"  alt="" class="wp-image-238"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/Image_x9nge8x9nge8x9ng-1024x559.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/Image_x9nge8x9nge8x9ng-1024x559.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_x9nge8x9nge8x9ng-300x164.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_x9nge8x9nge8x9ng-768x419.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_x9nge8x9nge8x9ng-1536x838.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/Image_x9nge8x9nge8x9ng-2048x1117.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Si tu suis mes articles sur l&rsquo;optimisation hardware et le scripting headless, tu sais que je ne suis pas du genre à m&#8217;emballer pour les communiqués de presse lisses ou les promesses marketing. Mais aujourd&rsquo;hui, on va lever le nez du terminal pour regarder un dossier qui va sérieusement bousculer nos habitudes.</p>



<p class="wp-block-paragraph">Le baromètre mondial de l&rsquo;IA (le fameux AI Index Report 2026 de Stanford) vient de sortir, et c’est une sacrée douche froide pour ceux qui pensaient que l’hégémonie de la Silicon Valley était gravée dans le marbre. On ne parle pas de spéculation ou de propagande, mais de faits documentés par l&rsquo;élite universitaire américaine : la Chine n&rsquo;est plus dans le rétroviseur, elle est en train de déboîter sur la file de gauche.</p>



<p class="wp-block-paragraph">Dans cet article, on va plonger dans le dur. On va voir comment les ingénieurs chinois ont réussi à transformer les sanctions sur les puces en un moteur pour leur propre souveraineté technique. On va parler de modèles massifs entraînés sans une seule puce Nvidia, de la fin de la dépendance à TSMC et de ce que cela signifie concrètement pour nos futures infras. Pas de langue de bois, juste de la technique, des chiffres et de la géopolitique appliquée. Attache ta ceinture, on va parler puissance brute et silicium.</p>



<h2 class="wp-block-heading">L&rsquo;évaporation de l&rsquo;écart technique : les chiffres qui fâchent</h2>



<p class="wp-block-paragraph">Pendant que les médias occidentaux se focalisaient sur les chatbots capables de générer des poèmes, les labos chinois ont bossé sur la performance brute. Le rapport de Stanford met en lumière une donnée qui devrait donner des sueurs froides à la tech américaine : l&rsquo;écart de performance entre les meilleurs modèles américains et les fleurons chinois comme DeepSeek ou Qwen est désormais inférieur à 3 %.</p>



<p class="wp-block-paragraph">En mars 2026, sur les benchmarks les plus exigeants ceux qui testent le codage informatique complexe, les mathématiques de niveau compétition et les raisonnements scientifiques de niveau doctorat la supériorité américaine est devenue un concept purement théorique. Pour nous, qui utilisons ces outils pour automatiser des workflows ou scripter des tâches complexes, la différence est devenue imperceptible en production.</p>



<figure class="wp-block-image size-full"><img width="906" height="632"  alt="" class="wp-image-233"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-17.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-17.png 906w, https://tazmenworld.com/wp-content/uploads/2026/04/image-17-300x209.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-17-768x536.png 768w" sizes="auto, (max-width: 906px) 100vw, 906px" /><figcaption class="wp-element-caption">Benchmarks de performance technique de l&rsquo;IA sélectifs par rapport aux performances humaines. source: ai_index_report_2026</figcaption></figure>



<h2 class="wp-block-heading">Le cas DeepSeek V4 : 1000 milliards de paramètres sans Nvidia</h2>



<p class="wp-block-paragraph">C&rsquo;est ici qu&rsquo;on entre dans le vif du sujet hardware. Les USA ont misé gros sur l&#8217;embargo des puces H100 et H200 de Nvidia pour freiner la Chine. Ils ont pensé qu&rsquo;en coupant l&rsquo;accès au silicium de pointe produit par TSMC, ils bloqueraient net la capacité de calcul chinoise.</p>



<p class="wp-block-paragraph">C&rsquo;est exactement l&rsquo;inverse qui s&rsquo;est produit. Le rapport mentionne l&rsquo;émergence de DeepSeek V4, un modèle massif de 1 000 milliards de paramètres. La véritable claque technique réside dans le fait que ce modèle a été entraîné à 100 % sur des clusters de puces Huawei Ascend.</p>



<p class="wp-block-paragraph">Habituellement, l&rsquo;entraînement de modèles de cette taille nécessite une interconnexion ultra-rapide entre les puces, un domaine où Nvidia régnait sans partage avec son protocole NVLink. Huawei a réussi à développer sa propre stack complète pour contourner ce goulot d&rsquo;étranglement :</p>



<ol start="1" class="wp-block-list">
<li>Les puces Ascend qui, bien que moins performantes par unité que les dernières Blackwell de Nvidia, sont optimisées pour travailler en clusters géants de manière très cohérente.</li>



<li>Un framework propriétaire, MindSpore, qui remplace PyTorch et qui est taillé sur mesure pour exploiter le silicium domestique.</li>



<li>Une indépendance totale vis-à-vis de TSMC pour la production, la Chine ayant réussi à optimiser ses procédés de lithographie pour sortir des volumes suffisants de puces de calcul performantes.</li>
</ol>



<p class="wp-block-paragraph">On est passé d&rsquo;une dépendance critique à une autonomie forcée. La Chine a appris à faire de l&rsquo;IA avec son propre hardware, là où le reste du monde est encore suspendu aux carnets de commandes de Nvidia.</p>



<h2 class="wp-block-heading">L&rsquo;architecture MoE et l&rsquo;optimisation au couteau</h2>



<p class="wp-block-paragraph">Si tu as lu mes posts sur le VRAM tuning, tu sais que la mémoire est le nerf de la guerre. Les ingénieurs chinois n&rsquo;ont pas cherché à copier bêtement l&rsquo;approche de puissance brute adoptée par OpenAI. Ils ont poussé l&rsquo;architecture Mixture of Experts (MoE) dans ses derniers retranchements.</p>



<p class="wp-block-paragraph">L&rsquo;idée est simple : au lieu d&rsquo;activer les 1000 milliards de paramètres à chaque requête, le modèle ne sollicite que les experts concernés par le sujet. Cela permet de réduire la consommation électrique et, surtout, de faire tourner des modèles très puissants sur des configurations hardware qui auraient été jugées insuffisantes il y a deux ans. En clair, ils font plus avec moins de VRAM, ce qui est un avantage stratégique énorme quand on a un accès limité au hardware de pointe.</p>



<figure class="wp-block-image size-full"><img width="537" height="948"  alt="" class="wp-image-235"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/architecture-Dense.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/architecture-Dense.jpg 537w, https://tazmenworld.com/wp-content/uploads/2026/04/architecture-Dense-170x300.jpg 170w" sizes="auto, (max-width: 537px) 100vw, 537px" /><figcaption class="wp-element-caption">Architecture <em>Dense</em>, chaque neurone est connecté à tous les neurones de la couche suivante (comme un réseau classique)</figcaption></figure>



<figure class="wp-block-image size-full is-resized"><img width="682" height="700"  alt="" class="wp-image-236" style="width:682px;height:auto"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/architecture-Mixture-of-Experts-MoE.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/architecture-Mixture-of-Experts-MoE.jpg 682w, https://tazmenworld.com/wp-content/uploads/2026/04/architecture-Mixture-of-Experts-MoE-292x300.jpg 292w" sizes="auto, (max-width: 682px) 100vw, 682px" /><figcaption class="wp-element-caption"><em>Mixture of Experts (MoE)</em> utilise plusieurs sous-réseaux spécialisés (<em>experts</em>), activés dynamiquement par un <em>gating network</em> pour traiter l’entrée, combinant ensuite leurs résultats pondérés, ce qui permet une modélisation plus flexible et efficace pour des tâches complexes</figcaption></figure>



<h2 class="wp-block-heading">La fuite des cerveaux à l&rsquo;envers : l&rsquo;impact politique</h2>



<p class="wp-block-paragraph">Le rapport de Stanford souligne un point critique sur le capital humain, et c’est peut-être là que le bât blesse le plus pour Washington. Historiquement, les USA étaient un aspirateur à talents sans équivalent. Un étudiant chinois brillant finissait ses études à Stanford et restait bosser dans la Silicon Valley pour créer de la valeur aux États-Unis.</p>



<p class="wp-block-paragraph">Ce cycle vertueux pour l’économie américaine est en train de se briser. Le rapport note une chute brutale de 89 % des arrivées de chercheurs étrangers en IA aux USA depuis 2017. Cette date n&rsquo;est pas un hasard : elle marque le début du durcissement drastique de la politique migratoire sous l&rsquo;administration Trump.</p>



<p class="wp-block-paragraph">L&rsquo;image projetée à l&rsquo;international, marquée par une administration perçue comme hostile aux étrangers et les actions d&rsquo;une agence comme l&rsquo;ICE (Immigration and Customs Enforcement) aux méthodes de plus en plus paramilitaires, a créé un climat de méfiance profonde. Pour un chercheur de haut niveau, le rêve américain a été remplacé par l&rsquo;incertitude des visas et un sentiment d&rsquo;insécurité.</p>



<p class="wp-block-paragraph">Aujourd&rsquo;hui, la majorité des cerveaux formés en Chine, ou même ceux formés aux États-Unis, choisissent de retourner au pays pour monter des structures ou rejoindre des géants comme Baidu, Tencent ou Huawei. Ce n&rsquo;est plus seulement une guerre de puces, c&rsquo;est une guerre de neurones, et les USA sont en train de perdre leur force d&rsquo;attraction principale. La Chine produit désormais plus de papiers de recherche de haut niveau que n&rsquo;importe quelle autre nation, et la force de leur système est que ces recherches sont immédiatement injectées dans leur tissu industriel.</p>



<figure class="wp-block-image size-full"><img width="932" height="1001"  alt="" class="wp-image-237"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-18.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-18.png 932w, https://tazmenworld.com/wp-content/uploads/2026/04/image-18-279x300.png 279w, https://tazmenworld.com/wp-content/uploads/2026/04/image-18-768x825.png 768w" sizes="auto, (max-width: 932px) 100vw, 932px" /><figcaption class="wp-element-caption">Tableau issu du chapitre Economy du rapport montrant la répartition géographique des publications de recherche en IA. source: ai_index_report_2026</figcaption></figure>



<h2 class="wp-block-heading">La frontière en dents de scie et le pragmatisme industriel</h2>



<p class="wp-block-paragraph">Un concept fondamental du rapport est la Sawtooth Frontier. Cela décrit le fait que l&rsquo;IA ne progresse pas de manière uniforme. Un modèle peut être un génie en programmation mais être incapable de comprendre un concept social simple.</p>



<p class="wp-block-paragraph">Alors que les Américains cherchent à créer une Intelligence Artificielle Générale capable de tout faire, les Chinois se concentrent sur une IA de production. Leurs investissements massifs sont fléchés vers des domaines concrets :</p>



<ol start="1" class="wp-block-list">
<li>L&rsquo;optimisation des réseaux électriques et des flux logistiques.</li>



<li>La conception assistée de nouveaux matériaux et semi-conducteurs.</li>



<li>L&rsquo;automatisation de la cybersécurité.</li>
</ol>



<p class="wp-block-paragraph">C&rsquo;est une approche purement utilitaire. Ils ne cherchent pas à ce que l&rsquo;IA soit humaine, ils cherchent à ce qu&rsquo;elle soit efficace. C&rsquo;est du headless appliqué à l&rsquo;échelle d&rsquo;un pays : on enlève l&rsquo;interface polie pour ne garder que le moteur de calcul.</p>



<h2 class="wp-block-heading">Le coût caché : l&rsquo;alerte environnementale</h2>



<p class="wp-block-paragraph">Même si la Chine gagne la course, le rapport de Stanford tire une sonnette d&rsquo;alarme sur le coût énergétique et environnemental. On parle souvent de la consommation des datacenters, mais les chiffres ici sont vertigineux. L&rsquo;entraînement d&rsquo;un modèle comme DeepSeek V4 consomme plus d&rsquo;eau pour le refroidissement que ce que consomme une ville moyenne en un an.</p>



<p class="wp-block-paragraph">La Chine, avec ses besoins énergétiques monstrueux, semble prête à payer ce prix pour la domination technologique. C&rsquo;est un facteur que les régulations européennes ou américaines pourraient limiter chez nous, créant un nouveau déséquilibre compétitif majeur.</p>



<h2 class="wp-block-heading">Conclusion : On fait quoi maintenant ?</h2>



<p class="wp-block-paragraph">On ne va pas se mentir : le centre de gravité a basculé. Ce rapport de Stanford n&rsquo;est pas une simple étude de plus, c&rsquo;est l&rsquo;aveu de la fin d&rsquo;un monopole. Pour nous, les techniciens, cela signifie que notre boîte à outils va changer.</p>



<p class="wp-block-paragraph">Il va falloir apprendre à bosser avec ces modèles venus d&rsquo;ailleurs, comprendre leurs frameworks et arrêter de penser que si ce n&rsquo;est pas développé en Californie, c&rsquo;est forcément moins bon. La réalité du terrain, celle des benchmarks et des clusters de serveurs, raconte une tout autre histoire.</p>



<p class="wp-block-paragraph">On est à l&rsquo;aube d&rsquo;une ère où la puissance de calcul ne dépendra plus d&rsquo;une seule marque de cartes graphiques ou d&rsquo;une seule fonderie à Taïwan. C&rsquo;est le retour de la diversité technique, et pour ceux qui aiment l&rsquo;optimisation et la performance, c&rsquo;est un nouveau terrain de jeu passionnant.</p>



<p class="wp-block-paragraph">On se retrouve pour le prochain article où on verra comment installer et quantifier localement ces nouveaux modèles pour voir ce qu&rsquo;ils ont vraiment dans le ventre.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Analyse comparative (Données Stanford AI Index 2026)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Critère</strong></td><td><strong>Bloc Américain</strong></td><td><strong>Bloc Chinois</strong></td></tr></thead><tbody><tr><td>Hardware dominant</td><td>Nvidia (Série H/Blackwell)</td><td>Huawei (Série Ascend)</td></tr><tr><td>Dépendance TSMC</td><td>Totale (N3/N2)</td><td>En forte diminution</td></tr><tr><td>Stratégie de modèle</td><td>AGI / Conversationnel</td><td>Industriel / Efficience MoE</td></tr><tr><td>Flux de talents</td><td>En baisse (Immigration -89%)</td><td>En hausse (Rétention interne)</td></tr><tr><td>Contexte politique</td><td>Instabilité des visas / ICE</td><td>Souveraineté et rapatriement</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Source: https://hai.stanford.edu/ai-index</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/04/23/la-chine-est-en-train-de-depasser-les-americains-sur-lia-et-cest-une-etude-americaine-qui-le-dit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Diagrammes auto-générés : Comment piloter Excalidraw en local avec une IA sans aucun effort</title>
		<link>https://tazmenworld.com/2026/04/22/diagrammes-auto-generes-comment-piloter-excalidraw-en-local-avec-une-ia-sans-aucun-effort/</link>
					<comments>https://tazmenworld.com/2026/04/22/diagrammes-auto-generes-comment-piloter-excalidraw-en-local-avec-une-ia-sans-aucun-effort/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 07:12:49 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=224</guid>

					<description><![CDATA[Aujourd&#8217;hui, on va parler d&#8217;un sujet qui me tient à cœur : comment faire bosser une IA à sa place quand on a une tablette graphique, des idées, mais une flemme monumentale de tracer des flèches droites. On va transformer une simple interface de dessin en un outil agentique piloté par Ollama. Accrochez-vous, ça va [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-229"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/47yhmv47yhmv47yh_cleanup-1024x572.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/47yhmv47yhmv47yh_cleanup-1024x572.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/47yhmv47yhmv47yh_cleanup-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/47yhmv47yhmv47yh_cleanup-768x429.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/47yhmv47yhmv47yh_cleanup.png 1376w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Aujourd&rsquo;hui, on va parler d&rsquo;un sujet qui me tient à cœur : comment faire bosser une IA à sa place quand on a une tablette graphique, des idées, mais une flemme monumentale de tracer des flèches droites. On va transformer une simple interface de dessin en un outil agentique piloté par Ollama. Accrochez-vous, ça va être dense.</p>



<h2 class="wp-block-heading">L&rsquo;Intro : La Tablette, la Formation et la Grosse Flemme</h2>



<p class="wp-block-paragraph">Quand je donne des formations, j’adore utiliser Excalidraw. C&rsquo;est souple, c&rsquo;est propre, et avec ma tablette, j&rsquo;ai l&rsquo;impression d&rsquo;être sur un vrai tableau blanc. C&rsquo;est parfait pour gribouiller des concepts en direct. Mais on va être honnête deux minutes : parfois, je suis en manque total d’inspiration pour mes schémas.</p>



<p class="wp-block-paragraph">Dessiner une architecture microservices avec 15 nœuds, trois bases de données et un bus de messages alors que j&rsquo;ai déjà parlé pendant trois heures ? J&rsquo;ai juste une grosse flemme. L’idée, c&rsquo;était simple : je veux une IA, en local (parce que ma VRAM, je l&rsquo;ai payée, alors je l&rsquo;utilise), qui puisse « tenir le pinceau » pendant que j&rsquo;explique le concept aux élèves. On ne parle pas juste de générer une image statique, mais d&rsquo;avoir un vrai <strong>Agent</strong> qui manipule le canvas en temps réel sous mes yeux.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Étape 1 : Monter le Tableau Blanc (Installation d&rsquo;Excalidraw)</h2>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-172">Avant de parler IA, il nous faut le support. La façon la plus simple et la plus propre de faire tourner Excalidraw chez soi sans dépendre du cloud, c&rsquo;est Docker<sup></sup>.</p>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-173">Tu peux le lancer en une seule ligne de commande pour tester<sup></sup>: <code>docker run --rm -dit --name excalidraw -p 8000:80 excalidraw/excalidraw:latest</code><sup></sup>.</p>



<p class="wp-block-paragraph">Mais comme on est sur une <strong>AI Station</strong> sérieuse, on va l&rsquo;intégrer proprement dans notre <code>docker-compose.yml</code>. Cela nous permet de gérer les ports et les redémarrages automatiques.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># --- TABLEAU BLANC EXCALIDRAW ---
  excalidraw:
    image: excalidraw/excalidraw:latest
    container_name: excalidraw
    ports:
      - "8000:80" # Accessible sur http://localhost:8000
    restart: unless-stopped</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># --- TABLEAU BLANC EXCALIDRAW ---</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">excalidraw:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">image:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">excalidraw/excalidraw:latest</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">container_name:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">excalidraw</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ports:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8000:80</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Accessible sur http://localhost:8000</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">restart:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span></code></pre></div>



<p class="wp-block-paragraph"><br>Une fois que c&rsquo;est lancé, tu as ton Excalidraw perso sur le port 8000. C’est rapide, c’est léger, et ça ne demande aucune configuration complexe pour commencer à dessiner avec sa tablette ou sur son ordinateur et c&rsquo;est gratuit :D.<br></p>



<figure class="wp-block-image size-large"><img width="1024" height="746"  alt="" class="wp-image-225"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-16-1024x746.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-16-1024x746.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-16-300x219.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-16-768x560.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-16.png 1253w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Étape 2 : L&rsquo;Intelligence de Dessin (Serveur MCP)</h2>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-176">Maintenant, on veut que l&rsquo;IA puisse interagir avec ce canvas. Pour ça, on utilise le protocole <strong>MCP</strong> (Model Context Protocol). J’ai choisi le projet <code>mcp-excalidraw-local</code> qui propose environ 32 outils pour manipuler le tableau blanc (créer des formes, du texte, des flèches, etc.).</p>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-177">Pour l&rsquo;intégrer à l&rsquo;infra, on ajoute un service dédié qui va compiler les sources GitHub.</p>



<h3 class="wp-block-heading">Le Dockerfile du serveur MCP</h3>



<p class="wp-block-paragraph">On crée un fichier <code>Dockerfile.mcp-excalidraw</code> :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>FROM node:20-slim
RUN apt-get update &amp;&amp; apt-get install -y git python3 make g++ &amp;&amp; rm -rf /var/lib/apt/lists/*
RUN npm install -g pnpm
WORKDIR /app
RUN git clone https://github.com/sanjibdevnathlabs/mcp-excalidraw-local.git .
RUN pnpm install &amp;&amp; pnpm build
# Le serveur attend des commandes stdio par défaut
CMD &#91;"node", "dist/index.js"&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">FROM</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">node:20-slim</span></span>
<span class="line"><span style="color: #88C0D0">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">python3</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">make</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">g++</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">rm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-rf</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/var/lib/apt/lists/</span><span style="color: #81A1C1">*</span></span>
<span class="line"><span style="color: #88C0D0">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">npm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-g</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pnpm</span></span>
<span class="line"><span style="color: #88C0D0">WORKDIR</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/app</span></span>
<span class="line"><span style="color: #88C0D0">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clone</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">https://github.com/sanjibdevnathlabs/mcp-excalidraw-local.git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pnpm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">pnpm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">build</span></span>
<span class="line"><span style="color: #616E88"># Le serveur attend des commandes stdio par défaut</span></span>
<span class="line"><span style="color: #88C0D0">CMD</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">node</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">, </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">dist/index.js</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">&#93;</span></span></code></pre></div>



<h3 class="wp-block-heading">Le Bridge pour Open-WebUI</h3>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-178">Le souci, c&rsquo;est que mon interface préférée, <strong>Open-WebUI</strong>, ne parle pas nativement le « stdio » (le langage des terminaux) pour le MCP. Elle préfère le HTTP. On va donc utiliser un bridge appelé <strong>mcpo</strong> qui va faire la traduction.</p>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-179">On ajoute ces deux services à notre <code>docker-compose.yml</code><sup></sup><sup></sup><sup></sup><sup></sup>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mcp-excalidraw:
    build:
      context: .
      dockerfile: Dockerfile.mcp-excalidraw
    container_name: mcp-excalidraw
    ports:
      - "3001:3000"
    environment:
      - CANVAS_PORT=3000
      - EXCALIDRAW_DB_PATH=/app/data/excalidraw.db
    volumes:
      - /chemin/vers/votre/data:/app/data
    restart: unless-stopped

  mcpo:
    image: ghcr.io/open-webui/mcpo:main
    container_name: mcpo
    ports:
      - "8081:8080"
    volumes:
      - ./mcpo/config.json:/app/config.json:ro
    depends_on:
      - mcp-excalidraw
    restart: unless-stopped</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">mcp-excalidraw:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">build:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">context:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">dockerfile:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Dockerfile.mcp-excalidraw</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">container_name:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mcp-excalidraw</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ports:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3001:3000</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">environment:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">CANVAS_PORT=</span><span style="color: #B48EAD">3000</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">EXCALIDRAW_DB_PATH=/app/data/excalidraw.db</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">volumes:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/chemin/vers/votre/data:/app/data</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">restart:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">mcpo:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">image:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ghcr.io/open-webui/mcpo:main</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">container_name:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mcpo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ports:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8081:8080</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">volumes:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./mcpo/config.json:/app/config.json:ro</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">depends_on:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mcp-excalidraw</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">restart:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span></code></pre></div>



<p class="wp-block-paragraph">Il ne faut pas oublier de créer le fichier <code>./mcpo/config.json</code> pour dire à mcpo d&rsquo;aller chercher le serveur Excalidraw:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{
  "mcpServers": {
    "excalidraw": {
      "type": "sse",
      "url": "http://mcp-excalidraw:3000/sse"
    }
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">&quot;mcpServers&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">&quot;excalidraw&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">&quot;type&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">sse</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">&quot;url&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http://mcp-excalidraw:3000/sse</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">  }</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span></code></pre></div>



<h2 class="wp-block-heading">Étape 3 : Le Tool Python « Agentic » (La Touche Finale)</h2>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-181">Après pas mal de tests, j&rsquo;ai réalisé que pour avoir un contrôle total, rien ne vaut un <strong>Tool Python</strong> personnalisé dans Open-WebUI. Cela permet d&rsquo;éviter les erreurs de protocole et de formater les requêtes exactement comme l&rsquo;API du serveur MCP l&rsquo;attend.</p>



<h3 class="wp-block-heading">Pourquoi ce script ?</h3>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-182">J&rsquo;ai découvert deux bugs critiques en analysant les logs:</p>



<ol start="1" class="wp-block-list">
<li>L&rsquo;API attend un objet pour le texte : <code>{"label": {"text": "votre texte"}}</code> et non une simple string.</li>



<li>Pour le Mermaid, le champ doit s&rsquo;appeler <code>mermaidDiagram</code>.</li>
</ol>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-185">Voici le script <code>excalidraw_tool.py</code> corrigé que j&rsquo;utilise<sup></sup><sup></sup><sup></sup><sup></sup>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>"""
title: Excalidraw Canvas Tool
author: tazmen
description: Contrôle le canvas Excalidraw local
version: 1.2.0
"""
import json
import requests
import time

EXCALIDRAW_API = "http://mcp-excalidraw:3000"

class Tools:
    def add_element(self, type: str, label: str = "", x: int = 100, y: int = 100, width: int = 200, height: int = 100):
        """Ajoute un élément sur le canvas."""
        try:
            payload = {
                "type": type,
                "label": {"text": label}, # Formatage correct pour l'API
                "x": x, "y": y,
                "width": width, "height": height
            }
            r = requests.post(f"{EXCALIDRAW_API}/api/elements", json=payload, timeout=5)
            return "Élément ajouté."
        except Exception as e:
            return f"Erreur: {e}"

    def create_diagram_from_mermaid(self, mermaid_code: str) -> str:
        """Convertit un code Mermaid en schéma Excalidraw."""
        try:
            r = requests.post(
                f"{EXCALIDRAW_API}/api/elements/from-mermaid",
                json={"mermaidDiagram": mermaid_code}, # Champ corrigé
                timeout=10
            )
            time.sleep(2) # On laisse le temps au rendu
            return "Schéma généré."
        except Exception as e:
            return f"Erreur: {e}"

    def clear_canvas(self):
        """Vide le tableau blanc."""
        requests.delete(f"{EXCALIDRAW_API}/api/elements/clear", timeout=5)
        return "Canvas nettoyé."</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #88C0D0">title: Excalidraw Canvas Tool</span></span>
<span class="line"><span style="color: #88C0D0">author: tazmen</span></span>
<span class="line"><span style="color: #88C0D0">description: Contrôle le canvas Excalidraw local</span></span>
<span class="line"><span style="color: #88C0D0">version: 1.2.0</span></span>
<span class="line"><span style="color: #88C0D0">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">json</span></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">requests</span></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">time</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">EXCALIDRAW_API</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http://mcp-excalidraw:3000</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">class</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Tools:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">add_element</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">self,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">type:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">str,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">label:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">str</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;&quot;</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">y:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">width:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">200</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">height:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">int</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">&quot;&quot;&quot;Ajoute un élément sur le canvas.&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">try:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">payload</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #88C0D0">&quot;type&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">type,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #88C0D0">&quot;label&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">label},</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Formatage correct pour l&#39;API</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #88C0D0">&quot;x&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">y</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">y,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #88C0D0">&quot;width&quot;</span><span style="color: #88C0D0">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">width,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">height</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">height</span></span>
<span class="line"><span style="color: #D8DEE9FF">            }</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">r</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">requests.post</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">f</span><span style="color: #88C0D0">&quot;{EXCALIDRAW_API}/api/elements&quot;</span><span style="color: #88C0D0">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">json=payload,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">timeout=</span><span style="color: #B48EAD">5</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Élément ajouté.</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">except</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Exception</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">as</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">f</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erreur: {e}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">create_diagram_from_mermaid</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">self,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mermaid_code:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">str</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> -</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">str:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">&quot;&quot;&quot;Convertit un code Mermaid en schéma Excalidraw.&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">try:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">r</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">requests.post</span><span style="color: #ECEFF4">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #88C0D0">f</span><span style="color: #88C0D0">&quot;{EXCALIDRAW_API}/api/elements/from-mermaid&quot;</span><span style="color: #88C0D0">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">json</span><span style="color: #81A1C1">=</span><span style="color: #A3BE8C">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">mermaidDiagram</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">mermaid_code},</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Champ corrigé</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #D8DEE9">timeout</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">10</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">            time.sleep</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">2</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># On laisse le temps au rendu</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Schéma généré.</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">except</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Exception</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">as</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">f</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Erreur: {e}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clear_canvas</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">self</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">&quot;&quot;&quot;Vide le tableau blanc.&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">requests.delete(f</span><span style="color: #88C0D0">&quot;{EXCALIDRAW_API}/api/elements/clear&quot;</span><span style="color: #88C0D0">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">timeout=</span><span style="color: #B48EAD">5</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Canvas nettoyé.</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<figure class="wp-block-video"><video height="810" style="aspect-ratio: 1440 / 810;" width="1440" controls src="https://tazmenworld.com/wp-content/uploads/2026/04/outil-webui.mp4" class="lws-optimize-lazyload"></video></figure>



<h2 class="wp-block-heading">Les Galères et le Troubleshooting (Le mode survie)</h2>



<p class="wp-block-paragraph">Si vous faites ça, vous allez forcément tomber sur des erreurs de permissions. C&rsquo;est mathématique.</p>



<ul class="wp-block-list">
<li><strong>Erreur SQLITE_CANTOPEN</strong> : Le conteneur <code>mcp-excalidraw</code> essaie d&rsquo;écrire la base de données sur votre disque mais il n&rsquo;a pas les droits. Comme le process Node.js tourne souvent avec l&rsquo;UID 1001 , il faut lui donner la propriété du dossier: <code>sudo chown -R 1001:1001 ~/tazmen-ai-station/mcp-excalidraw/data</code>.</li>



<li><strong>L&rsquo;IA qui refuse de dessiner</strong> : Si votre modèle (Mistral ou Qwen) vous dit qu&rsquo;il « ne peut pas dessiner ici », c&rsquo;est qu&rsquo;il n&rsquo;est pas assez directif. Il faut lui forcer la main dans le <strong>System Prompt</strong>.</li>
</ul>



<h3 class="wp-block-heading">Mon System Prompt de « Grosse Flemme »</h3>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-189">Ajoutez ceci à votre modèle personnalisé dans Open-WebUI:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-190"><em>« Tu es un assistant spécialisé dans la création de schémas sur Excalidraw. RÈGLE ABSOLUE : Quand on te demande un schéma, utilise TOUJOURS <code>create_diagram_from_mermaid</code>. Ne montre jamais le code, dessine direct. »</em>.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">La Démo Finale : Ça en jette !</h2>



<p class="wp-block-paragraph">Une fois que tout est vert, le résultat est magique. Pendant ma formation, je dis simplement : <em>« Fais-moi un schéma d&rsquo;une architecture active directory avec les rôles FSMO »</em><sup></sup>. L&rsquo;IA réfléchit, génère le Mermaid, et paf, les boîtes apparaissent sur mon Excalidraw sur <code>localhost:8000</code> ou <code>3001</code><sup></sup>.</p>



<figure class="wp-block-video"><video height="810" style="aspect-ratio: 1440 / 810;" width="1440" controls src="https://tazmenworld.com/wp-content/uploads/2026/04/export-1776809953006.mp4" class="lws-optimize-lazyload"></video></figure>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Voilà comment on passe d&rsquo;une tablette graphique sympa à une station de travail agentique complète. C&rsquo;est du boulot à installer, mais quel plaisir de voir ses idées prendre forme sans avoir à se battre avec l&rsquo;alignement des rectangles !</p>



<p class="wp-block-paragraph" id="p-rc_bd3390bc77cb145e-193">Si vous avez des questions sur les variables d&rsquo;environnement ou les quantisations de modèles (j&rsquo;utilise <strong>Qwen 3.5 9B</strong> pour que ça rentre dans mes 16 Go de VRAM <sup></sup>), posez-les en commentaire.</p>



<p class="wp-block-paragraph">À plus pour de nouvelles aventures en local !</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/04/22/diagrammes-auto-generes-comment-piloter-excalidraw-en-local-avec-une-ia-sans-aucun-effort/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/04/outil-webui.mp4" length="11821123" type="video/mp4" />
<enclosure url="https://tazmenworld.com/wp-content/uploads/2026/04/export-1776809953006.mp4" length="6902806" type="video/mp4" />

			</item>
		<item>
		<title>IA &#038; Vie Privée : Pourquoi (et comment) j&#8217;ai déporté mon assistant Mistral sur Slack</title>
		<link>https://tazmenworld.com/2026/04/19/ia-vie-privee-pourquoi-et-comment-jai-deporte-mon-assistant-mistral-sur-slack/</link>
					<comments>https://tazmenworld.com/2026/04/19/ia-vie-privee-pourquoi-et-comment-jai-deporte-mon-assistant-mistral-sur-slack/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Sun, 19 Apr 2026 21:36:11 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=213</guid>

					<description><![CDATA[Si vous avez suivi les deux premiers articles, vous avez maintenant une bête de course sous Linux qui fait tourner Mistral Nemo au doigt et à l&#8217;œil grâce à Ollama. On a optimisé la VRAM, on a une interface WebUI qui n&#8217;a rien à envier à ChatGPT, mais il manque encore un petit quelque chose&#8230; [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="571"  alt="" class="wp-image-222"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/4p68fp4p68fp4p68_cleanup-1024x571.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/4p68fp4p68fp4p68_cleanup-1024x571.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/4p68fp4p68fp4p68_cleanup-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/4p68fp4p68fp4p68_cleanup-768x428.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/4p68fp4p68fp4p68_cleanup-1536x857.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/4p68fp4p68fp4p68_cleanup-2048x1142.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Si vous avez suivi les deux premiers articles, vous avez maintenant une bête de course sous Linux qui fait tourner <strong>Mistral Nemo</strong> au doigt et à l&rsquo;œil grâce à <strong>Ollama</strong>. On a optimisé la VRAM, on a une interface WebUI qui n&rsquo;a rien à envier à ChatGPT, mais il manque encore un petit quelque chose&#8230;</p>



<p class="wp-block-paragraph">L&rsquo;accessibilité.</p>



<p class="wp-block-paragraph">Ouvrir un navigateur, c&rsquo;est bien. Mais pouvoir interpeller son propre modèle d&rsquo;IA directement depuis son outil de travail quotidien, là où se passent les discussions, c&rsquo;est un tout autre niveau. Aujourd&rsquo;hui, on va voir comment transformer cette infrastructure locale en un assistant Slack ultra-réactif, totalement privé et surtout, <strong>sécurisé</strong>.</p>



<h2 class="wp-block-heading">Le défi de la sécurité : Pourquoi le « Socket Mode » ?</h2>



<p class="wp-block-paragraph">Quand on parle de connecter un serveur local à un service cloud comme Slack, le premier réflexe est souvent de se dire : « Je vais devoir ouvrir un port sur ma box, gérer un DNS dynamique, un certificat SSL&#8230; ».</p>



<p class="wp-block-paragraph"><strong>Oubliez tout ça.</strong> Ouvrir des ports, c&rsquo;est créer des trous dans votre muraille de Chine personnelle. Pour cet article, on va utiliser le <strong>Socket Mode</strong>. C&rsquo;est une technologie qui permet à notre petit bot Python, bien au chaud derrière votre pare-feu local, d&rsquo;ouvrir lui-même une connexion vers Slack pour récupérer les messages. C&rsquo;est le bot qui « écoute » Slack via une connexion sortante, et non Slack qui « appelle » votre serveur.</p>



<p class="wp-block-paragraph">Résultat : Sécurité maximale. Votre IP reste cachée, aucun port n&rsquo;est ouvert, et votre IA reste souveraine.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Étape 1 : Préparer le terrain sur Slack</h2>



<p class="wp-block-paragraph">Avant de toucher au code, il faut donner une existence légale à notre assistant sur l&rsquo;interface développeur de Slack.</p>



<ol start="1" class="wp-block-list">
<li>Rendez-vous sur le portail API de Slack et créez une application « From Scratch ».</li>



<li><strong>Activer le Socket Mode</strong> : C&rsquo;est l&rsquo;option la plus importante dans le menu de gauche. En l&rsquo;activant, Slack vous donnera un premier token (commençant par <code>xapp-</code>). C&rsquo;est la clé de votre tunnel sécurisé.</li>



<li><strong>Permissions (Scopes)</strong> : Votre bot a besoin de voir les mentions (<code>app_mentions:read</code>) et de pouvoir répondre (<code>chat:write</code>). Si vous voulez lui parler en privé, ajoutez aussi les permissions liées aux messages directs (<code>im:history</code>).</li>
</ol>



<figure class="wp-block-image size-full"><img width="656" height="537"  alt="" class="wp-image-215"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-19-22-53-10.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-19-22-53-10.png 656w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-19-22-53-10-300x246.png 300w" sizes="auto, (max-width: 656px) 100vw, 656px" /></figure>



<figure class="wp-block-image size-full"><img width="830" height="835"  alt="" class="wp-image-214"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-19-50-20.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-19-50-20.png 830w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-19-50-20-298x300.png 298w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-19-50-20-150x150.png 150w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-19-50-20-768x773.png 768w" sizes="auto, (max-width: 830px) 100vw, 830px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Étape 2 : L&rsquo;architecture Docker (La modularité avant tout)</h2>



<p class="wp-block-paragraph">Dans l&rsquo;article précédent, on a vu que Docker était notre meilleur allié pour isoler nos services. Pour ajouter le bot Slack, on ne va pas polluer notre conteneur Ollama. On va créer un nouveau service dédié.</p>



<p class="wp-block-paragraph">Voici à quoi ressemble notre infrastructure mise à jour. J&rsquo;ai anonymisé les chemins et les clés, mais la structure est celle que j&rsquo;utilise au quotidien.</p>



<h5 class="wp-block-heading">1. Le fichier <code>docker-compose.yml</code></h5>



<p class="wp-block-paragraph">C&rsquo;est le chef d&rsquo;orchestre. Il définit comment Ollama et ton Bot communiquent dans un réseau privé.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># docker-compose.yml (Extrait)
services:
  # Votre moteur IA que nous avons configuré auparavant
  ollama:
    image: ollama/ollama
    container_name: ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: &#91;gpu&#93;

  # Le nouveau venu : Notre pont Python personnalisé
  slack-bot:
    build: ./slack-bot
    container_name: slack-bot
    depends_on:
      - ollama
    environment:
      - SLACK_BOT_TOKEN=xoxb-votre-cle-secrete # Token de l'App
      - SLACK_APP_TOKEN=xapp-votre-cle-tunnel # Token Socket Mode
      - PYTHONUNBUFFERED=1 # Pour voir les logs en temps réel
    restart: unless-stopped</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># docker-compose.yml (Extrait)</span></span>
<span class="line"><span style="color: #8FBCBB">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88"># Votre moteur IA que nous avons configuré auparavant</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">ollama</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ollama/ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">deploy</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">resources</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">reservations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">devices</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">driver</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nvidia</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">count</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">all</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">capabilities</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#91;</span><span style="color: #A3BE8C">gpu</span><span style="color: #ECEFF4">&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88"># Le nouveau venu : Notre pont Python personnalisé</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">slack-bot</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">build</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./slack-bot</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">slack-bot</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">depends_on</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">SLACK_BOT_TOKEN=xoxb-votre-cle-secrete</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Token de l&#39;App</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">SLACK_APP_TOKEN=xapp-votre-cle-tunnel</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Token Socket Mode</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PYTHONUNBUFFERED=1</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Pour voir les logs en temps réel</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span></code></pre></div>



<h5 class="wp-block-heading">2. Le fichier <code>slack-bot/requirements.txt</code></h5>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>slack_bolt
requests</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">slack_bolt</span></span>
<span class="line"><span style="color: #88C0D0">requests</span></span></code></pre></div>



<h5 class="wp-block-heading">3. Le fichier <code>slack-bot/Dockerfile</code></h5>



<p class="wp-block-paragraph">Les instructions pour construire l&rsquo;image de ton bot.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY bot.py .
CMD &#91;"python", "bot.py"&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">FROM python</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">3.11</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">slim</span></span>
<span class="line"><span style="color: #D8DEE9FF">WORKDIR </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">app</span></span>
<span class="line"><span style="color: #D8DEE9FF">COPY requirements</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">txt </span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9FF">RUN pip install </span><span style="color: #D8DEE9">--</span><span style="color: #D8DEE9FF">no</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">cache</span><span style="color: #81A1C1">-</span><span style="color: #88C0D0">dir</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">r requirements</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">txt</span></span>
<span class="line"><span style="color: #D8DEE9FF">COPY bot</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">py </span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9FF">CMD </span><span style="color: #ECEFF4">&#91;</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">python</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">bot.py</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">&#93;</span></span></code></pre></div>



<h5 class="wp-block-heading">4. Le fichier <code>slack-bot/bot.py</code> (Version avec Mémoire)</h5>



<p class="wp-block-paragraph">C&rsquo;est ici que la magie opère. Ce script gère les messages directs, les mentions, et conserve l&rsquo;historique pour que l&rsquo;IA ait du contexte.</p>



<p class="wp-block-paragraph">Les dépendances Python nécessaires pour faire tourner le bot.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import os
import requests
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

# Configuration
app = App(token=os.environ.get("SLACK_BOT_TOKEN"))
OLLAMA_URL = "http://ollama:11434/api/chat"
MODEL_NAME = "ministral-3:14b-instruct-2512-q4_K_M"

# Mémoire locale (Dictionnaire par utilisateur)
history_db = {}

def get_ai_response(user_id, user_text):
    # Initialiser l'historique si nouveau
    if user_id not in history_db:
        history_db&#91;user_id&#93; = []
    
    # Ajouter le message utilisateur
    history_db&#91;user_id&#93;.append({"role": "user", "content": user_text})
    
    # Garder les 10 derniers messages pour le contexte
    history_db&#91;user_id&#93; = history_db&#91;user_id&#93;&#91;-10:&#93;

    payload = {
        "model": MODEL_NAME,
        "messages": history_db&#91;user_id&#93;,
        "stream": False
    }

    try:
        r = requests.post(OLLAMA_URL, json=payload)
        r.raise_for_status()
        bot_response = r.json()&#91;'message'&#93;&#91;'content'&#93;
        
        # Mémoriser la réponse de l'IA
        history_db&#91;user_id&#93;.append({"role": "assistant", "content": bot_response})
        return bot_response
    except Exception as e:
        return f"Désolé, j'ai eu un souci technique : {e}"

# Écouteur pour les messages directs (DM)
@app.event("message")
def handle_message(event, say):
    if event.get("channel_type") == "im" and "bot_id" not in event:
        response = get_ai_response(event&#91;'user'&#93;, event&#91;'text'&#93;)
        say(response)

# Écouteur pour les mentions (@MonBot)
@app.event("app_mention")
def handle_mention(event, say):
    # On nettoie la mention pour ne garder que la question
    text = event&#91;'text'&#93;.split('> ')&#91;-1&#93; if '>' in event&#91;'text'&#93; else event&#91;'text'&#93;
    response = get_ai_response(event&#91;'user'&#93;, text)
    say(response)

if __name__ == "__main__":
    handler = SocketModeHandler(app, os.environ.get("SLACK_APP_TOKEN"))
    handler.start()</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">os</span></span>
<span class="line"><span style="color: #88C0D0">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">requests</span></span>
<span class="line"><span style="color: #88C0D0">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">slack_bolt</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">App</span></span>
<span class="line"><span style="color: #88C0D0">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">slack_bolt.adapter.socket_mode</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">SocketModeHandler</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Configuration</span></span>
<span class="line"><span style="color: #88C0D0">app</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">App</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">token</span><span style="color: #81A1C1">=</span><span style="color: #A3BE8C">os.environ.get</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">&quot;SLACK_BOT_TOKEN&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #88C0D0">OLLAMA_URL</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http://ollama:11434/api/chat</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #88C0D0">MODEL_NAME</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ministral-3:14b-instruct-2512-q4_K_M</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Mémoire locale (Dictionnaire par utilisateur)</span></span>
<span class="line"><span style="color: #88C0D0">history_db</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get_ai_response</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">user_id,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">user_text</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #616E88"># Initialiser l&#39;historique si nouveau</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">user_id</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">history_db:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">history_db&#91;user_id&#93;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> []</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #616E88"># Ajouter le message utilisateur</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">history_db&#91;user_id&#93;.append(</span><span style="color: #D8DEE9FF">{&quot;</span><span style="color: #88C0D0">role</span><span style="color: #88C0D0">&quot;: &quot;</span><span style="color: #88C0D0">user</span><span style="color: #88C0D0">&quot;, &quot;</span><span style="color: #88C0D0">content</span><span style="color: #88C0D0">&quot;: user_text})</span></span>
<span class="line"><span style="color: #88C0D0">    </span></span>
<span class="line"><span style="color: #88C0D0">    # Garder les 10 derniers messages pour le contexte</span></span>
<span class="line"><span style="color: #88C0D0">    history_db&#91;user_id&#93; = history_db&#91;user_id&#93;&#91;-10:&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">    payload = {</span></span>
<span class="line"><span style="color: #88C0D0">        &quot;</span><span style="color: #88C0D0">model</span><span style="color: #88C0D0">&quot;: MODEL_NAME,</span></span>
<span class="line"><span style="color: #88C0D0">        &quot;</span><span style="color: #88C0D0">messages</span><span style="color: #88C0D0">&quot;: history_db&#91;user_id&#93;,</span></span>
<span class="line"><span style="color: #88C0D0">        &quot;</span><span style="color: #88C0D0">stream</span><span style="color: #88C0D0">&quot;: False</span></span>
<span class="line"><span style="color: #88C0D0">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">    try:</span></span>
<span class="line"><span style="color: #88C0D0">        r = requests.post(OLLAMA_URL, json=payload)</span></span>
<span class="line"><span style="color: #88C0D0">        r.raise_for_status()</span></span>
<span class="line"><span style="color: #88C0D0">        bot_response = r.json()&#91;&#39;message&#39;&#93;&#91;&#39;content&#39;&#93;</span></span>
<span class="line"><span style="color: #88C0D0">        </span></span>
<span class="line"><span style="color: #88C0D0">        # Mémoriser la réponse de l&#39;IA</span></span>
<span class="line"><span style="color: #88C0D0">        history_db&#91;user_id&#93;.append({&quot;</span><span style="color: #88C0D0">role</span><span style="color: #88C0D0">&quot;: &quot;</span><span style="color: #88C0D0">assistant</span><span style="color: #88C0D0">&quot;, &quot;</span><span style="color: #88C0D0">content</span><span style="color: #88C0D0">&quot;: bot_response})</span></span>
<span class="line"><span style="color: #88C0D0">        return bot_response</span></span>
<span class="line"><span style="color: #88C0D0">    except Exception as e:</span></span>
<span class="line"><span style="color: #88C0D0">        return f&quot;</span><span style="color: #88C0D0">Désolé,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">j</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">ai eu un souci technique : {e}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"># Écouteur pour les messages directs (DM)</span></span>
<span class="line"><span style="color: #A3BE8C">@app.event(&quot;message&quot;)</span></span>
<span class="line"><span style="color: #A3BE8C">def handle_message(event, say):</span></span>
<span class="line"><span style="color: #A3BE8C">    if event.get(&quot;channel_type&quot;) == &quot;im&quot; and &quot;bot_id&quot; not in event:</span></span>
<span class="line"><span style="color: #A3BE8C">        response = get_ai_response(event&#91;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">user</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#93;, event&#91;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#93;)</span></span>
<span class="line"><span style="color: #A3BE8C">        say(response)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C"># Écouteur pour les mentions (@MonBot)</span></span>
<span class="line"><span style="color: #A3BE8C">@app.event(&quot;app_mention&quot;)</span></span>
<span class="line"><span style="color: #A3BE8C">def handle_mention(event, say):</span></span>
<span class="line"><span style="color: #A3BE8C">    # On nettoie la mention pour ne garder que la question</span></span>
<span class="line"><span style="color: #A3BE8C">    text = event&#91;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#93;.split(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">)&#91;-1&#93; if </span><span style="color: #ECEFF4">&#39;</span><span style="color: #81A1C1">&gt;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C"> in event&#91;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#93; else event&#91;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#93;</span></span>
<span class="line"><span style="color: #A3BE8C">    response = get_ai_response(event&#91;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">user</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#93;, text)</span></span>
<span class="line"><span style="color: #A3BE8C">    say(response)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C">if __name__ == &quot;__main__&quot;:</span></span>
<span class="line"><span style="color: #A3BE8C">    handler = SocketModeHandler(app, os.environ.get(&quot;SLACK_APP_TOKEN&quot;))</span></span>
<span class="line"><span style="color: #A3BE8C">    handler.start()</span></span></code></pre></div>



<p class="wp-block-paragraph">L&rsquo;avantage de cette méthode ? Si vous voulez changer de modèle d&rsquo;IA ou mettre à jour Ollama, votre bot Slack n&rsquo;a pas besoin d&rsquo;être modifié. Il attend simplement que le moteur soit prêt.</p>



<figure class="wp-block-image size-large"><img width="1024" height="423"  alt="" class="wp-image-216"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-14-1024x423.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-14-1024x423.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-14-300x124.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-14-768x317.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-14.png 1238w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Étape 3 : Donner un cerveau (et une mémoire) au Bot</h2>



<p class="wp-block-paragraph">C&rsquo;est là que le côté « humain » intervient. Un bot qui répond à une question, c&rsquo;est bien. Un bot qui se souvient que vous lui avez parlé d&rsquo;un projet de blog il y a trois messages, c&rsquo;est mieux.</p>



<p class="wp-block-paragraph">Par défaut, les API de LLM sont « amnésiques ». Chaque question repart de zéro. Pour corriger ça, on utilise un script Python qui va stocker les derniers échanges dans une petite structure de données (un dictionnaire) avant d&rsquo;envoyer le tout à l&rsquo;API <code>/api/chat</code> d&rsquo;Ollama.</p>



<p class="wp-block-paragraph">Le script va filtrer les mentions, nettoyer le texte et s&rsquo;assurer que si vous l&rsquo;appelez dans un canal public ou en message privé, il sache qui vous êtes.</p>



<p class="wp-block-paragraph"><strong>Note sur l&rsquo;anonymisation :</strong> Dans le code, on ne manipule jamais de noms réels, seulement des <code>user_id</code> fournis par Slack. C&rsquo;est une couche de confidentialité supplémentaire.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Étape 4 : Le premier démarrage (Et les logs magiques)</h2>



<p class="wp-block-paragraph">Une fois le code prêt, on lance la machine : <code>docker compose up -d --build</code></p>



<p class="wp-block-paragraph">C&rsquo;est le moment de vérité. On regarde les logs du conteneur. Si vous voyez s&rsquo;afficher <code>⚡️ Bolt app is running!</code>, félicitations : votre GPU est désormais branché sur Slack.</p>



<figure class="wp-block-image size-full"><img width="820" height="305"  alt="" class="wp-image-217"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-23-33-44.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-23-33-44.png 820w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-23-33-44-300x112.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-18-23-33-44-768x286.png 768w" sizes="auto, (max-width: 820px) 100vw, 820px" /></figure>



<h2 class="wp-block-heading">Étape 5 : L&rsquo;IA en action (Tests et ressentis)</h2>



<p class="wp-block-paragraph">En testant avec Mistral Nemo (en version instruct, quantifié en Q8 pour garder de la précision), les réponses sont bluffantes.</p>



<p class="wp-block-paragraph">Ce qui change tout par rapport à une interface web, c&rsquo;est la fluidité. On pose une question technique sur un bout de code, on continue sa discussion avec ses collègues, et on voit la petite notification Slack arriver quand l&rsquo;IA a fini de « réfléchir ». C&rsquo;est moins intrusif et beaucoup plus intégré au flux de travail.</p>



<figure class="wp-block-image size-large"><img width="1024" height="855"  alt="" class="wp-image-218"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-15-1024x855.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-15-1024x855.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-15-300x250.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-15-768x641.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-15.png 1363w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Conclusion : Souveraineté et Futur</h2>



<p class="wp-block-paragraph">En trois étapes, nous sommes passés d&rsquo;une machine Linux brute à un assistant personnel capable de rivaliser avec les meilleurs services payants, le coût du cloud et l&rsquo;espionnage en moins.</p>



<p class="wp-block-paragraph">Ce projet montre qu&rsquo;en 2026, l&rsquo;IA locale n&rsquo;est plus une curiosité pour les geeks du dimanche. C&rsquo;est un outil de production sérieux, sécurisé, et totalement personnalisable. La prochaine étape ? Pourquoi ne pas donner à ce bot la capacité de lire vos documents locaux ou d&rsquo;automatiser vos déploiements Docker ?</p>



<p class="wp-block-paragraph">Mais ça, c&rsquo;est peut-être le sujet d&rsquo;un futur article&#8230;</p>



<p class="wp-block-paragraph">D&rsquo;ici là, reprenez le contrôle de vos données, et amusez-vous bien avec votre nouveau collègue de bureau virtuel !</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/04/19/ia-vie-privee-pourquoi-et-comment-jai-deporte-mon-assistant-mistral-sur-slack/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Reprendre le contrôle : mon IA locale avec Mistral NeMo, Ollama et Open WebUI</title>
		<link>https://tazmenworld.com/2026/04/16/reprendre-le-controle-mon-ia-locale-avec-mistral-nemo-ollama-et-open-webui/</link>
					<comments>https://tazmenworld.com/2026/04/16/reprendre-le-controle-mon-ia-locale-avec-mistral-nemo-ollama-et-open-webui/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Thu, 16 Apr 2026 21:43:22 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=188</guid>

					<description><![CDATA[Cet article fait suite à la Partie 2 : Passer sous Linux pour libérer votre GPU. Maintenant que le système est propre, que l&#8217;interface graphique ne vient plus grignoter vos précieux gigaoctets de mémoire vidéo, on va s&#8217;attaquer au « cerveau » de la machine. L&#8217;idée ici n&#8217;est pas de suivre un tuto de plus sur l&#8217;IA, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-194"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/kkkfi2kkkfi2kkkf_cleanup-1024x572.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/kkkfi2kkkfi2kkkf_cleanup-1024x572.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/kkkfi2kkkfi2kkkf_cleanup-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/kkkfi2kkkfi2kkkf_cleanup-768x429.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/kkkfi2kkkfi2kkkf_cleanup-1536x857.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/kkkfi2kkkfi2kkkf_cleanup-2048x1143.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Cet article fait suite à la <a target="_blank" rel="noreferrer noopener" href="https://tazmenworld.com/2026/04/15/vram-tuning-partie-2-passer-sous-linux-pour-liberer-votre-gpu/">Partie 2 : Passer sous Linux pour libérer votre GPU</a>.</p>



<p class="wp-block-paragraph">Maintenant que le système est propre, que l&rsquo;interface graphique ne vient plus grignoter vos précieux gigaoctets de mémoire vidéo, on va s&rsquo;attaquer au « cerveau » de la machine. L&rsquo;idée ici n&rsquo;est pas de suivre un tuto de plus sur l&rsquo;IA, mais de comprendre comment orchestrer une stack qui tient la route pour de la production réelle.</p>



<h2 class="wp-block-heading">Reprendre le contrôle : mon IA locale avec Mistral NeMo, Ollama et Open WebUI</h2>



<p class="wp-block-paragraph">Le passage à une IA 100 % locale n&rsquo;est pas qu&rsquo;une question de confidentialité. C&rsquo;est avant tout une question de confort et de précision. Quand on travaille sur des projets sérieux, on ne peut pas se permettre d&rsquo;avoir une IA qui « oublie » le début de la conversation ou qui répond avec le ton policé d&rsquo;un département de relations publiques californien.</p>



<p class="wp-block-paragraph">Voici comment j&rsquo;ai structuré mon environnement pour exploiter au maximum mes 16 Go de VRAM.</p>



<figure class="wp-block-image size-full"><img width="978" height="508"  alt="" class="wp-image-180"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-4.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-4.png 978w, https://tazmenworld.com/wp-content/uploads/2026/04/image-4-300x156.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-4-768x399.png 768w" sizes="auto, (max-width: 978px) 100vw, 978px" /></figure>



<figure class="wp-block-image size-large"><img width="1024" height="470"  alt="" class="wp-image-181"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-5-1024x470.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-5-1024x470.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5-300x138.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5-768x353.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5-1536x705.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5.png 1675w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">1. Pourquoi le choix « Européen » : Mistral vs Llama vs Qwen</h2>



<p class="wp-block-paragraph">C&rsquo;est un point crucial qu&rsquo;on aborde rarement. Tous les modèles d&rsquo;IA ne se valent pas, et ce n&rsquo;est pas qu&rsquo;une question de « benchmarks ». C&rsquo;est une question de culture et de structure de langue.</p>



<ul class="wp-block-list">
<li><strong>Llama (Meta) :</strong> Très puissant, mais formaté par une vision américaine de la « safety ». Le modèle a tendance à être trop verbeux, à s&rsquo;excuser pour un rien et à utiliser des tournures de phrases très (trop) amicales qui sonnent faux en français comme Gemini ou Chatgpt.</li>



<li><strong>Qwen (Alibaba) :</strong> Techniquement impressionnant, surtout en code, mais on sent parfois une structure de pensée différente, presque « traduite », qui peut manquer de naturel sur des nuances rédactionnelles complexes en Europe.</li>



<li><strong>Mistral (Mistral AI) :</strong> C&rsquo;est mon choix par défaut. Pourquoi ? Parce que Mistral est conçu en Europe. On retrouve dans ses réponses une structure logique et une concision qui collent beaucoup mieux à notre façon de nous exprimer. Le ton est plus direct, plus pragmatique, et surtout, il maîtrise les subtilités de la langue française (et européenne en général) sans avoir besoin d&rsquo;en faire des tonnes. C&rsquo;est un modèle qui « réfléchit » de manière plus proche de la nôtre.</li>
</ul>



<h2 class="wp-block-heading">2. La stratégie de stockage : Le NVMe de 4 To dédié</h2>



<p class="wp-block-paragraph">On en a parlé rapidement, mais le stockage est le moteur silencieux de votre IA. Charger un modèle de 14 Go doit être une opération transparente.</p>



<p class="wp-block-paragraph">J&rsquo;utilise un <strong>disque NVMe de 4 To</strong> entièrement dédié à l&rsquo;IA. Voici pourquoi c&rsquo;est un choix pragmatique :</p>



<ul class="wp-block-list">
<li><strong>Éviter l&rsquo;asphyxie du système :</strong> Les modèles sont lourds. Si vous téléchargez trois ou quatre versions de Mistral ou de Codestral pour comparer, vous perdez 50 Go en dix minutes. Sur un disque système, c&rsquo;est le crash assuré.</li>



<li><strong>Vitesse de swap :</strong> Même avec 16 Go de VRAM, il arrive qu&rsquo;on ait besoin de charger/décharger des modèles pour passer du texte à l&rsquo;image. Le NVMe permet de le faire sans avoir l&rsquo;impression que le PC a figé.</li>



<li><strong>Anonymisation des chemins :</strong> Pour Docker, j&rsquo;ai monté ce disque sur un point propre (type <code>/mnt/storage-ia/</code>). Cela permet de garder un fichier de configuration lisible et de déplacer l&rsquo;intégralité de sa bibliothèque de modèles d&rsquo;une machine à l&rsquo;autre simplement en déplaçant le disque et en mettant à jour une ligne dans le <code>.env</code>.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-full"><img width="762" height="283"  alt="" class="wp-image-189"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-9.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-9.png 762w, https://tazmenworld.com/wp-content/uploads/2026/04/image-9-300x111.png 300w" sizes="auto, (max-width: 762px) 100vw, 762px" /></figure>
</blockquote>



<h2 class="wp-block-heading">3. L&rsquo;architecture Docker : Le pilotage de la VRAM</h2>



<p class="wp-block-paragraph">Docker est indispensable pour isoler les pilotes NVIDIA. Sans lui, une mise à jour d&rsquo;Ubuntu peut casser votre installation CUDA. Voici la structure de mon <code>docker-compose.yml</code>. Notez bien la gestion de ComfyUI : il est là, mais il ne démarre que si je l&rsquo;appelle.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>services:
  # Moteur d'inférence (Le coeur)
  ollama:
    image: ollama/ollama
    container_name: ollama
    volumes:
      - /chemin/anonymise/ssd-ia/models:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: &#91;gpu&#93;
    restart: unless-stopped

  # Interface utilisateur (Le visage)
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    volumes:
      - ./open-webui-data:/app/backend/data
    depends_on:
      - ollama
    ports:
      - "3000:8080"
    environment:
      - 'OLLAMA_BASE_URL=http://ollama:11434'
    restart: unless-stopped

  # Génération d'images (Démarrage manuel pour préserver les 16 Go de VRAM)
  comfyui:
    build: .
    container_name: comfyui
    runtime: nvidia
    restart: "no" # &lt;--- Crucial : ne consomme rien au repos</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  # </span><span style="color: #D8DEE9">Moteur</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">d</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">inférence (Le coeur</span><span style="color: #D8DEE9">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ollama</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ollama</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">chemin</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">anonymise</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ssd</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ia</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">models</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">/</span><span style="color: #EBCB8B">root</span><span style="color: #ECEFF4">/</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    deploy</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      resources</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        reservations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          devices</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> driver</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nvidia</span></span>
<span class="line"><span style="color: #D8DEE9FF">              count</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span></span>
<span class="line"><span style="color: #D8DEE9FF">              capabilities</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">gpu</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unless</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">stopped</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  # </span><span style="color: #D8DEE9">Interface</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">utilisateur</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">Le</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">visage</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">open</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">webui</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ghcr</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">open</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">webui</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">open</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">webui</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9">main</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">open</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">webui</span></span>
<span class="line"><span style="color: #D8DEE9FF">    volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">open</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">webui</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF">data</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">app</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">backend</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">data</span></span>
<span class="line"><span style="color: #D8DEE9FF">    depends_on</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ollama</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3000:8080</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">OLLAMA_BASE_URL=http://ollama:11434</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">unless</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">stopped</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  # </span><span style="color: #D8DEE9">Génération</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">d</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">images (Démarrage manuel pour préserver les 16 Go de VRAM</span><span style="color: #D8DEE9">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  comfyui</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    build</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comfyui</span></span>
<span class="line"><span style="color: #D8DEE9FF">    runtime</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nvidia</span></span>
<span class="line"><span style="color: #D8DEE9FF">    restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">no</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> # </span><span style="color: #81A1C1">&lt;---</span><span style="color: #D8DEE9FF"> Crucial </span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ne</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">consomme</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rien</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">au</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">repos</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img width="771" height="481"  alt="" class="wp-image-196"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/infra_IA-1.jpg" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/infra_IA-1.jpg 771w, https://tazmenworld.com/wp-content/uploads/2026/04/infra_IA-1-300x187.jpg 300w, https://tazmenworld.com/wp-content/uploads/2026/04/infra_IA-1-768x479.jpg 768w" sizes="auto, (max-width: 771px) 100vw, 771px" /><figcaption class="wp-element-caption">Configuration globale : Ollama en local, OpenWeb UI et  Cumfyui avec Nvidia Container Toolkit sur Docker rootless.</figcaption></figure>



<h2 class="wp-block-heading">4. Tableau comparatif des modèles utilisés</h2>



<p class="wp-block-paragraph">Voici comment je répartis la charge de travail sur ma carte de 16 Go. L&rsquo;idée est d&rsquo;avoir le bon outil pour la bonne tâche, sans jamais saturer la mémoire inutilement.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Modèle</th><th>Taille</th><th>Usage Principal</th><th>Pourquoi ce choix ?</th><th>Occupation VRAM (Q8)</th></tr></thead><tbody><tr><td><strong>Mistral NeMo 12B</strong></td><td>12B</td><td>Rédaction &amp; Chat quotidien</td><td><strong>Le plus naturel.</strong> Structure de phrase européenne, concis et intelligent.</td><td>~13 Go</td></tr><tr><td><strong>Ministral-3 14B</strong></td><td>14B</td><td>Analyse &amp; Code complexe</td><td><strong>Logique pure.</strong> Énorme contexte (256k) pour avaler des docs entiers.</td><td>~15 Go</td></tr><tr><td><strong>Llama 3.1 8B</strong></td><td>8B</td><td>Tâches de tri basiques</td><td><strong>Rapidité.</strong> Utilisé quand la nuance importe peu mais que la vitesse est clé.</td><td>~8 Go</td></tr></tbody></table></figure>



<figure class="wp-block-image size-full"><img width="941" height="271"  alt="" class="wp-image-192"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-12.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-12.png 941w, https://tazmenworld.com/wp-content/uploads/2026/04/image-12-300x86.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-12-768x221.png 768w" sizes="auto, (max-width: 941px) 100vw, 941px" /></figure>



<h2 class="wp-block-heading">5. Pourquoi ces modèles et pas d&rsquo;autres ?</h2>



<p class="wp-block-paragraph">Le choix de <strong>Mistral NeMo 12B</strong> est le résultat de nombreux tests. Sur une carte de 16 Go, c&rsquo;est le « sweet spot ».</p>



<ul class="wp-block-list">
<li><strong>En Q8_0 (8-bit) :</strong> Le modèle est quasi identique à la version non compressée. On a une précision chirurgicale.</li>



<li><strong>Le style :</strong> Contrairement à Llama qui a tendance à donner des conseils de vie non sollicités ou à faire de longs préambules (« En tant qu&rsquo;intelligence artificielle, je&#8230; »), Mistral NeMo répond à la question. Point. C&rsquo;est ce gain de temps et cette clarté qui font la différence en milieu pro.</li>
</ul>



<p class="wp-block-paragraph">Le <strong>Ministral-3 14B</strong>, lui, est mon joker pour les dossiers lourds. Sa capacité à gérer <strong>256 000 tokens</strong> change la façon dont on travaille. On ne lui donne plus une question, on lui donne un contexte global. C&rsquo;est le modèle que je sollicite pour auditer des fichiers de configuration Docker ou pour résumer des échanges techniques interminables.</p>



<h2 class="wp-block-heading">6. Gestion du workflow : Priorité au texte</h2>



<p class="wp-block-paragraph">Dans ma configuration, la VRAM est une ressource précieuse qu&rsquo;on ne gaspille pas. Le fait d&rsquo;avoir mis <strong>ComfyUI</strong> (ou tout autre service d&rsquo;image) en démarrage manuel est un choix pragmatique. Faire de l&rsquo;image demande souvent de charger des modèles SDXL ou Flux qui prennent 10 à 12 Go de VRAM. Si Ollama a déjà réservé 13 Go pour Mistral, le crash est inévitable.</p>



<p class="wp-block-paragraph">Mon workflow est donc linéaire :</p>



<p class="wp-block-paragraph"><strong>Phase créative :</strong> Je coupe les modèles texte (Ollama libère la VRAM automatiquement après quelques minutes d&rsquo;inactivité) et je lance ComfyUI.</p>



<p class="wp-block-paragraph"><strong>Phase de réflexion/rédaction :</strong> 100 % de la VRAM pour Mistral via Open WebUI.</p>



<figure class="wp-block-image size-full"><img width="975" height="280"  alt="" class="wp-image-193"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-13.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-13.png 975w, https://tazmenworld.com/wp-content/uploads/2026/04/image-13-300x86.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-13-768x221.png 768w" sizes="auto, (max-width: 975px) 100vw, 975px" /></figure>



<h2 class="wp-block-heading">7. Vers une mémoire infinie : Le RAG (Prochainement)</h2>



<p class="wp-block-paragraph">Vous avez sans doute remarqué l&rsquo;option « Documents » dans Open WebUI. C&rsquo;est ce qu&rsquo;on appelle le <strong>RAG (Retrieval-Augmented Generation)</strong>. L&rsquo;idée est simple : au lieu de tout demander au modèle, on lui permet de fouiller dans nos propres fichiers stockés sur le SSD de 4 To.</p>



<p class="wp-block-paragraph">C&rsquo;est un sujet tellement vaste et puissant (transformer son PC en base de connaissances souveraine) que j&rsquo;ai décidé de lui consacrer un <strong>article entier</strong>. On y verra comment indexer des milliers de documents sans que cela ne ralentisse l&rsquo;IA et comment poser des questions à sa propre archive technique.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<figure class="wp-block-image size-large"><img width="1024" height="559"  alt="" class="wp-image-197"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-16-18-52-31-1024x559.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-16-18-52-31-1024x559.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-16-18-52-31-300x164.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-16-18-52-31-768x419.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/Capture-decran-du-2026-04-16-18-52-31.png 1276w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Reprendre le contrôle de son IA, c&rsquo;est d&rsquo;abord arrêter de subir les choix des géants du cloud. Avec une carte de 16 Go, un bon disque NVMe et une stack Docker bien réglée, on a entre les mains un outil de travail plus performant et plus respectueux de notre culture que n&rsquo;importe quel abonnement à 20$/mois.</p>



<p class="wp-block-paragraph">Mistral NeMo et Ministral-3 ne sont pas juste des noms sur un benchmark, ce sont des outils calibrés pour notre façon de travailler en Europe. Optimisez votre VRAM, soignez votre stockage, et laissez l&rsquo;IA bosser pour vous, pas l&rsquo;inverse. 🚀🛠️</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><em>Note technique : Pour ceux qui veulent tester le Ministral-3 14B dès maintenant sur leur config Docker, la commande <code>ollama run ministral-3:14b</code> est votre point de départ.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/04/16/reprendre-le-controle-mon-ia-locale-avec-mistral-nemo-ollama-et-open-webui/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>VRAM Tuning (Partie 2) : Passer sous Linux pour libérer votre GPU</title>
		<link>https://tazmenworld.com/2026/04/15/vram-tuning-partie-2-passer-sous-linux-pour-liberer-votre-gpu/</link>
					<comments>https://tazmenworld.com/2026/04/15/vram-tuning-partie-2-passer-sous-linux-pour-liberer-votre-gpu/#comments</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 06:28:01 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=179</guid>

					<description><![CDATA[On se retrouve pour la suite de notre dossier sur l’optimisation de la VRAM. Dans la partie 1, on a vu comment gratter chaque Mo possible sur Windows. Mais soyons honnêtes : au bout d&#8217;un moment, on se cogne contre les limites du système lui-même. 🛑 Le constat : Windows est trop gourmand Même avec [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-185"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/xq1h9xq1h9xq1h9-1024x572.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/xq1h9xq1h9xq1h9-1024x572.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/xq1h9xq1h9xq1h9-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/xq1h9xq1h9xq1h9-768x429.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/xq1h9xq1h9xq1h9-1536x857.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/xq1h9xq1h9xq1h9-2048x1143.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">On se retrouve pour la suite de notre dossier sur l’optimisation de la VRAM. Dans la <a target="_blank" rel="noreferrer noopener" href="https://tazmenworld.com/2026/01/04/vram-tuning-partie-1-maximiser-votre-nouveau-gpu-pour-lia-headless-scripting/">partie 1</a>, on a vu comment gratter chaque Mo possible sur Windows. Mais soyons honnêtes : au bout d&rsquo;un moment, on se cogne contre les limites du système lui-même. 🛑</p>



<h3 class="wp-block-heading">Le constat : Windows est trop gourmand</h3>



<p class="wp-block-paragraph">Même avec 32 Go de RAM et un nettoyage complet des applications au démarrage, Windows a cette fâcheuse tendance à s&rsquo;étendre. Chez moi, il finit par occuper entre <strong>9 et 10 Go de RAM</strong> juste pour « exister », malgré toutes les optimisations possibles.</p>



<p class="wp-block-paragraph">Côté VRAM, c&rsquo;est le même combat. Même en suivant les astuces de mon article précédent pour réduire la consommation de l&rsquo;interface, Windows garde toujours une « taxe » de <strong>400 à 500 Mo</strong> sur votre GPU. Ça paraît peu ? Sur une carte de 16 Go comme la <strong>RTX 5070 Ti</strong> ou la <strong>RTX 5080</strong>, c&rsquo;est pourtant la différence entre charger un gros modèle Flux ou avoir une erreur « Out of Memory ». 📉</p>



<p class="wp-block-paragraph">En comparaison, une installation <strong>Ubuntu</strong> bien configurée ne consomme que <strong>20 Mo de VRAM</strong>. Le calcul est vite fait : on rend son potentiel brut à la carte graphique.</p>



<h3 class="wp-block-heading">Pourquoi Ubuntu + Docker ?</h3>



<p class="wp-block-paragraph">Si vous avez une carte performante avec 16 Go de VRAM, utiliser Ubuntu est le meilleur choix pour l&rsquo;IA. Pour garder un système propre, j&rsquo;ai opté pour <strong>Docker</strong>. C’est la méthode la plus robuste : on évite les conflits de versions Python (le fameux « Python hell ») et on garde un environnement isolé. 🐳</p>



<p class="wp-block-paragraph">Ce guide vous explique comment installer ComfyUI, configurer l&rsquo;accès au GPU et lier vos modèles déjà existants (issus de Stability Matrix par exemple) pour ne pas gaspiller d&rsquo;espace disque.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. Vérification des prérequis matériels 🖥️</h2>



<p class="wp-block-paragraph">Avant de commencer, on doit s&rsquo;assurer que ta carte graphique est bien reconnue par Ubuntu. C&rsquo;est la base indispensable pour que tout le reste fonctionne.</p>



<p class="wp-block-paragraph">Ouvre un terminal et tape :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nvidia-smi</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">nvidia</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">smi</span></span></code></pre></div>



<figure class="wp-block-image size-full"><img width="978" height="508"  alt="" class="wp-image-180"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-4.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-4.png 978w, https://tazmenworld.com/wp-content/uploads/2026/04/image-4-300x156.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-4-768x399.png 768w" sizes="auto, (max-width: 978px) 100vw, 978px" /></figure>



<p class="wp-block-paragraph">Tu devrais voir un tableau s&rsquo;afficher. Ce qui nous intéresse ici, c&rsquo;est que le nom de ta carte apparaisse bien et que la <strong>Driver Version</strong> soit à jour (idéalement au-dessus de 550 pour les cartes récentes). Si ce tableau s&rsquo;affiche, ton pilote est opérationnel.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. Installation de Docker : Le moteur de ton projet ⚙️</h2>



<p class="wp-block-paragraph">Docker va nous permettre d&rsquo;isoler ComfyUI. Au lieu d&rsquo;installer des dizaines de bibliothèques directement sur ton Ubuntu, on va créer un « conteneur » qui contiendra tout le nécessaire.</p>



<h3 class="wp-block-heading">Pourquoi Docker ?</h3>



<ul class="wp-block-list">
<li><strong>Propreté :</strong> Si tu veux supprimer ComfyUI un jour, tu supprimes juste le conteneur, et ton système reste comme neuf.</li>



<li><strong>Isolation :</strong> Pas de conflit entre tes différents projets IA.</li>



<li><strong>Simplicité :</strong> On utilise une « recette » précise qui fonctionne à tous les coups.</li>
</ul>



<h3 class="wp-block-heading">Les étapes d&rsquo;installation</h3>



<p class="wp-block-paragraph">Tape ces commandes pour installer Docker de manière propre (version officielle) :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Mise à jour des dépôts
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# Ajout de la clé GPG officielle de Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Configuration du dépôt stable
echo \
  "deb &#91;arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg&#93; https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Installation finale
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">Mise</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">à</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">jour</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">des</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dépôts</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">update</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">ca</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">certificates</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">gnupg</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">Ajout</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">la</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">clé</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">GPG</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">officielle</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Docker</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">m</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0755</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">d</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">keyrings</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">fsSL</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">chmod</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">a</span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9">r</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">keyrings</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">gpg</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">Configuration</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">du</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dépôt</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">stable</span></span>
<span class="line"><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">deb &#91;arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg&#93; https://download.docker.com/linux/ubuntu </span><span style="color: #EBCB8B">\</span></span>
<span class="line"><span style="color: #A3BE8C">  $(. /etc/os-release &amp;&amp; echo </span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9">$VERSION_CODENAME</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">) stable</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tee</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sources</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">list</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">d</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">docker</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">list</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">dev</span><span style="color: #81A1C1">/null</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">Installation</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">finale</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">update</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ce</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ce</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">cli</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">containerd</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">io</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">buildx</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plugin</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">compose</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">plugin</span></span></code></pre></div>



<h2 class="wp-block-heading">3. Le pont vers le GPU : NVIDIA Container Toolkit 🌉</h2>



<p class="wp-block-paragraph">Par défaut, Docker ne peut pas voir ta carte graphique. Il faut installer un « pont » qui permet au conteneur d&rsquo;utiliser la puissance de calcul de ta RTX.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Configuration du dépôt NVIDIA
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb &#91;signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg&#93; https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# Installation et configuration
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">Configuration</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">du</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dépôt</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NVIDIA</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">fsSL</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg</span></span>
<span class="line"><span style="color: #D8DEE9">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">s</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">L</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">sed</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">s#deb https://#deb &#91;signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg&#93; https://#g</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tee</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">etc</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">sources</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">list</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">d</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">nvidia</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">container</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">toolkit</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">list</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">Installation</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">et</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configuration</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">update</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nvidia</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">container</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">toolkit</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nvidia</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">ctk</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">runtime</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">configure</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">runtime</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">docker</span></span>
<span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">systemctl</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">restart</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span></span></code></pre></div>



<h2 class="wp-block-heading">4. Préparation de l&rsquo;environnement ComfyUI 🎨<sup></sup></h2>



<p class="wp-block-paragraph">On va créer un dossier dédié pour notre installation. On va y placer deux fichiers : un pour construire l&rsquo;image et un pour gérer le lancement.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mkdir ~/comfyui-station &amp;&amp; cd ~/comfyui-station</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mkdir</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9">comfyui</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">station</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9">comfyui</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">station</span></span></code></pre></div>



<h3 class="wp-block-heading">Le fichier Dockerfile</h3>



<p class="wp-block-paragraph">Ce fichier contient la « recette » de notre environnement. Il va télécharger une base NVIDIA/PyTorch stable et y installer ComfyUI.</p>



<p class="wp-block-paragraph">Tape <code>nano Dockerfile</code> et colle ceci :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># On part d'une base CUDA solide
FROM pytorch/pytorch:2.2.1-cuda12.1-cudnn8-runtime

# Installation des dépendances système pour OpenCV et Git
RUN apt-get update &amp;&amp; apt-get install -y \
    git \
    libgl1-mesa-glx \
    libglib2.0-0 \
    &amp;&amp; rm -rf /var/lib/apt/lists/*

# Clonage de ComfyUI
WORKDIR /opt
RUN git clone https://github.com/comfyanonymous/ComfyUI.git

# Installation des dépendances Python de base
WORKDIR /opt/ComfyUI
RUN pip install --no-cache-dir -r requirements.txt

# --- AJOUT CRUCIAL POUR TON BLOG ---
# On installe les bibliothèques requises par les extensions populaires
# (Manager, Crystools, Lora Manager, etc.)
RUN pip install --no-cache-dir piexif deepdiff py-cpuinfo natsort pynvml toml GitPython

# Lancement du serveur
EXPOSE 8188
CMD &#91;"python", "main.py", "--listen", "0.0.0.0"&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">On</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">part</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">d</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">une base CUDA solid</span><span style="color: #D8DEE9">e</span></span>
<span class="line"><span style="color: #D8DEE9">FROM</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pytorch</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">pytorch</span><span style="color: #ECEFF4">:</span><span style="color: #B48EAD">2.2</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">cuda12</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">cudnn8</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">runtime</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF"># </span><span style="color: #D8DEE9">Installation</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">des</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dépendances</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">système</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pour</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">OpenCV</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">et</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Git</span></span>
<span class="line"><span style="color: #D8DEE9">RUN</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">update</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">y</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">git</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">libgl1</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">mesa</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">glx</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">libglib2</span><span style="color: #ECEFF4">.</span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">-</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF"> \</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">rm</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">rf</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/var</span><span style="color: #D8DEE9FF">/</span><span style="color: #D8DEE9">lib</span><span style="color: #D8DEE9FF">/apt/lists</span><span style="color: #616E88">/*</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Clonage de ComfyUI</span></span>
<span class="line"><span style="color: #616E88">WORKDIR /opt</span></span>
<span class="line"><span style="color: #616E88">RUN git clone https://github.com/comfyanonymous/ComfyUI.git</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Installation des dépendances Python de base</span></span>
<span class="line"><span style="color: #616E88">WORKDIR /opt/ComfyUI</span></span>
<span class="line"><span style="color: #616E88">RUN pip install --no-cache-dir -r requirements.txt</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># --- AJOUT CRUCIAL POUR TON BLOG ---</span></span>
<span class="line"><span style="color: #616E88"># On installe les bibliothèques requises par les extensions populaires</span></span>
<span class="line"><span style="color: #616E88"># (Manager, Crystools, Lora Manager, etc.)</span></span>
<span class="line"><span style="color: #616E88">RUN pip install --no-cache-dir piexif deepdiff py-cpuinfo natsort pynvml toml GitPython</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Lancement du serveur</span></span>
<span class="line"><span style="color: #616E88">EXPOSE 8188</span></span>
<span class="line"><span style="color: #616E88">CMD &#91;&quot;python&quot;, &quot;main.py&quot;, &quot;--listen&quot;, &quot;0.0.0.0&quot;&#93;</span></span></code></pre></div>



<h2 class="wp-block-heading">5. Mapping des modèles existants (Stability Matrix) 🧠</h2>



<p class="wp-block-paragraph">C&rsquo;est l&rsquo;étape cruciale pour ne pas perdre de place. Si tu as déjà tes modèles (Checkpoints, Lora, VAE) sur un disque dur séparé, on va les « monter » directement dans le conteneur.</p>



<h3 class="wp-block-heading">Le fichier docker-compose.yml</h3>



<p class="wp-block-paragraph">Tape <code>nano docker-compose.yml</code> et adapte les chemins vers ton disque de données :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>services:
  comfyui:
    build: .
    container_name: comfyui
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "8188:8188"
    volumes:
      # --- STOCKAGE DES MODÈLES (À adapter selon votre disque) ---
      # Remplacez /media/NOM_UTILISATEUR/DISQUE/ par votre chemin réel
      - /media/user/DATA/Models/StableDiffusion:/opt/ComfyUI/models/checkpoints
      - /media/user/DATA/Models/Lora:/opt/ComfyUI/models/loras
      - /media/user/DATA/Models/VAE:/opt/ComfyUI/models/vae
      
      # --- DONNÉES LOCALES (Persistance dans le dossier du projet) ---
      - ./custom_nodes:/opt/ComfyUI/custom_nodes # Vos extensions
      - ./user:/opt/ComfyUI/user                 # Vos réglages (langue, thèmes)
      - ./output:/opt/ComfyUI/output             # Vos images générées

    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: &#91;gpu&#93;
    
    # "no" pour garder le contrôle manuel, "unless-stopped" pour un démarrage auto
    restart: "no"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  comfyui</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    build</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span></span>
<span class="line"><span style="color: #D8DEE9FF">    container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comfyui</span></span>
<span class="line"><span style="color: #D8DEE9FF">    runtime</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nvidia</span></span>
<span class="line"><span style="color: #D8DEE9FF">    environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NVIDIA_VISIBLE_DEVICES</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">all</span></span>
<span class="line"><span style="color: #D8DEE9FF">    ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8188:8188</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      # </span><span style="color: #81A1C1">---</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">STOCKAGE</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">DES</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">MODÈLES</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">À</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">adapter</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">selon</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">votre</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">disque</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">---</span></span>
<span class="line"><span style="color: #D8DEE9FF">      # </span><span style="color: #D8DEE9">Remplacez</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">media</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">NOM_UTILISATEUR</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">DISQUE</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">par</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">votre</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">chemin</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">réel</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">media</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">user</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">DATA</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Models</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">StableDiffusion</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">opt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ComfyUI</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">models</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">checkpoints</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">media</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">user</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">DATA</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Models</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">Lora</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">opt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ComfyUI</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">models</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">loras</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">media</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">user</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">DATA</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">Models</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">VAE</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">opt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ComfyUI</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">models</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">vae</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span></span>
<span class="line"><span style="color: #D8DEE9FF">      # </span><span style="color: #81A1C1">---</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">DONNÉES</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">LOCALES</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">Persistance</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dans</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">le</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dossier</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">du</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">projet</span><span style="color: #D8DEE9FF">) </span><span style="color: #81A1C1">---</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">custom_nodes</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">opt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ComfyUI</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">custom_nodes</span><span style="color: #D8DEE9FF"> # </span><span style="color: #D8DEE9">Vos</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">extensions</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">user</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">opt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ComfyUI</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">user</span><span style="color: #D8DEE9FF">                 # </span><span style="color: #D8DEE9">Vos</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">réglages</span><span style="color: #D8DEE9FF"> (</span><span style="color: #D8DEE9">langue</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">thèmes</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">.</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9FF">output</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">opt</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">ComfyUI</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">output</span><span style="color: #D8DEE9FF">             # </span><span style="color: #D8DEE9">Vos</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">images</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">générées</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    deploy</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      resources</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        reservations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">          devices</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> driver</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nvidia</span></span>
<span class="line"><span style="color: #D8DEE9FF">              count</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">all</span></span>
<span class="line"><span style="color: #D8DEE9FF">              capabilities</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> &#91;</span><span style="color: #D8DEE9">gpu</span><span style="color: #D8DEE9FF">&#93;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span></span>
<span class="line"><span style="color: #D8DEE9FF">    # </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">no</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pour</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">garder</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">le</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">contrôle</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">manuel</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">unless-stopped</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">pour</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">un</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">démarrage</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">auto</span></span>
<span class="line"><span style="color: #D8DEE9FF">    restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">no</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<h2 class="wp-block-heading">6. Lancement et Monitoring 📊</h2>



<p class="wp-block-paragraph">Tout est prêt. On lance la construction et le démarrage :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo docker compose up -d --build</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">compose</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">up</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">d</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">--</span><span style="color: #D8DEE9">build</span></span></code></pre></div>



<p class="wp-block-paragraph">Docker va maintenant télécharger les composants (plusieurs Go) et préparer ton serveur. Tu peux suivre l&rsquo;avancée avec :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo docker logs -f comfyui</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">f</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">comfyui</span></span></code></pre></div>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">Surveiller tes ressources</h3>



<p class="wp-block-paragraph">Une fois que ComfyUI est lancé sur <code>http://localhost:8188</code>, il est important de surveiller la charge de ta carte. Je te conseille d&rsquo;installer <strong>nvtop</strong> sur ton Ubuntu :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo apt install nvtop
nvtop</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">apt</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nvtop</span></span>
<span class="line"><span style="color: #D8DEE9">nvtop</span></span></code></pre></div>



<figure class="wp-block-image size-large"><img width="1024" height="470"  alt="" class="wp-image-181"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-5-1024x470.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-5-1024x470.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5-300x138.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5-768x353.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5-1536x705.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-5.png 1675w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Cela t&rsquo;affichera des graphiques magnifiques sur l&rsquo;utilisation de ta VRAM et de ton GPU en temps réel.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">7. Installation du Manager et de Crystools 🛠️</h2>



<p class="wp-block-paragraph">Pour que ton expérience soit complète, tu as besoin du <strong>ComfyUI-Manager</strong>. Puisque nous avons mappé le dossier <code>custom_nodes</code>, tu peux l&rsquo;installer directement depuis ton Ubuntu :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cd ~/comfyui-station/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9">comfyui</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">station</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">custom_nodes</span></span>
<span class="line"><span style="color: #D8DEE9">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">clone</span><span style="color: #D8DEE9FF"> https</span><span style="color: #ECEFF4">:</span><span style="color: #616E88">//github.com/ltdrdata/ComfyUI-Manager.git</span></span></code></pre></div>



<figure class="wp-block-image size-large"><img width="1024" height="558"  alt="" class="wp-image-182"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-6-1024x558.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-6-1024x558.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-6-300x164.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-6-768x419.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-6.png 1198w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Redémarre le conteneur (<code>sudo docker compose restart</code>) et tu verras le bouton Manager apparaître. Utilise-le pour installer <strong>Crystools</strong>, qui te permettra d&rsquo;avoir tes statistiques de ressources directement dans l&rsquo;interface web.</p>



<figure class="wp-block-image size-large"><img width="1024" height="58"  alt="" class="wp-image-183"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-7-1024x58.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-7-1024x58.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-7-300x17.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-7-768x43.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-7.png 1117w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">8. Garder le contrôle : Le mode « Démarrage Manuel » 🕹️</h2>



<p class="wp-block-paragraph">Avoir ComfyUI qui tourne en arrière-plan, c&rsquo;est pratique, mais sur une machine de guerre, on veut parfois récupérer <strong>100 % de sa VRAM</strong> pour lancer un jeu gourmand ou un logiciel de montage sans que Docker ne vienne grignoter des ressources.</p>



<p class="wp-block-paragraph">Voici comment configurer ton installation pour qu&rsquo;elle ne s&rsquo;allume que lorsque <strong>tu</strong> le décides.</p>



<h3 class="wp-block-heading">1. Modifier la règle de redémarrage</h3>



<p class="wp-block-paragraph">Par défaut, nous avons configuré Docker pour qu&rsquo;il relance ComfyUI automatiquement au démarrage du PC. Pour changer cela, ouvre ton fichier de configuration :</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>nano ~/comfyui-station/docker-compose.yml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">nano</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">~/</span><span style="color: #D8DEE9">comfyui</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">station</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">docker</span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">compose</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">yml</span></span></code></pre></div>



<p class="wp-block-paragraph">Modifie la ligne <code>restart</code> tout en bas :</p>



<ul class="wp-block-list">
<li><strong>Ancienne version :</strong> <code>restart: unless-stopped</code></li>



<li><strong>Nouvelle version :</strong> <code>restart: "no"</code></li>
</ul>



<p class="wp-block-paragraph">Applique le changement avec un petit : <code>sudo docker compose up -d</code>. Désormais, au prochain démarrage d&rsquo;Ubuntu, ComfyUI restera sagement éteint.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. Le pilotage « Clic-Bouton » avec Portainer</h3>



<p class="wp-block-paragraph">C&rsquo;est là que <strong>Portainer</strong> prend tout son sens. Au lieu de taper des lignes de commande, tu as maintenant une télécommande visuelle :</p>



<ol start="1" class="wp-block-list">
<li>Ouvre ton interface Portainer.</li>



<li>Dans l&rsquo;onglet <strong>Containers</strong>, tu verras ton conteneur <code>comfyui</code> avec un voyant gris (<strong>stopped</strong>).</li>



<li>Quand tu as une idée de création : coche la case et clique sur <strong>Start</strong>.</li>



<li>Une fois ta session finie : clique sur <strong>Stop</strong>. Ta carte graphique retombe instantanément à 0% d&rsquo;utilisation.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"></h3>



<h2 class="wp-block-heading">Conclusion 🏁</h2>



<p class="wp-block-paragraph">Tu as maintenant une installation de ComfyUI professionnelle :</p>



<ol start="1" class="wp-block-list">
<li><strong>Performante :</strong> Accès direct au GPU via NVIDIA Container Toolkit.</li>



<li><strong>Organisée :</strong> Tes modèles restent sur ton disque DATA.</li>



<li><strong>Évolutive :</strong> Tu peux mettre à jour ComfyUI ou tester d&rsquo;autres versions sans jamais polluer ton système Ubuntu principal.</li>
</ol>



<p class="wp-block-paragraph">Il ne te reste plus qu&rsquo;à charger ton premier modèle et à laisser libre cours à ta créativité !</p>



<figure class="wp-block-image size-large"><img width="1024" height="158"  alt="" class="wp-image-184"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-8-1024x158.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-8-1024x158.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-8-300x46.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-8-768x118.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-8-1536x237.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/image-8-2048x315.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Dernier conseil de sécurité :</strong> Pense à faire une copie de ton dossier <code>~/comfyui-station</code> (surtout les fichiers <code>Dockerfile</code> et <code>docker-compose.yml</code>) sur une clé USB ou un cloud. Si tu réinstalles ton Ubuntu un jour, tu récupéreras ton usine à images en exactement 2 minutes.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/04/15/vram-tuning-partie-2-passer-sous-linux-pour-liberer-votre-gpu/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Gemma 4 : Comment Google révolutionne l&#8217;usage de la VRAM avec ses modèles open source</title>
		<link>https://tazmenworld.com/2026/04/03/gemma-4-comment-google-revolutionne-lusage-de-la-vram-avec-ses-modeles-open-source/</link>
					<comments>https://tazmenworld.com/2026/04/03/gemma-4-comment-google-revolutionne-lusage-de-la-vram-avec-ses-modeles-open-source/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Fri, 03 Apr 2026 09:43:16 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=168</guid>

					<description><![CDATA[L&#8217;arrivée de Gemma 4 marque un tournant que nous, ingénieurs d&#8217;infrastructure, attendions de pied ferme. On ne parle plus ici d&#8217;une simple itération incrémentale de « LLM » (Large Language Model), mais d&#8217;une véritable architecture multimodale native, pensée dès le départ pour la performance brute et la flexibilité de déploiement. Google DeepMind vient de libérer une famille [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-176"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/h3xjo1h3xjo1h3xj-1-1024x572.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/h3xjo1h3xjo1h3xj-1-1024x572.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/h3xjo1h3xjo1h3xj-1-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/h3xjo1h3xjo1h3xj-1-768x429.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/h3xjo1h3xjo1h3xj-1.png 1376w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">L&rsquo;arrivée de Gemma 4 marque un tournant que nous, ingénieurs d&rsquo;infrastructure, attendions de pied ferme. On ne parle plus ici d&rsquo;une simple itération incrémentale de « LLM » (Large Language Model), mais d&rsquo;une véritable architecture multimodale native, pensée dès le départ pour la performance brute et la flexibilité de déploiement. Google DeepMind vient de libérer une famille de modèles (sous licence Apache 2) qui bouscule le rapport habituel entre puissance de calcul et qualité de réponse.</p>



<p class="wp-block-paragraph">Le passage à la multimodalité totale (texte, image, audio, vidéo) dans des formats capables de tourner sur des stations de travail standard, voire sur du matériel « edge », change radicalement la donne pour nos pipelines de production.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">1. Analyse Technique : L&rsquo;Architecture sous le Capot</h2>



<p class="wp-block-paragraph">Gemma 4 ne se contente pas d&#8217;empiler des couches de Transformers. L&rsquo;architecture introduit plusieurs mécanismes sophistiqués pour optimiser le flux de données et la gestion de la mémoire vive, ce qui est le nerf de la guerre en infrastructure.</p>



<h3 class="wp-block-heading">L&rsquo;Attention Hybride : Sliding Window vs Global Context</h3>



<p class="wp-block-paragraph">L&rsquo;une des innovations majeures réside dans la gestion de l&rsquo;attention. Au lieu d&rsquo;utiliser une attention globale sur toute la fenêtre de contexte (ce qui est extrêmement coûteux en calcul, croissant de manière quadratique), Gemma 4 alterne :</p>



<ul class="wp-block-list">
<li><strong>Sliding-window attention (SWA) :</strong> Des couches d&rsquo;attention locale (512 tokens pour les petits modèles, 1024 pour les gros) qui limitent le voisinage de calcul et réduisent drastiquement la charge GPU.</li>



<li><strong>Global full-context attention :</strong> Des couches classiques intercalées pour maintenir la cohérence globale.</li>
</ul>



<p class="wp-block-paragraph">Pour gérer cette dualité, Google utilise un <strong>Dual RoPE</strong> (Rotary Positional Embeddings). Un RoPE standard pour les fenêtres glissantes et un RoPE « proportionnel » pour les couches globales. C&rsquo;est ce qui permet aux modèles de tenir des fenêtres de contexte allant jusqu&rsquo;à 256k tokens sans que la latence n&rsquo;explose au premier prompt.</p>



<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-170"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/unnamed-1-1024x572.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/unnamed-1-1024x572.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/unnamed-1-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/unnamed-1-768x429.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/unnamed-1-1536x857.png 1536w, https://tazmenworld.com/wp-content/uploads/2026/04/unnamed-1-2048x1143.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">Per-Layer Embeddings (PLE) : La fin du goulot d&rsquo;étranglement initial</h3>



<p class="wp-block-paragraph">Dans un modèle classique, l&#8217;embedding initial doit contenir toute l&rsquo;information sémantique que les couches suivantes vont traiter. Gemma 4 introduit les <strong>PLE</strong>. C&rsquo;est un second tableau d&#8217;embeddings, de dimension plus faible, qui injecte un signal résiduel spécifique à chaque couche du décodeur.</p>



<p class="wp-block-paragraph">Concrètement, chaque couche reçoit une information « fraîche » sur l&rsquo;identité des tokens, ce qui permet au modèle d&rsquo;être beaucoup plus fin dans son raisonnement multimodal sans augmenter massivement le nombre total de paramètres.</p>



<h3 class="wp-block-heading">Shared KV Cache : L&rsquo;optimisation critique de la VRAM</h3>



<p class="wp-block-paragraph">Pour nous, les Ops, le « KV Cache » est souvent ce qui sature la mémoire vidéo lors des phases de génération longue. Gemma 4 implémente un <strong>Shared KV Cache</strong>. Les dernières couches du modèle ne recalculent pas leurs propres projections de clés (K) et de valeurs (V) ; elles réutilisent celles des couches précédentes.</p>



<p class="wp-block-paragraph">Le gain est immédiat : moins de calculs de projection et une empreinte mémoire réduite pour le cache de contexte, sans perte de qualité mesurable sur les benchmarks.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">2. Impacts sur l&rsquo;Infrastructure : Dimensionnement et Performance</h2>



<p class="wp-block-paragraph">Le déploiement de Gemma 4 impose de repenser nos quotas de ressources. Voici un tableau récapitulatif des modèles pour nous aider à calibrer nos instances :</p>



<h3 class="wp-block-heading">Tableau des caractéristiques et tailles de fichiers (Estimations Infra)</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Modèle</strong></td><td><strong>Paramètres (Effectifs / Totaux)</strong></td><td><strong>Fenêtre Contexte</strong></td><td><strong>Taille Fichier (FP16)</strong></td><td><strong>Taille Fichier (4-bit)</strong></td><td><strong>Usage Cible</strong></td></tr></thead><tbody><tr><td><strong>Gemma 4 E2B</strong></td><td>2.3B / 5.1B*</td><td>128k</td><td>~10.2 Go</td><td>~3.2 Go</td><td>Smartphone, Edge, IoT</td></tr><tr><td><strong>Gemma 4 E4B</strong></td><td>4.5B / 8.0B*</td><td>128k</td><td>~16.0 Go</td><td>~5.0 Go</td><td>Laptop, Serveur léger</td></tr><tr><td><strong>Gemma 4 26B (MoE)</strong></td><td>4B (actifs) / 26B</td><td>256k</td><td>~52.0 Go</td><td>~15.5 Go</td><td>Workstation, Inference Cloud</td></tr><tr><td><strong>Gemma 4 31B (Dense)</strong></td><td>31B / 31B</td><td>256k</td><td>~62.0 Go</td><td>~18.5 Go</td><td>Cluster GPU, Recherche</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><em>*Incluant les tables d&#8217;embeddings et PLE.</em></p>



<h3 class="wp-block-heading">Le cas particulier du modèle Mixture-of-Experts (MoE)</h3>



<p class="wp-block-paragraph">Le modèle 26B est particulièrement intéressant d&rsquo;un point de vue infrastructure. Bien qu&rsquo;il pèse 26 milliards de paramètres (ce qui impacte le stockage et la VRAM nécessaire pour charger le modèle), il n&rsquo;utilise que <strong>4 milliards de paramètres actifs</strong> par token lors de l&rsquo;inférence.</p>



<p class="wp-block-paragraph"><strong>Impact concret :</strong> Vous avez besoin d&rsquo;une carte avec au moins 24 Go de VRAM (ou une quantification agressive) pour le charger, mais le débit de tokens (tokens/sec) sera proche de celui d&rsquo;un modèle 4B. C&rsquo;est le meilleur compromis latence/intelligence du moment.</p>



<figure class="wp-block-image size-large"><img width="1024" height="952"  alt="" class="wp-image-171"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-1024x952.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-1024x952.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/04/image-300x279.png 300w, https://tazmenworld.com/wp-content/uploads/2026/04/image-768x714.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image.png 1478w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img width="819" height="1024"  alt="" class="wp-image-172"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-1-819x1024.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-1-819x1024.png 819w, https://tazmenworld.com/wp-content/uploads/2026/04/image-1-240x300.png 240w, https://tazmenworld.com/wp-content/uploads/2026/04/image-1-768x960.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-1.png 960w" sizes="auto, (max-width: 819px) 100vw, 819px" /></figure>



<h3 class="wp-block-heading">Gestion de la Multimodalité native</h3>



<p class="wp-block-paragraph">Gemma 4 intègre des encodeurs Vision et Audio directement dans le flux. L&rsquo;encodeur vision supporte des ratios d&rsquo;aspect variables et permet de configurer le nombre de tokens d&rsquo;image (de 70 à 1120). En production, cela signifie que vous pouvez ajuster dynamiquement la charge de calcul en fonction de la précision d&rsquo;image requise. Un OCR sur un document complexe demandera 1120 tokens, tandis qu&rsquo;une simple reconnaissance d&rsquo;objet se contentera de 70 tokens, économisant ainsi de précieux cycles GPU.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">3. Recommandations : Mise en œuvre et Optimisation</h2>



<p class="wp-block-paragraph">Pour intégrer Gemma 4 dans vos environnements, voici les chemins critiques à privilégier.</p>



<h3 class="wp-block-heading">Choix de la quantification</h3>



<p class="wp-block-paragraph">Ne restez pas en FP16 sauf si vous faites du fine-tuning. Pour l&rsquo;inférence de production :</p>



<ul class="wp-block-list">
<li><strong>Quantification 4-bit (GGUF/EXL2) :</strong> Indispensable pour faire tourner le modèle 31B ou 26B sur une seule carte type RTX 3090/4090 ou A10G.</li>



<li><strong>Quantification 8-bit (bitsandbytes) :</strong> Le « sweet spot » pour les modèles E2B et E4B si vous voulez conserver une précision quasi-parfaite en environnement critique.</li>
</ul>



<h3 class="wp-block-heading">Stack de déploiement</h3>



<ol start="1" class="wp-block-list">
<li><strong>Local / On-device :</strong> Utilisez <code>llama.cpp</code> ou <code>MLX</code> (pour les puces Apple Silicon). La gestion du cache KV partagé y est déjà optimisée.</li>



<li><strong>Cloud / Serveur :</strong> Privilégiez <code>vLLM</code> ou <code>TGI</code> (Text Generation Inference). Ces moteurs gèrent nativement le « Paged Attention », ce qui, couplé à la fenêtre de 256k de Gemma 4, permet de servir des contextes massifs sans crash mémoire.</li>



<li><strong>Web / Browser :</strong> Grâce à <code>transformers.js</code>, le modèle E2B est désormais utilisable directement côté client en WebGPU. C&rsquo;est une option majeure pour réduire vos coûts d&rsquo;infrastructure serveur en déportant l&rsquo;inférence sur le device de l&rsquo;utilisateur.</li>
</ol>



<h3 class="wp-block-heading">Configuration Système (Exemple CLI)</h3>



<p class="wp-block-paragraph">Pour tester rapidement le modèle E4B sur une machine Linux avec Python :</p>



<p class="wp-block-paragraph">Bash</p>



<pre class="wp-block-code"><code>pip install -U transformers accelerate bitsandbytes
</code></pre>



<p class="wp-block-paragraph">Python</p>



<pre class="wp-block-code"><code>from transformers import Gemma4ForCausalLM, AutoProcessor
import torch

model_id = "google/gemma-4-e4b-it"
# Chargement optimisé en 4-bit pour économiser la VRAM
model = Gemma4ForCausalLM.from_pretrained(
    model_id, 
    device_map="auto", 
    quantization_config=BitsAndBytesConfig(load_in_4bit=True)
)
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Gemma 4 n&rsquo;est pas seulement une réussite algorithmique, c&rsquo;est une leçon d&rsquo;optimisation d&rsquo;infrastructure. En combinant intelligemment l&rsquo;attention hybride, les PLE et le partage de cache KV, Google livre des modèles qui « respirent » mieux sur notre hardware actuel.</p>



<p class="wp-block-paragraph">Pour les équipes Infra, le message est clair : la barrière à l&rsquo;entrée pour l&rsquo;IA multimodale de haute qualité vient de s&rsquo;effondrer. Le modèle 26B MoE, en particulier, va devenir le standard pour les agents autonomes nécessitant rapidité et compréhension contextuelle étendue. Il est temps de mettre à jour vos clusters et de commencer à benchmarker ces modèles sur vos données métiers.</p>



<figure class="wp-block-image size-large"><img width="640" height="1024"  alt="" class="wp-image-174"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/04/image-3-640x1024.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/04/image-3-640x1024.png 640w, https://tazmenworld.com/wp-content/uploads/2026/04/image-3-187x300.png 187w, https://tazmenworld.com/wp-content/uploads/2026/04/image-3-768x1229.png 768w, https://tazmenworld.com/wp-content/uploads/2026/04/image-3-960x1536.png 960w, https://tazmenworld.com/wp-content/uploads/2026/04/image-3.png 1220w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>



<p class="wp-block-paragraph">Source : <a href="https://huggingface.co/blog/gemma4" target="_blank" rel="noreferrer noopener">https://huggingface.co/blog/gemma4</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/04/03/gemma-4-comment-google-revolutionne-lusage-de-la-vram-avec-ses-modeles-open-source/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Au-delà de la magie : La mécanique profonde de la génération d&#8217;images et de vidéos par IA</title>
		<link>https://tazmenworld.com/2026/02/22/au-dela-de-la-magie-la-mecanique-profonde-de-la-generation-dimages-et-de-videos-par-ia/</link>
					<comments>https://tazmenworld.com/2026/02/22/au-dela-de-la-magie-la-mecanique-profonde-de-la-generation-dimages-et-de-videos-par-ia/#respond</comments>
		
		<dc:creator><![CDATA[tazmen3]]></dc:creator>
		<pubDate>Sun, 22 Feb 2026 17:36:56 +0000</pubDate>
				<category><![CDATA[Intelligence Artificielle (IA)]]></category>
		<guid isPermaLink="false">https://tazmenworld.com/?p=125</guid>

					<description><![CDATA[Il y a encore quelques années, si je voulais créer des images numériques hyperréalistes, il me fallait des compétences pointues en modélisation 3D, en rendu physique ou des heures de travail acharné sur Photoshop. Aujourd&#8217;hui, il me suffit de taper une phrase, un simple « prompt » : « génère moi une image réaliste de l&#8217;homme du [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="572"  alt="" class="wp-image-126"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/tempetemoivoiture-1024x572.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/tempetemoivoiture-1024x572.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/02/tempetemoivoiture-300x167.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/tempetemoivoiture-768x429.png 768w, https://tazmenworld.com/wp-content/uploads/2026/02/tempetemoivoiture.png 1376w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Il y a encore quelques années, si je voulais créer des images numériques hyperréalistes, il me fallait des compétences pointues en modélisation 3D, en rendu physique ou des heures de travail acharné sur Photoshop. Aujourd&rsquo;hui, il me suffit de taper une phrase, un simple « prompt » : <em>« génère moi une image réaliste de l&rsquo;homme du lapin (soit fidèle à la source) qui roulent dans un décapotable verte dans le désert du Nevada, le xénomorphe (du film alien) fait du stop sur le bord de la route sur le dos d&rsquo;une licorne arc en ciel »</em>. Quelques secondes plus tard, je vois l&rsquo;image apparaître, non pas extraite d&rsquo;une immense base de données secrète, mais générée de toutes pièces, pixel par pixel. Plus récemment encore, j&rsquo;ai vu cette prouesse s&rsquo;étendre à la vidéo, ajoutant une dimension temporelle vertigineuse à cette création <em>ex nihilo</em>.</p>



<p class="wp-block-paragraph">Pendant longtemps, le monde de l&rsquo;IA générative visuelle que j&rsquo;observais était dominé par les GANs (Réseaux Antagonistes Génératifs). Bien que puissants, ils étaient notoirement instables et peinaient à générer des images très complexes à partir de textes précis. Puis, une révolution silencieuse a eu lieu au croisement de l&rsquo;apprentissage profond (deep learning) et de la physique thermodynamique.</p>



<p class="wp-block-paragraph">Face à ces résultats stupéfiants, je suis souvent tenté de crier à la magie. Pourtant, sous le capot de ces modèles génératifs de pointe, se cache une mécanique d&rsquo;une élégance mathématique rare. J&rsquo;ai voulu comprendre comment ces modèles fonctionnent réellement, et cela demande de dépasser les explications superficielles du type « l&rsquo;IA a regardé beaucoup d&rsquo;images ». C&rsquo;est en fait un processus complexe de sculpture du bruit, guidé par une compréhension mathématique et sémantique du langage humain.</p>



<p class="wp-block-paragraph">Dans cet article, je vais déconstruire pour vous cette mécanique en trois étapes fondamentales : la création d&rsquo;un langage commun entre la machine et l&rsquo;image, la structuration de la matière à partir du chaos absolu, et enfin, l&rsquo;astuce mathématique cruciale qui permet à l&rsquo;IA de suivre nos instructions à la lettre.</p>



<h2 class="wp-block-heading">Partie 1 : La Pierre de Rosette Numérique (Comprendre le lien Texte-Image)</h2>



<p class="wp-block-paragraph">Avant qu&rsquo;une IA puisse me « dessiner » un chat, elle doit comprendre fondamentalement ce qu&rsquo;est un « chat », et comment ce concept purement linguistique se traduit visuellement. Si je montre une image de chat à un ordinateur, il ne voit qu&rsquo;une grille de nombres. Comment faire le pont entre ces pixels froids et le mot « chat » ?</p>



<p class="wp-block-paragraph">La réponse que j&rsquo;ai découverte réside dans ce qu&rsquo;on appelle les <strong>espaces latents</strong> et une technique d&rsquo;apprentissage révolutionnaire nommée l&rsquo;<strong>apprentissage contrastif</strong>, popularisée notamment par l&rsquo;architecture CLIP (Contrastive Language-Image Pre-training).</p>



<h3 class="wp-block-heading">1.1 La magie des espaces vectoriels à haute dimension</h3>



<p class="wp-block-paragraph">Pour comprendre CLIP, il m&rsquo;a fallu d&rsquo;abord saisir comment l&rsquo;IA lit le texte. Les algorithmes modernes ne lisent pas les lettres, ils placent des mots dans un espace géométrique. J&rsquo;imagine un espace gigantesque, non pas en 3 dimensions, mais possédant des centaines, voire des milliers de dimensions. Dans cet espace, chaque mot, chaque concept est un « point » défini par un vecteur (une longue liste de coordonnées).</p>



<p class="wp-block-paragraph">L&rsquo;idée est que des mots ayant un sens similaire seront placés proches l&rsquo;un de l&rsquo;autre dans cet espace. « Chien » sera géométriquement proche de « Chiot » et de « Loup », mais très loin de « Gratte-ciel ». Plus fascinant encore, cet espace permet des mathématiques sémantiques : si je prends les coordonnées du mot « Roi », que j&rsquo;y soustrais les coordonnées de « Homme » et ajoute celles de « Femme », j&rsquo;atterris exactement sur les coordonnées du mot « Reine ».</p>



<p class="wp-block-paragraph">Le coup de génie de CLIP a été d&rsquo;étendre ce concept au monde visuel. L&rsquo;objectif ? Créer un espace vectoriel unique où les images et les textes qui les décrivent « habitent » exactement au même endroit.</p>



<p class="wp-block-paragraph">Pour ce faire, le système utilise deux réseaux de neurones distincts fonctionnant en tandem :</p>



<ol start="1" class="wp-block-list">
<li><strong>Un encodeur d&rsquo;images :</strong> Il prend une image de pixels et la compresse pour la transformer en un vecteur de 512 dimensions.</li>



<li><strong>Un encodeur de texte :</strong> Il prend une phrase et fait exactement la même chose, produisant un autre vecteur de 512 dimensions.</li>
</ol>



<h3 class="wp-block-heading">1.2 Le jeu des paires contrastives</h3>



<p class="wp-block-paragraph">Au début de l&rsquo;entraînement, ces encodeurs sont « stupides ». Le vecteur d&rsquo;une image de chien peut se retrouver à l&rsquo;autre bout de l&rsquo;espace latent par rapport au vecteur de la phrase « une photo de chien ». C&rsquo;est là qu&rsquo;intervient l&rsquo;apprentissage contrastif.</p>



<figure class="wp-block-image size-large"><img width="1024" height="451"  alt="" class="wp-image-127"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/1_h5xJzfFAfjdysNvqQbB9nQ-1024x451.webp" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/1_h5xJzfFAfjdysNvqQbB9nQ-1024x451.webp 1024w, https://tazmenworld.com/wp-content/uploads/2026/02/1_h5xJzfFAfjdysNvqQbB9nQ-300x132.webp 300w, https://tazmenworld.com/wp-content/uploads/2026/02/1_h5xJzfFAfjdysNvqQbB9nQ-768x338.webp 768w, https://tazmenworld.com/wp-content/uploads/2026/02/1_h5xJzfFAfjdysNvqQbB9nQ-1536x676.webp 1536w, https://tazmenworld.com/wp-content/uploads/2026/02/1_h5xJzfFAfjdysNvqQbB9nQ-2048x902.webp 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Source: OpenAI’s&nbsp;<a href="https://openai.com/research/clip" target="_blank" rel="noreferrer noopener">Blog</a>&nbsp;showing how to use CLIP for zero-shot image classification.</figcaption></figure>



<figure class="wp-block-image size-full"><img width="698" height="972"  alt="" class="wp-image-128"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-4.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-4.png 698w, https://tazmenworld.com/wp-content/uploads/2026/02/image-4-215x300.png 215w" sizes="auto, (max-width: 698px) 100vw, 698px" /><figcaption class="wp-element-caption">The transformer architecture from&nbsp;<a href="https://arxiv.org/abs/1706.03762" target="_blank" rel="noreferrer noopener">Attention is All You Need</a>.</figcaption></figure>



<figure class="wp-block-image size-large"><img width="1024" height="555"  alt="" class="wp-image-129"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-5-1024x555.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-5-1024x555.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/02/image-5-300x163.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/image-5-768x416.png 768w, https://tazmenworld.com/wp-content/uploads/2026/02/image-5.png 1380w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Source:&nbsp;<a href="https://arxiv.org/abs/2204.14198" target="_blank" rel="noreferrer noopener">Flamingo paper</a></figcaption></figure>



<p class="wp-block-paragraph">On nourrit le modèle avec des centaines de millions de paires (image, texte descriptif) aspirées sur Internet. J&rsquo;imagine cela comme une matrice géante. Sur les lignes, j&rsquo;ai les descriptions textuelles d&rsquo;un lot d&rsquo;images. Sur les colonnes, les images correspondantes.</p>



<p class="wp-block-paragraph">L&rsquo;objectif de l&rsquo;entraînement est d&rsquo;optimiser le modèle pour :</p>



<ol start="1" class="wp-block-list">
<li><strong>Maximiser la similarité</strong> entre les paires correspondantes (la diagonale de ma matrice). Géométriquement, l&rsquo;IA force l&rsquo;encodeur d&rsquo;image et l&rsquo;encodeur de texte à orienter leurs vecteurs respectifs dans la même direction exacte.</li>



<li><strong>Minimiser la similarité</strong> entre toutes les autres paires. L&rsquo;IA repousse activement le vecteur de l&rsquo;image « chat » loin du vecteur du texte « voiture rouge ».</li>
</ol>



<p class="wp-block-paragraph">C&rsquo;est cette fondation, cette véritable Pierre de Rosette numérique, qui permet à l&rsquo;IA de « comprendre » mes prompts. Cependant, comprendre un texte n&rsquo;est pas dessiner. CLIP est un critique d&rsquo;art exceptionnel, mais c&rsquo;est un piètre peintre. Pour générer l&rsquo;image, il me faut un autre moteur.</p>



<h2 class="wp-block-heading">Partie 2 : Sculpter le Chaos (Les Modèles de Diffusion)</h2>



<p class="wp-block-paragraph">La véritable révolution visuelle de la décennie est née de l&rsquo;adoption des <strong>Modèles Probabilistes de Diffusion (DDPM)</strong>. L&rsquo;idée centrale m&rsquo;a paru profondément contre-intuitive au début : pour apprendre à créer la beauté et la structure, l&rsquo;intelligence artificielle doit d&rsquo;abord apprendre à les détruire systématiquement.</p>



<h3 class="wp-block-heading">2.1 Le processus aller : La thermodynamique de la destruction</h3>



<p class="wp-block-paragraph">Le principe s&rsquo;inspire directement de la physique statistique (le mouvement brownien). Imaginons le processus d&rsquo;entraînement. Je prends une image parfaitement nette de notre ensemble de données. Le processus de diffusion « aller » (forward process) consiste à détruire cette information en y ajoutant progressivement du bruit gaussien (une sorte de neige télévisuelle).</p>



<ul class="wp-block-list">
<li><strong>Étape 0 :</strong> Image originale, parfaitement claire.</li>



<li><strong>Étape 500 :</strong> Les formes commencent à se dissoudre sévèrement dans la neige statique.</li>



<li><strong>Étape 1000 :</strong> L&rsquo;image originale a totalement et irrémédiablement disparu. Il ne reste qu&rsquo;un carré de bruit aléatoire absolu.</li>
</ul>



<p class="wp-block-paragraph">Ce processus est mathématiquement défini et fixe. J&rsquo;ai transformé une donnée hautement structurée en un chaos parfait.</p>



<figure class="wp-block-image size-full"><img width="850" height="424"  alt="" class="wp-image-130"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-6.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-6.png 850w, https://tazmenworld.com/wp-content/uploads/2026/02/image-6-300x150.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/image-6-768x383.png 768w" sizes="auto, (max-width: 850px) 100vw, 850px" /><figcaption class="wp-element-caption">Source: <a href="https://www.researchgate.net/figure/Forward-and-reverse-process-of-diffusion-model_fig4_379478877">Circuits Systems and Signal Processing</a></figcaption></figure>



<figure class="wp-block-image size-full"><img width="850" height="331"  alt="" class="wp-image-131"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-7.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-7.png 850w, https://tazmenworld.com/wp-content/uploads/2026/02/image-7-300x117.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/image-7-768x299.png 768w" sizes="auto, (max-width: 850px) 100vw, 850px" /><figcaption class="wp-element-caption">Source: <a href="https://www.researchgate.net/figure/The-forward-and-backward-processes-of-the-diffusion-model-The-credit-of-the-used-images_fig1_382128283">The forward and backward processes of the diffusion model.&nbsp;</a></figcaption></figure>



<figure class="wp-block-image size-full"><img width="753" height="245"  alt="" class="wp-image-132"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-8.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-8.png 753w, https://tazmenworld.com/wp-content/uploads/2026/02/image-8-300x98.png 300w" sizes="auto, (max-width: 753px) 100vw, 753px" /><figcaption class="wp-element-caption">Source: <a href="https://www.researchgate.net/figure/Denoising-diffusion-model-forward-and-backward-process-qxtx-t-1-p-th-x-t-1-xt_fig1_369946317">Denoising diffusion model forward and backward process. q(xt|x t−1 ), p θ (x t−1 |xt) represent noising adding forward process and denoising backward process, respectively.</a></figcaption></figure>



<figure class="wp-block-image size-full"><img width="850" height="293"  alt="" class="wp-image-133"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-9.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-9.png 850w, https://tazmenworld.com/wp-content/uploads/2026/02/image-9-300x103.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/image-9-768x265.png 768w" sizes="auto, (max-width: 850px) 100vw, 850px" /><figcaption class="wp-element-caption">Source: <a href="https://arxiv.org/pdf/2011.13456">SCORE-BASED GENERATIVE MODELING THROUGH<br>STOCHASTIC DIFFERENTIAL EQUATIONS</a></figcaption></figure>



<h3 class="wp-block-heading">2.2 Le processus retour : La genèse à rebours</h3>



<p class="wp-block-paragraph">Le coup de génie des chercheurs a été d&rsquo;entraîner un immense réseau de neurones (souvent une architecture U-Net) à inverser l&rsquo;entropie de ce processus temporel.</p>



<p class="wp-block-paragraph">L&rsquo;entraînement se déroule ainsi : je donne au réseau de neurones l&rsquo;image bruitée à une étape aléatoire (par exemple l&rsquo;étape 450). Je lui donne aussi cette valeur temporelle pour qu&rsquo;il sache « à quel point » l&rsquo;image est censée être détruite. Sa mission est de deviner : <em>« Parmi tout ce bruit que tu vois, quelle est la part exacte de bruit qui vient d&rsquo;être ajoutée ? »</em></p>



<p class="wp-block-paragraph">Plutôt que d&rsquo;essayer de deviner l&rsquo;image finale d&rsquo;un coup sec, le réseau apprend à modéliser le vecteur de bruit pour le soustraire mathématiquement et retrouver l&rsquo;image de l&rsquo;étape 449, un peu plus nette.</p>



<h3 class="wp-block-heading">2.3 Le paradoxe de la moyenne : Pourquoi l&rsquo;IA réinjecte-t-elle du bruit ?</h3>



<p class="wp-block-paragraph">C&rsquo;est l&rsquo;une des caractéristiques que je trouve les plus fascinantes. Lors de la génération d&rsquo;une nouvelle image, je pars de l&rsquo;étape 1000 avec du pur bruit. Je demande au réseau de prédire le bruit, je le soustrais, et ainsi de suite. Logiquement, je devrais simplement « nettoyer » l&rsquo;image pas à pas.</p>



<p class="wp-block-paragraph">Pourtant, dans l&rsquo;algorithme original, <strong>après avoir soustrait le bruit prédit, l&rsquo;algorithme rajoute délibérément une petite dose de nouveau bruit aléatoire</strong> avant de passer à l&rsquo;étape suivante. Pourquoi saboter son propre travail ?</p>



<p class="wp-block-paragraph">Pour le comprendre, il faut s&rsquo;imaginer l&rsquo;espace de toutes les images possibles. Les images « réelles » et cohérentes occupent un espace extrêmement restreint, comme une fine ligne sinueuse, une <strong>spirale complexe</strong>.</p>



<p class="wp-block-paragraph">Quand le modèle regarde un point très bruité (très loin de la spirale), son objectif est de pointer vers elle. Mais au début, le bruit pur est à égale distance de toutes les images possibles. Le réseau a tendance à pointer vers la <strong>moyenne</strong> de toutes les images possibles de son set d&rsquo;entraînement (une bouillie grisâtre et floue).</p>



<p class="wp-block-paragraph">Si je me contente de suivre la prédiction de manière purement déterministe, j&rsquo;obtiendrai une image sans détails. En rajoutant du bruit à chaque étape, je force le point à « trembler » pendant qu&rsquo;il se dirige vers la spirale. Cette agitation l&#8217;empêche de s&rsquo;échouer sur la moyenne et lui permet de « tomber » sur une branche spécifique, nette et détaillée.</p>



<h2 class="wp-block-heading">Partie 3 : Prendre le Contrôle (Conditionnement et Guidage CFG)</h2>



<p class="wp-block-paragraph">J&rsquo;ai maintenant deux pièces maîtresses isolées : CLIP (qui comprend le texte) et le U-Net de Diffusion (qui sculpte l&rsquo;image). Le but est de les fusionner. Comment dire au moteur de diffusion <em>quelle partie</em> de la spirale il doit viser ?</p>



<h3 class="wp-block-heading">3.1 Le conditionnement : Murmurer à l&rsquo;oreille du bruit</h3>



<p class="wp-block-paragraph">Lorsque je valide mon prompt, le texte passe d&rsquo;abord dans l&rsquo;encodeur de texte de CLIP, qui recrache un vecteur dense de coordonnées sémantiques. Ce vecteur est injecté directement dans les entrailles du réseau de diffusion (via l&rsquo;Attention Croisée).</p>



<p class="wp-block-paragraph">Au lieu de se demander « Comment rendre cette bouillie de pixels plus réaliste ? », le réseau se demande « Comment la rendre réaliste, <strong>sachant que cela doit finir par ressembler au concept d&rsquo;un astronaute</strong> ? ».</p>



<h3 class="wp-block-heading">3.2 Le secret de l&rsquo;obéissance aveugle : Le « Classifier-Free Guidance » (CFG)</h3>



<p class="wp-block-paragraph">Cependant, dans la pratique, j&rsquo;ai souvent remarqué qu&rsquo;un simple conditionnement ne suffisait pas. Si je demandais « un astronaute tenant une pomme verte sur la lune », le modèle générait souvent juste un astronaute générique.</p>



<p class="wp-block-paragraph">C&rsquo;est là qu&rsquo;est née l&rsquo;astuce la plus importante : le <strong>Guidage sans classifieur (Classifier-Free Guidance ou CFG)</strong>. C&rsquo;est ce fameux paramètre « Guidance Scale » que l&rsquo;on manipule dans les interfaces.</p>



<figure class="wp-block-image size-large"><img width="1024" height="747"  alt="" class="wp-image-134"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-10-1024x747.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-10-1024x747.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/02/image-10-300x219.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/image-10-768x560.png 768w, https://tazmenworld.com/wp-content/uploads/2026/02/image-10.png 1180w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Compared to CFG, which uses external class information, SAG extracts the internal information with self-attention to guide the models, making it training- and condition-free. The figure is adapted from&nbsp;&nbsp;with minor annotations highlighted in light purple, licensed under CC BY 4.0.</em> Source: <a href="https://theaisummer.com/classifier-free-guidance-part-2/">https://theaisummer.com/</a></figcaption></figure>



<figure class="wp-block-image size-large"><img width="1024" height="723"  alt="" class="wp-image-135"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-11-1024x723.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-11-1024x723.png 1024w, https://tazmenworld.com/wp-content/uploads/2026/02/image-11-300x212.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/image-11-768x543.png 768w, https://tazmenworld.com/wp-content/uploads/2026/02/image-11.png 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>PAG replaces the self-attention map with an identity matrix for the negative model</em> <a href="https://arxiv.org/abs/2403.17377v1" type="link" id="https://arxiv.org/abs/2403.17377v1">Source</a></figcaption></figure>



<figure class="wp-block-image size-full"><img width="850" height="294"  alt="" class="wp-image-136"/ loading="lazy" decoding="async" src="https://tazmenworld.com/wp-content/uploads/2026/02/image-12.png" srcset="https://tazmenworld.com/wp-content/uploads/2026/02/image-12.png 850w, https://tazmenworld.com/wp-content/uploads/2026/02/image-12-300x104.png 300w, https://tazmenworld.com/wp-content/uploads/2026/02/image-12-768x266.png 768w" sizes="auto, (max-width: 850px) 100vw, 850px" /><figcaption class="wp-element-caption">The demonstration of unconditional, classifier-guided and classifier-free diffusion models. <a href="https://www.researchgate.net/figure/The-demonstration-of-unconditional-classifier-guided-and-classifier-free-diffusion_fig1_364441770">Source</a></figcaption></figure>



<p class="wp-block-paragraph">L&rsquo;idée du CFG est de forcer mathématiquement le modèle à être radical dans son adhésion à mon texte. Voici comment cette magie opère :</p>



<ol start="1" class="wp-block-list">
<li><strong>La passe silencieuse :</strong> Le modèle regarde l&rsquo;image bruitée, et on lui cache mon prompt. Il génère un vecteur prédisant la direction pour rendre l&rsquo;image simplement « réaliste ».</li>



<li><strong>La passe attentive :</strong> Le modèle regarde la même image, mais cette fois en lisant mon prompt. Il génère une nouvelle direction de débruitage conditionnée.</li>



<li><strong>L&rsquo;extraction de l&rsquo;essence pure :</strong> On soustrait le vecteur générique du vecteur conditionné. Cette soustraction isole l&rsquo;<strong>essence pure</strong> de mon prompt.</li>



<li><strong>L&rsquo;amplification :</strong> On multiplie ce vecteur d&rsquo;essence pure par le facteur d&rsquo;échelle CFG et on l&rsquo;ajoute à la prédiction inconditionnelle.</li>
</ol>



<p class="wp-block-paragraph">En langage courant, voici ce que je dis au réseau via le CFG : <em>« Je vois où tu irais naturellement. Je vois aussi où tu irais avec mon texte. Calcule la différence, multiplie cette urgence par 8, et fonce dans cette direction en ignorant tes instincts de base ! »</em></p>



<h3 class="wp-block-heading">3.3 L&rsquo;ingénierie inversée des défauts : Les Prompts Négatifs</h3>



<p class="wp-block-paragraph">Le corollaire magnifique du CFG, ce sont les « prompts négatifs ». Si je tape <em>« flou, mauvaise anatomie, doigts supplémentaires »</em>, le système calcule le vecteur vers ces mots horribles et <strong>le soustrait</strong> activement de la trajectoire finale. Le processus est mathématiquement repoussé loin des zones contenant des mains à six doigts.</p>



<h2 class="wp-block-heading">Conclusion : La grammaire de la nouvelle réalité</h2>



<p class="wp-block-paragraph">Pour moi, la génération d&rsquo;images et de vidéos par IA n&rsquo;est pas un banal tour de passe-passe. C&rsquo;est le triomphe absolu de la modélisation mathématique des espaces à très haute dimension.</p>



<p class="wp-block-paragraph">En combinant l&rsquo;apprentissage de la sémantique humaine avec la puissante modélisation des probabilités thermiques inversées, et en y appliquant une algèbre vectorielle agressive pour forcer l&rsquo;obéissance, nous avons créé un nouveau paradigme de création. J&rsquo;utilise aujourd&rsquo;hui mes mots comme des scalpels pour sculpter le bruit probabiliste.</p>



<p class="wp-block-paragraph">La prochaine fois que je taperai un prompt et que je verrai une image époustouflante émerger du néant en quelques secondes, je prendrai un instant pour imaginer cette tempête de bruit mathématique, repoussée et modelée en arrière dans le temps, guidée par la force gravitationnelle de mes mots. Ce n&rsquo;est pas de la magie, et c&rsquo;est précisément pour cela que c&rsquo;est si fascinant.</p>



<h3 class="wp-block-heading">Sources et références scientifiques</h3>



<p class="wp-block-paragraph">Pour la rédaction de cet article et pour celles et ceux qui souhaitent creuser les fondations mathématiques de ces technologies, je me suis appuyé sur les travaux de recherche fondateurs suivants :</p>



<p class="wp-block-paragraph"><strong>Sur l&rsquo;alignement Texte-Image (CLIP) :</strong></p>



<ul class="wp-block-list">
<li>Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., &#8230; &amp; Sutskever, I. (2021). <em>Learning Transferable Visual Models From Natural Language Supervision</em>. OpenAI. Lien : <a href="https://arxiv.org/abs/2103.00020" target="_blank" rel="noreferrer noopener">https://arxiv.org/abs/2103.00020</a></li>
</ul>



<p class="wp-block-paragraph"><strong>Sur la création des Modèles de Diffusion (DDPM) :</strong></p>



<ul class="wp-block-list">
<li>Sohl-Dickstein, J., Weiss, E., Maheswaranathan, N., &amp; Ganguli, S. (2015). <em>Deep Unsupervised Learning using Nonequilibrium Thermodynamics</em>. Stanford University / UC Berkeley. Lien : <a href="https://arxiv.org/abs/1503.03585" target="_blank" rel="noreferrer noopener">https://arxiv.org/abs/1503.03585</a></li>



<li>Ho, J., Jain, A., &amp; Abbeel, P. (2020). <em>Denoising Diffusion Probabilistic Models</em>. UC Berkeley. Lien : <a href="https://arxiv.org/abs/2006.11239" target="_blank" rel="noreferrer noopener">https://arxiv.org/abs/2006.11239</a></li>
</ul>



<p class="wp-block-paragraph"><strong>Sur l&rsquo;accélération du processus (DDIM) :</strong></p>



<ul class="wp-block-list">
<li>Song, J., Meng, C., &amp; Ermon, S. (2021). <em>Denoising Diffusion Implicit Models</em>. Stanford University. Lien : <a href="https://arxiv.org/abs/2010.02502" target="_blank" rel="noreferrer noopener">https://arxiv.org/abs/2010.02502</a></li>
</ul>



<p class="wp-block-paragraph"><strong>Sur le contrôle de l&rsquo;IA (Classifier-Free Guidance) :</strong></p>



<ul class="wp-block-list">
<li>Ho, J., &amp; Salimans, T. (2021). <em>Classifier-Free Diffusion Guidance</em>. Google Brain. Lien : <a href="https://arxiv.org/abs/2207.12598" target="_blank" rel="noreferrer noopener">https://arxiv.org/abs/2207.12598</a></li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tazmenworld.com/2026/02/22/au-dela-de-la-magie-la-mecanique-profonde-de-la-generation-dimages-et-de-videos-par-ia/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
