Benchmarking LLM local sur Radeon Pro W7800 : de l’outil maison au vrai test de stack

Ces derniers jours, j’ai transformé un petit benchmark LLM maison en un outil beaucoup plus complet pour tester ma stack locale sur AMD Radeon Pro W7800 48 Go.

L’objectif de départ était simple : mesurer proprement un endpoint OpenAI-compatible sans dépendre de Python, Node ou d’une interface web. Le résultat est devenu un vrai outil Windows natif en Delphi/VCL, avec stockage SQLite, rapports PDF, télémétrie SSH et comparaison de backends.

Le logiciel mesure maintenant notamment :

  • TTFT, TPOT et débit de génération en tokens/s ;
  • performances en séquentiel et en concurrence ;
  • évolution du prefill et du decode avec la taille du contexte ;
  • cold start, warm start et cache de prompt ;
  • jitter du streaming SSE ;
  • déterminisme ;
  • support tools / JSON / vision ;
  • robustesse API ;
  • stabilité sur plusieurs minutes ;
  • précision en long contexte avec un test “needle in a haystack”.

Une des évolutions les plus importantes a été d’ajouter la collecte automatique de l’environnement distant via SSH. Le benchmark peut maintenant enregistrer avec chaque session :

  • OS et kernel ;
  • CPU et mémoire système ;
  • GPU et VRAM ;
  • ROCm / HIP ;
  • Mesa et Vulkan ;
  • CUDA / NVIDIA si la machine en utilise ;
  • VBIOS ;
  • paramètres kernel ;
  • configuration réelle du service llama-server ;
  • options comme flash-attention, cache KV, batch, ubatch, parallel, etc.

En parallèle, une télémétrie matérielle est échantillonnée pendant les tests : charge GPU, température, puissance, fréquence, VRAM, charge Linux et RAM utilisée. Cela permet de corréler une baisse de performances avec un éventuel throttling ou un changement de comportement du backend.

J’ai également corrigé plusieurs pièges méthodologiques apparus pendant les premiers runs. Le plus important concernait les tests de contexte : certaines répétitions pouvaient bénéficier du cache de préfixe de llama.cpp, ce qui mélangeait mesures froides et chaudes. Le benchmark utilise maintenant des prompts différents dès le début pour garantir de vraies mesures “cold”, tandis que les comportements de cache sont testés séparément.

Autre correction intéressante : le test de précision en long contexte avait un budget de sortie trop faible pour un modèle “thinking”, ce qui produisait des faux échecs. Le budget a été augmenté et le test est maintenant plus représentatif.

Trois backends testés sur la même machine

J’ai ensuite lancé trois séries complètes sur la W7800 avec le même modèle Qwen 27B Q8 :

  • configuration ROCm optimisée de départ ;
  • ROCm 10 / Lemonade ;
  • Vulkan / RADV.

Le résultat est assez intéressant : Vulkan est globalement le plus rapide en decode interactif, avec un avantage net sur les scénarios courts, les générations longues et le débit soutenu. ROCm 10 reste très compétitif sur certains gros contextes et semble particulièrement intéressant sur certains scénarios de prefill.

Par exemple, Vulkan atteint environ 46,9 tok/s en short chat et autour de 40 tok/s en génération soutenue, alors que la configuration ROCm de départ reste plutôt dans les 34–43 tok/s selon les scénarios. ROCm 10, de son côté, montre de bons résultats sur les gros prompts et certains niveaux de contexte.

Ce qui m’intéresse le plus n’est pas seulement “qui gagne”, mais le fait de pouvoir enfin comparer les stacks de manière reproductible : même GPU, même modèle, mêmes tests, même contexte, même télémétrie, et environnement logiciel enregistré avec le rapport.

Au final, ce petit projet est devenu un véritable outil de qualification et de non-régression pour LLM local. C’est particulièrement utile quand on teste de nouveaux drivers, des builds ROCm spécifiques, Vulkan, Lemonade ou différentes versions de llama.cpp.

 

 

Vibe coding avec un LLM local : jusqu’où peut aller Qwen3.8-27B ?

Les tests de modèles de langage se résument souvent à des benchmarks, des scores de programmation ou quelques questions complexes. J’ai voulu tester autre chose : la capacité d’un modèle local à réaliser un petit projet complet avec très peu d’informations de départ. Pour cette expérience, j’utilise  […]

Lire la suite

Pourquoi le Strix Halo est excellent pour du LLM et mauvais pour de la diffusion

L'AMD Strix Halo (gfx1151) a une réputation méritée dans la communauté du LLM local : 96GB de RAM unifiée, une bande passante mémoire correcte, et un support ROCm qui, sans être parfait, tient la route pour de l'inférence texte. Ce que j'ai voulu vérifier cette semaine, c'est si cette réputation tenait aussi pour la génération d'image. Verdict : non, pas du tout.

Lire la suite

Open WebUI & MTP : Retour d’expérience sur une évaluation technique en vue d’une intégration entreprise

Petite digression sur mon projet actuel. Suite à une demande concrète, je me suis penché sur l’évaluation d’Open WebUI pour une potentielle mise en production en environnement professionnel. L’objectif ? Identifier ses forces, mais aussi ses limites, tout en testant des configurations matérielles et logicielles optimisées pour simuler une charge réelle.

Lire la suite

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.

Lire la suite

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

Haut de page