﻿﻿{"id":2657,"date":"2026-04-01T17:00:19","date_gmt":"2026-04-01T15:00:19","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/turboquant-un-llm-de-104b-sur-un-macbook-merci-google\/"},"modified":"2026-04-01T17:00:19","modified_gmt":"2026-04-01T15:00:19","slug":"turboquant-un-llm-de-104b-sur-un-macbook-merci-google","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/turboquant-un-llm-de-104b-sur-un-macbook-merci-google\/","title":{"rendered":"TurboQuant &#8211; Un LLM de 104B sur un MacBook, merci Google"},"content":{"rendered":"<p>Vous faites tourner des LLMs en local comme le gros fifou de Hipster IA que vous \u00eates et, \u00d4 drame, la VRAM de votre ordinateur explose d\u00e8s que le contexte d\u00e9passe 8000 pauvres malheureux tokens ?<\/p>\n<p>Le probl\u00e8me c&#8217;est le KV cache les amis ! Le KV cache c&#8217;est ce truc qui stocke les cl\u00e9s et valeurs d&#8217;attention et qui grossit lin\u00e9airement avec la longueur du prompt. C&#8217;est pour g\u00e9rer ce probl\u00e8me que Google a annonc\u00e9 sous la forme d&#8217;un whitepaper uniquement un algo qui compresse tout \u00e7a de 3,8 \u00e0 6,4 fois&#8230; et youpi pour nous, y&#8217;a un dev qui l&#8217;a d\u00e9j\u00e0 impl\u00e9ment\u00e9 dans<br \/>\n<a href=\"https:\/\/github.com\/TheTom\/llama-cpp-turboquant\">un fork de llama.cpp<\/a><br \/>\n.<\/p>\n<p>Concr\u00e8tement \u00e7a donne :<\/p>\n<p><code>llama-server -m model.gguf -ctk turbo3 -ctv turbo3 -fa on<\/code><\/p>\n<p>Et vous venez de diviser la m\u00e9moire du cache par 4,6. Et voil\u00e0 comment un \u00e9noooorme<br \/>\n<a href=\"https:\/\/cohere.com\/blog\/command-r-plus-microsoft-azure\">Command-R+ de 104 milliards de param\u00e8tres<\/a><br \/>\narrive \u00e0 tourner \u00e0 128K tokens de contexte sur un MacBook M5 Max, avec un pic m\u00e9moire max de 74 Go.<\/p>\n<p>Pour bien comprendre pourquoi c&#8217;est costaud, faut revenir au probl\u00e8me de base. En fait quand un LLM g\u00e9n\u00e8re du texte, il stocke pour chaque token pass\u00e9 2 vecteurs (la cl\u00e9 K et la valeur V) dans un cache. Plus le contexte est long, plus ce cache grossit. Et \u00e7a s&#8217;accumule vite&#8230; Par exemple, sur un Llama 70B avec 128K tokens de contexte, le KV cache en fp16 bouffe \u00e0 lui seul plus de 40 Go de RAM. Du coup votre mod\u00e8le Llama 3.1 ou Qwen3 rentre \u00e9videmment en m\u00e9moire, mais le cache, lui, fait tout d\u00e9border comme vous quand vous vous incrustez dans la mini piscine Intex des gosses.<\/p>\n<p>Google a publi\u00e9 son papier<br \/>\n<a href=\"https:\/\/research.google\/blog\/turboquant-redefining-ai-efficiency-with-extreme-compression\/\">TurboQuant<\/a><br \/>\nfin mars et leur id\u00e9e c&#8217;est de compresser ces vecteurs K et V en 3-4 bits au lieu de 16, sans r\u00e9-entra\u00eener le mod\u00e8le. En fait l&#8217;algorithme fait \u00e7a en deux \u00e9tapes&#8230;<\/p>\n<p>D&#8217;abord <strong>PolarQuant<\/strong> : on applique une<br \/>\n<a href=\"https:\/\/en.wikipedia.org\/wiki\/Hadamard_transform\">rotation Walsh-Hadamard<\/a><br \/>\naux vecteurs pour &#8220;gaussianiser&#8221; leur distribution, genre transformer des donn\u00e9es qui partent dans tous les sens en une forme bien ronde et pr\u00e9visible.<\/p>\n<p>Puis on convertit les coordonn\u00e9es cart\u00e9siennes en coordonn\u00e9es polaires, rayon + angle. Le rayon capture alors l&#8217;essentiel de l&#8217;information, et l&#8217;angle se compresse tr\u00e8s bien parce que sa distribution est connue \u00e0 l&#8217;avance.<\/p>\n<p>Ensuite, deuxi\u00e8me \u00e9tape, <strong>QJL<\/strong> (Quantized Johnson-Lindenstrauss) : Il s&#8217;agit d&#8217;un correcteur d&#8217;erreur \u00e0 1 bit qui \u00e9limine le biais r\u00e9siduel, le tout sans overhead m\u00e9moire pour les constantes de quantification, contrairement aux m\u00e9thodes classiques comme q4_0 ou q5_1 qui perdent 1-2 bits rien qu&#8217;en stockant leurs propres param\u00e8tres.<\/p>\n<p>Et c&#8217;est l\u00e0 qu&#8217;intervient notre d\u00e9veloppeur de g\u00e9nie, TheTom, qui a pris ce document acad\u00e9mique de Google et l&#8217;a transform\u00e9 en code C avec des kernels Metal pour Apple Silicon et CUDA pour NVIDIA. Et c&#8217;est pas juste un portage b\u00eate et m\u00e9chant puisqu&#8217;il a vraiment pouss\u00e9 les exp\u00e9riences bien au-del\u00e0 du document original avec une couverture de tests de 100% et des benchmarks sur des mod\u00e8les de 1.5 \u00e0 104 milliards de param\u00e8tres.<\/p>\n<p>Et ses d\u00e9couvertes les plus int\u00e9ressantes c&#8217;est justement ce qui n&#8217;est PAS dans le paper. Premi\u00e8re trouvaille : <strong>la compression des valeurs V est gratuite<\/strong>. Compresser V \u00e0 2 bits sur Qwen, Llama, Mistral ou Command-R+ n&#8217;a aucun impact mesurable sur la qualit\u00e9 d&#8217;attention, tant que les cl\u00e9s K restent en q8_0.<\/p>\n<p>Et cela a \u00e9t\u00e9 confirm\u00e9 sur Metal M5 Max 128 Go, CUDA RTX 4090 et RTX 3090 par plusieurs testeurs ind\u00e9pendants. C&#8217;est franchement contre-intuitif, mais cela veut dire que toute la d\u00e9gradation de qualit\u00e9 vient de la compression des cl\u00e9s K, et pas de leurs valeurs. Du coup une config asym\u00e9trique (K en q8_0, V en turbo3) arrive \u00e0 r\u00e9cup\u00e8rer des mod\u00e8les o\u00f9 la compression sym\u00e9trique \u00e9choue.<\/p>\n<p>Deuxi\u00e8me trouvaille : les couches limites sont hypersensibles. Prot\u00e9ger les 2 premi\u00e8res et 2 derni\u00e8res couches en q8_0 pendant qu&#8217;on compresse le reste en turbo2 permet de r\u00e9cup\u00e9rer jusqu&#8217;\u00e0 91% de la perte de qualit\u00e9. Et plus le mod\u00e8le est gros, mieux \u00e7a marche. C&#8217;est seulement 15 lignes de code, et l\u00e0 encore, y&#8217;a aucun impact sur la vitesse.<\/p>\n<p>Troisi\u00e8me trouvaille : Sparse V, un d\u00e9codage du cache qui saute les positions V \u00e0 faible poids d&#8217;attention permet de gagner environ 23% de vitesse de d\u00e9codage \u00e0 32K tokens de contexte. Et z\u00e9ro d\u00e9gradation de la qualit\u00e9.<\/p>\n<p>C\u00f4t\u00e9 chiffres bruts, y&#8217;a 3 modes : turbo4 compresse 3.8x et le mod\u00e8le r\u00e9pond quasi pareil qu&#8217;avant. turbo3 compresse 4.6x avec une perte de qualit\u00e9 \u00e0 peine d\u00e9tectable. turbo2 pousse \u00e0 6.4x mais l\u00e0 faut l&#8217;utiliser malin (uniquement sur les valeurs V, pas les cl\u00e9s K).<\/p>\n<p>Et dire que pour l&#8217;instant Google n&#8217;a toujours pas publi\u00e9 de code officiel (mais c&#8217;est pr\u00e9vu pour le second trimestre 2026)&#8230; Donc pour le moment, cette impl\u00e9mentation communautaire est le seul moyen de tester<br \/>\n<a href=\"https:\/\/github.com\/TheTom\/turboquant_plus\">TurboQuant<\/a><br \/>\ndans un fork llama.cpp. \u00c7a tourne sur Apple Silicon M1 \u00e0 M5, NVIDIA RTX 3080 Ti \u00e0 5090 et AMD 6800 XT \/ 9070 XT et visiblement, pas mal de monde a test\u00e9 sur du mat\u00e9riel vari\u00e9 et les r\u00e9sultats sont au rendez-vous.<\/p>\n<p>Donc voil\u00e0, si vous faites de l&#8217;<br \/>\n<a href=\"https:\/\/korben.info\/llmlingua-compresser-prompts-accelerer-llm.html\">inf\u00e9rence LLM locale<\/a><br \/>\net que la m\u00e9moire vous limite, c&#8217;est le moment de tester \u00e7a !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vous faites tourner des LLMs en local comme le gros fifou de Hipster IA que vous \u00eates et, \u00d4 drame, la VRAM de votre ordinateur explose d\u00e8s que le contexte d\u00e9passe 8000 pauvres malheureux tokens ? Le probl\u00e8me c&#8217;est le KV cache les amis ! Le KV cache c&#8217;est ce truc qui stocke les cl\u00e9s et valeurs d&#8217;attention et qui grossit lin\u00e9airement avec la longueur du prompt. C&#8217;est pour g\u00e9rer ce probl\u00e8me que Google a annonc\u00e9 sous la forme d&#8217;un whitepaper uniquement un algo qui compresse tout \u00e7a de 3,8 \u00e0 6,4 fois&#8230; et youpi pour nous, y&#8217;a un dev qui l&#8217;a d\u00e9j\u00e0 impl\u00e9ment\u00e9 dans un fork de llama.cpp . Concr\u00e8tement \u00e7a donne : llama-server -m model.gguf -ctk turbo3 -ctv turbo3 -fa on Et vous venez de diviser la m\u00e9moire du cache par 4,6. Et voil\u00e0 comment un \u00e9noooorme Command-R+ de 104 milliards de param\u00e8tres arrive \u00e0 tourner \u00e0 128K tokens de contexte sur un MacBook M5 Max, avec un pic m\u00e9moire max de 74 Go. Pour bien comprendre pourquoi c&#8217;est costaud, faut revenir au probl\u00e8me de base. En fait quand un LLM g\u00e9n\u00e8re du texte, il stocke pour chaque token pass\u00e9 2 vecteurs (la cl\u00e9 K et la valeur V) dans un cache. Plus le contexte est long, plus ce cache grossit. Et \u00e7a s&#8217;accumule vite&#8230; Par exemple, sur un Llama 70B avec 128K tokens de contexte, le KV cache en fp16 bouffe \u00e0 lui seul plus de 40 Go de RAM. Du coup votre mod\u00e8le Llama 3.1 ou Qwen3 rentre \u00e9videmment en m\u00e9moire, mais le cache, lui, fait tout d\u00e9border comme vous quand vous vous incrustez dans la mini piscine Intex des gosses. Google a publi\u00e9 son papier TurboQuant fin mars et leur id\u00e9e c&#8217;est de compresser ces vecteurs K et V en 3-4 bits au lieu de 16, sans r\u00e9-entra\u00eener le mod\u00e8le. En fait l&#8217;algorithme fait \u00e7a en deux \u00e9tapes&#8230; D&#8217;abord PolarQuant : on applique une rotation Walsh-Hadamard aux vecteurs pour &#8220;gaussianiser&#8221; leur distribution, genre transformer des donn\u00e9es qui partent dans tous les sens en une forme bien ronde et pr\u00e9visible. Puis on convertit les coordonn\u00e9es cart\u00e9siennes en coordonn\u00e9es polaires, rayon + angle. Le rayon capture alors l&#8217;essentiel de l&#8217;information, et l&#8217;angle se compresse tr\u00e8s bien parce que sa distribution est connue \u00e0 l&#8217;avance. Ensuite, deuxi\u00e8me \u00e9tape, QJL (Quantized Johnson-Lindenstrauss) : Il s&#8217;agit d&#8217;un correcteur d&#8217;erreur \u00e0 1 bit qui \u00e9limine le biais r\u00e9siduel, le tout sans overhead m\u00e9moire pour les constantes de quantification, contrairement aux m\u00e9thodes classiques comme q4_0 ou q5_1 qui perdent 1-2 bits rien qu&#8217;en stockant leurs propres param\u00e8tres. Et c&#8217;est l\u00e0 qu&#8217;intervient notre d\u00e9veloppeur de g\u00e9nie, TheTom, qui a pris ce document acad\u00e9mique de Google et l&#8217;a transform\u00e9 en code C avec des kernels Metal pour Apple Silicon et CUDA pour NVIDIA. Et c&#8217;est pas juste un portage b\u00eate et m\u00e9chant puisqu&#8217;il a vraiment pouss\u00e9 les exp\u00e9riences bien au-del\u00e0 du document original avec une couverture de tests de 100% et des benchmarks sur des mod\u00e8les de 1.5 \u00e0 104 milliards de param\u00e8tres. Et ses d\u00e9couvertes les plus int\u00e9ressantes c&#8217;est justement ce qui n&#8217;est PAS dans le paper. Premi\u00e8re trouvaille : la compression des valeurs V est gratuite. Compresser V \u00e0 2 bits sur Qwen, Llama, Mistral ou Command-R+ n&#8217;a aucun impact mesurable sur la qualit\u00e9 d&#8217;attention, tant que les cl\u00e9s K restent en q8_0. Et cela a \u00e9t\u00e9 confirm\u00e9 sur Metal M5 Max 128 Go, CUDA RTX 4090 et RTX 3090 par plusieurs testeurs ind\u00e9pendants. C&#8217;est franchement contre-intuitif, mais cela veut dire que toute la d\u00e9gradation de qualit\u00e9 vient de la compression des cl\u00e9s K, et pas de leurs valeurs. Du coup une config asym\u00e9trique (K en q8_0, V en turbo3) arrive \u00e0 r\u00e9cup\u00e8rer des mod\u00e8les o\u00f9 la compression sym\u00e9trique \u00e9choue. Deuxi\u00e8me trouvaille : les couches limites sont hypersensibles. Prot\u00e9ger les 2 premi\u00e8res et 2 derni\u00e8res couches en q8_0 pendant qu&#8217;on compresse le reste en turbo2 permet de r\u00e9cup\u00e9rer jusqu&#8217;\u00e0 91% de la perte de qualit\u00e9. Et plus le mod\u00e8le est gros, mieux \u00e7a marche. C&#8217;est seulement 15 lignes de code, et l\u00e0 encore, y&#8217;a aucun impact sur la vitesse. Troisi\u00e8me trouvaille : Sparse V, un d\u00e9codage du cache qui saute les positions V \u00e0 faible poids d&#8217;attention permet de gagner environ 23% de vitesse de d\u00e9codage \u00e0 32K tokens de contexte. Et z\u00e9ro d\u00e9gradation de la qualit\u00e9. C\u00f4t\u00e9 chiffres bruts, y&#8217;a 3 modes : turbo4 compresse 3.8x et le mod\u00e8le r\u00e9pond quasi pareil qu&#8217;avant. turbo3 compresse 4.6x avec une perte de qualit\u00e9 \u00e0 peine d\u00e9tectable. turbo2 pousse \u00e0 6.4x mais l\u00e0 faut l&#8217;utiliser malin (uniquement sur les valeurs V, pas les cl\u00e9s K). Et dire que pour l&#8217;instant Google n&#8217;a toujours pas publi\u00e9 de code officiel (mais c&#8217;est pr\u00e9vu pour le second trimestre 2026)&#8230; Donc pour le moment, cette impl\u00e9mentation communautaire est le seul moyen de tester TurboQuant dans un fork llama.cpp. \u00c7a tourne sur Apple Silicon M1 \u00e0 M5, NVIDIA RTX 3080 Ti \u00e0 5090 et AMD 6800 XT \/ 9070 XT et visiblement, pas mal de monde a test\u00e9 sur du mat\u00e9riel vari\u00e9 et les r\u00e9sultats sont au rendez-vous. Donc voil\u00e0, si vous faites de l&#8217; inf\u00e9rence LLM locale et que la m\u00e9moire vous limite, c&#8217;est le moment de tester \u00e7a !<\/p>\n","protected":false},"author":1,"featured_media":2658,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2657","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2657","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2657"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2657\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2658"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2657"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}