{"id":243,"date":"2026-10-03T20:12:18","date_gmt":"2026-10-03T18:12:18","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=243"},"modified":"2026-10-14T17:41:14","modified_gmt":"2026-10-14T15:41:14","slug":"quand-optimiser-un-moteur-d-inference","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/inference\/quand-optimiser-un-moteur-d-inference\/","title":{"rendered":"Quand optimiser un moteur d&rsquo;inf\u00e9rence (et quand s&rsquo;arr\u00eater)"},"content":{"rendered":"<p>Imagine un assistant vocal dont le moteur de synth\u00e8se g\u00e9n\u00e8re la parole plus vite qu&rsquo;on ne peut l&rsquo;\u00e9couter. Au-del\u00e0 du rythme du temps r\u00e9el, chaque token suppl\u00e9mentaire est du travail que personne n&rsquo;entendra : de la performance pay\u00e9e pour rien. Savoir quand <a href=\"\/blog\/inference\/techniques-d-optimisation-d-un-moteur-d-inference\/\" title=\"optimiser un moteur d&#x27;inf\u00e9rence\">optimiser un moteur d&rsquo;inf\u00e9rence<\/a>, c&rsquo;est donc aussi savoir quand le gain cesse de compter. Tu repars d&rsquo;ici avec les signaux qui disent \u00ab fonce \u00bb, ceux qui disent \u00ab regarde ailleurs \u00bb, et le crit\u00e8re pour poser les outils.<\/p>\n<p><strong>Sommaire<\/strong><\/p>\n<ul>\n<li><a href=\"#l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/a><\/li>\n<li><a href=\"#fixer-une-cible-chiffree-avant-de-toucher-a-quoi-que-ce-soit\">Fixer une cible chiffr\u00e9e avant de toucher \u00e0 quoi que ce soit<\/a><\/li>\n<li><a href=\"#ecarter-les-autres-couches-avant-d-accuser-le-moteur\">\u00c9carter les autres couches avant d&rsquo;accuser le moteur<\/a><\/li>\n<li><a href=\"#essayer-d-abord-un-modele-plus-petit\">Essayer d&rsquo;abord un mod\u00e8le plus petit<\/a><\/li>\n<li><a href=\"#lire-le-symptome-pour-savoir-quelle-ressource-manque\">Lire le sympt\u00f4me pour savoir quelle ressource manque<\/a><\/li>\n<li><a href=\"#ce-que-coute-un-essai-avant-meme-le-premier-gain\">Ce que co\u00fbte un essai, avant m\u00eame le premier gain<\/a><\/li>\n<li><a href=\"#savoir-s-arreter\">Savoir s&rsquo;arr\u00eater<\/a><\/li>\n<li><a href=\"#ce-qui-doit-te-faire-rouvrir-le-chantier\">Ce qui doit te faire rouvrir le chantier<\/a><\/li>\n<\/ul>\n<h2 id=\"l-essentiel-en-30-secondes\">L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Optimise quand une mesure chiffr\u00e9e sort d&rsquo;une cible que tu as \u00e9crite avant de commencer, pas parce que le moteur te semble \u00ab lent \u00bb.<\/li>\n<li>Avant de r\u00e9gler le moteur, \u00e9carte les autres couches : client, r\u00e9seau, file d&rsquo;attente, infrastructure. Le temps pass\u00e9 sur le GPU n&rsquo;est qu&rsquo;une fraction de ce que ton utilisateur attend.<\/li>\n<li>Choisis le levier d&rsquo;apr\u00e8s le sympt\u00f4me : un premier mot qui tarde pointe le calcul, un d\u00e9bit de mots trop bas pointe la bande passante m\u00e9moire, une erreur de m\u00e9moire pointe la capacit\u00e9 de VRAM.<\/li>\n<li>Un mod\u00e8le plus petit, bien choisi et \u00e9valu\u00e9 sur ton produit, t&rsquo;\u00e9vite souvent tout le chantier.<\/li>\n<li>Chaque essai co\u00fbte du temps d&rsquo;ing\u00e9nierie et des GPU : il ne vaut que si ton banc d&rsquo;essai ressemble \u00e0 ta production.<\/li>\n<li>Arr\u00eate-toi quand la cible est tenue et que la qualit\u00e9 est intacte ; rouvre le chantier quand tes m\u00e9triques, ton trafic ou le paysage des mod\u00e8les bougent.<\/li>\n<\/ul>\n<h2 id=\"fixer-une-cible-chiffree-avant-de-toucher-a-quoi-que-ce-soit\">Fixer une cible chiffr\u00e9e avant de toucher \u00e0 quoi que ce soit<\/h2>\n<p>Une plainte comme \u00ab les r\u00e9ponses sont lentes \u00bb ne dit pas quand tu auras fini. Une exigence exploitable est chiffr\u00e9e : au lieu de \u00ab r\u00e9ponse rapide \u00bb, on \u00e9crit \u00ab neuf requ\u00eates sur dix servies en moins de 2 secondes \u00bb, avec des m\u00e9triques de succ\u00e8s fix\u00e9es d\u00e8s le d\u00e9part et distinctes des objectifs m\u00e9tier eux-m\u00eames.<\/p>\n<p>Le bon chiffre d\u00e9pend de ce que ton utilisateur per\u00e7oit. Pour un agent conversationnel qui diffuse sa r\u00e9ponse en continu, on suit le TTFT, l&rsquo;attente avant que le premier mot apparaisse, puis le rythme des mots suivants. Pour un appel d&rsquo;outil par un agent, les tokens ne servent pas un par un : on mesure alors le temps de r\u00e9ponse total.<\/p>\n<p>En synth\u00e8se vocale, l&rsquo;\u00e9quivalent du TTFT s&rsquo;appelle TTFB (<em>time to first byte<\/em>) et peut descendre jusqu&rsquo;\u00e0 150 millisecondes pour le mod\u00e8le Orpheus sur un seul H100. Une autre mesure colle mieux encore \u00e0 l&rsquo;exp\u00e9rience : le temps jusqu&rsquo;\u00e0 la premi\u00e8re phrase, qui chronom\u00e8tre la premi\u00e8re portion de parole vraiment utile.<\/p>\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Une cible utile tient en une phrase : un chiffre, un percentile, un usage. \u00ab 90 % des requ\u00eates en moins de 2 secondes \u00bb en est une ; \u00ab plus rapide \u00bb n&rsquo;en est pas une. Tant que tu ne l&rsquo;as pas \u00e9crite, tu ne peux ni savoir s&rsquo;il faut optimiser, ni reconna\u00eetre le moment o\u00f9 c&rsquo;est fini.<\/p>\n<\/blockquote>\n<p>Pourquoi on exprime ces cibles en percentiles plut\u00f4t qu&rsquo;en moyenne, et ce que mesurent exactement TTFT et TPS, est expliqu\u00e9 dans \u00ab Optimiser un moteur d&rsquo;inf\u00e9rence : les 6 techniques qui comptent \u00bb.<\/p>\n<h2 id=\"ecarter-les-autres-couches-avant-d-accuser-le-moteur\">\u00c9carter les autres couches avant d&rsquo;accuser le moteur<\/h2>\n<p>Un moteur d&rsquo;inf\u00e9rence n&rsquo;est qu&rsquo;une des trois couches d&rsquo;un service d&rsquo;IA g\u00e9n\u00e9rative. L&rsquo;ex\u00e9cution optimise un mod\u00e8le sur une instance de GPU. L&rsquo;infrastructure fait passer \u00e0 l&rsquo;\u00e9chelle sur des clusters, des r\u00e9gions et des clouds tout en gardant une bonne disponibilit\u00e9. L&rsquo;outillage donne le bon niveau d&rsquo;abstraction entre contr\u00f4le et productivit\u00e9.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46a33e84&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46a33e84\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1479\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch01_trois_couches_pile_inference-scaled.png\" alt=\"Les trois couches d'une pile d'inf\u00e9rence : le moteur se r\u00e8gle tout en bas, dans l'ex\u00e9cution, alors que l'infrastructure et l'outillage se r\u00e8glent ailleurs\" class=\"wp-image-222\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch01_trois_couches_pile_inference-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch01_trois_couches_pile_inference-300x173.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch01_trois_couches_pile_inference-1024x592.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch01_trois_couches_pile_inference-768x444.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch01_trois_couches_pile_inference-1536x887.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch01_trois_couches_pile_inference-2048x1183.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Regarde la couche du bas : c&rsquo;est la seule que le moteur r\u00e8gle. Une file d&rsquo;attente qui s&rsquo;allonge, par exemple, rel\u00e8ve de celle du milieu, puisque la file est la primitive d&rsquo;infrastructure qui retient les requ\u00eates pendant que le syst\u00e8me ajoute des ressources.<\/figcaption><\/figure>\n\n\n<p>L&rsquo;\u00e9cart entre le temps pass\u00e9 sur le GPU et le temps ressenti se joue souvent chez le client, c&rsquo;est-\u00e0-dire le navigateur, l&rsquo;agent ou l&rsquo;application qui envoie la requ\u00eate. \u00c9tablir une session avec le serveur prend quelques dizaines de millisecondes : avec un engagement de latence de bout en bout de 300 millisecondes au P95, une poign\u00e9e de main TLS en consomme au moins dix pour cent avant m\u00eame que l&rsquo;inf\u00e9rence commence.<\/p>\n<p>Les requ\u00eates suivantes d&rsquo;un m\u00eame client doivent donc r\u00e9utiliser la session. Les SDK courants comme celui d&rsquo;OpenAI le font en silence, mais un client maison pour une modalit\u00e9 non standard doit y penser. Pour le temps r\u00e9el, un autre protocole que HTTP, comme les WebSockets, peut aussi s&rsquo;imposer pour garder une connexion continue.<\/p>\n<p>Pour trancher, lis les m\u00e9triques c\u00f4te \u00e0 c\u00f4te. L&rsquo;observabilit\u00e9 de l&rsquo;inf\u00e9rence suit le volume de requ\u00eates, la taille des entr\u00e9es et des sorties, les codes de r\u00e9ponse (2XX, 4XX, 5XX), la latence en P50, P90 et P99, le nombre de r\u00e9plicas, l&rsquo;utilisation du CPU et du GPU, et la profondeur de file pour le trafic asynchrone. Ces courbes sont li\u00e9es : un pic de latence peut venir du volume, mais aussi de s\u00e9quences d&rsquo;entr\u00e9e plus longues, et les voir ensemble dit non seulement ce qui se passe, mais pourquoi.<\/p>\n<p>La distinction entre temps d&rsquo;inf\u00e9rence et mesure de bout en bout est pos\u00e9e dans \u00ab Optimiser un moteur d&rsquo;inf\u00e9rence : les 6 techniques qui comptent \u00bb ; ici, on regarde ce qui se cache dans l&rsquo;\u00e9cart.<\/p>\n<h2 id=\"essayer-d-abord-un-modele-plus-petit\">Essayer d&rsquo;abord un mod\u00e8le plus petit<\/h2>\n<p>L&rsquo;article sur les six techniques le rappelle : le choix du mod\u00e8le p\u00e8se plus lourd que n&rsquo;importe quel r\u00e9glage du moteur. Voici ce qui rend ce choix concret.<\/p>\n<p>D&rsquo;abord, mesure si le mod\u00e8le sert \u00e0 quelque chose. L&rsquo;\u00e9valuation de mod\u00e8le, la mesure syst\u00e9matique de son intelligence sur ton produit, \u00e9vite de perdre du temps \u00e0 acc\u00e9l\u00e9rer un mod\u00e8le inutile, et fournit une base de comparaison, puisque certaines techniques de performance d\u00e9gradent la qualit\u00e9. Les bancs d&rsquo;essai g\u00e9n\u00e9raux sont satur\u00e9s, voire truqu\u00e9s, et la loi de Goodhart s&rsquo;applique : quand une mesure devient une cible, elle cesse d&rsquo;\u00eatre une bonne mesure. Rien ne remplace la mesure directe sur ton application.<\/p>\n<p>Ensuite, ne pr\u00e9sume pas que le prix pr\u00e9dit la qualit\u00e9. Sur MMLU, un banc d&rsquo;essai g\u00e9n\u00e9ral de connaissances, DeepSeek-v3 obtient 87,2 pour un prix relatif de 2,75 en entr\u00e9e et 3,65 en sortie, alors que Claude 4 Opus en r\u00e9flexion \u00e9tendue obtient 86,5 pour 75 et 125. La r\u00e9f\u00e9rence \u00e0 1, c&rsquo;est Llama 3.1 : 0,20 &#36; par million de tokens en entr\u00e9e et 0,60 &#36; en sortie. Performance et prix ne sont donc pas directement corr\u00e9l\u00e9s, et ces scores ne font qu&rsquo;orienter : seul un essai sur ta propre t\u00e2che tranche.<\/p>\n<p>Enfin, regarde si un petit mod\u00e8le affin\u00e9 suffit. Si tu parviens \u00e0 l&rsquo;affiner jusqu&rsquo;\u00e0 ce qu&rsquo;il r\u00e9ussisse tes \u00e9valuations, tes cibles de latence et de co\u00fbt deviennent bien plus faciles \u00e0 atteindre. Le cas extr\u00eame est la traduction de l&rsquo;anglais vers SQL : un minuscule mod\u00e8le affin\u00e9 de quelques milliards de param\u00e8tres peut \u00e9galer, sur cette t\u00e2che, des mod\u00e8les de code g\u00e9n\u00e9ralistes de plusieurs centaines de milliards. Tous les domaines n&rsquo;autorisent pas une telle r\u00e9duction ; il y faut un domaine bien d\u00e9limit\u00e9, de bons crit\u00e8res d&rsquo;\u00e9valuation et de bonnes donn\u00e9es \u00e9tiquet\u00e9es.<\/p>\n<p>Les petits mod\u00e8les progressent vite. Phi-3-mini (3,8 milliards de param\u00e8tres) a \u00e9gal\u00e9 les 60 % de MMLU de PaLM (540 milliards), soit une r\u00e9duction de taille d&rsquo;un facteur 142 en deux ans. Comme rep\u00e8re : sous huit milliards de param\u00e8tres, ils sont imbattables pour l&rsquo;inf\u00e9rence sur appareil ou \u00e0 bas co\u00fbt ; de 8 \u00e0 70 milliards, ils offrent un bon compromis pour le raisonnement g\u00e9n\u00e9ral ; au-del\u00e0, les g\u00e9ants propri\u00e9taires dominent encore l&rsquo;exactitude \u00e0 fort enjeu.<\/p>\n<p>La distillation ouvre aussi un chemin. \u00c0 c\u00f4t\u00e9 de son R1 de 671 milliards de param\u00e8tres, DeepSeek a publi\u00e9 des versions distill\u00e9es sur Llama 3 et Qwen 2.5 : leurs scores sont moins bons, leur raisonnement semblable, et leur petite taille leur permet de profiter du travail de performance d\u00e9j\u00e0 fait sur ces architectures.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Peaufiner \u00e0 l&rsquo;extr\u00eame la s\u00e9lection du mod\u00e8le ne rapporte souvent que des gains marginaux : sauf contrainte d&rsquo;\u00e9chelle, d\u00e9marrer simplement suffit. Et la \u00ab meilleure \u00bb famille de petits mod\u00e8les d&rsquo;aujourd&rsquo;hui sera peut-\u00eatre \u00e9clips\u00e9e dans quelques mois : appuie-toi sur des classements tiers de confiance (HELM de Stanford, Papers With Code, Evaluation on the Hub).<\/p>\n<\/blockquote>\n<h2 id=\"lire-le-symptome-pour-savoir-quelle-ressource-manque\">Lire le sympt\u00f4me pour savoir quelle ressource manque<\/h2>\n<p>Si ni la couche, ni le mod\u00e8le ne sont en cause, il reste \u00e0 savoir quelle ressource du GPU sature. Le principe (deux phases, l&rsquo;une limit\u00e9e par le calcul, l&rsquo;autre par la m\u00e9moire) est expliqu\u00e9 dans l&rsquo;article sur les six techniques ; voici seulement la correspondance entre ce que tu observes et ce qu&rsquo;il faut regarder c\u00f4t\u00e9 mat\u00e9riel.<\/p>\n<table>\n<thead>\n<tr>\n<th>Ce que tu observes<\/th>\n<th>Ressource en cause<\/th>\n<th>O\u00f9 agir c\u00f4t\u00e9 mat\u00e9riel<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Le premier mot tarde (TTFT \u00e9lev\u00e9)<\/td>\n<td>Le calcul : le prefill, la g\u00e9n\u00e9ration d&rsquo;images et de vid\u00e9os y sont limit\u00e9s<\/td>\n<td>L&rsquo;acc\u00e9l\u00e9rateur qui offre le plus de FLOPS<\/td>\n<\/tr>\n<tr>\n<td>Les mots s&rsquo;encha\u00eenent lentement (TPS bas)<\/td>\n<td>La bande passante m\u00e9moire, \u00e0 tailles de lot faibles ou moyennes<\/td>\n<td>L&rsquo;acc\u00e9l\u00e9rateur \u00e0 plus forte bande passante, comme le H200 plut\u00f4t que le H100<\/td>\n<\/tr>\n<tr>\n<td>Erreur de m\u00e9moire insuffisante, inf\u00e9rence lente ou qui plante<\/td>\n<td>La capacit\u00e9 de VRAM : poids du mod\u00e8le plus au moins 50 % de marge pour le cache KV<\/td>\n<td>Plus de VRAM, davantage de marge si contextes longs, gros lots ou vid\u00e9o<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46a342b0&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46a342b0\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1152\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_hierarchie_gpu-scaled.png\" alt=\"Hi\u00e9rarchie m\u00e9moire d'un GPU : une grande VRAM de plusieurs To\/s alimente un cache L2 de 50 Mo sur H100, puis des multiprocesseurs de flux dot\u00e9s chacun de leur cache L1 de 256 Ko\" class=\"wp-image-242\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_hierarchie_gpu-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_hierarchie_gpu-300x135.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_hierarchie_gpu-1024x461.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_hierarchie_gpu-768x346.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_hierarchie_gpu-1536x691.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_hierarchie_gpu-2048x922.png 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Sur ce sch\u00e9ma, la VRAM est le bloc de plus grande capacit\u00e9. Deux chiffres distincts la d\u00e9crivent sur une fiche technique : sa capacit\u00e9 borne la taille du mod\u00e8le que tu peux charger, sa bande passante borne la vitesse \u00e0 laquelle elle alimente les caches, donc celle du decode.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Quand tu compares des GPU sur <a href=\"\/blog\/inference\/que-sont-les-flops\/\" title=\"FLOPS\">FLOPS<\/a>, lis les chiffres sans parcimonie : par d\u00e9faut l&rsquo;inf\u00e9rence est dense, et les FLOPS avec parcimonie valent souvent le double. Compare aussi \u00e0 pr\u00e9cision identique, car les FLOPS doublent g\u00e9n\u00e9ralement \u00e0 chaque division par deux de la pr\u00e9cision.<\/p>\n<\/blockquote>\n<p>Quand le mat\u00e9riel est fix\u00e9 et que le sympt\u00f4me persiste, c&rsquo;est alors que les techniques logicielles entrent en jeu : elles sont d\u00e9taill\u00e9es dans \u00ab Optimiser un moteur d&rsquo;inf\u00e9rence : les 6 techniques qui comptent \u00bb.<\/p>\n<h2 id=\"ce-que-coute-un-essai-avant-meme-le-premier-gain\">Ce que co\u00fbte un essai, avant m\u00eame le premier gain<\/h2>\n<p>Tester un service d&rsquo;inf\u00e9rence est co\u00fbteux : il faut du temps d&rsquo;ing\u00e9nierie pour monter les tests et mesurer les r\u00e9sultats, et des GPU pour traiter le trafic de test. C&rsquo;est en partie le prix \u00e0 payer, mais on peut le r\u00e9duire : un test en trafic fant\u00f4me (copie du trafic r\u00e9el vers un d\u00e9ploiement de test) peut commencer par un \u00e9chantillon al\u00e9atoire de la production, suivi d&rsquo;un test de charge plus court. Garde en t\u00eate que l&rsquo;usage des produits d&rsquo;IA fluctue selon des cycles quotidiens et hebdomadaires.<\/p>\n<p>Le meilleur banc d&rsquo;essai double le trafic r\u00e9el en production ; \u00e0 d\u00e9faut, il faut simuler l&rsquo;usage en faisant correspondre quatre dimensions :<\/p>\n<ul>\n<li><strong>les longueurs de s\u00e9quence<\/strong> : le TTFT et l&rsquo;usage m\u00e9moire d\u00e9pendent du nombre de tokens du prompt et de la r\u00e9ponse ;<\/li>\n<li><strong>le volume et le motif du trafic<\/strong> : le regroupement et la charge du serveur d\u00e9pendent du nombre de requ\u00eates simultan\u00e9es, qu&rsquo;il faut faire varier ;<\/li>\n<li><strong>le contenu des requ\u00eates<\/strong> : le prompt r\u00e9el influe sur le taux de succ\u00e8s du cache et sur l&rsquo;acceptation des tokens de brouillon ;<\/li>\n<li><strong>les param\u00e8tres d&rsquo;entr\u00e9e<\/strong> : temp\u00e9rature, effort de raisonnement, \u00e0 r\u00e9gler sur leurs valeurs de production.<\/li>\n<\/ul>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Maximiser la performance d&rsquo;un banc d&rsquo;essai aliment\u00e9 de mauvaises entr\u00e9es ne produit pas la performance attendue en production. Un banc qui envoie des prompts sans rapport avec ceux de tes utilisateurs ne mesure ni le cache ni la sp\u00e9culation tels que tu les vivras.<\/p>\n<\/blockquote>\n<p>C\u00f4t\u00e9 outils, quelques noms reviennent : Genai-bench (\u00e9quipe SGLang), GenAI-Perf (NVIDIA, c\u00f4t\u00e9 client) et Locust, un outil libre de test de charge qui simule jusqu&rsquo;\u00e0 des millions d&rsquo;utilisateurs simultan\u00e9s. Les jeux d&rsquo;\u00e9valuation libres, de MMLU et gsm8k \u00e0 SWE-bench, fournissent des entr\u00e9es vari\u00e9es et r\u00e9alistes, et permettent de v\u00e9rifier que les optimisations n&rsquo;ont pas d\u00e9grad\u00e9 la qualit\u00e9 ; mieux vaut choisir celui qui \u00e9pouse ton usage, comme HumanEval pour r\u00e9duire la latence d&rsquo;une compl\u00e9tion de code.<\/p>\n<p>Pour que les chiffres se comparent, pars d&rsquo;une base de r\u00e9f\u00e9rence solide, garde une configuration de test constante, envoie assez de trafic pour une lecture correcte et, dans le doute, relance plusieurs fois en moyennant.<\/p>\n<p>Faut-il en plus un profileur, qui montre o\u00f9 chaque milliseconde est pass\u00e9e ? Probablement pas. Avec un moteur d\u00e9j\u00e0 tr\u00e8s performant comme TensorRT-LLM, le travail est un cycle de configuration et d&rsquo;\u00e9valuation. Le profilage devient n\u00e9cessaire pour contribuer \u00e0 un cadre comme vLLM ou SGLang, \u00e9crire son propre service en PyTorch ou travailler \u00e0 la pointe d&rsquo;une nouvelle modalit\u00e9 comme la vid\u00e9o.<\/p>\n<h2 id=\"savoir-s-arreter\">Savoir s&rsquo;arr\u00eater<\/h2>\n<h3>Quand la vitesse d\u00e9passe le besoin<\/h3>\n<p>Reviens \u00e0 l&rsquo;assistant vocal. Selon le mod\u00e8le, il faut de 80 \u00e0 100 tokens par seconde pour g\u00e9n\u00e9rer de l&rsquo;audio en temps r\u00e9el ; au-del\u00e0, produire plus de tokens par seconde n&rsquo;apporte rien. Une fois ce seuil franchi, la performance change de fonction : elle sert \u00e0 augmenter le nombre de sorties temps r\u00e9el simultan\u00e9es. Si un seul GPU supporte beaucoup d&rsquo;utilisateurs en m\u00eame temps, le co\u00fbt de synth\u00e8se par utilisateur chute spectaculairement.<\/p>\n<p>Le gain suivant ne vient d&rsquo;ailleurs plus du moteur. Pour la synth\u00e8se en temps r\u00e9el, la couche d&rsquo;ex\u00e9cution est d\u00e9j\u00e0 optimis\u00e9e (TensorRT-LLM, quantification, d\u00e9codeur compil\u00e9), et ce qui reste \u00e0 gagner tient surtout \u00e0 l&rsquo;infrastructure : le flux par WebSocket est le plus grand d\u00e9blocage face \u00e0 l&rsquo;envoi de texte et \u00e0 la r\u00e9ception d&rsquo;audio par morceaux distincts. On teste combien de flux simultan\u00e9s le moteur tient, puis on fixe la taille de lot et le nombre de WebSocket actifs pour une utilisation \u00e9lev\u00e9e mais stable.<\/p>\n<h3>Quand la qualit\u00e9 d\u00e9croche<\/h3>\n<p>Pour toute optimisation qui touche au mod\u00e8le, le crit\u00e8re de sortie est la qualit\u00e9. Une quantification n&rsquo;est pr\u00eate pour la production que si l&rsquo;on ne per\u00e7oit aucune perte de qualit\u00e9 : l&rsquo;\u00e9cart de score avec l&rsquo;original doit \u00eatre indiscernable du bruit, puisque les LLM sont non d\u00e9terministes et que les scores varient l\u00e9g\u00e8rement d&rsquo;une ex\u00e9cution \u00e0 l&rsquo;autre.<\/p>\n<p>Au-del\u00e0 de ce bruit, l&rsquo;optimisation a d\u00e9pass\u00e9 son but, m\u00eame si les courbes de latence sont superbes.<\/p>\n<h2 id=\"ce-qui-doit-te-faire-rouvrir-le-chantier\">Ce qui doit te faire rouvrir le chantier<\/h2>\n<p>Une fois la cible atteinte, ce sont tes m\u00e9triques qui disent quand reprendre. Un P90 qui franchit la cible fix\u00e9e au d\u00e9part, une file qui ne se vide plus ou un pic de latence qui suit la longueur des entr\u00e9es sont autant de d\u00e9clencheurs. Branche-les sur tes outils d&rsquo;alerte existants, comme Grafana, Datadog, PagerDuty ou Sentry, pour lire l&rsquo;information d&rsquo;inf\u00e9rence avec le reste de l&rsquo;application.<\/p>\n<p>Deux autres d\u00e9clencheurs viennent de l&rsquo;ext\u00e9rieur du syst\u00e8me. Le premier est le rythme de l&rsquo;usage : parce qu&rsquo;il suit des cycles quotidiens et hebdomadaires, un test r\u00e9alis\u00e9 sur une seule plage horaire risque de ne pas repr\u00e9senter le reste. Le second est le paysage des mod\u00e8les, qui bouge en quelques mois : le chantier de demain sera peut-\u00eatre de passer \u00e0 un mod\u00e8le plus petit, plus simple \u00e0 servir que celui d&rsquo;aujourd&rsquo;hui.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Un moteur ne s&rsquo;optimise pas parce qu&rsquo;il pourrait aller plus vite, mais parce qu&rsquo;une mesure sort d&rsquo;une cible \u00e9crite \u00e0 l&rsquo;avance. Le chantier se termine quand la cible est tenue, que la qualit\u00e9 est intacte et que la surveillance reste silencieuse.<\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Cible chiffr\u00e9e, bonne couche, mod\u00e8le adapt\u00e9, co\u00fbt des essais : les signaux qui justifient d&rsquo;optimiser un moteur d&rsquo;inf\u00e9rence, et ceux qui disent stop.<\/p>\n","protected":false},"author":1,"featured_media":275,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-inference"],"_links":{"self":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/comments?post=243"}],"version-history":[{"count":3,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions"}],"predecessor-version":[{"id":814,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/243\/revisions\/814"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/275"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}