Le cluster en juin 2026 : trois machines, trois rôles, un seul objectif

Depuis les premiers billets sur ce blog, l'infrastructure a beaucoup évolué. Ce qui était au départ une seule machine qui faisait tourner un LLM en local est devenu un cluster de trois nœuds, chacun avec un rôle distinct et des responsabilités claires. Il me semble utile de faire un point complet sur l'état actuel — non pas pour décrire chaque composant dans le détail technique, mais pour expliquer ce que chaque machine fait concrètement et comment elles s'articulent.

Les trois machines

Les trois machines sont des GMKtec EVO-X2, basées sur le processeur AMD Ryzen AI Max+ 395 avec de la mémoire unifiée. C'est ce point — la mémoire unifiée — qui rend ce matériel particulièrement adapté aux modèles de langage locaux : pas de transfert GPU/CPU, la totalité de la RAM est visible par le moteur d'inférence. Chaque machine tourne sous Ubuntu avec une stack d'inférence différente selon son rôle.


Machine 1 — Le nœud de codage (128 GB)

C'est la machine dédiée à l'assistance au développement via Cline dans VS Code. Elle fait tourner deux modèles en permanence : Qwen3.6-27B (le modèle "plan") et Qwen3.6-35B-A3B (le modèle "act").

La distinction entre les deux est volontaire. La phase plan, c'est celle où Cline réfléchit à ce qu'il va faire — il décompose la tâche, identifie les fichiers à modifier, structure l'approche. Pour ça, un modèle dense de 27B avec de bonnes capacités de raisonnement structuré est idéal. La phase act, c'est l'exécution : générer du code, modifier des fichiers, écrire des tests. Le 35B-A3B est un modèle MoE qui n'active qu'une fraction de ses paramètres à chaque inférence — il est plus rapide pour ce type de requêtes courtes et répétées, ce qui compte quand Cline enchaîne les actions.

Le tout est exposé via un routeur FastAPI sur le réseau local, et accessible depuis les postes de développement Windows via LLMRouter.exe, un petit exécutable tray qui intercepte les requêtes Cline et les redirige vers le bon modèle selon la phase. Cline ne voit qu'une seule URL, le routeur fait le reste. C'est portable — la même config fonctionne au bureau, à la maison, ou depuis n'importe quel poste sans rien installer.


Machine 2 — Le nœud RAG (96 GB)

C'est la machine centrale du projet, celle qui fait tourner RAG Pro. Elle héberge l'ensemble du pipeline documentaire et conversationnel qui sert à la fois d'outil quotidien et de terrain d'expérimentation.

RAG Pro v3 est aujourd'hui structuré autour d'un système de plugins. L'idée de base : le core de l'application ne sait pas ce que signifie "indexer un document" — ce n'est pas son rôle. Il sait router une requête vers le bon plugin selon le type de projet, gérer les jobs d'ingestion, streamer les réponses. Les plugins, eux, portent la logique métier.

Il y a aujourd'hui cinq plugins actifs :

  • Documents — le plugin RAG classique. PDF, DOCX, TXT sont découpés, vectorisés, indexés dans Qdrant avec une recherche hybride (sémantique + BM25). C'est la base du projet, celle qui répond aux questions sur la documentation Oracle ERP, les exports markdown, les procédures internes.
  • Analyse de données — pensé pour les fichiers XLSX et CSV issus de l'ERP. Un fichier de 12 000 lignes peut être chargé, profilé, et interrogé en langage naturel. Le plugin génère du code pandas validé par AST plutôt que de tenter une réponse directe — ce qui garantit que les calculs sont justes même sur des volumes importants.
  • Code project — pour les bases de code Python, JS, TS. Index de symboles, graphe de dépendances, recherche sémantique sur le code source. Sert de base à la migration DirectSalesVD v2.
  • Migration VBA — spécifique aux fichiers XLSM qui contiennent du code VBA. Extraction de la logique métier, cartographie des macros, génération de l'équivalent Python. Directement connecté au chantier de migration des outils Excel de production.
  • Web search avec mitigation — le plugin le plus récent. Plutôt que de renvoyer le premier résultat d'une source unique, il interroge plusieurs sources en parallèle et croise les résultats avant de les injecter en contexte. L'objectif est de mitiger les biais d'une source unique et d'améliorer la fiabilité des réponses sur des sujets qui évoluent — versions de librairies, documentation en ligne, procédures Oracle Apex.

Le modèle principal sur cette machine est Qwen3.6-35B-A3B en BF16, avec un contexte de 262K tokens. C'est ce contexte étendu qui permet d'ingérer des fichiers volumineux ou des historiques longs sans perdre la cohérence de la réponse.

