{"id":218,"date":"2026-10-03T10:45:46","date_gmt":"2026-10-03T08:45:46","guid":{"rendered":"https:\/\/www.ranksignal.fr\/blog\/?p=218"},"modified":"2026-10-14T17:52:02","modified_gmt":"2026-10-14T15:52:02","slug":"techniques-d-optimisation-d-un-moteur-d-inference","status":"publish","type":"post","link":"https:\/\/www.ranksignal.fr\/blog\/inference\/techniques-d-optimisation-d-un-moteur-d-inference\/","title":{"rendered":"Optimiser un moteur d&rsquo;inf\u00e9rence : les 6 techniques qui comptent"},"content":{"rendered":"<p><\/p>\n<p>Tu veux servir DeepSeek-V3.1 \u00e0 tes utilisateurs. Ses 671 milliards de param\u00e8tres, charg\u00e9s en FP8, r\u00e9clament environ un gigaoctet de VRAM par milliard : un seul B200 s&rsquo;arr\u00eate net sur une erreur de m\u00e9moire insuffisante. Et m\u00eame si les poids tenaient, il resterait \u00e0 r\u00e9pondre vite, \u00e0 beaucoup de monde, sans ruiner le budget GPU.<\/p>\n<p>Optimiser un moteur d&rsquo;inf\u00e9rence, c&rsquo;est exactement cela : un jeu d&rsquo;arbitrages entre latence, d\u00e9bit et qualit\u00e9, o\u00f9 chaque technique s&rsquo;attaque \u00e0 un goulot pr\u00e9cis. \u00c0 la fin de cet article, tu sauras lequel est en cause \u00e0 chaque moment, et quel levier actionner.<\/p>\n<h2>L&rsquo;essentiel en 30 secondes<\/h2>\n<ul>\n<li>Un LLM r\u00e9pond en deux temps : le <a href=\"\/blog\/inference\/l-etape-du-prefill-d-un-llm\/\" title=\"prefill\">prefill<\/a> (lire la question) est limit\u00e9 par le calcul, le <a href=\"\/blog\/inference\/l-etape-du-decode-d-un-llm\/\" title=\"decode\">decode<\/a> (\u00e9crire la r\u00e9ponse) par la m\u00e9moire. Presque toutes les optimisations desserrent l&rsquo;un de ces goulots.<\/li>\n<li>Six familles de techniques composent la couche d&rsquo;ex\u00e9cution : regrouper les requ\u00eates, mettre en cache, quantifier, sp\u00e9culer, parall\u00e9liser, d\u00e9sagr\u00e9ger.<\/li>\n<li>Quantifier fait gagner environ 30 \u00e0 50 % par niveau de pr\u00e9cision, au risque de la qualit\u00e9 ; sp\u00e9culation et cache acc\u00e9l\u00e8rent sans changer la sortie du mod\u00e8le.<\/li>\n<li>FlashAttention et PagedAttention all\u00e8gent les lectures et \u00e9critures m\u00e9moire de l&rsquo;attention, sans perte de qualit\u00e9.<\/li>\n<li>Plus tu as de trafic, plus tu peux empiler d&rsquo;optimisations.<\/li>\n<\/ul>\n<h2>Pourquoi un GPU rapide peut rester \u00e0 attendre<\/h2>\n<p>Une requ\u00eate adress\u00e9e \u00e0 un LLM suit toujours le m\u00eame parcours. Le texte est d\u00e9coup\u00e9 en tokens, puis le <em>prefill<\/em> calcule l&rsquo;attention de chaque token d&rsquo;entr\u00e9e et range le r\u00e9sultat dans un cache KV. Le <em>decode<\/em> prend ensuite le relais : chaque passe avant produit un token, et la boucle continue jusqu&rsquo;\u00e0 un token d&rsquo;arr\u00eat, la limite de contexte ou <code>max_tokens<\/code>.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46eb7ba7&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46eb7ba7\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1109\" 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_ch03_boucle_prefill_decode-scaled.png\" alt=\"Boucle d'inf\u00e9rence d'un LLM : tokenisation du prompt, prefill qui construit le cache KV, puis decode qui r\u00e9p\u00e8te choix du token et nouvelle passe avant jusqu'\u00e0 l'arr\u00eat\" class=\"wp-image-202\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch03_boucle_prefill_decode-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch03_boucle_prefill_decode-300x130.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch03_boucle_prefill_decode-1024x444.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch03_boucle_prefill_decode-768x333.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch03_boucle_prefill_decode-1536x666.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch03_boucle_prefill_decode-2048x887.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 boucle de droite : c&rsquo;est elle qui tourne des centaines de fois par r\u00e9ponse, et c&rsquo;est elle qu&rsquo;il faudra acc\u00e9l\u00e9rer.<\/figcaption><\/figure>\n\n\n<p>Deux mesures disent si tu as r\u00e9ussi. Le TTFT (<em>time to first token<\/em>) est le d\u00e9lai avant le premier token ; il d\u00e9pend du prefill. Le TPS (<em>tokens per second<\/em>) compte les tokens re\u00e7us par seconde ensuite ; il d\u00e9pend du decode. Une latence inter-token (ITL) de 10 millisecondes \u00e9quivaut \u00e0 100 tokens par seconde et par utilisateur.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46eb80fc&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46eb80fc\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"981\" 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_ch02_chronologie_requete_ttft_itl-scaled.png\" alt=\"Chronologie d'une requ\u00eate : requ\u00eate re\u00e7ue, prefill, premier token, puis un token toutes les ITL millisecondes\" class=\"wp-image-203\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_chronologie_requete_ttft_itl-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_chronologie_requete_ttft_itl-300x115.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_chronologie_requete_ttft_itl-1024x393.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_chronologie_requete_ttft_itl-768x294.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_chronologie_requete_ttft_itl-1536x589.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_chronologie_requete_ttft_itl-2048x785.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\">La barre orange mesure l&rsquo;attente avant le premier mot ; la partie bleue, c&rsquo;est le rythme de la suite. Chaque technique de cet article d\u00e9place l&rsquo;une des deux.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\ud83d\udca1 Intuition<\/strong> Un GPU a deux ressources : le calcul (op\u00e9rations par seconde) et la bande passante m\u00e9moire (octets d\u00e9plac\u00e9s par seconde). Dans un syst\u00e8me id\u00e9al, aucune n&rsquo;attend l&rsquo;autre. Dans la r\u00e9alit\u00e9, l&rsquo;une est satur\u00e9e pendant que l&rsquo;autre dort, et c&rsquo;est ce d\u00e9s\u00e9quilibre qu&rsquo;on appelle un goulot. Si une op\u00e9ration est limit\u00e9e par la m\u00e9moire, aucune optimisation du calcul ne la rendra plus rapide.<\/p>\n<\/blockquote>\n<p>Au prefill, les poids sont lus une seule fois puis servent \u00e0 de grosses multiplications matricielles : beaucoup de calcul pour une lecture m\u00e9moire. Au decode, les poids sont relus pour chaque token g\u00e9n\u00e9r\u00e9, avec de petites multiplications vecteur-matrice : peu de calcul, \u00e9norm\u00e9ment de lecture.<\/p>\n<p>Un exemple minuscule montre le co\u00fbt de ces lectures. Deux noyaux encha\u00een\u00e9s, <code>multiply_by_2<\/code> puis <code>multiply_by_3<\/code>, lisent le vecteur [1, 2, 3], \u00e9crivent [2, 4, 6], le relisent aussit\u00f4t, puis \u00e9crivent [6, 12, 18]. Fusionn\u00e9s en un seul noyau <code>multiply_by_6<\/code>, ils lisent [1, 2, 3] et \u00e9crivent [6, 12, 18] directement. L&rsquo;\u00e9criture suivie de la relecture interm\u00e9diaires \u00e9tait un aller-retour inutile, que le decode ne peut pas se permettre.<\/p>\n<h2>Sous le capot : mesurer le goulot de l&rsquo;attention<\/h2>\n<p>Pour savoir si une op\u00e9ration attend la m\u00e9moire ou le calcul, on compare son <em>intensit\u00e9 arithm\u00e9tique<\/em> (op\u00e9rations effectu\u00e9es par octet d\u00e9plac\u00e9) au <a href=\"\/blog\/inference\/qu-est-ce-qu-un-rapport-ops-octet-du-materiel\/\" title=\"rapport ops:octet du mat\u00e9riel\">rapport ops:octet du mat\u00e9riel<\/a>. Prenons l&rsquo;attention standard, sans optimisation, pour une t\u00eate de dimension <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-7fcb3cc404e818fa61953e0c6a0c3aac_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#100;&#32;&#61;&#32;&#49;&#50;&#56;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"60\" style=\"vertical-align: 0px;\"\/> sur une s\u00e9quence de <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-0bfdbce012cc2880b3c46c98e8294b3e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;&#32;&#61;&#32;&#52;&#48;&#57;&#54;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"76\" style=\"vertical-align: 0px;\"\/> tokens.<\/p>\n<p>Elle tient en trois lignes : calculer <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-adae6c2a3915ea41fc0d06dc7c3a492a_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#83;&#32;&#61;&#32;&#81;&#75;&#94;&#92;&#116;&#111;&#112;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"76\" style=\"vertical-align: -4px;\"\/> en lisant <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-2c758bec4c272382411b95fc0e7ee250_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#81;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"14\" style=\"vertical-align: -4px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-ea9c87a513e4a72624155d392fae86e2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/> puis en \u00e9crivant <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-520cb534cd5b6bed768a61515b57cb7e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#83;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"12\" style=\"vertical-align: 0px;\"\/> ; lire <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-520cb534cd5b6bed768a61515b57cb7e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#83;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"12\" style=\"vertical-align: 0px;\"\/>, calculer <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-9703a3e7d97f45f0814e277684108d94_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;&#32;&#61;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#115;&#111;&#102;&#116;&#109;&#97;&#120;&#125;&#40;&#83;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"123\" style=\"vertical-align: -5px;\"\/> et \u00e9crire <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-650eb7688af6737ac325425b5c9a5982_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> ; lire <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-650eb7688af6737ac325425b5c9a5982_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-63ada879859a9e41fd935f035b7313bc_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/>, calculer <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-70951caeec79fe7f55b5c3538c3a97d9_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#79;&#32;&#61;&#32;&#80;&#86;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"65\" style=\"vertical-align: 0px;\"\/> et \u00e9crire <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-41136ed7463f7254f4e6df131f8be490_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#79;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/>. <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-2c758bec4c272382411b95fc0e7ee250_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#81;\" title=\"Rendered by QuickLaTeX.com\" height=\"16\" width=\"14\" style=\"vertical-align: -4px;\"\/>, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-ea9c87a513e4a72624155d392fae86e2_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#75;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/>, <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-63ada879859a9e41fd935f035b7313bc_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#86;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-41136ed7463f7254f4e6df131f8be490_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#79;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> mesurent <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-1c36be4bfffc2e70d527b6f37d6e85c4_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#100;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"48\" style=\"vertical-align: 0px;\"\/>, tandis que <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-520cb534cd5b6bed768a61515b57cb7e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#83;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"12\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-650eb7688af6737ac325425b5c9a5982_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> mesurent <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4baf35605d041d4b70147e126302e8a7_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#78;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"54\" style=\"vertical-align: 0px;\"\/>. En FP16, une valeur occupe deux octets, donc une matrice <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-4ce94dd8f8a97c80927ded4ea129ac05_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#52;&#48;&#57;&#54;&#32;&#92;&#116;&#105;&#109;&#101;&#115;&#32;&#52;&#48;&#57;&#54;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"93\" style=\"vertical-align: 0px;\"\/> p\u00e8se environ 32 Mio.<\/p>\n<p>Chaque ligne lit, calcule, \u00e9crit. En additionnant tous les mouvements m\u00e9moire, on obtient :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 48px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-e3267c37d31608646dee8b0b36b5aceb_l3.png\" height=\"48\" width=\"596\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#92;&#117;&#110;&#100;&#101;&#114;&#98;&#114;&#97;&#99;&#101;&#123;&#50;&#92;&#99;&#100;&#111;&#116;&#50;&#92;&#99;&#100;&#111;&#116;&#32;&#78;&#100;&#125;&#95;&#123;&#92;&#116;&#101;&#120;&#116;&#123;&#108;&#105;&#114;&#101;&#32;&#125;&#81;&#44;&#75;&#125;&#43;&#92;&#117;&#110;&#100;&#101;&#114;&#98;&#114;&#97;&#99;&#101;&#123;&#50;&#78;&#94;&#50;&#125;&#95;&#123;&#92;&#116;&#101;&#120;&#116;&#123;&eacute;&#99;&#114;&#105;&#114;&#101;&#32;&#125;&#83;&#125;&#43;&#92;&#117;&#110;&#100;&#101;&#114;&#98;&#114;&#97;&#99;&#101;&#123;&#50;&#78;&#94;&#50;&#125;&#95;&#123;&#92;&#116;&#101;&#120;&#116;&#123;&#108;&#105;&#114;&#101;&#32;&#125;&#83;&#125;&#43;&#92;&#117;&#110;&#100;&#101;&#114;&#98;&#114;&#97;&#99;&#101;&#123;&#50;&#78;&#94;&#50;&#125;&#95;&#123;&#92;&#116;&#101;&#120;&#116;&#123;&eacute;&#99;&#114;&#105;&#114;&#101;&#32;&#125;&#80;&#125;&#43;&#92;&#117;&#110;&#100;&#101;&#114;&#98;&#114;&#97;&#99;&#101;&#123;&#50;&#40;&#78;&#94;&#50;&#43;&#78;&#100;&#41;&#125;&#95;&#123;&#92;&#116;&#101;&#120;&#116;&#123;&#108;&#105;&#114;&#101;&#32;&#125;&#80;&#44;&#86;&#125;&#43;&#92;&#117;&#110;&#100;&#101;&#114;&#98;&#114;&#97;&#99;&#101;&#123;&#50;&#78;&#100;&#125;&#95;&#123;&#92;&#116;&#101;&#120;&#116;&#123;&eacute;&#99;&#114;&#105;&#114;&#101;&#32;&#125;&#79;&#125;&#61;&#56;&#78;&#94;&#50;&#43;&#56;&#78;&#100;&#92;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#111;&#99;&#116;&#101;&#116;&#115;&#125;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Lecture pas \u00e0 pas : chaque terme est un nombre d&rsquo;octets, avec 2 octets par valeur. Les trois termes en <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-631c6838c7c34d53d3887f80bcc6f5eb_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#50;&#78;&#94;&#50;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"32\" style=\"vertical-align: 0px;\"\/> viennent des matrices <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-520cb534cd5b6bed768a61515b57cb7e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#83;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"12\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-650eb7688af6737ac325425b5c9a5982_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/>, \u00e9crites puis relues. Ce sont elles qui dominent, car <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-929e3ccb61da0dd7de63dd25661941a3_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;&#94;&#50;\" title=\"Rendered by QuickLaTeX.com\" height=\"15\" width=\"23\" style=\"vertical-align: 0px;\"\/> grandit bien plus vite que <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-cc2054d00682eb1d560a206c26932f7f_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;&#100;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"26\" style=\"vertical-align: 0px;\"\/>.<\/p>\n<p>C\u00f4t\u00e9 calcul, la somme des trois \u00e9tapes donne <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-a83a3495a2f726b85e455827f0d8b856_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#50;&#100;&#78;&#94;&#50;&#32;&#43;&#32;&#51;&#78;&#94;&#50;&#32;&#43;&#32;&#50;&#78;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#78;&#100;&#32;&#61;&#32;&#52;&#78;&#94;&#50;&#100;&#32;&#43;&#32;&#51;&#78;&#94;&#50;\" title=\"Rendered by QuickLaTeX.com\" height=\"17\" width=\"301\" style=\"vertical-align: -2px;\"\/> op\u00e9rations. Le rapport des deux totaux est l&rsquo;intensit\u00e9 arithm\u00e9tique :<\/p>\n<p><p class=\"ql-center-displayed-equation\" style=\"line-height: 41px;\"><span class=\"ql-right-eqno\"> &nbsp; <\/span><span class=\"ql-left-eqno\"> &nbsp; <\/span><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f6bbe83629b9adff844ba2abd9333036_l3.png\" height=\"41\" width=\"219\" class=\"ql-img-displayed-equation quicklatex-auto-format\" alt=\"&#92;&#91; &#92;&#102;&#114;&#97;&#99;&#123;&#52;&#78;&#94;&#50;&#100;&#43;&#51;&#78;&#94;&#50;&#125;&#123;&#56;&#78;&#94;&#50;&#43;&#56;&#78;&#100;&#125;&#92;&#97;&#112;&#112;&#114;&#111;&#120;&#32;&#54;&#50;&#92;&#32;&#92;&#116;&#101;&#120;&#116;&#123;&#111;&#112;&#115;&#58;&#111;&#99;&#116;&#101;&#116;&#125;&#46;&#92;&#93;\" title=\"Rendered by QuickLaTeX.com\"\/><\/p><\/p>\n<p>Avec <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-0bfdbce012cc2880b3c46c98e8294b3e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;&#32;&#61;&#32;&#52;&#48;&#57;&#54;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"76\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-7fcb3cc404e818fa61953e0c6a0c3aac_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#100;&#32;&#61;&#32;&#49;&#50;&#56;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"60\" style=\"vertical-align: 0px;\"\/>, on trouve environ 62 op\u00e9rations par octet, tr\u00e8s en dessous du rapport ops:octet de 295 d&rsquo;un H100 : l&rsquo;attention du decode est limit\u00e9e par la m\u00e9moire. Les chiffres exacts varient selon le mod\u00e8le, la longueur de s\u00e9quence et le mat\u00e9riel, mais le principe tient.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46eb86dc&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46eb86dc\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1422\" 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_ch04_modele_roofline-scaled.png\" alt=\"Mod\u00e8le roofline d'un H100 en FP16 : l'attention du decode (intensit\u00e9 62) se place dans la zone limit\u00e9e par la m\u00e9moire, \u00e0 gauche du seuil \u00e0 295 ops:octet\" class=\"wp-image-204\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_modele_roofline-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_modele_roofline-300x167.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_modele_roofline-1024x569.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_modele_roofline-768x427.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_modele_roofline-1536x853.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_modele_roofline-2048x1138.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 graphique, le point orange de l&rsquo;attention en decode est loin \u00e0 gauche du trait pointill\u00e9 : tant qu&rsquo;il y reste, ajouter de la puissance de calcul ne sert \u00e0 rien. Il faut d\u00e9placer moins d&rsquo;octets, ou faire plus de calcul pour les m\u00eames octets.<\/figcaption><\/figure>\n\n\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Prefill, g\u00e9n\u00e9ration d&rsquo;images et de vid\u00e9os sont limit\u00e9s par le calcul. Le decode est limit\u00e9 par la m\u00e9moire. Regrouper plusieurs requ\u00eates rend le decode moins limit\u00e9 par la m\u00e9moire : traiter un lot consomme plus de calcul pour le m\u00eame trafic m\u00e9moire.<\/p>\n<\/blockquote>\n<h2>Les noyaux d&rsquo;attention : lire et \u00e9crire moins<\/h2>\n<p>L&rsquo;impl\u00e9mentation de base de l&rsquo;attention \u00e9crit les matrices interm\u00e9diaires <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-520cb534cd5b6bed768a61515b57cb7e_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#83;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"12\" style=\"vertical-align: 0px;\"\/> et <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-650eb7688af6737ac325425b5c9a5982_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#80;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"14\" style=\"vertical-align: 0px;\"\/> \u00e0 la fin d&rsquo;une \u00e9tape, puis les relit aussit\u00f4t \u00e0 la suivante. Deux strat\u00e9gies s&rsquo;offrent \u00e0 toi : de meilleures impl\u00e9mentations (m\u00eames calculs, mieux plac\u00e9s en m\u00e9moire) ou de nouveaux algorithmes de complexit\u00e9 moindre. Les premi\u00e8res restent quadratiques mais sont sans perte de qualit\u00e9 ; les seconds \u00e9changent de la qualit\u00e9 contre du temps et de l&rsquo;espace.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46eb8b68&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46eb8b68\" 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_ch04_attention_naive_contre_fusionnee-scaled.png\" alt=\"Attention na\u00efve en trois allers-retours m\u00e9moire contre attention fusionn\u00e9e : un seul noyau lit Q, K, V une fois et garde S et P dans la m\u00e9moire rapide du GPU\" class=\"wp-image-205\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_attention_naive_contre_fusionnee-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_attention_naive_contre_fusionnee-300x135.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_attention_naive_contre_fusionnee-1024x461.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_attention_naive_contre_fusionnee-768x346.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_attention_naive_contre_fusionnee-1536x691.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch04_attention_naive_contre_fusionnee-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\">\u00c0 gauche, trois \u00e9tapes qui \u00e9crivent puis relisent S et P ; \u00e0 droite, un seul noyau qui les garde dans la m\u00e9moire rapide du GPU et n&rsquo;\u00e9crit O qu&rsquo;une fois. C&rsquo;est l&rsquo;id\u00e9e de FlashAttention.<\/figcaption><\/figure>\n\n\n<p>FlashAttention est une s\u00e9rie de noyaux fusionn\u00e9s \u00e0 la main pour des GPU pr\u00e9cis : le code pour H100 diff\u00e8re de celui pour B200. Elle sert surtout aux op\u00e9rations limit\u00e9es par le calcul, comme le prefill ou la g\u00e9n\u00e9ration de vid\u00e9o. PagedAttention d\u00e9coupe le cache KV en blocs, les pages, accessibles par une table de correspondance : le cache peut vivre dans une m\u00e9moire fragment\u00e9e plut\u00f4t que dans un bloc contigu.<\/p>\n<p>Ni l&rsquo;une ni l&rsquo;autre ne change la complexit\u00e9 quadratique de l&rsquo;attention. Les variantes algorithmiques, elles, la changent. L&rsquo;attention \u00e0 fen\u00eatre glissante ne regarde que les <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-dfee5c980777976ae8cf6541893fb572_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"13\" style=\"vertical-align: 0px;\"\/> derniers tokens, avec <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-dfee5c980777976ae8cf6541893fb572_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#119;\" title=\"Rendered by QuickLaTeX.com\" height=\"8\" width=\"13\" style=\"vertical-align: 0px;\"\/> souvent compris entre 8 000 et 32 000, et passe de <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-f9713cd5b63b85dc4fe8db1460609e03_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#79;&#40;&#78;&#94;&#50;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"20\" width=\"51\" style=\"vertical-align: -5px;\"\/> \u00e0 <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-d857d677119aadcec3f9b59f52d7d264_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#79;&#40;&#78;&#119;&#41;\" title=\"Rendered by QuickLaTeX.com\" height=\"19\" width=\"56\" style=\"vertical-align: -5px;\"\/>. L&rsquo;attention lin\u00e9aire remplace le softmax quadratique par un algorithme lin\u00e9aire qui l&rsquo;approxime. Mamba, un mod\u00e8le d&rsquo;espace d&rsquo;\u00e9tats s\u00e9lectif, remplace carr\u00e9ment l&rsquo;attention par une mise \u00e0 jour d&rsquo;\u00e9tat r\u00e9currente.<\/p>\n<p>Pour les longues s\u00e9quences, le prefill par morceaux (<em>chunked prefill<\/em>) d\u00e9coupe la grande entr\u00e9e en morceaux ex\u00e9cut\u00e9s en m\u00eame temps que le decode, selon les ressources disponibles, pour qu&rsquo;une longue s\u00e9quence ne submerge pas le moteur.<\/p>\n<h2>Les six leviers de la couche d&rsquo;ex\u00e9cution<\/h2>\n<p>Toutes les techniques ci-dessous partagent un principe : plus tu ajoutes de contraintes au syst\u00e8me, meilleure est la performance. Elles se combinent, mais pas toujours harmonieusement, nous y reviendrons.<\/p>\n<h3>Regrouper les requ\u00eates : le batching<\/h3>\n<p>Un m\u00eame GPU peut traiter plus d&rsquo;une requ\u00eate \u00e0 la fois. Le regroupement statique attend que le lot soit plein avant de d\u00e9marrer. Le regroupement dynamique d\u00e9marre quand le lot est plein ou quand un d\u00e9lai configur\u00e9 est \u00e9coul\u00e9. Le regroupement continu ins\u00e8re les requ\u00eates \u00e0 mesure que des places se lib\u00e8rent.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46eb9179&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46eb9179\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"2276\" 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_ch12_batching_statique_dynamique_continu-scaled.png\" alt=\"Trois diagrammes de Gantt comparant batching statique, dynamique et continu sur quatre requ\u00eates\" class=\"wp-image-206\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch12_batching_statique_dynamique_continu-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch12_batching_statique_dynamique_continu-300x267.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch12_batching_statique_dynamique_continu-1024x910.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch12_batching_statique_dynamique_continu-768x683.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch12_batching_statique_dynamique_continu-1536x1365.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch12_batching_statique_dynamique_continu-2048x1820.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\">Dans le diagramme du bas, chaque requ\u00eate d\u00e9marre et finit ind\u00e9pendamment, sans l&rsquo;attente commune des deux premiers. Les moteurs vLLM, SGLang et TensorRT-LLM regroupent ainsi au niveau du token (\u00ab en vol \u00bb pour TensorRT-LLM), ce qui minimise la latence face au regroupement statique.<\/figcaption><\/figure>\n\n\n<p>La taille de lot est un curseur : l&rsquo;augmenter produit plus de d\u00e9bit global, mais la latence de chaque utilisateur se d\u00e9grade. Il faut donc tester plusieurs tailles de lot pour trouver le bon compromis pour ton mod\u00e8le, ton instance, ta cible de latence et ton budget.<\/p>\n<h3>Quantifier : des nombres plus petits<\/h3>\n<p>Les mod\u00e8les sont entra\u00een\u00e9s dans un format num\u00e9rique natif, le plus souvent BF16 ou FP16. La quantification apr\u00e8s entra\u00eenement convertit les poids et d&rsquo;autres valeurs vers une pr\u00e9cision inf\u00e9rieure. Diviser la pr\u00e9cision par deux aide les deux phases : le prefill s&rsquo;ex\u00e9cute sur des Tensor Cores de pr\u00e9cision inf\u00e9rieure qui offrent deux fois plus de FLOPS, et le decode charge deux fois moins de donn\u00e9es par valeur.<\/p>\n<p>Le gain r\u00e9el est moins beau que la th\u00e9orie, car travailler sur des donn\u00e9es quantifi\u00e9es ajoute un surco\u00fbt : descendre d&rsquo;un niveau de pr\u00e9cision apporte en pratique 30 \u00e0 50 % de performance en plus pour les LLM.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46eba030&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46eba030\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1047\" 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\/b2_ch06_processus_quantification-scaled.png\" alt=\"Principe de la quantification : rep\u00e9rer min et max du tenseur, mettre \u00e0 l'\u00e9chelle, arrondir vers un entier born\u00e9\" class=\"wp-image-207\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-300x123.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-1024x419.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-768x314.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-1536x628.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-2048x838.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\">Le sch\u00e9ma montre la m\u00e9canique de base : on rep\u00e8re les bornes du tenseur, on met \u00e0 l&rsquo;\u00e9chelle avec <img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1047\" 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\/b2_ch06_processus_quantification-scaled.png\" alt=\"Principe de la quantification : rep\u00e9rer min et max du tenseur, mettre \u00e0 l'\u00e9chelle, arrondir vers un entier born\u00e9\" class=\"wp-image-207\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-300x123.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-1024x419.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-768x314.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-1536x628.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b2_ch06_processus_quantification-2048x838.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>, puis on arrondit vers un entier born\u00e9, par exemple entre 0 et 255. Un poids flottant 32 bits comme \u22120,294 devient ainsi un simple entier.<\/figcaption><\/figure>\n\n\n<p>Le revers, ce sont les erreurs de pr\u00e9cision, qui s&rsquo;accumulent. \u00c9l\u00e8ve au carr\u00e9 et au cube diff\u00e9rentes pr\u00e9cisions de \u03c0 : avec 3,14159 tu obtiens 9,869588 et 31,006198 ; avec 3,14, 9,8596 et 30,959144 ; avec 3, tu obtiens 9 et 27. Tout le travail de quantification consiste \u00e0 pr\u00e9venir ces erreurs et \u00e0 limiter leur effet sur la sortie finale.<\/p>\n<p>Tout ne se quantifie pas avec le m\u00eame risque. De la moins \u00e0 la plus sensible : les poids des couches lin\u00e9aires, les activations, le cache KV, puis l&rsquo;attention, tr\u00e8s sensible, surtout des \u00e9quations comme le softmax.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46eba63d&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46eba63d\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"896\" 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_ch07_sensibilite_composants-scaled.png\" alt=\"Sensibilit\u00e9 croissante \u00e0 la quantification : poids des couches lin\u00e9aires, activations, cache KV, attention (softmax)\" class=\"wp-image-208\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_sensibilite_composants-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_sensibilite_composants-300x105.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_sensibilite_composants-1024x358.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_sensibilite_composants-768x269.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_sensibilite_composants-1536x538.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch07_sensibilite_composants-2048x717.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\">On quantifie de gauche \u00e0 droite, avec prudence : le dernier encadr\u00e9, orange, est celui o\u00f9 les erreurs s&rsquo;accumulent d&rsquo;un token \u00e0 l&rsquo;autre, puisque le calcul de chaque token s&rsquo;appuie sur tous les pr\u00e9c\u00e9dents. Presque tous les sch\u00e9mas gardent donc le softmax dans sa pr\u00e9cision d&rsquo;origine.<\/figcaption><\/figure>\n\n\n<p>C\u00f4t\u00e9 formats, mieux vaut s&rsquo;en tenir aux flottants : les entiers manquent de plage dynamique pour les charges sensibles \u00e0 la qualit\u00e9. Les flottants 8 bits (FP8, MXFP8) offrent g\u00e9n\u00e9ralement le meilleur compromis ; le FP4, surtout NVFP4, est prometteur.<\/p>\n<p>Deux voies existent : l&rsquo;entra\u00eenement conscient de la quantification (des laboratoires publient ainsi GPT-OSS en MXFP4 ou Kimi K2 Thinking en INT4) et la quantification apr\u00e8s entra\u00eenement, la seule accessible quand on re\u00e7oit des poids termin\u00e9s. NVIDIA TensorRT Model Optimizer est un outil de r\u00e9f\u00e9rence, et ses sorties sont compatibles avec vLLM, SGLang et TensorRT-LLM.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> La quantification est une \u00e9chelle, pas un choix binaire. Quantifie en FP8 plut\u00f4t qu&rsquo;en FP4, ou seulement les poids, si la qualit\u00e9 ne peut pas \u00eatre risqu\u00e9e. Pour v\u00e9rifier, compare la perplexit\u00e9 avant et apr\u00e8s (on cherche une hausse minimale), puis un banc d&rsquo;essai public ou, mieux, une \u00e9valuation propre \u00e0 ton domaine.<\/p>\n<\/blockquote>\n<h3>Sp\u00e9culer : plusieurs tokens par passe<\/h3>\n<p>Le decode est limit\u00e9 par la m\u00e9moire : \u00e0 lot faible ou mod\u00e9r\u00e9, le calcul reste au repos pendant que les poids sont lus. Le d\u00e9codage sp\u00e9culatif exploite ce calcul libre pour tenter de produire plusieurs tokens par passe avant dans le mod\u00e8le cible.<\/p>\n<p>Le m\u00e9canisme est commun \u00e0 tous les algorithmes : un sp\u00e9culateur propose un ou plusieurs tokens de brouillon, le mod\u00e8le cible les valide en une seule passe, accepte ceux qui co\u00efncident avec ce qu&rsquo;il aurait g\u00e9n\u00e9r\u00e9, puis produit lui-m\u00eame un token de plus. On obtient <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-45c978c7874d154b4001f44f382e2a9c_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;&#43;&#49;\" title=\"Rendered by QuickLaTeX.com\" height=\"14\" width=\"46\" style=\"vertical-align: -2px;\"\/> tokens par passe, o\u00f9 <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.ranksignal.fr\/wp-content\/ql-cache\/quicklatex.com-5793832f979c2268e3694c246d53b1bb_l3.png\" class=\"ql-img-inline-formula quicklatex-auto-format\" alt=\"&#78;\" title=\"Rendered by QuickLaTeX.com\" height=\"12\" width=\"16\" style=\"vertical-align: 0px;\"\/> est le nombre de brouillons accept\u00e9s.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ebabea&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ebabea\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"981\" 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_ch08_cycle_decodage_speculatif-scaled.png\" alt=\"Cycle du d\u00e9codage sp\u00e9culatif : contexte, sp\u00e9culateur qui propose N tokens, mod\u00e8le cible qui valide en une passe, N+1 tokens obtenus\" class=\"wp-image-209\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_cycle_decodage_speculatif-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_cycle_decodage_speculatif-300x115.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_cycle_decodage_speculatif-1024x393.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_cycle_decodage_speculatif-768x294.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_cycle_decodage_speculatif-1536x589.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_cycle_decodage_speculatif-2048x785.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\">Remarque la note du bas : d\u00e8s qu&rsquo;un brouillon est rejet\u00e9, tous les suivants le sont aussi, ce qui favorise des s\u00e9quences courtes et fiables. Et le gain ne porte que sur le TPS, pas sur le TTFT.<\/figcaption><\/figure>\n\n\n<p>Pourquoi \u00e7a marche ? V\u00e9rifier est bien plus rapide que g\u00e9n\u00e9rer, comme une grille de sudoku : la r\u00e9soudre est difficile, contr\u00f4ler une grille termin\u00e9e est facile. Le gain d\u00e9pend de trois facteurs : le co\u00fbt d&rsquo;un token de brouillon, la longueur de la s\u00e9quence de brouillon et le taux d&rsquo;acceptation.<\/p>\n<p>Le taux d&rsquo;acceptation chute avec la temp\u00e9rature (des distributions plus difficiles \u00e0 pr\u00e9dire) et varie avec le sujet trait\u00e9. Autre limite : la sp\u00e9culation n&rsquo;aide qu&rsquo;\u00e0 faible taille de lot, l\u00e0 o\u00f9 il reste des cycles de calcul ; \u00e0 lot \u00e9lev\u00e9, le calcul est satur\u00e9 et il faut la d\u00e9sactiver dynamiquement.<\/p>\n<p>Trois variantes s&rsquo;appuient sur un mod\u00e8le de brouillon :<\/p>\n<ul>\n<li><strong>Brouillon-cible<\/strong> : un petit mod\u00e8le de la m\u00eame famille g\u00e9n\u00e8re les brouillons, avec en r\u00e8gle g\u00e9n\u00e9rale au moins dix fois moins de param\u00e8tres. Simple \u00e0 mettre en place, mais au surco\u00fbt le plus \u00e9lev\u00e9.<\/li>\n<li><strong>Medusa<\/strong> : elle affine le mod\u00e8le cible pour lui greffer de deux \u00e0 quatre t\u00eates de d\u00e9codage suppl\u00e9mentaires. Peu utilis\u00e9e en production, elle a inspir\u00e9 EAGLE.<\/li>\n<li><strong>EAGLE<\/strong> : un mod\u00e8le de brouillon entra\u00een\u00e9 sur les \u00e9tats cach\u00e9s du mod\u00e8le, jusqu&rsquo;\u00e0 huit tokens de brouillon avec un tr\u00e8s haut taux d&rsquo;acceptation. C&rsquo;est l&rsquo;algorithme de r\u00e9f\u00e9rence pour un usage g\u00e9n\u00e9ral chez les ing\u00e9nieurs qui savent entra\u00eener ces t\u00eates.<br \/>\nLa sp\u00e9culation par <strong>n-grammes<\/strong> fait sans mod\u00e8le de brouillon : elle construit pendant le prefill un dictionnaire de s\u00e9quences du texte d&rsquo;entr\u00e9e. Elle d\u00e9passe dix tokens de brouillon, mais n&rsquo;est efficace que quand la sortie ressemble \u00e0 l&rsquo;entr\u00e9e, comme en compl\u00e9tion de code. Le d\u00e9codage anticip\u00e9 (<em>Lookahead Decoding<\/em>) g\u00e9n\u00e9ralise l&rsquo;id\u00e9e en produisant les n-grammes pendant l&rsquo;inf\u00e9rence, au prix de calcul suppl\u00e9mentaire.<\/li>\n<\/ul>\n<h3>Mettre en cache : ne pas refaire ce qui est fait<\/h3>\n<p>Tous les moteurs utilisent le cache KV requ\u00eate par requ\u00eate : sans lui, il faudrait recalculer chaque valeur pr\u00e9c\u00e9dente de toute la s\u00e9quence pour chaque nouveau token. On peut en tirer plus en le r\u00e9utilisant d&rsquo;une requ\u00eate \u00e0 l&rsquo;autre.<\/p>\n<p>Prenons deux prompts de quatre tokens qui commencent par \u00ab Weather in \u00bb. Par d\u00e9faut, le moteur ex\u00e9cute le prefill sur les quatre tokens de chacun. Avec le cache de pr\u00e9fixe, il r\u00e9utilise le cache KV de la premi\u00e8re requ\u00eate et saute le prefill des deux premiers tokens de la seconde. Les API facturent moins cher les tokens d&rsquo;entr\u00e9e \u00ab avec succ\u00e8s de cache \u00bb pour cette raison.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ebb0ef&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ebb0ef\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1071\" 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_ch08_prefixe_partage_cache-scaled.png\" alt=\"Deux requ\u00eates partageant le pr\u00e9fixe \u00ab Weather in \u00bb : le pr\u00e9fixe commun est relu depuis le cache, la suite est recalcul\u00e9e\" class=\"wp-image-210\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_prefixe_partage_cache-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_prefixe_partage_cache-300x125.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_prefixe_partage_cache-1024x428.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_prefixe_partage_cache-768x321.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_prefixe_partage_cache-1536x642.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_prefixe_partage_cache-2048x856.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\">Seul le pr\u00e9fixe commun, en bleu, est relu depuis le cache. M\u00eame le \u00ab ? \u00bb final, pourtant identique dans les deux requ\u00eates, est recalcul\u00e9, parce qu&rsquo;il suit le premier token diff\u00e9rent.<\/figcaption><\/figure>\n\n\n<p>Le cache de pr\u00e9fixe fonctionne du d\u00e9but de la s\u00e9quence jusqu&rsquo;au premier token non r\u00e9p\u00e9t\u00e9. Si le tout premier token diff\u00e8re, il n&rsquo;y a aucune \u00e9conomie, m\u00eame si tous les suivants sont identiques. Place donc les tokens nouveaux le plus tard possible dans le contexte : c&rsquo;est ton ing\u00e9nierie de contexte qui d\u00e9termine les \u00e9conomies de TTFT.<\/p>\n<p>Les gains deviennent massifs l\u00e0 o\u00f9 de longues parties se r\u00e9p\u00e8tent : invites syst\u00e8me d&rsquo;agents ou de chatbots, compl\u00e9tion de code, r\u00e9sum\u00e9 et questions-r\u00e9ponses sur documents, conversations \u00e0 plusieurs tours. Pour d\u00e9passer la limite du pr\u00e9fixe, des outils comme CacheBlend et LMCache prennent en charge des s\u00e9quences hors pr\u00e9fixe.<\/p>\n<p>Reste un probl\u00e8me : le cache KV occupe beaucoup de m\u00e9moire. On peut le d\u00e9charger de la VRAM vers d&rsquo;autres stockages, par bande passante d\u00e9croissante : G1 (VRAM du GPU, de l&rsquo;ordre du To\/s pour 10 \u00e0 100 Go), G2 (RAM de l&rsquo;h\u00f4te, 10 \u00e0 100 Go\/s), G3 (SSD local, 5 \u00e0 10 Go\/s) et G4 (SSD en r\u00e9seau, de l&rsquo;ordre du Go\/s pour des dizaines de To).<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ebbcb8&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ebbcb8\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"939\" 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_ch08_hierarchie_stockage_cache_kv-scaled.png\" alt=\"Quatre niveaux de stockage du cache KV, de la VRAM rapide et petite au SSD r\u00e9seau lent et vaste\" class=\"wp-image-211\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_hierarchie_stockage_cache_kv-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_hierarchie_stockage_cache_kv-300x110.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_hierarchie_stockage_cache_kv-1024x375.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_hierarchie_stockage_cache_kv-768x282.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_hierarchie_stockage_cache_kv-1536x563.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch08_hierarchie_stockage_cache_kv-2048x751.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\">La r\u00e8gle : les blocs les plus utilis\u00e9s restent \u00e0 gauche, dans la m\u00e9moire la plus rapide, les autres glissent vers la droite jusqu&rsquo;\u00e0 ce qu&rsquo;on en ait besoin. NVIDIA Dynamo prend en charge ce d\u00e9port avec KVBM, qui fournit des API pour d\u00e9placer des blocs de cache KV entre niveaux.<\/figcaption><\/figure>\n\n\n<p>Avec plusieurs r\u00e9plicas, le routage doit lui aussi tenir compte du cache : un utilisateur en longue conversation doit atterrir autant que possible sur le m\u00eame r\u00e9plica pour obtenir un succ\u00e8s de cache. On parle de routage conscient du cache. Un cache global sur stockage r\u00e9seau G4 garantit en plus que les s\u00e9quences en cache ne sont pas perdues quand des n\u0153uds s&rsquo;arr\u00eatent pendant la mise \u00e0 l&rsquo;\u00e9chelle.<\/p>\n<h3>Parall\u00e9liser : quand un GPU ne suffit plus<\/h3>\n<p>Tous les LLM de pointe sont trop gros pour tenir sur un seul GPU en inf\u00e9rence par lots. Il ne suffit d&rsquo;ailleurs pas de faire tout juste tenir les poids : le cache KV occupe souvent 80 % ou plus de la VRAM restante apr\u00e8s les poids. Avec quatre B200, soit 720 Go, on pourrait th\u00e9oriquement charger les poids de DeepSeek, mais il ne resterait aucune place pour le cache KV. Un n\u0153ud complet de huit B200 est n\u00e9cessaire pour un vrai trafic de production.<\/p>\n<p>Il existe trois formes de parall\u00e9lisme de mod\u00e8le :<\/p>\n<ul>\n<li><strong>Pipeline (PP)<\/strong> : les couches sont r\u00e9parties entre les GPU. Latence et usage m\u00e9diocres ; il n&rsquo;est pas recommand\u00e9, sauf pour l&rsquo;inf\u00e9rence multi-n\u0153uds.<\/li>\n<li><strong>Tensoriel (TP)<\/strong> : les tenseurs de chaque couche sont r\u00e9partis. Les op\u00e9rations lourdes sont partag\u00e9es, mais il faut synchroniser les GPU. C&rsquo;est g\u00e9n\u00e9ralement le meilleur choix pour une faible latence dans un seul n\u0153ud.<\/li>\n<li><strong>Experts (EP)<\/strong> : dans un mod\u00e8le MoE, chaque expert vit sur un GPU. Il faut du routage entre GPU, mais le d\u00e9bit est meilleur.<\/li>\n<\/ul>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ebc235&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ebc235\" 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_ch09_trois_formes_parallelisme-scaled.png\" alt=\"Trois formes de parall\u00e9lisme : pipeline qui d\u00e9coupe en \u00e9tages, tensoriel qui coupe chaque couche, experts r\u00e9partis entre huit GPU\" class=\"wp-image-212\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_trois_formes_parallelisme-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_trois_formes_parallelisme-300x135.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_trois_formes_parallelisme-1024x461.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_trois_formes_parallelisme-768x346.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_trois_formes_parallelisme-1536x691.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch09_trois_formes_parallelisme-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\">Le sch\u00e9ma associe chaque forme \u00e0 sa caract\u00e9ristique : latence m\u00e9diocre pour PP, latence minimale dans un n\u0153ud pour TP, d\u00e9bit \u00e9lev\u00e9 et multi-n\u0153uds possible pour EP. Dans un mod\u00e8le \u00e0 128 experts servi en EP8, chaque GPU h\u00e9berge 16 experts complets.<\/figcaption><\/figure>\n\n\n<p>Le parall\u00e9lisme tensoriel doit \u00eatre ta strat\u00e9gie par d\u00e9faut. Mais les r\u00e9sultats de chaque couche doivent \u00eatre combin\u00e9s par une r\u00e9duction collective (<em>all-reduce<\/em>) avant la couche suivante : sur des n\u0153uds \u00e9quip\u00e9s de NVLink et NVSwitch, ce surco\u00fbt de communication est minimis\u00e9. De nombreux d\u00e9ploiements m\u00ealent TP pour l&rsquo;attention et EP pour la couche MoE parcimonieuse.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ebca05&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ebca05\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"981\" 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_interconnexions_nvlink_infiniband-scaled.png\" alt=\"Deux n\u0153uds de huit GPU reli\u00e9s par NVLink et NVSwitch en interne et par InfiniBand entre eux\" class=\"wp-image-213\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_interconnexions_nvlink_infiniband-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_interconnexions_nvlink_infiniband-300x115.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_interconnexions_nvlink_infiniband-1024x392.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_interconnexions_nvlink_infiniband-768x294.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_interconnexions_nvlink_infiniband-1536x589.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch05_interconnexions_nvlink_infiniband-2048x785.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 l&rsquo;ordre de grandeur d&rsquo;\u00e9cart : NVLink atteint jusqu&rsquo;\u00e0 1 800 Go\/s sur Blackwell et 900 Go\/s sur Hopper, alors qu&rsquo;InfiniBand plafonne \u00e0 400 Gb\/s par carte r\u00e9seau. D\u00e8s que l&rsquo;inf\u00e9rence sort d&rsquo;un n\u0153ud, la communication devient le goulot.<\/figcaption><\/figure>\n\n\n<p>Sur InfiniBand, le TP exige trop de communication entre GPU. Deux options fonctionnent : pour les mod\u00e8les denses, du TP dans chaque n\u0153ud et du PP entre les n\u0153uds (TP8PP2) ; pour les MoE, le parall\u00e9lisme d&rsquo;experts (EP16). Pour les MoE, TP8PP2 offrira g\u00e9n\u00e9ralement une latence plus basse par utilisateur, et EP16 un d\u00e9bit global plus \u00e9lev\u00e9.<\/p>\n<h3>D\u00e9sagr\u00e9ger : s\u00e9parer prefill et decode<\/h3>\n<p>Quand prefill et decode tournent sur le m\u00eame n\u0153ud sous fort trafic, ils se g\u00eanent : le prefill consomme du calcul, le decode de la m\u00e9moire, et avec de plus grands lots ils se disputent les ressources.<\/p>\n<p>La d\u00e9sagr\u00e9gation les s\u00e9pare en moteurs distincts, sur des GPU ou des n\u0153uds distincts. Le moteur de prefill prend la s\u00e9quence d&rsquo;entr\u00e9e et g\u00e9n\u00e8re un cache KV en calculant le premier token ; il envoie le cache KV au moteur de decode par l&rsquo;interconnexion mat\u00e9rielle ; le moteur de decode calcule tous les tokens suivants.<\/p>\n<p>Les vrais syst\u00e8mes ne comptent pas un moteur de chaque sorte. On note xPyD le nombre de moteurs de prefill et de decode : 5P3D signifie cinq moteurs de prefill et trois de decode au service d&rsquo;un m\u00eame d\u00e9ploiement. Le nouveau goulot devient la taille de la file de prefill, et l&rsquo;autre est le manque de cache KV sur les moteurs de decode sous forte charge, soulag\u00e9 par la quantification et le d\u00e9port du cache KV.<\/p>\n<blockquote>\n<p><strong>\ud83d\udccc \u00c0 retenir<\/strong> Ces six leviers servent \u00e0 contourner un goulot. Le batching rend le decode moins limit\u00e9 par la m\u00e9moire, la quantification diminue les octets \u00e0 lire, la sp\u00e9culation produit plusieurs tokens par lecture des poids, le cache \u00e9vite de recalculer, le parall\u00e9lisme \u00e9tale poids et cache sur plusieurs GPU, la d\u00e9sagr\u00e9gation sp\u00e9cialise chaque phase.<\/p>\n<\/blockquote>\n<h2>Quel moteur pour appliquer tout \u00e7a ?<\/h2>\n<p>Tu n&rsquo;as pas \u00e0 r\u00e9impl\u00e9menter ces techniques : trois moteurs concurrents les int\u00e8grent. Ils offrent de bonnes performances pr\u00eates \u00e0 l&#8217;emploi et fonctionnent d&#8217;embl\u00e9e avec le regroupement continu ; ils prennent en charge quantification, d\u00e9codage sp\u00e9culatif, cache de pr\u00e9fixe, parall\u00e9lisme et d\u00e9sagr\u00e9gation. Les moteurs sont puissants parce qu&rsquo;ils sont configurables : tu testes des combinaisons plut\u00f4t que de r\u00e9p\u00e9ter des impl\u00e9mentations routini\u00e8res.<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>vLLM<\/th>\n<th>SGLang<\/th>\n<th>TensorRT-LLM<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Performance<\/td>\n<td>Bonne<\/td>\n<td>Bonne<\/td>\n<td>La meilleure<\/td>\n<\/tr>\n<tr>\n<td>Facilit\u00e9 d&rsquo;usage<\/td>\n<td>Facile<\/td>\n<td>Facile<\/td>\n<td>Difficile<\/td>\n<\/tr>\n<tr>\n<td>Mod\u00e8les pris en charge<\/td>\n<td>La plupart<\/td>\n<td>La plupart<\/td>\n<td>Certains<\/td>\n<\/tr>\n<tr>\n<td>Mat\u00e9riel<\/td>\n<td>GPU, TPU<\/td>\n<td>NVIDIA, AMD<\/td>\n<td>NVIDIA seulement<\/td>\n<\/tr>\n<tr>\n<td>Licence<\/td>\n<td>Apache 2.0<\/td>\n<td>Apache 2.0<\/td>\n<td>Apache 2.0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>vLLM et SGLang sont plus g\u00e9n\u00e9ralistes et prennent en charge davantage de mod\u00e8les d\u00e8s le premier jour ; TensorRT-LLM a une courbe d&rsquo;apprentissage plus raide mais atteint g\u00e9n\u00e9ralement la meilleure performance, en grande partie gr\u00e2ce aux noyaux \u00e9crits et fusionn\u00e9s \u00e0 la main par les ing\u00e9nieurs de NVIDIA. Pour orchestrer ces moteurs \u00e0 grande \u00e9chelle, NVIDIA Dynamo ajoute routage KV distribu\u00e9, d\u00e9sagr\u00e9gation et parall\u00e9lisme multi-n\u0153uds ; sans volume suffisant, il serait une surcharge inutile.<\/p>\n<h2>Le voir tourner : DeepSeek sur huit GPU<\/h2>\n<p>Reprenons notre fil rouge. Premi\u00e8re question : combien de GPU faut-il ? On estime le minimum en multipliant la pr\u00e9cision, le nombre de param\u00e8tres et l&rsquo;allocation pr\u00e9vue pour le cache KV, puis on arrondit \u00e0 la taille d&rsquo;instance sup\u00e9rieure. Le bloc suivant fait ce calcul pour DeepSeek en FP8 ; <code>round_up<\/code> y d\u00e9signe cet arrondi vers la taille disponible suivante.<\/p>\n<pre><code># Deciding GPU allocation for DeepSeek\nbits_precision = 8 # FP8 quantization\nparams = 671 # parameters in billions\nkv_cache_allocation = 1.8\nvram_required = (bits_precision \/ 8) * params * kv_cache_allocation\n# DeepSeek requires about 1200 GB of VRAM with this config\nb200_vram_available = [180, 360, 720, 1440]\nround_up(vram_required, b200_vram_available)\n# Serving DeepSeek in FP8 requires 1440 GB of VRAM (8xB200 GPUs)\n<\/code><\/pre>\n<p>Avec 8 bits, 671 milliards de param\u00e8tres et un coefficient de 1,8 pour le cache KV, le calcul donne environ 1 200 Go ; on arrondit \u00e0 la taille d&rsquo;instance suivante, 1 440 Go, soit huit B200. M\u00eame pour des mod\u00e8les de taille moyenne, on veut souvent plus que le minimum de GPU, pour permettre de plus grands caches KV et une meilleure latence par utilisateur.<\/p>\n<p>Deuxi\u00e8me question : quelle part de la m\u00e9moire r\u00e9server au cache KV ? Le moteur se r\u00e8gle. Voici l&rsquo;extrait de configuration TensorRT-LLM qui fixe cette part.<\/p>\n<pre><code>kv_cache_config.free_gpu_memory_fraction = 0.8\n# or any value 0.0 &lt; n &lt; 1.0\n<\/code><\/pre>\n<p>Ce r\u00e9glage r\u00e9serve au cache KV 80 % de la VRAM restante : sur un B200 de 180 Go dont 100 Go servent aux poids du mod\u00e8le et aux tampons, cela alloue 80 % des 80 Go restants, soit 64 Go. Une fois cette allocation remplie, et elle se remplit vite, il faut supprimer des caches KV enregistr\u00e9s, ce qui augmente la probabilit\u00e9 d&rsquo;\u00e9chec de cache pour les requ\u00eates futures.<\/p>\n<p>Troisi\u00e8me question : comment lancer le serveur ? Avec vLLM, la commande <code>vllm serve<\/code> active ici le parall\u00e9lisme d&rsquo;experts et un parall\u00e9lisme tensoriel sur 8 GPU, et nomme le mod\u00e8le <code>ds31<\/code> pour les clients.<\/p>\n<pre><code>vllm serve deepseek-ai\/DeepSeek-V3.1\n  --enable-expert-parallel\n  --tensor-parallel-size 8\n  --served-model-name ds31\n<\/code><\/pre>\n<p>Avec SGLang, la m\u00eame id\u00e9e se compl\u00e8te d&rsquo;un d\u00e9codage sp\u00e9culatif EAGLE : on r\u00e8gle le nombre d&rsquo;\u00e9tapes sp\u00e9culatives, le top-k d&rsquo;EAGLE et le nombre de tokens de brouillon, avec un parall\u00e9lisme tensoriel sur 8 GPU.<\/p>\n<pre><code>python3 -m sglang.launch_server\n  --model-path deepseek-ai\/DeepSeek-V3-0324\n  --speculative-algorithm EAGLE\n  --speculative-num-steps 1\n  --speculative-eagle-topk 1\n  --speculative-num-draft-tokens 2\n  --trust-remote-code\n  --tp 8\n<\/code><\/pre>\n<p>Avec TensorRT-LLM, la commande <code>trtllm-serve<\/code> r\u00e8gle en plus la taille maximale de lot, les limites de tokens et de s\u00e9quence, la part de m\u00e9moire GPU r\u00e9serv\u00e9e au cache KV, et combine parall\u00e9lisme tensoriel et parall\u00e9lisme d&rsquo;experts sur huit GPU.<\/p>\n<pre><code>trtllm-serve deepseek-ai\/DeepSeek-R1-0528\n  --host 0.0.0.0\n  --port 8000\n  --backend pytorch\n  --max_batch_size 1024\n  --max_num_tokens 3200\n  --max_seq_len 2048\n  --kv_cache_free_gpu_memory_fraction 0.8\n  --tp_size 8\n  --ep_size 8\n  --trust_remote_code\n  --extra_llm_api_options &#36;{EXTRA_LLM_API_FILE}\n<\/code><\/pre>\n<p>Retiens ce que ces trois commandes ont en commun : chaque option est un levier vu plus haut. Parall\u00e9lisme tensoriel et d&rsquo;experts, sp\u00e9culation, taille de lot, part de VRAM du cache KV : optimiser un moteur, c&rsquo;est avant tout r\u00e9gler ces param\u00e8tres.<\/p>\n<h2>Savoir si \u00e7a a march\u00e9<\/h2>\n<p>Optimiser sans mesurer ne m\u00e8ne nulle part. Distingue d&rsquo;abord le temps d&rsquo;inf\u00e9rence (le temps pass\u00e9 sur le GPU \u00e0 g\u00e9n\u00e9rer les tokens) de la mesure de bout en bout, qui inclut latence r\u00e9seau et file d&rsquo;attente. Quand l&rsquo;inf\u00e9rence est rapide mais que le bout en bout est lent, tourne-toi vers l&rsquo;infrastructure plut\u00f4t que vers le mod\u00e8le.<\/p>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ebd394&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ebd394\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1365\" 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_ch02_distribution_latence_percentiles-scaled.png\" alt=\"Distribution asym\u00e9trique des temps de r\u00e9ponse : m\u00e9diane et moyenne pr\u00e8s du pic, percentiles P90 et P99 dans la tra\u00eene lente\" class=\"wp-image-216\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_distribution_latence_percentiles-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_distribution_latence_percentiles-300x160.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_distribution_latence_percentiles-1024x546.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_distribution_latence_percentiles-768x410.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_distribution_latence_percentiles-1536x819.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_distribution_latence_percentiles-2048x1092.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\">La moyenne cache les requ\u00eates lentes : les temps de r\u00e9ponse forment une distribution asym\u00e9trique, et la moyenne d\u00e9passe la m\u00e9diane. On mesure donc des percentiles (P50, P90, P99), et la zone orange du graphique rappelle que ce sont ces 10 % de requ\u00eates les plus lentes que tes utilisateurs remarquent.<\/figcaption><\/figure>\n\n\n<p>Un bon banc d&rsquo;essai imite le trafic r\u00e9el et ne change qu&rsquo;une variable \u00e0 la fois ; le profilage explique le pourquoi des chiffres. Pour les mod\u00e8les d&#8217;embedding quantifi\u00e9s, un contr\u00f4le simple compare la similarit\u00e9 cosinus des vecteurs de sortie du mod\u00e8le d&rsquo;origine et du mod\u00e8le quantifi\u00e9 : 100 % signifie des vecteurs identiques, et il faut au moins 99 % pour \u00eatre en confiance.<\/p>\n<h2>Pi\u00e8ges et limites<\/h2>\n<p>Les techniques sont parfois symbiotiques, parfois incompatibles. Quantifier le cache KV all\u00e8ge un goulot de la d\u00e9sagr\u00e9gation, mais augmenter la taille de lot r\u00e9duit le calcul disponible pour la sp\u00e9culation. L&rsquo;objectif est un ensemble \u00e9quilibr\u00e9 d&rsquo;optimisations qui vaut plus que la somme de ses parties, et cela demande de l&rsquo;exp\u00e9rimentation patiente : chez Baseten, un ing\u00e9nieur a essay\u00e9 77 configurations avant de trouver une solution peu \u00e9vidente qui doublait le TPS pour le mod\u00e8le d&rsquo;un client.<\/p>\n<blockquote>\n<p><strong>\u26a0\ufe0f Pi\u00e8ge<\/strong> Plus de contraintes donne une meilleure performance, mais plus de trafic permet plus d&rsquo;optimisations. Un parall\u00e9lisme pouss\u00e9, un routage conscient du KV et une d\u00e9sagr\u00e9gation dynamique n&rsquo;ont de sens qu&rsquo;avec un grand nombre de GPU. \u00c0 faible trafic, ces outils ajoutent de la complexit\u00e9 sans rapporter.<\/p>\n<\/blockquote>\n<p>Quelques autres limites \u00e0 garder en t\u00eate :<\/p>\n<ul>\n<li>R\u00e9duire la latence par la sp\u00e9culation impose de r\u00e9duire les tailles de lot, ce qui abaisse le d\u00e9bit et augmente le co\u00fbt.<\/li>\n<li>Le cache de pr\u00e9fixe et la d\u00e9sagr\u00e9gation ne servent \u00e0 rien pour un mod\u00e8le d&#8217;embedding, qui traite ses tokens en parall\u00e8le.<\/li>\n<li>Les moteurs compil\u00e9s ciblent un GPU pr\u00e9cis : pour ex\u00e9cuter un mod\u00e8le sur un B200, il faut compiler sur un B200. Un noyau choisi \u00e0 la main peut aussi perdre sa compatibilit\u00e9 en changeant de GPU.<\/li>\n<\/ul>\n<p>Surtout, aucun r\u00e9glage ne remplace le choix du mod\u00e8le : \u00e0 mat\u00e9riel, ex\u00e9cution et architecture \u00e9gaux, un mod\u00e8le plus petit est plus rapide et moins cher. C&rsquo;est la d\u00e9cision la plus importante, avant le moteur ou l&rsquo;algorithme de sp\u00e9culation.<\/p>\n<h2>Aller plus loin<\/h2>\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6adef46ebdee6&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6adef46ebdee6\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1164\" 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_ch02_finetuning_contre_distillation-scaled.png\" alt=\"Fine-tuning contre distillation : l'affinage modifie les poids pour un domaine, la distillation fait imiter un grand mod\u00e8le enseignant par un petit \u00e9l\u00e8ve\" class=\"wp-image-217\" srcset=\"https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_finetuning_contre_distillation-scaled.png 2560w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_finetuning_contre_distillation-300x136.png 300w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_finetuning_contre_distillation-1024x465.png 1024w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_finetuning_contre_distillation-768x349.png 768w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_finetuning_contre_distillation-1536x698.png 1536w, https:\/\/www.ranksignal.fr\/wp-content\/uploads\/2026\/10\/b1_ch02_finetuning_contre_distillation-2048x931.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\">En haut du sch\u00e9ma, l&rsquo;affinage garde l&rsquo;architecture et modifie les poids ; en bas, la distillation transmet les distributions de probabilit\u00e9s d&rsquo;un grand mod\u00e8le \u00e0 un petit.<\/figcaption><\/figure>\n\n\n<ul>\n<li><strong>Distillation<\/strong> : un grand mod\u00e8le \u00ab enseignant \u00bb entra\u00eene un petit \u00ab \u00e9l\u00e8ve \u00bb \u00e0 imiter son comportement. \u00c0 la diff\u00e9rence d&rsquo;un <a href=\"\/blog\/inference\/le-finetuning-d-un-modele\/\" title=\"affinage\">affinage<\/a> sur des donn\u00e9es synth\u00e9tiques, l&rsquo;\u00e9l\u00e8ve voit les distributions de probabilit\u00e9s de l&rsquo;enseignant, pas seulement ses r\u00e9ponses.<\/li>\n<li><strong>Mise \u00e0 l&rsquo;\u00e9chelle automatique<\/strong> : quand une instance, m\u00eame optimis\u00e9e, re\u00e7oit plus de trafic qu&rsquo;elle ne peut traiter, c&rsquo;est un probl\u00e8me d&rsquo;infrastructure. On ajuste le nombre de r\u00e9plicas selon l&rsquo;utilisation ou selon le trafic, et l&rsquo;on utilise les deux ensemble.<\/li>\n<li><strong>D\u00e9marrage \u00e0 froid<\/strong> : le temps pour lancer un r\u00e9plica d\u00e9pend de l&rsquo;obtention du GPU, du chargement de l&rsquo;image et des poids, et du d\u00e9marrage du moteur. Des poids quantifi\u00e9s se chargent plus vite.<\/li>\n<\/ul>\n<p>Deux pistes plus larges :<\/p>\n<ul>\n<li><strong>NVIDIA Dynamo<\/strong> : l&rsquo;orchestrateur distribu\u00e9 qui f\u00e9d\u00e8re routage KV, d\u00e9sagr\u00e9gation et multi-n\u0153uds au-dessus des moteurs.<\/li>\n<li><strong>Autres modalit\u00e9s<\/strong> : les m\u00eames techniques s&rsquo;appliquent aux mod\u00e8les vision-langage, d&#8217;embedding ou de parole ; pour la g\u00e9n\u00e9ration d&rsquo;images et de vid\u00e9os, l&rsquo;attention, qui repr\u00e9sente 70 \u00e0 80 % du temps de calcul en vid\u00e9o, devient le premier poste \u00e0 optimiser.<\/li>\n<\/ul>\n<h2>Questions fr\u00e9quentes<\/h2>\n<p><strong>Quelle technique essayer en premier ?<\/strong><br \/>\nRegarde d&rsquo;abord o\u00f9 se trouve ton goulot. Pour un mod\u00e8le qui ne tient pas sur un GPU, le parall\u00e9lisme tensoriel est la strat\u00e9gie par d\u00e9faut ; pour des requ\u00eates qui r\u00e9p\u00e8tent de longs pr\u00e9fixes, le cache de pr\u00e9fixe ; pour r\u00e9duire la latence \u00e0 faible trafic, la sp\u00e9culation.<\/p>\n<p><strong>La quantification d\u00e9grade-t-elle toujours la qualit\u00e9 ?<\/strong><br \/>\nNon, mais elle peut l&rsquo;ab\u00eemer si elle est mal faite. Plus un mod\u00e8le a de param\u00e8tres, moins il y est sensible, et les poids sont le composant le moins risqu\u00e9 \u00e0 quantifier. Valide toujours par la perplexit\u00e9, un banc d&rsquo;essai et une \u00e9valuation propre \u00e0 ton usage.<\/p>\n<p><strong>Le d\u00e9codage sp\u00e9culatif change-t-il les r\u00e9ponses du mod\u00e8le ?<\/strong><br \/>\nNon : le mod\u00e8le cible valide les tokens de brouillon et ne garde que ceux qui co\u00efncident avec ce qu&rsquo;il aurait g\u00e9n\u00e9r\u00e9. La sp\u00e9culation et le cache acc\u00e9l\u00e8rent le mod\u00e8le sans changer ce qu&rsquo;il produit.<\/p>\n<p><strong>Vaut-il mieux vLLM, SGLang ou TensorRT-LLM ?<\/strong><br \/>\nCela d\u00e9pend du d\u00e9ploiement : vLLM et SGLang sont plus faciles \u00e0 adopter, TensorRT-LLM atteint g\u00e9n\u00e9ralement la meilleure performance sur NVIDIA au prix d&rsquo;un travail d&rsquo;ing\u00e9nierie accru. Un ing\u00e9nieur doit conna\u00eetre les trois et choisir d\u00e9ploiement par d\u00e9ploiement.<\/p>\n<h2>\u00c0 retenir<\/h2>\n<ul>\n<li>Prefill et decode ont des goulots oppos\u00e9s : identifie la phase avant d&rsquo;optimiser.<\/li>\n<li>Lire moins d&rsquo;octets (quantification, fusion de noyaux, FlashAttention) et produire plus de tokens par lecture (batching, sp\u00e9culation) sont les deux grandes mani\u00e8res de desserrer le decode.<\/li>\n<li>Le cache KV est pr\u00e9cieux : r\u00e9utilise-le entre requ\u00eates, d\u00e9porte-le sur des m\u00e9moires plus lentes, route le trafic selon lui.<\/li>\n<li>Au-del\u00e0 d&rsquo;un GPU, la communication d\u00e9cide de tout : TP dans un n\u0153ud, EP pour le d\u00e9bit, d\u00e9sagr\u00e9gation quand prefill et decode se g\u00eanent.<\/li>\n<li>Mesure en percentiles, change une variable \u00e0 la fois : un bon r\u00e9glage est le fruit d&rsquo;exp\u00e9riences plus que d&rsquo;une recette.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Batching, quantification, sp\u00e9culation, cache KV, parall\u00e9lisme, d\u00e9sagr\u00e9gation : comment chaque technique contourne le goulot de l&rsquo;inf\u00e9rence d&rsquo;un LLM.<\/p>\n","protected":false},"author":1,"featured_media":273,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-218","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\/218","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=218"}],"version-history":[{"count":3,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/218\/revisions"}],"predecessor-version":[{"id":829,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/posts\/218\/revisions\/829"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media\/273"}],"wp:attachment":[{"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/media?parent=218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/categories?post=218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ranksignal.fr\/blog\/wp-json\/wp\/v2\/tags?post=218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}