L'API context pour Cline est aussi portée par cette machine. Concrètement : quand Cline travaille sur un fichier Python, il peut interroger RAG Pro pour récupérer du contexte pertinent — documentation ERP associée, autres modules du projet, historique des changements. C'est la boucle qui fait que le codage assisté n'est pas juste de la génération de code générique mais quelque chose d'ancré dans la réalité du projet. Cline sur la machine 1 tire du contexte depuis la machine 2 — c'est le local dev bouclé sur lui-même.


Machine 3 — Le nœud image (96 GB)

C'est la machine la plus récente dans son rôle actuel. Elle est dédiée à la génération d'images via des modèles de diffusion, complètement isolée des deux autres pour éviter toute contention mémoire pendant les générations.

Deux modèles sont actifs :

  • FLUX.1-Schnell — modèle de diffusion rapide de Black Forest Labs. Génération en quelques étapes, bon rapport vitesse/qualité pour une première passe ou des itérations rapides.
  • FLUX.1-Kontext — la variante contextuelle du même modèle, pensée pour les modifications d'image à partir d'une image source. Idéal pour des cas où on part d'un visuel existant et qu'on veut le faire évoluer de manière cohérente.

Le worker est un service FastAPI (qwen-image-worker) avec une architecture flip-flop : un seul modèle est chargé en mémoire à la fois. Quand une requête arrive pour l'autre modèle, le modèle actif est déchargé proprement avant que le suivant soit initialisé. Ça évite de saturer les 89 GB de mémoire unifiée en voulant garder les deux en RAM simultanément.

La connexion avec la machine 2 est directe : RAG Pro expose une interface de génération d'image qui passe par le worker de la machine 3. Les utilisateurs interagissent depuis l'interface RAG Pro, le résultat revient via le réseau local. L'idée à terme est qu'un prompt optimisé puisse être construit côté machine 2 (via le LLM) avant d'être envoyé à la machine 3 — un worker de prompt dédié est en cours de réflexion pour ça.


Ce que ça change dans la pratique

L'intérêt de cette architecture à trois nœuds n'est pas technique pour le plaisir d'être technique. C'est que chaque machine peut évoluer indépendamment. Si on change le modèle d'inférence sur la machine 1, ça n'affecte pas le RAG. Si on ajoute un plugin sur la machine 2, ça ne touche pas la génération d'image. Et surtout, les workflows peuvent tourner en parallèle — Cline qui refactore du code pendant que le RAG répond à une question, pendant qu'une image se génère en arrière-plan.

Le cluster est entièrement on-premises, sans dépendance cloud. Les données ne quittent pas le réseau local. Pour des usages qui touchent à de la documentation interne ou à du code propriétaire, c'est un prérequis, pas un choix.

 

Quand le projet devient multi-utilisateurs

Depuis les premiers billets sur ce projet, j’ai surtout parlé de modèles, d’embeddings et de pipelines RAG. Tout ce qui se passe côté machine. Mais il y a un autre axe d’évolution que j’ai mené en parallèle ces dernières semaines, moins spectaculaire techniquement mais tout aussi important en  […]

Lire la suite

Pourquoi j’ai ajouté un mode RAG piloté par agents dans Internal LLM

Au départ, un LLM local peut déjà aider pour écrire, expliquer ou générer du code. Mais il a une limite simple : il ne connaît pas automatiquement mes documents, mes scripts, mes exports ou la structure réelle de mes projets. C’est pour ça que j’ai ajouté un vrai mode RAG dans Internal LLM. L’idée  […]

Lire la suite

Internal LLM : pourquoi l’architecture repose sur trois moteurs spécialisés

Dans Internal LLM, je n’ai pas choisi un seul modèle pour tout faire. J’ai préféré une architecture en trois services spécialisés, chacun avec un rôle précis. Le service principal du code repose sur Qwen3-Coder-30B-A3B-Instruct en Q5_K_M sur le port 8080, le service de raisonnement sur Qwen3-32B en  […]

Lire la suite

Internal LLM : pourquoi j’ai choisi Ubuntu, un kernel récent et une architecture LLM en plusieurs modèles

Après avoir présenté le projet, je voulais revenir sur un point essentiel : dans un environnement d’IA locale, le choix du système compte presque autant que le choix des modèles. Pour Internal LLM, j’ai retenu Ubuntu 24.04.4 LTS avec un kernel 6.14.0-37, sur une machine basée sur AMD Ryzen AI Max+ 395 avec Radeon 8060S. Ce n’est pas un choix “par défaut”, mais un compromis entre compatibilité matérielle, stabilité et capacité d’expérimentation.

Lire la suite

Internal LLM : pourquoi je construis un assistant IA local.

Je démarre ce blog pour partager l’évolution de Internal LLM, un projet centré sur l’IA locale et l’exploitation intelligente de documentation technique, de code, de requêtes SQL et de connaissances internes. L’objectif est de construire un assistant capable de retrouver, comprendre et exploiter  […]

Lire la suite

Haut de page