<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hardware on kenji.blog</title><link>http://kenji.blog/fr/categories/hardware/</link><description>Recent content in Hardware on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/categories/hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>Gadgets et paramètres de moniteur pour réduire la fatigue oculaire des programmeurs</title><link>http://kenji.blog/fr/p/programmer-eye-strain-relief/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/programmer-eye-strain-relief/</guid><description>&lt;img src="http://kenji.blog/p/programmer-eye-strain-relief/img/eyecatch.jpg" alt="Featured image of post Gadgets et paramètres de moniteur pour réduire la fatigue oculaire des programmeurs" />&lt;p>Pour les programmeurs et ingénieurs logiciels, les « yeux » sont l&amp;rsquo;outil de travail le plus important et le plus sollicité. Passant de 8 à 10 heures par jour, et parfois plus, devant des éditeurs, des terminaux et des navigateurs, presque tous les ingénieurs sont confrontés à la « fatigue oculaire (Computer Vision Syndrome : CVS) ».&lt;/p>
&lt;p>En général, les conseils contre la fatigue oculaire se limitent à des recommandations superficielles comme « mettre des gouttes pour les yeux », « prendre des pauses régulières » ou « porter des lunettes anti-lumière bleue ». Cependant, en tant qu&amp;rsquo;ingénieur, il convient d&amp;rsquo;identifier la cause fondamentale (Root Cause) du problème et d&amp;rsquo;optimiser le système (l&amp;rsquo;environnement) dès sa base.&lt;/p>
&lt;p>Dans cet article, nous allons disséquer en profondeur les mécanismes de la fatigue oculaire des programmeurs du point de vue de la physique (optique), de la biochimie, de l&amp;rsquo;ergonomie et de l&amp;rsquo;architecture matérielle des écrans, et nous plongerons dans les configurations de moniteurs et les gadgets ultimes pour l&amp;rsquo;atténuer, en nous appuyant sur des formules mathématiques et des schémas.&lt;/p>
&lt;hr>
&lt;h1 id="chapitre-1--décrypter-les-mécanismes-de-la-fatigue-oculaire-cvs-par-la-physique-et-la-biochimie">Chapitre 1 : Décrypter les mécanismes de la fatigue oculaire (CVS) par la physique et la biochimie
&lt;/h1>&lt;p>Le syndrome de vision informatique (CVS) n&amp;rsquo;est pas causé par un seul facteur. Comme le montre le diagramme circulaire ci-dessous, divers éléments s&amp;rsquo;entremêlent de manière complexe pour provoquer fatigue oculaire, douleurs, sécheresse des yeux et fatigue générale.&lt;/p>
&lt;pre class="mermaid">
pie title Causes du syndrome de vision informatique (CVS)
&amp;#34;Lumière bleue et éblouissement&amp;#34; : 30
&amp;#34;Scintillement de l&amp;#39;écran (PWM)&amp;#34; : 25
&amp;#34;Contraste et éclairage inappropriés&amp;#34; : 20
&amp;#34;Fatigue de mise au point (muscle ciliaire)&amp;#34; : 15
&amp;#34;Sécheresse oculaire (clignement réduit)&amp;#34; : 10
&lt;/pre>
&lt;p>Nous expliquerons ici plus particulièrement les « propriétés physiques de la lumière » et la « fonction d&amp;rsquo;accommodation de l&amp;rsquo;œil », qui ont un impact majeur.&lt;/p>
&lt;h2 id="11-propriétés-physiques-de-la-lumière-bleue-et-énergie-des-photons">1.1 Propriétés physiques de la lumière bleue et énergie des photons
&lt;/h2>&lt;p>La lumière bleue émise par les écrans se situe approximativement dans la bande de longueur d&amp;rsquo;onde de $400 \text{ nm} \sim 490 \text{ nm}$. La raison pour laquelle elle fatigue les yeux peut s&amp;rsquo;expliquer par la base de la mécanique quantique, la « relation de Planck-Einstein ».&lt;/p>
&lt;p>L&amp;rsquo;énergie $E$ de la lumière est exprimée par la formule suivante :&lt;/p>
$$ E = h\nu = \frac{hc}{\lambda} $$&lt;p>Ici, chaque variable a la signification suivante :&lt;/p>
&lt;ul>
&lt;li>$E$ : Énergie par photon (Joule)&lt;/li>
&lt;li>$h$ : Constante de Planck ($6.626 \times 10^{-34} \text{ J}\cdot\text{s}$)&lt;/li>
&lt;li>$c$ : Vitesse de la lumière dans le vide ($3.0 \times 10^8 \text{ m/s}$)&lt;/li>
&lt;li>$\lambda$ : Longueur d&amp;rsquo;onde de la lumière (m)&lt;/li>
&lt;li>$\nu$ : Fréquence de la lumière (Hz)&lt;/li>
&lt;/ul>
&lt;p>Le fait important révélé par cette formule est que &lt;strong>« l&amp;rsquo;énergie $E$ de la lumière est inversement proportionnelle à sa longueur d&amp;rsquo;onde $\lambda$ »&lt;/strong>. Autrement dit, la lumière bleue, qui a la longueur d&amp;rsquo;onde la plus courte parmi les lumières visibles, possède une énergie extrêmement élevée. Ces photons à haute énergie sont difficilement absorbés ou atténués par la cornée et le cristallin, et atteignent les profondeurs de la rétine, causant un puissant stress oxydatif aux cellules photoréceptrices.&lt;/p>
&lt;h2 id="12-aberration-chromatique-chromatic-aberration-et-décalage-focal">1.2 Aberration chromatique (Chromatic Aberration) et décalage focal
&lt;/h2>&lt;p>De plus, d&amp;rsquo;un point de vue optique, la différence de longueur d&amp;rsquo;onde de la lumière crée une différence d&amp;rsquo;« indice de réfraction ». L&amp;rsquo;indice de réfraction $n$ du milieu (ici le cristallin, etc.) dépend de la longueur d&amp;rsquo;onde $\lambda$ et est approximé par l&amp;rsquo;équation de dispersion de Cauchy.&lt;/p>
$$ n(\lambda) = B + \frac{C}{\lambda^2} $$&lt;p>($B$ et $C$ sont des constantes propres au milieu)&lt;/p>
&lt;p>Comme le montre cette formule, plus la longueur d&amp;rsquo;onde $\lambda$ de la lumière bleue est courte, plus l&amp;rsquo;indice de réfraction $n$ est grand. Par conséquent, même si la lumière rouge forme une image parfaitement nette sur la rétine, la lumière bleue est fortement réfractée et forme une image &lt;strong>devant la rétine&lt;/strong>.
Lorsque le cerveau perçoit ce « flou de l&amp;rsquo;image dû à la lumière bleue (aberration chromatique) », il envoie en permanence l&amp;rsquo;ordre au muscle ciliaire d&amp;rsquo;ajuster la mise au point. C&amp;rsquo;est l&amp;rsquo;un des facteurs majeurs de l&amp;rsquo;épuisement inconscient des muscles oculaires.&lt;/p>
&lt;h2 id="13-muscle-daccommodation-muscle-ciliaire-et-formule-des-lentilles">1.3 Muscle d&amp;rsquo;accommodation (muscle ciliaire) et formule des lentilles
&lt;/h2>&lt;p>Lorsque nous faisons la mise au point sur de petits textes à l&amp;rsquo;écran, l&amp;rsquo;épaisseur du cristallin (lentille) dans l&amp;rsquo;œil s&amp;rsquo;ajuste. La formule des lentilles minces est la suivante :&lt;/p>
$$ \frac{1}{f} = \frac{1}{a} + \frac{1}{b} $$&lt;ul>
&lt;li>$f$ : Distance focale du cristallin&lt;/li>
&lt;li>$a$ : Distance de l&amp;rsquo;œil au moniteur (distance de l&amp;rsquo;objet)&lt;/li>
&lt;li>$b$ : Distance du cristallin à la rétine (distance de l&amp;rsquo;image : constante à environ $24 \text{ mm}$ pour un globe oculaire adulte)&lt;/li>
&lt;/ul>
&lt;p>Lors de la programmation, si la distance $a$ avec l&amp;rsquo;écran est courte (ex. $40 \text{ cm} \sim 50 \text{ cm}$) pendant une longue période, afin de former une image précise sur la rétine (maintenir $b$ constant), la distance focale $f$ doit être maintenue extrêmement courte. Cette contraction extrême prolongée des muscles ciliaires pendant des heures provoque des spasmes musculaires, entraînant une fatigue oculaire sévère accompagnée de raideurs de la nuque et de maux de tête.&lt;/p>
&lt;hr>
&lt;h1 id="chapitre-2--choix-du-matériel-daffichage-et-élimination-des-facteurs-de-fatigue">Chapitre 2 : Choix du matériel d&amp;rsquo;affichage et élimination des facteurs de fatigue
&lt;/h1>&lt;p>Pour réduire la fatigue oculaire, avant de régler les logiciels, il faut d&amp;rsquo;abord vérifier et améliorer les spécifications matérielles. En particulier, la « méthode de gradation » et le « taux de rafraîchissement » sont des points sur lesquels il ne faut pas faire de compromis.&lt;/p>
&lt;h2 id="21-la-terreur-de-la-gradation-pwm--révéler-le-scintillement-invisible">2.1 La terreur de la gradation PWM : Révéler le scintillement invisible
&lt;/h2>&lt;p>Les technologies permettant de régler la luminosité des écrans LCD et OLED se divisent en deux grandes catégories : la « gradation DC (Direct Current) » et la « gradation PWM (Pulse-Width Modulation) ».&lt;/p>
&lt;p>La gradation PWM est une technologie qui fait clignoter les LED du rétroéclairage à une vitesse si élevée qu&amp;rsquo;elle est invisible à l&amp;rsquo;œil humain, et qui ajuste artificiellement la luminosité de l&amp;rsquo;écran en fonction du ratio entre le « temps d&amp;rsquo;allumage » et le « temps d&amp;rsquo;extinction ». La luminosité moyenne $L$ selon le cycle de service (Duty Cycle) du PWM est exprimée par la formule suivante :&lt;/p>
$$ L = L_{max} \times \frac{T_{on}}{T_{on} + T_{off}} \times 100 \ (\%) $$&lt;ul>
&lt;li>$T_{on}$ : Temps pendant lequel la LED est allumée&lt;/li>
&lt;li>$T_{off}$ : Temps pendant lequel la LED est éteinte&lt;/li>
&lt;li>$L_{max}$ : Luminosité maximale en crête&lt;/li>
&lt;/ul>
&lt;p>Si la fréquence de la gradation PWM est faible (ex. $200 \text{ Hz} \sim 300 \text{ Hz}$), même si on ne perçoit pas consciemment le scintillement de l&amp;rsquo;écran (flicker), le cerveau et les pupilles réagissent inconsciemment au clignotement de la lumière, entraînant une dilatation et une contraction répétées des pupilles. Cela provoque une fatigue extrême, des maux de tête et même des nausées.&lt;/p>
&lt;p>&lt;strong>[Méthode de détection du PWM et solutions]&lt;/strong>
Pour vérifier si votre écran utilise la gradation PWM, ouvrez l&amp;rsquo;application appareil photo de votre smartphone, passez en mode « ralenti » (Slow Motion) et filmez un écran blanc du moniteur (comme une page blanche de navigateur). Si vous voyez des bandes noires se déplacer sur la vidéo, cela signifie que votre écran utilise une gradation PWM à basse fréquence.
Lorsqu&amp;rsquo;un programmeur choisit un moniteur, il devrait absolument opter pour un modèle dont la fiche technique mentionne &lt;strong>« Sans scintillement (Flicker-Free / Gradation DC) »&lt;/strong>.&lt;/p>
&lt;h2 id="22-taux-de-rafraîchissement-hz-et-impact-ophtalmologique-du-flou-de-mouvement">2.2 Taux de rafraîchissement (Hz) et impact ophtalmologique du flou de mouvement
&lt;/h2>&lt;p>Le taux de rafraîchissement est le nombre de fois que l&amp;rsquo;écran est mis à jour en une seconde (Hz).
Les écrans de bureau standards sont à $60 \text{ Hz}$, mais ces dernières années, des écrans à taux de rafraîchissement élevé comme $120 \text{ Hz}$ ou $144 \text{ Hz}$ se sont démocratisés. Ceci est extrêmement bénéfique non seulement pour les joueurs, mais aussi pour les programmeurs.&lt;/p>
&lt;p>Lorsqu&amp;rsquo;on fait défiler une grande quantité de code ou que beaucoup de logs défilent dans le terminal, un écran $60 \text{ Hz}$ produit un « flou de mouvement » (motion blur) en raison des limites de la vitesse de réponse des pixels. Même pendant le défilement, l&amp;rsquo;œil tente inconsciemment de faire la mise au point sur la forme du texte, et si le texte est flou, la charge de traitement dans le cortex visuel du cerveau augmente de façon spectaculaire.
Avec un écran de $120 \text{ Hz}$ ou plus, le texte reste parfaitement visible même pendant le défilement, ce qui réduit considérablement la charge de ces mouvements oculaires et accommodements inconscients.&lt;/p>
&lt;h2 id="23-types-de-dalles-et-ratio-de-contraste-ips-va-oled">2.3 Types de dalles et ratio de contraste (IPS, VA, OLED)
&lt;/h2>&lt;p>Le ratio de contraste de l&amp;rsquo;écran est directement lié à la lisibilité du texte.
La « Loi de Weber-Fechner », selon laquelle l&amp;rsquo;intensité de la sensation humaine est proportionnelle au logarithme du stimulus, s&amp;rsquo;exprime par la formule suivante :&lt;/p>
$$ p = k \ln \left( \frac{S}{S_0} \right) $$&lt;p>($p$ : intensité de la sensation, $S$ : intensité physique du stimulus, $S_0$ : seuil, $k$ : constante)&lt;/p>
&lt;p>En d&amp;rsquo;autres termes, l&amp;rsquo;œil humain réagit plus fortement au « ratio de luminosité relative (contraste) » qu&amp;rsquo;à la luminosité absolue.
Pour lire du code avec coloration syntaxique pendant de longues heures, les dalles VA avec des noirs profonds (rapport de contraste élevé de $3000:1$) ou les dalles OLED capables d&amp;rsquo;éteindre chaque pixel individuellement ($1 000 000:1$ et plus) rendent les contours du texte extrêmement nets et améliorent la lisibilité.
Cependant, comme nous le verrons plus loin, regarder un écran avec un contraste extrêmement élevé dans une pièce sombre provoque une contraction excessive des pupilles, ce qui fatigue davantage les yeux. Il est donc indispensable d&amp;rsquo;équilibrer cela avec la lumière ambiante.&lt;/p>
&lt;p>Le graphique suivant compare le spectre d&amp;rsquo;émission d&amp;rsquo;un écran LCD standard avec celui d&amp;rsquo;un OLED moderne (conçu pour réduire la lumière bleue).&lt;/p>
&lt;pre class="mermaid">
xychart-beta
title Comparaison du spectre d&amp;#39;émission de la lumière bleue
x-axis &amp;#34;Longueur d&amp;#39;onde (nm)&amp;#34; [400, 420, 440, 460, 480, 500]
y-axis &amp;#34;Intensité relative&amp;#34; 0 --&amp;gt; 100
bar &amp;#34;LCD Standard (W-LED)&amp;#34; [10, 30, 95, 80, 40, 20]
line &amp;#34;OLED moderne / Faible lumière bleue&amp;#34; [5, 10, 40, 75, 55, 30]
&lt;/pre>
&lt;hr>
&lt;h1 id="chapitre-3--calibration-du-moniteur-et-paramètres-du-système-dexploitation--logiciels">Chapitre 3 : Calibration du moniteur et paramètres du système d&amp;rsquo;exploitation / logiciels
&lt;/h1>&lt;p>La gestion de l&amp;rsquo;espace colorimétrique et la calibration côté système d&amp;rsquo;exploitation sont tout aussi importantes que le choix du matériel.&lt;/p>
&lt;h2 id="31-le-piège-du-gamut-srgb-vs-dci-p3-et-le-profil-icc">3.1 Le piège du gamut (sRGB vs DCI-P3) et le profil ICC
&lt;/h2>&lt;p>Les moniteurs récents mettent souvent en avant un « large gamut », comme une couverture DCI-P3 de plus de 95 %, mais cela peut se retourner contre vous en programmation.
Dans un environnement Windows, si vous utilisez un écran à large gamut sans appliquer le profil ICC approprié (profil colorimétrique défini par le Consortium International de la Couleur), la coloration syntaxique de VS Code (comme le rouge ou le vert pour les avertissements), qui est définie pour le sRGB standard, s&amp;rsquo;affichera avec des couleurs artificiellement saturées et criardes.
Ces couleurs intenses étant très stimulantes pour les yeux, il est fortement recommandé d&amp;rsquo;installer le profil ICC correct depuis les paramètres d&amp;rsquo;affichage de l&amp;rsquo;OS, ou de passer le moniteur en mode « Émulation sRGB » via ses menus OSD.&lt;/p>
&lt;p>Le diagramme de séquence ci-dessous illustre le processus par lequel l&amp;rsquo;application d&amp;rsquo;un profil ICC correct permet un rendu de couleurs plus doux pour les yeux.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant OS as &amp;#34;Système d&amp;#39;exploitation&amp;#34;
participant LUT as &amp;#34;Color LUT (Look-Up Table)&amp;#34;
participant Mon as &amp;#34;Écran du moniteur&amp;#34;
participant Eye as &amp;#34;Œil du programmeur&amp;#34;
OS-&amp;gt;&amp;gt;LUT: &amp;#34;Charger le bon profil ICC (ex. sRGB)&amp;#34;
OS-&amp;gt;&amp;gt;LUT: &amp;#34;Appliquer le mode éclairage nocturne (3400K)&amp;#34;
LUT-&amp;gt;&amp;gt;Mon: &amp;#34;Ajuster la sortie du signal RVB&amp;#34;
Mon-&amp;gt;&amp;gt;Eye: &amp;#34;Rendre des couleurs précises et désaturées&amp;#34;
Eye--&amp;gt;&amp;gt;Eye: &amp;#34;Réduction de la fatigue du cortex visuel&amp;#34;
&lt;/pre>
&lt;h2 id="32-solutions-logicielles-flux--night-light">3.2 Solutions logicielles (f.lux / Night Light)
&lt;/h2>&lt;p>Le moyen le plus simple et le plus efficace de lutter contre la lumière bleue consiste à utiliser des logiciels qui modifient dynamiquement la température de couleur (Color Temperature) en fonction de l&amp;rsquo;heure.&lt;/p>
&lt;ul>
&lt;li>Windows : &lt;strong>Éclairage nocturne (Night Light)&lt;/strong>&lt;/li>
&lt;li>macOS : &lt;strong>Night Shift&lt;/strong>&lt;/li>
&lt;li>Tiers : &lt;strong>f.lux&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>La température de couleur s&amp;rsquo;exprime en kelvins ($\text{K}$). La lumière du soleil en journée se situe autour de $5500\text{K} \sim 6500\text{K}$ (lumière bleutée). S&amp;rsquo;exposer continuellement à cette lumière inhibe la sécrétion de « mélatonine » (hormone du sommeil) par la glande pinéale du cerveau.
Le soir, en utilisant ces logiciels pour abaisser la température de couleur à $3400\text{K} \sim 1900\text{K}$ (teintes chaudes allant de l&amp;rsquo;orange au rouge), on réduit physiquement l&amp;rsquo;émission de lumière bleue. Cela permet de préserver le rythme circadien (horloge biologique) et d&amp;rsquo;empêcher les photons à haute énergie d&amp;rsquo;atteindre le globe oculaire.&lt;/p>
&lt;hr>
&lt;h1 id="chapitre-4--la-solution-matérielle-ultime--ladoption-des-derniers-gadgets">Chapitre 4 : La solution matérielle ultime : L&amp;rsquo;adoption des derniers gadgets
&lt;/h1>&lt;p>Si les mesures expliquées jusqu&amp;rsquo;ici ne suffisent pas à dissiper la fatigue, il est nécessaire d&amp;rsquo;investir dans des gadgets externes pour transformer radicalement l&amp;rsquo;environnement.&lt;/p>
&lt;h2 id="41-léclairage-en-biais-bias-lighting-et-la-lampe-décran-screenbar">4.1 L&amp;rsquo;éclairage en biais (Bias Lighting) et la lampe d&amp;rsquo;écran (ScreenBar)
&lt;/h2>&lt;p>Regarder un écran lumineux dans une pièce sombre crée un contraste violent entre le centre de la vision (haute luminosité) et la périphérie (basse luminosité). C&amp;rsquo;est ce qu&amp;rsquo;on appelle &lt;strong>« l&amp;rsquo;éblouissement d&amp;rsquo;inconfort (Discomfort Glare) »&lt;/strong>.
Dans ces conditions, l&amp;rsquo;œil tente d&amp;rsquo;absorber la lumière en dilatant la pupille, tout en voulant la contracter à cause de la luminosité centrale. Cette contradiction épuise le muscle de l&amp;rsquo;iris.&lt;/p>
&lt;p>La solution à ce problème est « l&amp;rsquo;éclairage en biais » (Bias Lighting).
Les « lampes à fixer sur le moniteur », comme la &lt;strong>BenQ ScreenBar&lt;/strong>, sont particulièrement recommandées.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Environnement de pièce sombre&amp;#34;] --&amp;gt; B[&amp;#34;Fort contraste de luminosité (Moniteur vs Pièce)&amp;#34;]
B --&amp;gt; C[&amp;#34;Conflit Constriction/Dilatation de la pupille&amp;#34;]
C --&amp;gt; D[&amp;#34;Fatigue sévère du muscle de l&amp;#39;iris&amp;#34;]
A --&amp;gt; E[&amp;#34;Installer une lampe d&amp;#39;écran (ex. ScreenBar)&amp;#34;]
E --&amp;gt; F[&amp;#34;Conception optique asymétrique (Pas d&amp;#39;éblouissement sur l&amp;#39;écran)&amp;#34;]
F --&amp;gt; G[&amp;#34;Luminosité ambiante équilibrée&amp;#34;]
G --&amp;gt; H[&amp;#34;Iris détendu et fatigue oculaire soulagée&amp;#34;]
&lt;/pre>
&lt;p>La caractéristique principale de la ScreenBar est sa « conception optique asymétrique (Asymmetrical Optical Design) ». Grâce à un réflecteur et une lentille spéciaux, la lumière n&amp;rsquo;éclaire pas l&amp;rsquo;écran lui-même (évitant ainsi les reflets et l&amp;rsquo;éblouissement sur l&amp;rsquo;écran), mais illumine de façon uniforme uniquement le clavier et l&amp;rsquo;espace situé derrière le moniteur. Cela réduit drastiquement la différence de luminosité (ratio de contraste) dans l&amp;rsquo;ensemble du champ visuel et élimine la pression exercée sur les yeux.&lt;/p>
&lt;h2 id="42-le-changement-de-paradigme-des-écrans-e-ink-dasung--boox">4.2 Le changement de paradigme des écrans E-Ink (Dasung &amp;amp; Boox)
&lt;/h2>&lt;p>Pour la lecture de longues références d&amp;rsquo;API, de livres techniques (PDF) ou de code, la solution ultime moderne consiste à &lt;strong>utiliser un écran à encre électronique (E-Ink) comme moniteur secondaire&lt;/strong>.&lt;/p>
&lt;p>Contrairement aux écrans LCD ou OLED, l&amp;rsquo;E-Ink ne possède pas de rétroéclairage. Il affiche le texte en déplaçant des particules de pigment blanc et noir (comme le dioxyde de titane) sous l&amp;rsquo;effet d&amp;rsquo;une tension (électrophorèse), et reflète la lumière ambiante.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Émission physique de lumière bleue : Zéro&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Scintillement lié au PWM ou au rafraîchissement : Totalement zéro&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>En plaçant un moniteur E-Ink comme la série &lt;strong>Dasung Paperlike&lt;/strong> (25,3 pouces, etc.) ou l&amp;rsquo;&lt;strong>Onyx Boox Mira&lt;/strong> en mode portrait comme moniteur secondaire dédié au texte, vous pouvez lire des documents avec la même sensation que s&amp;rsquo;ils étaient imprimés sur papier.
Bien qu&amp;rsquo;il y ait un inconvénient de latence d&amp;rsquo;affichage (faible taux de rafraîchissement), pour un usage strictement limité à la « lecture de texte statique » dans un environnement de programmation, il n&amp;rsquo;y a pas d&amp;rsquo;appareil plus doux pour les yeux sur Terre.&lt;/p>
&lt;hr>
&lt;h1 id="chapitre-5--ergonomie-et-règles-dutilisation">Chapitre 5 : Ergonomie et règles d&amp;rsquo;utilisation
&lt;/h1>&lt;p>Avoir le meilleur matériel ne sert à rien si les postures et les règles de l&amp;rsquo;utilisateur sont inadaptées.&lt;/p>
&lt;h2 id="51-dynamique-des-fluides-de-lœil-sec-et-angle-de-vue">5.1 Dynamique des fluides de l&amp;rsquo;œil sec et angle de vue
&lt;/h2>&lt;p>La sécheresse oculaire n&amp;rsquo;est pas seulement une sensation d&amp;rsquo;inconfort (« yeux secs »). La destruction du film lacrymal à la surface de la cornée provoque une réflexion diffuse de la lumière, rendant la vision floue et entraînant, par conséquent, un cercle vicieux de fatigue oculaire supplémentaire (surmenage du muscle ciliaire).
Le taux d&amp;rsquo;évaporation des larmes est proportionnel à la surface de l&amp;rsquo;œil exposée à l&amp;rsquo;air (fente palpébrale).&lt;/p>
&lt;p>L&amp;rsquo;angle de vue idéal $\theta$ pour la position du moniteur serait de $15^\circ \sim 20^\circ$ vers le bas par rapport à la ligne d&amp;rsquo;horizon.
En définissant $d$ comme la distance horizontale du centre du moniteur à l&amp;rsquo;œil, et $h$ comme la différence de hauteur entre le centre du moniteur et la hauteur des yeux, on obtient la fonction trigonométrique suivante :&lt;/p>
$$ \tan \theta = \frac{h}{d} $$&lt;p>Par exemple, si la distance au moniteur $d$ est de $60 \text{ cm}$ (environnement de bureau standard), pour obtenir $\theta = 15^\circ$ :&lt;/p>
$$ h = 60 \times \tan(15^\circ) \approx 60 \times 0.267 = 16.02 \text{ cm} $$&lt;p>En d&amp;rsquo;autres termes, &lt;strong>le centre du moniteur devrait idéalement se situer à environ $16 \text{ cm}$ en dessous de la hauteur des yeux&lt;/strong>.
Regarder légèrement vers le bas fait naturellement descendre la paupière supérieure, réduisant ainsi la surface exposée de l&amp;rsquo;œil, ce qui prévient de manière drastique l&amp;rsquo;évaporation des larmes. Il est conseillé d&amp;rsquo;utiliser un bras de moniteur (comme Ergotron) pour régler cette hauteur avec une précision millimétrique.&lt;/p>
&lt;h2 id="52-application-stricte-et-automatisation-de-la-norme-mondiale--règle-des-20-20-20-">5.2 Application stricte et automatisation de la norme mondiale « Règle des 20-20-20 »
&lt;/h2>&lt;p>La méthode de récupération de la fatigue oculaire recommandée par l&amp;rsquo;Académie Américaine d&amp;rsquo;Ophtalmologie (AAO) et les ophtalmologistes du monde entier lors de l&amp;rsquo;utilisation d&amp;rsquo;appareils numériques est la &lt;strong>« Règle des 20-20-20 »&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>« Toutes les 20 minutes, regardez un objet situé à au moins 20 pieds (environ 6 mètres) pendant 20 secondes. »&lt;/strong>&lt;/p>
&lt;p>Cette action simple force le muscle ciliaire, qui était extrêmement contracté, à se détendre (relâchement). Le cristallin s&amp;rsquo;amincit et la fonction d&amp;rsquo;accommodation est réinitialisée.
Les programmeurs oubliant souvent le temps lorsqu&amp;rsquo;ils entrent dans un état de « flow », la solution digne d&amp;rsquo;un ingénieur consiste à créer un système forçant automatiquement cette règle.
Voici un exemple très simple de script utilisant &lt;code>tkinter&lt;/code> en Python pour afficher un popup obligatoire toutes les 20 minutes.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">tk&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">tkinter&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">messagebox&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">remind_20_20_20&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Masquer la fenêtre principale&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tk&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Tk&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">withdraw&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Attendre 20 minutes (1200 secondes)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">20&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Afficher la boîte de dialogue d&amp;#39;avertissement au premier plan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messagebox&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">showinfo&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Règle des 20-20-20&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">message&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;Détachez vos yeux de l&amp;#39;écran et regardez à au moins 6 mètres pendant 20 secondes !&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">(Cela permet de détendre le muscle ciliaire)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 20 secondes de détente&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sleep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s1">&amp;#39;__main__&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Exécuter en arrière-plan&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">remind_20_20_20&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>En enregistrant un script comme celui-ci au démarrage ou en l&amp;rsquo;exécutant avec le planificateur de tâches de l&amp;rsquo;OS (Cron), vous pouvez intégrer ce cycle de récupération forcée dans votre routine quotidienne.&lt;/p>
&lt;hr>
&lt;h1 id="conclusion--la-prévention-de-la-fatigue-oculaire-comme-investissement-pour-lavenir">Conclusion : La prévention de la fatigue oculaire comme investissement pour l&amp;rsquo;avenir
&lt;/h1>&lt;p>Notre carrière d&amp;rsquo;ingénieur logiciel dure plusieurs décennies. Ce qui soutient cette carrière, ce n&amp;rsquo;est pas un clavier onéreux ou le dernier processeur, mais indéniablement nos propres « yeux » et « cerveau ».&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Comprendre l&amp;rsquo;énergie de la lumière ($E = hc/\lambda$) et la charge physique de l&amp;rsquo;accommodation&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Adopter un moniteur sans scintillement (gradation DC) et à taux de rafraîchissement élevé&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Optimiser le contraste relatif de l&amp;rsquo;environnement avec un éclairage en biais tel que la ScreenBar&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Envisager un moniteur E-Ink comme appareil ultime pour la lecture de texte&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Utiliser un bras de moniteur pour créer l&amp;rsquo;angle de vue optimal basé sur $\tan \theta = h/d$, et systématiser la « règle des 20-20-20 »&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>Bien que ces mesures puissent impliquer des dépenses et des efforts temporaires, on peut dire qu&amp;rsquo;elles constituent l&amp;rsquo;« investissement technologique » le plus rentable pour prolonger la durée de vie saine de vos yeux et maximiser votre productivité ainsi que votre qualité de vie (QOL) tout au long de votre vie. Révisez dès maintenant votre environnement de développement et implémentez un peu de soin pour vos yeux.&lt;/p></description></item><item><title>Pour les longues sessions de codage ! 5 claviers mécaniques recommandés pour les ingénieurs</title><link>http://kenji.blog/fr/p/engineer-mechanical-keyboard-recommendations/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/engineer-mechanical-keyboard-recommendations/</guid><description>&lt;img src="http://kenji.blog/p/engineer-mechanical-keyboard-recommendations/img/eyecatch.jpg" alt="Featured image of post Pour les longues sessions de codage ! 5 claviers mécaniques recommandés pour les ingénieurs" />&lt;h1 id="pour-les-longues-sessions-de-codage--5-claviers-mécaniques-recommandés-pour-les-ingénieurs">Pour les longues sessions de codage ! 5 claviers mécaniques recommandés pour les ingénieurs
&lt;/h1>&lt;p>Pour les professionnels travaillant dans l&amp;rsquo;industrie informatique, tels que les programmeurs, les ingénieurs système et les data scientists, le clavier n&amp;rsquo;est pas un simple périphérique de saisie. C&amp;rsquo;est &amp;ldquo;l&amp;rsquo;interface pour traduire les pensées sous forme de code&amp;rdquo; et c&amp;rsquo;est l&amp;rsquo;outil de travail le plus important avec lequel vous êtes en contact direct pendant des heures chaque jour.&lt;/p>
&lt;p>Continuer à utiliser un clavier de mauvaise qualité entraîne non seulement une diminution de la vitesse de frappe, mais augmente également le risque de charge excessive sur les poignets et les articulations des doigts, conduisant potentiellement à des tendinites (comme le syndrome du canal carpien). À l&amp;rsquo;inverse, l&amp;rsquo;acquisition d&amp;rsquo;un clavier qui s&amp;rsquo;adapte bien à vos mains, offre une bonne sensation de frappe et est hautement personnalisable constitue le &amp;ldquo;meilleur investissement&amp;rdquo; qui améliorera considérablement à la fois votre productivité et votre santé.&lt;/p>
&lt;p>Dans cet article, à l&amp;rsquo;attention des ingénieurs, nous allons au-delà des simples &amp;ldquo;recommandations&amp;rdquo; pour expliquer en profondeur depuis la physique des claviers jusqu&amp;rsquo;aux circuits électroniques internes et aux dernières technologies de micrologiciels (firmwares). Sur cette base, nous vous présenterons les 5 claviers ultimes capables de résister à une véritable utilisation pratique.&lt;/p>
&lt;h2 id="1-la-physique-et-le-mécanisme-des-commutateurs-de-touches">1. La physique et le mécanisme des commutateurs de touches
&lt;/h2>&lt;p>L&amp;rsquo;élément le plus important qui détermine la sensation de frappe d&amp;rsquo;un clavier est le &amp;ldquo;commutateur de touche&amp;rdquo; (switch). Les commutateurs des claviers mécaniques sont constitués d&amp;rsquo;un ressort (spring) et d&amp;rsquo;un mécanisme de contact, et leurs caractéristiques physiques sont transmises comme retour tactile à nos doigts.&lt;/p>
&lt;h3 id="11-la-loi-de-hooke-et-la-constante-de-raideur">1.1 La loi de Hooke et la constante de raideur
&lt;/h3>&lt;p>La force d&amp;rsquo;actionnement (Actuation Force) d&amp;rsquo;un commutateur mécanique est principalement déterminée par les caractéristiques du ressort intégré à l&amp;rsquo;intérieur. Le comportement de ce ressort peut être approximativement décrit par la &amp;ldquo;loi de Hooke&amp;rdquo; en mécanique classique.&lt;/p>
$$ F = -k x $$&lt;p>Ici, $F$ est la force de rappel (la force de répulsion ressentie par le doigt), $k$ est la constante de raideur du ressort, et $x$ est la distance d&amp;rsquo;enfoncement (course).
Dans le cas des commutateurs linéaires (comme les switchs rouges ou noirs), ils suivent assez fidèlement cette loi de Hooke, présentant une caractéristique linéaire où la force de répulsion augmente proportionnellement à l&amp;rsquo;enfoncement.&lt;/p>
&lt;h3 id="12-calcul-intégral-de-lénergie-dactionnement">1.2 Calcul intégral de l&amp;rsquo;énergie d&amp;rsquo;actionnement
&lt;/h3>&lt;p>Le point où la touche est reconnue comme &amp;ldquo;saisie&amp;rdquo; est appelé le point d&amp;rsquo;actionnement (Actuation Point). L&amp;rsquo;énergie (travail) $E$ dépensée par le doigt depuis le début de la pression sur la touche jusqu&amp;rsquo;à atteindre le point d&amp;rsquo;actionnement $x_a$ est exprimée par l&amp;rsquo;intégrale de la force par rapport à la distance.&lt;/p>
$$ E = \int_{0}^{x_a} F(x) \, dx $$&lt;p>Pour les commutateurs tactiles (switchs marrons) ou les commutateurs à clic (switchs bleus), en raison de la résistance physique (bosse tactile) due au frottement des contacts, $F(x)$ n&amp;rsquo;est pas une simple fonction linéaire, mais une fonction qui atteint un pic non linéaire à une position de course spécifique.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Début de la pression par le doigt&amp;#34;] --&amp;gt; B{&amp;#34;Type de commutateur&amp;#34;}
B --&amp;gt;|Linéaire| C[&amp;#34;La résistance augmente linéairement&amp;#34;]
B --&amp;gt;|Tactile| D[&amp;#34;Résistance physique au milieu (Bosse)&amp;#34;]
B --&amp;gt;|Clic| E[&amp;#34;Le mécanisme sonore s&amp;#39;active en même temps que la bosse&amp;#34;]
C --&amp;gt; F[&amp;#34;Atteinte du point d&amp;#39;actionnement (Actuation Point)&amp;#34;]
D --&amp;gt; F
E --&amp;gt; F
F --&amp;gt; G[&amp;#34;Touche enfoncée à fond (Bottom Out)&amp;#34;]
&lt;/pre>
&lt;p>Lorsqu&amp;rsquo;un ingénieur code pendant de longues heures, si cette énergie $E$ (énergie d&amp;rsquo;actionnement) est trop importante, les doigts se fatiguent facilement, et si elle est trop faible, les fautes de frappe augmentent. En général, les commutateurs avec une force d&amp;rsquo;actionnement d&amp;rsquo;environ 45g à 55g sont considérés comme offrant un bon équilibre entre la réduction de la fatigue et la précision, et sont préférés par de nombreux ingénieurs.&lt;/p>
&lt;h3 id="13-technologie-de-pointe-des-commutateurs--capacitif-sans-contact-et-effet-hall">1.3 Technologie de pointe des commutateurs : Capacitif sans contact et effet Hall
&lt;/h3>&lt;p>Il existe également des technologies de commutateurs plus avancées qui ne possèdent pas de contacts métalliques physiques.&lt;/p>
&lt;p>&lt;strong>Capacitif sans contact (Topre)&lt;/strong>
Cette méthode utilise un ressort conique et un dôme en caoutchouc pour déterminer la saisie en détectant le changement de capacité électrique dû à l&amp;rsquo;enfoncement. Comme il n&amp;rsquo;y a pas de contact physique, l&amp;rsquo;usure est extrêmement faible et le &amp;ldquo;chattering&amp;rdquo; (phénomène où une seule pression entraîne plusieurs saisies) ne se produit pas. La sensation de frappe unique en &amp;ldquo;thock&amp;rdquo; produite par le dôme en caoutchouc possède un charme dont il est difficile de se passer une fois essayé.&lt;/p>
&lt;p>&lt;strong>Commutateurs magnétiques (Effet Hall)&lt;/strong>
En utilisant l&amp;rsquo;effet Hall, les changements de densité de flux magnétique lorsqu&amp;rsquo;un aimant intégré dans la tige (stem) s&amp;rsquo;approche d&amp;rsquo;un capteur à effet Hall sur le circuit imprimé sont lus comme une tension.
La force électromotrice $V_H$ due à l&amp;rsquo;effet Hall est exprimée par la formule suivante :&lt;/p>
$$ V_H = R_H \left( \frac{I \cdot B}{t} \right) $$&lt;p>Ici, $R_H$ est le coefficient de Hall, $I$ est le courant, $B$ est la densité de flux magnétique, et $t$ est l&amp;rsquo;épaisseur du conducteur. Grâce à cette technologie, la profondeur de la frappe peut être acquise en continu en tant que valeur analogique, permettant un contrôle phénoménal tel que &amp;ldquo;l&amp;rsquo;ajustement du point d&amp;rsquo;actionnement par incréments de 0,1 mm (Actuation Point Adjustment)&amp;rdquo; et la &amp;ldquo;désactivation instantanée dès que la touche commence à remonter (Rapid Trigger)&amp;rdquo;.&lt;/p>
&lt;h2 id="2-circuits-électroniques-du-clavier-et-indicateurs-de-performance">2. Circuits électroniques du clavier et indicateurs de performance
&lt;/h2>&lt;p>Même si les commutateurs sont excellents, si les performances des circuits électroniques ou du microcontrôleur (MCU) qui les gèrent sont faibles, le clavier ne pourra pas fournir ses meilleures performances.&lt;/p>
&lt;h3 id="21-balayage-matriciel-et-taux-de-rafraîchissement-polling-rate">2.1 Balayage matriciel et taux de rafraîchissement (Polling Rate)
&lt;/h3>&lt;p>À l&amp;rsquo;intérieur d&amp;rsquo;un clavier, il y a des dizaines voire plus de 100 commutateurs, mais comme le nombre de broches du microcontrôleur est limité, il est impossible de connecter chaque commutateur à une broche individuelle. C&amp;rsquo;est pourquoi les commutateurs sont câblés sous forme de grille (matrice) en lignes (Row) et en colonnes (Column), et un balayage rapide permet de déterminer quelle touche a été pressée.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
M[&amp;#34;Microcontrôleur (MCU)&amp;#34;] --&amp;gt;|Commute la sortie Row sur High/Low| R1[&amp;#34;Row 1&amp;#34;]
M --&amp;gt; R2[&amp;#34;Row 2&amp;#34;]
R1 --&amp;gt; S11[&amp;#34;Switch 1,1&amp;#34;] &amp;amp; S12[&amp;#34;Switch 1,2&amp;#34;]
R2 --&amp;gt; S21[&amp;#34;Switch 2,1&amp;#34;] &amp;amp; S22[&amp;#34;Switch 2,2&amp;#34;]
S11 &amp;amp; S21 --&amp;gt; C1[&amp;#34;Column 1&amp;#34;]
S12 &amp;amp; S22 --&amp;gt; C2[&amp;#34;Column 2&amp;#34;]
C1 &amp;amp; C2 --&amp;gt;|Détecte et lit la tension| M
&lt;/pre>
&lt;p>Le &lt;strong>taux de rafraîchissement (Polling Rate)&lt;/strong> est la fréquence à laquelle le clavier signale à l&amp;rsquo;ordinateur &amp;ldquo;l&amp;rsquo;état actuel des touches&amp;rdquo;. Un clavier standard est à 125Hz (1 fois toutes les 8ms), mais les modèles haut de gamme offrent des communications ultra-rapides à 1000Hz (1 fois par 1ms) ou, plus récemment, à 8000Hz (1 fois toutes les 0,125ms).
Pour le codage, des performances de 1000Hz sont plus que suffisantes, mais cela procure une tranquillité d&amp;rsquo;esprit en évitant toute frappe manquée lors de saisies ultra-rapides.&lt;/p>
&lt;h3 id="22-n-key-rollover-nkro-et-anti-ghosting">2.2 N-Key Rollover (NKRO) et Anti-Ghosting
&lt;/h3>&lt;p>Le &lt;strong>N-Key Rollover (NKRO)&lt;/strong> est une fonctionnalité garantissant que lorsque plusieurs touches sont pressées simultanément, toutes sont reconnues avec précision. Dans le passé, en raison des limites de la connexion USB, il y avait des restrictions telles que &amp;ldquo;jusqu&amp;rsquo;à 6 touches&amp;rdquo;, mais les claviers haut de gamme actuels permettent une pression simultanée pratiquement illimitée (Full NKRO) en manipulant astucieusement les rapports HID USB.&lt;/p>
&lt;p>Pour les ingénieurs qui utilisent beaucoup de raccourcis complexes (ex: &lt;code>Ctrl + Shift + Alt + une touche quelconque&lt;/code>) dans des éditeurs comme Vim ou Emacs, un NKRO complet est une condition indispensable.&lt;/p>
&lt;h3 id="23-délai-anti-rebond-debounce-delay">2.3 Délai anti-rebond (Debounce Delay)
&lt;/h3>&lt;p>Les commutateurs mécaniques avec des contacts métalliques subissent un &amp;ldquo;phénomène de rebond&amp;rdquo; (bounce) où les contacts rebondissent de manière microscopique lorsqu&amp;rsquo;ils sont pressés ou relâchés. Le temps de traitement pour que le microcontrôleur ignore cela est le &lt;strong>délai anti-rebond&lt;/strong>. Habituellement, un délai d&amp;rsquo;environ 5ms à 20ms est intentionnellement prévu, mais avec la méthode capacitive sans contact ou les commutateurs magnétiques mentionnés précédemment, comme il n&amp;rsquo;y a pas de bruit de contact physique, le délai anti-rebond peut être réglé sur zéro (ou très faible), offrant ainsi une réponse fulgurante.&lt;/p>
&lt;h2 id="3-micrologiciel-et-personnalisation-qmk--via">3. Micrologiciel et personnalisation (QMK / VIA)
&lt;/h2>&lt;p>Si le matériel est le &amp;ldquo;corps&amp;rdquo;, le micrologiciel (firmware) est le &amp;ldquo;cerveau&amp;rdquo; du clavier. Les claviers haut de gamme modernes destinés aux ingénieurs ne se contentent pas d&amp;rsquo;envoyer des codes de touches, ils ont la capacité d&amp;rsquo;exécuter des programmes complexes.&lt;/p>
&lt;h3 id="31-qmk-firmware">3.1 QMK Firmware
&lt;/h3>&lt;p>&lt;strong>QMK (Quantum Mechanical Keyboard)&lt;/strong> est un micrologiciel open-source pour claviers. Écrit en langage C, il permet littéralement &amp;ldquo;tout&amp;rdquo;, de la modification de la disposition des touches (keymap) à la création de macros, en passant par le contrôle des animations LED.&lt;/p>
&lt;h3 id="32-fonctions-daffectation-de-touches-avancées">3.2 Fonctions d&amp;rsquo;affectation de touches avancées
&lt;/h3>&lt;p>Parmi les fonctionnalités offertes par QMK, les suivantes augmentent de manière explosive la productivité des ingénieurs :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fonction de couches (Layers) :&lt;/strong> Tout comme le passage de &amp;ldquo;lettres&amp;rdquo; à &amp;ldquo;chiffres&amp;rdquo; sur le clavier d&amp;rsquo;un smartphone, elle permet de basculer la disposition entière du clavier vers une autre disposition uniquement pendant qu&amp;rsquo;une touche spécifique (comme la touche Fn) est enfoncée. Cela permet de saisir des touches fléchées, des macros et des symboles sans bouger les mains de la position de repos (home position).&lt;/li>
&lt;li>&lt;strong>Mod-Tap :&lt;/strong> Donne deux rôles distincts à une seule touche : un pour &amp;ldquo;lorsqu&amp;rsquo;elle est tapée brièvement&amp;rdquo; et un autre pour &amp;ldquo;lorsqu&amp;rsquo;elle est maintenue enfoncée&amp;rdquo;. Par exemple, en réglant la barre d&amp;rsquo;espace sur &amp;ldquo;Espace lors de la frappe, Shift lors du maintien&amp;rdquo; (Space Cadet Shift), l&amp;rsquo;utilisation efficace des pouces devient possible.&lt;/li>
&lt;li>&lt;strong>Home Row Mods :&lt;/strong> Une méthode qui attribue des modificateurs de maintien (Ctrl, Shift, Alt, GUI) aux touches de la rangée de repos (ASDF, JKL;, etc.). Cela élimine le besoin de surutiliser l&amp;rsquo;auriculaire pour s&amp;rsquo;étirer et appuyer sur la touche Ctrl, réduisant considérablement la fatigue du poignet pour les utilisateurs de Vim ou Emacs.&lt;/li>
&lt;/ul>
&lt;h3 id="33-configuration-en-temps-réel-avec-via--vial">3.3 Configuration en temps réel avec VIA / VIAL
&lt;/h3>&lt;p>L&amp;rsquo;inconvénient de QMK était qu&amp;rsquo;il fallait &amp;ldquo;compiler le code source et flasher (écrire) le micrologiciel à chaque changement de configuration&amp;rdquo;. &lt;strong>VIA&lt;/strong> et &lt;strong>VIAL&lt;/strong> ont résolu ce problème. Ceux-ci permettent d&amp;rsquo;accéder au clavier via une application GUI (ou dans un navigateur web) et de réécrire la disposition des touches en temps réel sans redémarrage.&lt;/p>
&lt;h2 id="4-ergonomie-et-science-des-dispositions">4. Ergonomie et science des dispositions
&lt;/h2>&lt;p>La disposition classique en &amp;ldquo;quinconce par rangée&amp;rdquo; (Row Staggered) est un vestige conçu pour éviter que les bras physiques des machines à écrire ne s&amp;rsquo;emmêlent, et n&amp;rsquo;est pas basée sur la structure de la main humaine.&lt;/p>
&lt;pre class="mermaid">
pie title Préférences de disposition de clavier idéales des ingénieurs (Données estimées)
&amp;#34;Row Staggered (Classique)&amp;#34; : 45
&amp;#34;Disposition Alice (Ergonomique)&amp;#34; : 15
&amp;#34;Ortholinéaire (Disposition en grille)&amp;#34; : 10
&amp;#34;Column Staggered (Type divisé)&amp;#34; : 30
&lt;/pre>
&lt;p>Voici quelques dispositions plus soucieuses de l&amp;rsquo;ergonomie :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ortholinéaire (Ortholinear) :&lt;/strong> Une disposition où les touches sont parfaitement alignées en grille, verticalement et horizontalement. La flexion et l&amp;rsquo;extension des doigts deviennent linéaires, réduisant les mouvements inutiles des doigts.&lt;/li>
&lt;li>&lt;strong>Column Staggered (Décalage en colonne) :&lt;/strong> Une disposition où les colonnes verticales sont décalées pour s&amp;rsquo;adapter à la longueur des doigts humains (le majeur est long, l&amp;rsquo;auriculaire est court). Elle permet de taper avec une forme de main naturelle.&lt;/li>
&lt;li>&lt;strong>Type divisé (Split) :&lt;/strong> Étant donné que les mains gauche et droite peuvent être placées de manière complètement indépendante, cela permet de taper dans une posture naturelle avec les épaules ouvertes et la poitrine relevée, offrant un effet immense sur la prévention de la raideur des épaules et de la perte de lordose cervicale (straight neck).&lt;/li>
&lt;/ul>
&lt;h2 id="5-les-5-claviers-mécaniques-ultimes-recommandés-pour-les-ingénieurs">5. Les 5 claviers mécaniques ultimes recommandés pour les ingénieurs
&lt;/h2>&lt;p>Sur la base de la physique, des circuits électroniques, du micrologiciel et de l&amp;rsquo;ergonomie, nous avons soigneusement sélectionné 5 claviers destinés aux véritables professionnels, capables de résister à de longues sessions de codage.&lt;/p>
&lt;hr>
&lt;h3 id="1-série-keychron-q-q1-pro--q8-etc---la-porte-dentrée-dans-le-monde-des-claviers-personnalisés">1. Série Keychron Q (Q1 Pro / Q8, etc.) - La porte d&amp;rsquo;entrée dans le monde des claviers personnalisés
&lt;/h3>&lt;p>Originaire de Hong Kong, Keychron est le moteur du boom récent des claviers personnalisés. En particulier, la &amp;ldquo;série Q&amp;rdquo; adopte un corps lourd entièrement en aluminium et une structure &amp;ldquo;Gasket Mount&amp;rdquo; qui ajuste le son de frappe à la limite.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Commutateurs :&lt;/strong> Mécaniques (Compatibles Hot-Swap. Les commutateurs peuvent être changés librement)&lt;/li>
&lt;li>&lt;strong>Micrologiciel :&lt;/strong> Entièrement compatible QMK/VIA&lt;/li>
&lt;li>&lt;strong>Caractéristiques :&lt;/strong> Commutateur pour basculer entre macOS/Windows. Vous pouvez choisir votre disposition préférée, comme la disposition Alice Q8 ou la disposition 75% Q1.&lt;/li>
&lt;li>&lt;strong>Avantages pour les ingénieurs :&lt;/strong> Bien qu&amp;rsquo;il s&amp;rsquo;agisse d&amp;rsquo;un produit prêt à l&amp;rsquo;emploi, vous pouvez immédiatement profiter d&amp;rsquo;une sensation de frappe exceptionnelle et d&amp;rsquo;une personnalisation rivalisant avec les claviers faits maison dès la sortie de la boîte. Idéal pour configurer une couche de touches fléchées de type Vim à l&amp;rsquo;aide de VIA.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="2-hhkb-studio---le-périphérique-de-pointage-tout-en-un-pour-les-hackers">2. HHKB Studio - Le périphérique de pointage tout-en-un pour les hackers
&lt;/h3>&lt;p>Le &amp;ldquo;Happy Hacking Keyboard (HHKB)&amp;rdquo; est un clavier légendaire né pour les programmeurs UNIX. Le dernier &amp;ldquo;HHKB Studio&amp;rdquo; a encore évolué en adoptant des commutateurs mécaniques silencieux développés exclusivement, plutôt que la méthode capacitive sans contact conventionnelle.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Commutateurs :&lt;/strong> Commutateurs mécaniques linéaires/silencieux (Fabriqués par Kailh, compatibles Hot-Swap)&lt;/li>
&lt;li>&lt;strong>Caractéristiques :&lt;/strong> Bâton de pointage (trackpoint) au centre du clavier, 4 pads tactiles pour les gestes.&lt;/li>
&lt;li>&lt;strong>Avantages pour les ingénieurs :&lt;/strong> Le contrôle du curseur de la souris, le défilement et le changement de fenêtres peuvent être accomplis sans jamais retirer les mains de la position de repos. Une fois que vous avez goûté à cette &amp;ldquo;expérience où tout est accompli du bout des doigts&amp;rdquo;, vous ne pourrez plus jamais revenir à la tâche de tendre la main droite vers une souris.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="3-zsa-moonlander--ergodox-ez---lergonomie-divisée-ultime">3. ZSA Moonlander / ErgoDox EZ - L&amp;rsquo;ergonomie divisée ultime
&lt;/h3>&lt;p>Le summum des claviers divisés développés par ZSA au Canada. Étant donné que les côtés gauche et droit sont indépendants et peuvent être placés selon la largeur des épaules, la tension sur les épaules et le cou est étonnamment réduite même lors de frappes prolongées.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Commutateurs :&lt;/strong> Mécaniques (Compatibles Cherry MX, compatibles Hot-Swap)&lt;/li>
&lt;li>&lt;strong>Micrologiciel :&lt;/strong> Basé sur QMK (Utilise leur propre outil GUI puissant &amp;ldquo;Oryx&amp;rdquo;)&lt;/li>
&lt;li>&lt;strong>Caractéristiques :&lt;/strong> Disposition Column Staggered, groupe de touches dédié aux pouces, pieds fournis en standard pour ajouter une inclinaison (tente).&lt;/li>
&lt;li>&lt;strong>Avantages pour les ingénieurs :&lt;/strong> En attribuant Enter, Space, Backspace et les changements de couche aux pouces, la charge sur l&amp;rsquo;auriculaire, qui a le moins de force, est considérablement réduite. C&amp;rsquo;est un appareil qui deviendra le sauveur des ingénieurs souffrant du syndrome du canal carpien.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="4-realforce-r3---fiabilité-japonaise-et-sensation-de-frappe-suprême-capacitif-sans-contact">4. REALFORCE R3 - Fiabilité japonaise et sensation de frappe suprême (Capacitif sans contact)
&lt;/h3>&lt;p>Le chef-d&amp;rsquo;œuvre japonais dont Topre est fier. Son palmarès d&amp;rsquo;utilisation pendant de nombreuses années dans des environnements professionnels tels que les institutions financières n&amp;rsquo;est pas un hasard. À partir de la génération R3, il prend également en charge la connexion Bluetooth.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Commutateurs :&lt;/strong> Méthode capacitive sans contact (Topre)&lt;/li>
&lt;li>&lt;strong>Caractéristiques :&lt;/strong> Avec la fonction APC (Actuation Point Changer), le point d&amp;rsquo;actionnement peut être réglé pour chaque touche à 0,8 mm, 1,5 mm, 2,2 mm, ou 3,0 mm.&lt;/li>
&lt;li>&lt;strong>Avantages pour les ingénieurs :&lt;/strong> Le toucher de touche doux, sans contact physique, est appelé &amp;ldquo;toucher plume&amp;rdquo;, minimisant le stress de répulsion sur les doigts même pendant de longues sessions de codage. Il est possible de personnaliser les touches pressées par l&amp;rsquo;auriculaire (comme A et Enter) pour avoir un point d&amp;rsquo;actionnement très superficiel (0,8 mm) afin qu&amp;rsquo;elles réagissent à un simple contact léger.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="5-wooting-60he---la-réponse-révolutionnaire-apportée-par-les-commutateurs-magnétiques">5. Wooting 60HE - La réponse révolutionnaire apportée par les commutateurs magnétiques
&lt;/h3>&lt;p>Initialement développé pour les joueurs d&amp;rsquo;e-sport, sa technologie innovante est également très appréciée des ingénieurs qui exigent la frappe et la réponse les plus rapides.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Commutateurs :&lt;/strong> Lekker Switch (Commutateurs magnétiques à effet Hall)&lt;/li>
&lt;li>&lt;strong>Caractéristiques :&lt;/strong> Fonction Rapid Trigger, point d&amp;rsquo;actionnement réglable par incréments de 0,1 mm de 0,1 mm à 4,0 mm.&lt;/li>
&lt;li>&lt;strong>Avantages pour les ingénieurs :&lt;/strong> Tirant parti de l&amp;rsquo;entrée analogique, il permet des configurations folles (Dynamic Keystroke) telles que &amp;ldquo;lettre minuscule si pressée légèrement, majuscule si pressée profondément (en combinaison avec Shift)&amp;rdquo;. De plus, étant donné que la touche s&amp;rsquo;éteint au moment même où le doigt est légèrement levé, cela empêche l&amp;rsquo;entrée continue involontaire de touches lors de la frappe à grande vitesse, offrant une expérience de saisie précise inégalée.&lt;/li>
&lt;/ul>
&lt;h2 id="en-conclusion">En conclusion
&lt;/h2>&lt;p>Le choix d&amp;rsquo;un clavier est un processus &amp;ldquo;d&amp;rsquo;optimisation de sa propre interface&amp;rdquo; tout au long de la carrière d&amp;rsquo;un ingénieur. De la sensation physique du ressort obéissant à la loi de Hooke, à l&amp;rsquo;énergie d&amp;rsquo;actionnement calculée par intégrale, la construction de macros par QMK, et l&amp;rsquo;ergonomie ultime, la profondeur à explorer est sans fin.&lt;/p>
&lt;p>Les 5 claviers présentés cette fois (Keychron, HHKB Studio, Moonlander, REALFORCE, Wooting) sont tous des chefs-d&amp;rsquo;œuvre visant la &amp;ldquo;meilleure expérience de saisie&amp;rdquo; avec des approches différentes. Trouvez votre meilleur partenaire en fonction de votre propre style de frappe et des problèmes physiques auxquels vous êtes confronté.&lt;/p>
&lt;p>L&amp;rsquo;investissement dans un clavier se transformera sûrement en &amp;ldquo;des millions de lignes de code sans bug&amp;rdquo; et vous apportera des bénéfices.&lt;/p></description></item><item><title>Techniques pour résoudre le manque de mémoire GPU dans le développement de l'IA (déchargement CPU, etc.)</title><link>http://kenji.blog/fr/p/ai-gpu-vram-optimization-cpu-offloading/</link><pubDate>Fri, 11 Sep 2026 01:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/ai-gpu-vram-optimization-cpu-offloading/</guid><description>&lt;img src="http://kenji.blog/p/ai-gpu-vram-optimization-cpu-offloading/img/eyecatch.jpg" alt="Featured image of post Techniques pour résoudre le manque de mémoire GPU dans le développement de l'IA (déchargement CPU, etc.)" />&lt;h1 id="introduction--le-développement-de-lia-et-le-mur-de-la-vram">Introduction : Le développement de l&amp;rsquo;IA et le &amp;ldquo;Mur de la VRAM&amp;rdquo;
&lt;/h1>&lt;p>Ces dernières années, les technologies d&amp;rsquo;IA générative telles que les grands modèles de langage (LLM) et les modèles de diffusion (Diffusion Models) ont connu un développement rapide. Cependant, lors de l&amp;rsquo;apprentissage (fine-tuning) ou de l&amp;rsquo;exécution de l&amp;rsquo;inférence (Inference) de ces modèles d&amp;rsquo;IA de pointe dans un environnement local, de nombreux développeurs et chercheurs sont confrontés à un obstacle extrêmement physique : &lt;strong>le &amp;ldquo;manque de mémoire GPU (VRAM)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Même avec un GPU haut de gamme grand public comme le NVIDIA GeForce RTX 4090, la VRAM maximale est de 24 Go, ce qui rend impossible le chargement d&amp;rsquo;un modèle gigantesque comme Llama 3 70B tel quel. Les GPU destinés aux centres de données tels que le H100 (80 Go) ou le B200 (192 Go) sont très coûteux et ne sont pas facilement accessibles aux individus ou aux petites équipes. Si l&amp;rsquo;on ne parvient pas à franchir ce &amp;ldquo;Mur de la VRAM (The Wall of VRAM)&amp;rdquo;, il est même impossible de toucher aux modèles de pointe.&lt;/p>
&lt;p>Cet article explique en profondeur les techniques avancées, tant du côté de l&amp;rsquo;inférence que de l&amp;rsquo;apprentissage, pour surmonter cette contrainte physique de limitation de VRAM grâce à l&amp;rsquo;ingéniosité de l&amp;rsquo;architecture matérielle et logicielle. Nous explorerons en détail le déchargement CPU (CPU Offloading), l&amp;rsquo;optimisation du cache KV, les points de contrôle de gradient (Gradient Checkpointing) et la toute dernière architecture de mémoire unifiée (Unified Memory), le tout illustré par des formules mathématiques et des diagrammes. La lecture de cet article vous permettra de comprendre en profondeur le comportement de la VRAM et d&amp;rsquo;acquérir des connaissances pratiques pour manipuler des modèles gigantesques avec des ressources limitées.&lt;/p>
&lt;hr>
&lt;h1 id="1-anatomie-de-la-consommation-de-vram-des-modèles-dia-inférence-et-apprentissage">1. Anatomie de la consommation de VRAM des modèles d&amp;rsquo;IA (Inférence et Apprentissage)
&lt;/h1>&lt;p>La première étape pour résoudre le manque de VRAM consiste à comprendre précisément &amp;ldquo;ce qui&amp;rdquo; consomme la mémoire et &amp;ldquo;dans quelle proportion&amp;rdquo;, d&amp;rsquo;un point de vue microscopique. Plutôt que de la traiter comme une boîte noire, si nous pouvons l&amp;rsquo;estimer avec précision à l&amp;rsquo;aide de formules mathématiques, nous pourrons choisir la méthode d&amp;rsquo;optimisation appropriée.&lt;/p>
&lt;h2 id="11-calcul-de-la-mémoire-des-paramètres-du-modèle-poids">1.1 Calcul de la mémoire des paramètres du modèle (Poids)
&lt;/h2>&lt;p>La quantité de mémoire de base consommée par les paramètres (Weights) qui composent un modèle d&amp;rsquo;IA est déterminée par le nombre total de paramètres du modèle et le type de données (Precision : précision) utilisé pour les représenter.&lt;/p>
&lt;p>Les types de données couramment utilisés en Deep Learning et le nombre d&amp;rsquo;octets par paramètre ($B$) sont les suivants :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>FP32 (Nombre à virgule flottante simple précision) :&lt;/strong> 4 octets (précision standard lors de l&amp;rsquo;apprentissage)&lt;/li>
&lt;li>&lt;strong>FP16 / BF16 (Nombre à virgule flottante demi-précision) :&lt;/strong> 2 octets (inférence générale et apprentissage en précision mixte)&lt;/li>
&lt;li>&lt;strong>INT8 (Entier 8 bits) :&lt;/strong> 1 octet (modèles quantifiés)&lt;/li>
&lt;li>&lt;strong>INT4 (Quantification entière 4 bits) :&lt;/strong> 0,5 octet (quantification extrême comme GPTQ, AWQ, GGUF)&lt;/li>
&lt;/ul>
&lt;p>Si le nombre total de paramètres du modèle est $P$, la quantité de mémoire de base occupée par les poids eux-mêmes $M_{weights}$ est exprimée par la formule suivante :&lt;/p>
$$ M_{weights} = P \times B $$&lt;p>Par exemple, si l&amp;rsquo;on charge le modèle &amp;ldquo;Llama 3 8B&amp;rdquo; publié par Meta (environ 8 milliards de paramètres) en FP16 (demi-précision), le calcul est le suivant :&lt;/p>
$$ M_{weights} = 8,000,000,000 \times 2 \text{ octets} \approx 16,000,000,000 \text{ octets} \approx 16 \text{ Go} $$&lt;p>En d&amp;rsquo;autres termes, le simple chargement des poids du modèle dans le GPU consomme 16 Go de VRAM. Avec une RTX 3060 (12 Go), une erreur &amp;ldquo;Out of Memory&amp;rdquo; (OOM) se produirait à ce stade. Cependant, si le modèle est quantifié en INT4, cela devient $8 \times 0.5 = 4 \text{ Go}$, ce qui permet de le charger avec de la marge.&lt;/p>
&lt;h2 id="12-consommation-de-mémoire-lors-de-linférence--laugmentation-du-cache-kv">1.2 Consommation de mémoire lors de l&amp;rsquo;inférence : l&amp;rsquo;augmentation du cache KV
&lt;/h2>&lt;p>Lors de l&amp;rsquo;inférence des LLM (en particulier la génération de texte autorégressive), le &lt;strong>cache KV (Key-Value Cache)&lt;/strong> exerce une pression sur la VRAM aussi forte, voire plus forte, que les poids eux-mêmes.
Dans l&amp;rsquo;architecture Transformer, afin d&amp;rsquo;éviter de recalculer les informations des jetons (tokens) générés et traités précédemment, les tenseurs Key et Value de chaque couche d&amp;rsquo;attention continuent d&amp;rsquo;être mis en cache dans la VRAM. Cela améliore la vitesse de calcul (Compute), mais à mesure que la longueur du contexte (longueur du prompt d&amp;rsquo;entrée + longueur générée) augmente, la consommation de mémoire augmente de manière linéaire et explosive.&lt;/p>
&lt;p>La quantité de mémoire du cache KV consommée lors du traitement d&amp;rsquo;un jeton $M_{kv\_token}$ est calculée de manière stricte par la formule suivante en fonction de l&amp;rsquo;architecture du modèle :&lt;/p>
$$ M_{kv\_token} = 2 \times N_{layers} \times N_{heads\_kv} \times D_{head} \times B $$&lt;p>Ici, chaque variable a la signification suivante :&lt;/p>
&lt;ul>
&lt;li>$2$ : Car il existe deux tenseurs, Key et Value&lt;/li>
&lt;li>$N_{layers}$ : Nombre de couches (layers) du Transformer&lt;/li>
&lt;li>$N_{heads\_kv}$ : Nombre de têtes d&amp;rsquo;attention KV (Dans le cas du GQA : Grouped Query Attention, ce nombre est inférieur au nombre de têtes normales)&lt;/li>
&lt;li>$D_{head}$ : Nombre de dimensions de chaque tête (généralement, le nombre de dimensions de la couche cachée $D_{model} / N_{heads}$)&lt;/li>
&lt;li>$B$ : Nombre d&amp;rsquo;octets du type de données (2 pour FP16)&lt;/li>
&lt;/ul>
&lt;p>La taille totale du cache KV $M_{kv\_total}$ est obtenue en multipliant cela par la longueur de la séquence ($L_{seq}$) et la taille du lot ($BatchSize$).&lt;/p>
$$ M_{kv\_total} = M_{kv\_token} \times L_{seq} \times BatchSize $$&lt;p>&lt;strong>Exemple concret : Cas de Llama 2 7B&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>$N_{layers} = 32$&lt;/li>
&lt;li>$N_{heads\_kv} = 32$ (Dans le cas du MHA)&lt;/li>
&lt;li>$D_{head} = 128$&lt;/li>
&lt;li>FP16 ($B=2$)&lt;/li>
&lt;li>Taille du lot 1, longueur de la séquence 8192 (contexte 8K)&lt;/li>
&lt;/ul>
$$ M_{kv\_total} = 2 \times 32 \times 32 \times 128 \times 2 \times 8192 \times 1 = 4,294,967,296 \text{ octets} \approx 4 \text{ Go} $$&lt;p>Si l&amp;rsquo;on allongeait le contexte à 32K (32768 jetons), le cache KV à lui seul consommerait environ 16 Go. Si l&amp;rsquo;on augmente la taille du lot à 4, cela fait 64 Go. C&amp;rsquo;est l&amp;rsquo;un des défis majeurs de l&amp;rsquo;inférence : l&amp;rsquo;exigence d&amp;rsquo;une VRAM bien plus gigantesque que la taille du modèle lui-même.&lt;/p>
&lt;h2 id="13-consommation-de-mémoire-lors-de-lapprentissage--optimiseur-gradients-et-activations">1.3 Consommation de mémoire lors de l&amp;rsquo;apprentissage : Optimiseur, Gradients et Activations
&lt;/h2>&lt;p>Comparé à l&amp;rsquo;inférence, l&amp;rsquo;apprentissage d&amp;rsquo;un modèle (pré-entraînement ou fine-tuning) consomme beaucoup plus de VRAM. Cela est dû au fait qu&amp;rsquo;il est nécessaire de conserver des informations non seulement pour une simple propagation avant (forward pass), mais aussi pour la rétropropagation (backpropagation). La mémoire d&amp;rsquo;apprentissage est principalement composée des 4 éléments suivants :&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Poids du modèle (Model Weights) :&lt;/strong> Similaire à l&amp;rsquo;inférence, mais dans l&amp;rsquo;apprentissage en précision mixte, on peut conserver à la fois le FP16 et le FP32 (Master Weights).&lt;/li>
&lt;li>&lt;strong>Gradients (Gradients) :&lt;/strong> Les gradients pour chaque paramètre calculés lors de la rétropropagation. 2 octets par paramètre dans le cas du FP16.&lt;/li>
&lt;li>&lt;strong>États de l&amp;rsquo;optimiseur (Optimizer States) :&lt;/strong> Les optimiseurs avancés comme AdamW maintiennent le premier moment (Momentum) et le deuxième moment (Variance) pour chaque paramètre. Pour maintenir la stabilité de l&amp;rsquo;apprentissage, ceux-ci sont généralement conservés en FP32 (4 octets). Cela signifie que les deux moments consomment $4 + 4 = 8$ octets par paramètre.&lt;/li>
&lt;li>&lt;strong>Activations (Activations) :&lt;/strong> Afin de calculer les gradients lors de la rétropropagation, la sortie de chaque couche (état intermédiaire) lors de la propagation avant doit être conservée en mémoire. Cela dépend fortement de la taille du lot et de la longueur de la séquence, et devient très volumineux.&lt;/li>
&lt;/ol>
&lt;p>En résumé, dans un apprentissage en précision mixte (Mixed Precision Training) utilisant l&amp;rsquo;optimiseur Adam standard, &lt;strong>environ 16 à 20 octets&lt;/strong> (Poids principal 4 + Poids FP16 2 + Gradient 2 + Optimiseur 8 + α) de mémoire sont requis par paramètre.&lt;/p>
$$ M_{train\_param} \approx P \times 16 \text{ octets} $$&lt;p>Pour l&amp;rsquo;apprentissage d&amp;rsquo;un modèle de 7B (7 milliards de paramètres), la partie liée aux paramètres consomme à elle seule $7B \times 16 = 112 \text{ Go}$. Avec les activations ajoutées à cela, le calcul montre qu&amp;rsquo;il faudrait plus de 140 Go de VRAM. Pour exécuter cela avec 24 Go de VRAM, les techniques d&amp;rsquo;optimisation radicales expliquées dans les chapitres suivants sont indispensables.&lt;/p>
&lt;hr>
&lt;h1 id="2-techniques-déconomie-de-vram-lors-de-linférence">2. Techniques d&amp;rsquo;économie de VRAM lors de l&amp;rsquo;inférence
&lt;/h1>&lt;p>Pour faire fonctionner de gigantesques modèles lors de l&amp;rsquo;inférence, de nombreuses technologies logicielles franchissant les limites matérielles ont été développées.&lt;/p>
&lt;h2 id="21-déchargement-cpu-cpu-offloading-et-division-des-couches">2.1 Déchargement CPU (CPU Offloading) et division des couches
&lt;/h2>&lt;p>Lorsqu&amp;rsquo;un modèle trop volumineux ne tient pas dans un ou plusieurs GPU, la méthode consistant à placer une partie du modèle dans la mémoire système (RAM CPU) et à la transférer vers le GPU pour effectuer les calculs uniquement lorsque cela est nécessaire s&amp;rsquo;appelle le &lt;strong>déchargement CPU (CPU Offloading)&lt;/strong>. &lt;code>llama.cpp&lt;/code> et &lt;code>Accelerate&lt;/code> de Hugging Face prennent en charge cette fonctionnalité.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;RAM Système (DDR4 / DDR5)&amp;#34;] --&amp;gt; B[&amp;#34;VRAM du GPU (GDDR6X)&amp;#34;]
B[&amp;#34;VRAM du GPU (GDDR6X)&amp;#34;] --&amp;gt; C[&amp;#34;Cœurs Tensor (Calcul)&amp;#34;]
subgraph &amp;#34;Division des couches et Déchargement&amp;#34;
D[&amp;#34;Couches inférieures 1-15 (Épinglées sur GPU)&amp;#34;]
E[&amp;#34;Couches supérieures 16-32 (Déchargées sur CPU)&amp;#34;]
end
E[&amp;#34;Couches supérieures 16-32 (Déchargées sur CPU)&amp;#34;] -.-&amp;gt; B[&amp;#34;VRAM du GPU (GDDR6X)&amp;#34;]
&lt;/pre>
&lt;p>&lt;strong>Mécanismes et Défis :&lt;/strong>
Comme le modèle Transformer a une structure où les couches (layers) sont empilées en série, le calcul de la couche suivante ne commencera pas avant que le calcul d&amp;rsquo;une couche soit terminé. En tirant parti de cela, seules les couches qui rentrent dans le GPU (par exemple, couches 1 à 15) sont rendues résidentes (épinglées) dans la VRAM, tandis que les couches restantes (couches 16 à 32) sont placées dans la RAM CPU de grande capacité mais lente. Pendant l&amp;rsquo;inférence, une fois les calculs jusqu&amp;rsquo;à la 15ème couche terminés, les poids de la 16ème couche sont transférés (copiés) du CPU vers le GPU via le bus PCIe, et les calculs sont exécutés sur le GPU.&lt;/p>
&lt;p>Cependant, &lt;strong>la bande passante (Bandwidth) du PCIe constitue un goulet d&amp;rsquo;étranglement sévère&lt;/strong>. La bande passante maximale théorique du PCIe 4.0 x16 est de 32 Go/s (unidirectionnelle), mais comparée à la bande passante interne de la VRAM des derniers GPU (par exemple, la GDDR6X de la RTX 4090 est de 1008 Go/s, et la HBM3 de la H100 dépasse les 3 To/s), elle est deux ordres de grandeur plus lente. L&amp;rsquo;utilisation intensive du déchargement CPU réduit donc drastiquement la vitesse d&amp;rsquo;inférence (Tokens per Second).
Pour minimiser la perte de vitesse, la clé en pratique est de placer autant de couches que possible dans le GPU (maximisation des GPU Layers) et de minimiser les couches à décharger.&lt;/p>
&lt;h2 id="22-quantification-du-cache-kv-et-pagedattention">2.2 Quantification du cache KV et PagedAttention
&lt;/h2>&lt;p>Deux puissantes optimisations sont également appliquées au cache KV, qui est le principal coupable de la consommation de VRAM lors de l&amp;rsquo;inférence.&lt;/p>
&lt;p>&lt;strong>1. Quantification du cache KV (KV Cache Quantization) :&lt;/strong>
C&amp;rsquo;est une méthode permettant de quantifier non seulement les poids du modèle, mais aussi le cache KV lui-même, généré dynamiquement à l&amp;rsquo;exécution, en INT8, INT4 ou FP8 pour le stocker dans la VRAM. Cela permet de réduire la taille du cache KV de moitié, voire au quart. Les moteurs d&amp;rsquo;inférence récents (vLLM, llama.cpp) intègrent cette fonctionnalité, permettant d&amp;rsquo;économiser massivement la VRAM tout en minimisant la perte de précision.&lt;/p>
&lt;p>&lt;strong>2. PagedAttention :&lt;/strong>
L&amp;rsquo;application du concept de &amp;ldquo;pagination&amp;rdquo; de la mémoire virtuelle du système d&amp;rsquo;exploitation au cache KV est appelée &lt;strong>PagedAttention&lt;/strong>, introduite par le moteur d&amp;rsquo;inférence vLLM. Dans les moteurs d&amp;rsquo;inférence classiques, des zones de VRAM contiguës étaient préalablement réservées (Pre-allocation) en fonction de la longueur de séquence maximale configurée. En conséquence, si l&amp;rsquo;entrée réelle était courte, de la fragmentation ou un gaspillage de mémoire inutilisée se produisait, gaspillant parfois plus de 60 % de la VRAM.&lt;/p>
&lt;p>PagedAttention divise le cache KV en blocs (pages) de taille fixe, permettant de les stocker de manière distribuée dans un espace mémoire physique non contigu. Cela réduit le gaspillage de mémoire à presque zéro (limité seulement à la fragmentation interne) et permet d&amp;rsquo;augmenter considérablement la taille du lot avec la même capacité de VRAM.&lt;/p>
&lt;pre class="mermaid">
graph LR
A[&amp;#34;Cache KV Logique&amp;#34;] --&amp;gt; B[&amp;#34;Blocs VRAM Physiques&amp;#34;]
A1[&amp;#34;Jeton 1, 2, 3, 4&amp;#34;] --&amp;gt; B3[&amp;#34;Bloc 3 (Alloué)&amp;#34;]
A2[&amp;#34;Jeton 5, 6, 7, 8&amp;#34;] --&amp;gt; B1[&amp;#34;Bloc 1 (Alloué)&amp;#34;]
A3[&amp;#34;Jetons Futurs...&amp;#34;] -.-&amp;gt; B2[&amp;#34;Bloc 2 (Libre)&amp;#34;]
&lt;/pre>
&lt;h2 id="23-flashattention--briser-la-complexité-de-la-mémoire-dans-le-calcul-de-lattention">2.3 FlashAttention : Briser la complexité de la mémoire dans le calcul de l&amp;rsquo;attention
&lt;/h2>&lt;p>Le manque de VRAM n&amp;rsquo;est pas seulement causé par la quantité de mémoire pour stocker les données, mais aussi par le manque d&amp;rsquo;&amp;ldquo;espace de travail temporaire&amp;rdquo; pendant le calcul. Le mécanisme Self-Attention standard de Transformer nécessite de matérialiser (Materialize) sur la VRAM une énorme matrice d&amp;rsquo;attention de $N \times N$ pour une séquence de longueur $N$. Cela entraîne une complexité de mémoire de $O(N^2)$, ce qui est la principale cause des OOM avec de longs contextes.&lt;/p>
&lt;p>Ce problème a été résolu par &lt;strong>FlashAttention&lt;/strong> (ainsi que FlashAttention-2, 3).
FlashAttention est un algorithme qui tient compte de l&amp;rsquo;architecture matérielle du GPU (la hiérarchie entre la HBM, immense mais lente, et la SRAM, minuscule mais ultra-rapide). En utilisant une méthode appelée Tiling (pavage), les données sont chargées dans la SRAM par blocs pour y effectuer complètement le calcul de l&amp;rsquo;attention, ce qui permet d&amp;rsquo;éviter totalement le processus d&amp;rsquo;écriture de la matrice $N \times N$ dans la HBM (VRAM).&lt;/p>
&lt;p>Grâce à cela, la complexité de la mémoire des couches d&amp;rsquo;attention a considérablement chuté de $O(N^2)$ à $O(N)$ (proportionnelle à la longueur de la séquence), relâchant considérablement les restrictions sur la longueur du contexte.&lt;/p>
&lt;h2 id="24-lessor-de-la-mémoire-unifiée-unified-memory-et-apple-silicon">2.4 L&amp;rsquo;essor de la mémoire unifiée (Unified Memory) et Apple Silicon
&lt;/h2>&lt;p>&lt;strong>L&amp;rsquo;architecture de mémoire unifiée (Unified Memory Architecture : UMA)&lt;/strong>, adoptée par Apple Silicon (séries M1/M2/M3/M4 Max et Ultra) ou par certains APU récents (comme AMD Strix Point), s&amp;rsquo;attaque à ce problème à la base même de l&amp;rsquo;architecture PC.&lt;/p>
&lt;p>Dans ces architectures, le CPU et le GPU sur la carte mère partagent exactement la même mémoire physique (par exemple, jusqu&amp;rsquo;à 192 Go de LPDDR5). Par conséquent, le concept même de &amp;ldquo;transfert de données lent du CPU vers le GPU via PCIe&amp;rdquo; n&amp;rsquo;existe physiquement pas.&lt;/p>
&lt;pre class="mermaid">
graph TD
subgraph &amp;#34;Architecture de Mémoire Unifiée (ex. Apple Silicon)&amp;#34;
A[&amp;#34;Cœurs CPU&amp;#34;] &amp;lt;--&amp;gt; C[&amp;#34;Contrôleur de Mémoire Partagée&amp;#34;]
B[&amp;#34;Cœurs GPU / Neural Engine&amp;#34;] &amp;lt;--&amp;gt; C[&amp;#34;Contrôleur de Mémoire Partagée&amp;#34;]
C[&amp;#34;Contrôleur de Mémoire Partagée&amp;#34;] &amp;lt;--&amp;gt; D[&amp;#34;Pool de Mémoire Unifiée (ex. 192 Go)&amp;#34;]
end
&lt;/pre>
&lt;p>Le plus grand avantage de cette architecture est l&amp;rsquo;absence de frontière distincte comme la VRAM, ce qui permet d&amp;rsquo;utiliser la quasi-totalité de la mémoire système telle quelle pour charger des LLM gigantesques. Avec un Mac Studio disposant de 192 Go de mémoire unifiée, il est possible de charger des modèles colossaux de la classe des 70B ou plus (comme Grok-1) sur un seul appareil sans quantification, et de réaliser des inférences rapides. La bande passante d&amp;rsquo;accès à la mémoire atteint 800 Go/s sur le M2 Ultra, rivalisant avec les vitesses des GPU discrets grand public. C&amp;rsquo;est une approche extrêmement puissante qui résout le dilemme entre &amp;ldquo;capacité de mémoire&amp;rdquo; et &amp;ldquo;bande passante&amp;rdquo; au niveau matériel.&lt;/p>
&lt;hr>
&lt;h1 id="3-techniques-déconomie-de-vram-lors-de-lapprentissage-fine-tuning">3. Techniques d&amp;rsquo;économie de VRAM lors de l&amp;rsquo;apprentissage (Fine-Tuning)
&lt;/h1>&lt;p>De nombreuses percées ont également été réalisées lors de l&amp;rsquo;apprentissage (Training), qui nécessite encore plus de VRAM que l&amp;rsquo;inférence. Pour effectuer un fine-tuning avec des ressources limitées, il est indispensable de combiner les technologies suivantes.&lt;/p>
&lt;h2 id="31-points-de-contrôle-de-gradient-gradient-checkpointing">3.1 Points de contrôle de gradient (Gradient Checkpointing)
&lt;/h2>&lt;p>Dans la rétropropagation (backpropagation) du Deep Learning, afin de calculer les gradients, il est nécessaire de conserver en mémoire toutes les sorties intermédiaires (Activations) de toutes les couches lors de la propagation avant (forward pass). Si la longueur de la séquence ou la taille du lot augmente, cette mémoire d&amp;rsquo;activation commence à dominer la VRAM.&lt;/p>
&lt;p>Le &lt;strong>Gradient Checkpointing (Points de contrôle de gradient / Activation Recomputation)&lt;/strong> est une technique géniale qui exploite le compromis entre la capacité de mémoire et le temps de calcul (Compute).
Plutôt que de sauvegarder toutes les sorties intermédiaires en mémoire, seules les sorties de certaines couches spécifiques (points de contrôle) sont sauvegardées. Lors de la rétropropagation, si une valeur intermédiaire non sauvegardée est nécessaire, &lt;strong>la propagation avant est recalculée à partir du point de contrôle le plus proche sauvegardé pour restaurer la valeur&lt;/strong>.&lt;/p>
&lt;p>Bien que la quantité de calcul augmente d&amp;rsquo;environ 20 à 30 % et que le temps total d&amp;rsquo;apprentissage s&amp;rsquo;allonge, la consommation de VRAM due aux activations peut être drastiquement réduite de $O(N)$ ($N$ étant le nombre de couches) à $O(\sqrt{N})$. C&amp;rsquo;est un paramètre tellement essentiel que l&amp;rsquo;on pourrait dire que l&amp;rsquo;apprentissage des modèles à grande échelle actuels ne pourrait même pas commencer sans lui.&lt;/p>
&lt;h2 id="32-lora-et-qlora-low-rank-adaptation">3.2 LoRA et QLoRA (Low-Rank Adaptation)
&lt;/h2>&lt;p>L&amp;rsquo;acteur principal qui a résolu fondamentalement le manque de VRAM est &lt;strong>LoRA&lt;/strong>, le représentant phare du PEFT (Parameter-Efficient Fine-Tuning).&lt;/p>
&lt;p>La gigantesque matrice de poids d&amp;rsquo;origine $W_0 \in \mathbb{R}^{d \times k}$ du modèle est gelée (Frozen) et n&amp;rsquo;est pas entraînée. À la place, deux très petites matrices de rang faible $A \in \mathbb{R}^{r \times k}$ et $B \in \mathbb{R}^{d \times r}$ sont introduites en parallèle, et seuls ces $A$ et $B$ sont entraînés. (Ici, le rang $r$ est une petite valeur telle que $r \ll d, k$).&lt;/p>
$$ W_{adapted} = W_0 + \Delta W = W_0 + B A $$&lt;p>Cela permet de réduire le nombre de paramètres à entraîner à moins de 1 % (parfois moins de 0,1 %) de l&amp;rsquo;original, ce qui réduit considérablement les &amp;ldquo;gradients&amp;rdquo; et les &amp;ldquo;états de l&amp;rsquo;optimiseur&amp;rdquo; qui engloutissaient massivement la mémoire à moins de 1 %.&lt;/p>
&lt;p>De plus, &lt;strong>QLoRA (Quantized LoRA)&lt;/strong> a poussé ce concept à l&amp;rsquo;extrême.
Dans QLoRA, les poids du modèle de base $W_0$ sont quantifiés à l&amp;rsquo;extrême en 4 bits (format NF4 : NormalFloat4) et chargés dans la VRAM. Ensuite, les petites matrices de LoRA $A, B$ sont entraînées en BF16 (16 bits) afin de préserver la précision des calculs.
Tout en réduisant la taille VRAM du modèle de base au quart grâce à la quantification 4 bits, QLoRA utilise une technologie appelée &lt;strong>Paged Optimizers&lt;/strong> (Optimiseurs paginés), qui sauvegarde automatiquement les états de l&amp;rsquo;optimiseur vers la RAM CPU de manière temporaire lorsque la VRAM est sur le point de s&amp;rsquo;épuiser. Cela a rendu possible le fine-tuning de modèles hyper-gigantesques comme le Llama 3 70B, même sur un seul GPU disposant de 24 Go de VRAM (comme une RTX 4090).&lt;/p>
&lt;h2 id="33-deepspeed-zero-et-le-déchargement-offloading">3.3 DeepSpeed ZeRO et le Déchargement (Offloading)
&lt;/h2>&lt;p>Dans les environnements utilisant plusieurs GPU (Multi-GPU), une simple parallélisation des données (Data Parallelism) ne résout pas le problème de VRAM. Car chaque GPU conserve une copie complète du modèle, ce qui fait que la limite de la capacité VRAM individuelle ne peut être dépassée.&lt;/p>
&lt;p>&lt;strong>ZeRO (Zero Redundancy Optimizer)&lt;/strong> de la bibliothèque &lt;strong>DeepSpeed&lt;/strong> développée par Microsoft est une technologie qui divise (shard) minutieusement les paramètres du modèle, les gradients et les états de l&amp;rsquo;optimiseur entre plusieurs GPU. Ainsi, la &amp;ldquo;somme totale&amp;rdquo; de la VRAM de plusieurs GPU peut être traitée comme un seul gigantesque pool de mémoire.&lt;/p>
&lt;pre class="mermaid">
graph TD
subgraph &amp;#34;ZeRO Stage 3 (Partitionnement des Paramètres)&amp;#34;
A[&amp;#34;GPU 0&amp;#34;] --&amp;gt; D[&amp;#34;Partition 0 (Stocke 1/3 des Poids/Grads/Opts)&amp;#34;]
B[&amp;#34;GPU 1&amp;#34;] --&amp;gt; E[&amp;#34;Partition 1 (Stocke 1/3 des Poids/Grads/Opts)&amp;#34;]
C[&amp;#34;GPU 2&amp;#34;] --&amp;gt; F[&amp;#34;Partition 2 (Stocke 1/3 des Poids/Grads/Opts)&amp;#34;]
end
D[&amp;#34;Partition 0 (Stocke 1/3 des Poids/Grads/Opts)&amp;#34;] &amp;lt;--&amp;gt; E[&amp;#34;Partition 1 (Stocke 1/3 des Poids/Grads/Opts)&amp;#34;]
E[&amp;#34;Partition 1 (Stocke 1/3 des Poids/Grads/Opts)&amp;#34;] &amp;lt;--&amp;gt; F[&amp;#34;Partition 2 (Stocke 1/3 des Poids/Grads/Opts)&amp;#34;]
&lt;/pre>
&lt;ul>
&lt;li>&lt;strong>ZeRO Stage 1 :&lt;/strong> Répartit les états de l&amp;rsquo;optimiseur sur chaque GPU&lt;/li>
&lt;li>&lt;strong>ZeRO Stage 2 :&lt;/strong> Répartit également les gradients sur chaque GPU&lt;/li>
&lt;li>&lt;strong>ZeRO Stage 3 :&lt;/strong> Répartit même les paramètres du modèle (poids) sur chaque GPU&lt;/li>
&lt;/ul>
&lt;p>De plus, en utilisant la fonction &lt;strong>ZeRO-Offload&lt;/strong>, il est possible de décharger (offload) les calculs de mise à jour des états de l&amp;rsquo;optimiseur et des gradients répartis par ZeRO vers &lt;strong>la mémoire du CPU&lt;/strong> au lieu du GPU, pour les faire exécuter par le processeur hôte. Cela allège à l&amp;rsquo;extrême la charge sur la VRAM du GPU, permettant l&amp;rsquo;apprentissage de modèles géants même dans des environnements GPU limités. Comme les calculs sont effectués sur le CPU et les résultats renvoyés au GPU via PCIe, la vitesse d&amp;rsquo;apprentissage diminue, mais cela permet d&amp;rsquo;éviter le pire des scénarios : &amp;ldquo;un plantage de l&amp;rsquo;apprentissage dû à un manque de mémoire&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h1 id="4-exemples-dimplémentation--hugging-face-accelerate-et-deepspeed">4. Exemples d&amp;rsquo;Implémentation : Hugging Face Accelerate et DeepSpeed
&lt;/h1>&lt;p>Pour finir, voici des exemples simples de la façon dont on implémente concrètement le déchargement CPU et l&amp;rsquo;optimisation VRAM en code Python.&lt;/p>
&lt;h2 id="41-déchargement-automatique-avec-device_mapauto-de-hugging-face">4.1 Déchargement automatique avec device_map=&amp;ldquo;auto&amp;rdquo; de Hugging Face
&lt;/h2>&lt;p>L&amp;rsquo;utilisation des bibliothèques &lt;code>transformers&lt;/code> et &lt;code>accelerate&lt;/code> de Hugging Face permet de répartir automatiquement les couches entre le GPU et le CPU lors du chargement du modèle.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">transformers&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AutoModelForCausalLM&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">AutoTokenizer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model_id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;meta-llama/Llama-2-13b-hf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Avec device_map=&amp;#34;auto&amp;#34;, ce qui ne rentre pas dans la VRAM est déchargé vers la RAM CPU&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># load_in_8bit=True quantifie les poids en 8 bits pour encore plus d&amp;#39;économies de mémoire&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AutoModelForCausalLM&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_pretrained&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model_id&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">device_map&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;auto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">load_in_8bit&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">offload_folder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;offload_dir&amp;#34;&lt;/span> &lt;span class="c1"># Si insuffisant, il est même possible de décharger sur disque (SSD)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>En exécutant ce code, la bibliothèque sous-jacente &lt;code>accelerate&lt;/code> analyse la capacité libre de la VRAM du système et de la RAM du CPU, puis organise (Dispatch) le placement des couches de la manière la plus optimale.&lt;/p>
&lt;h2 id="42-configuration-du-déchargement-cpu-de-deepspeed-zero-2">4.2 Configuration du déchargement CPU de DeepSpeed (ZeRO-2)
&lt;/h2>&lt;p>Voici un exemple de fichier de configuration (JSON) pour activer le déchargement CPU avec DeepSpeed pendant l&amp;rsquo;apprentissage.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;fp16&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;zero_optimization&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;stage&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;offload_optimizer&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;device&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;cpu&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;pin_memory&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allgather_partitions&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;allgather_bucket_size&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">2e8&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;overlap_comm&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;reduce_scatter&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;reduce_bucket_size&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">2e8&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;contiguous_gradients&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;train_batch_size&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">16&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;gradient_accumulation_steps&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dans cette configuration, en assignant &lt;code>&amp;quot;cpu&amp;quot;&lt;/code> à &lt;code>offload_optimizer&lt;/code>, la conservation de l&amp;rsquo;état et les calculs de mise à jour de l&amp;rsquo;optimiseur (comme Adam), qui consomment massivement de la VRAM, sont exécutés par le CPU côté système. Cela permet à la VRAM du GPU de se consacrer exclusivement à la tâche la plus importante : les calculs forward/backward du modèle. En paramétrant &lt;code>pin_memory: true&lt;/code>, on empêche les défauts de page (page faults) et on accélère au maximum les transferts PCIe entre CPU et GPU.&lt;/p>
&lt;hr>
&lt;h1 id="conclusion">Conclusion
&lt;/h1>&lt;p>Dans le développement de l&amp;rsquo;IA, le manque de mémoire GPU (Out of Memory) est un problème éternel qui continuera de hanter les développeurs à mesure que l&amp;rsquo;échelle des modèles s&amp;rsquo;agrandit. Cependant, en combinant intelligemment une compréhension approfondie du matériel (architecture) et des techniques d&amp;rsquo;optimisation au niveau logiciel et algorithmique, telles que présentées dans cet article, il devient possible de réaliser des inférences et des apprentissages de modèles géants en environnement local, chose qui pourrait sembler impossible à première vue.&lt;/p>
&lt;p>&lt;strong>Résumé des mesures pour l&amp;rsquo;inférence :&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Quantification (INT4 / INT8 / FP8) :&lt;/strong> Compresser de manière drastique la taille du modèle lui-même et réduire l&amp;rsquo;occupation de la VRAM.&lt;/li>
&lt;li>&lt;strong>Déchargement CPU :&lt;/strong> Évacuer vers la mémoire système les couches qui ne rentrent pas dans la VRAM (au prix d&amp;rsquo;un compromis avec la baisse de vitesse due à la bande passante PCIe).&lt;/li>
&lt;li>&lt;strong>Optimisation du cache KV :&lt;/strong> Assurer la longueur du contexte (Context Length) grâce à la pagination (PagedAttention), la quantification du cache ou FlashAttention.&lt;/li>
&lt;li>&lt;strong>Utilisation de la mémoire unifiée :&lt;/strong> Exploiter les UMA, comme Apple Silicon, pour utiliser directement une mémoire de grande capacité pour l&amp;rsquo;inférence.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Résumé des mesures pour l&amp;rsquo;apprentissage :&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>PEFT (LoRA / QLoRA) :&lt;/strong> Limiter les paramètres à entraîner et quantifier à l&amp;rsquo;extrême le modèle de base.&lt;/li>
&lt;li>&lt;strong>Points de contrôle de gradient (Gradient Checkpointing) :&lt;/strong> Éviter de conserver les sorties intermédiaires de la propagation avant et les recalculer lors de la rétropropagation, afin de limiter la consommation VRAM en échange de temps de calcul.&lt;/li>
&lt;li>&lt;strong>ZeRO &amp;amp; Déchargement CPU (DeepSpeed) :&lt;/strong> Répartir les états de l&amp;rsquo;optimiseur et les gradients sur plusieurs GPU, ou les décharger sur la mémoire CPU pour dépasser les limites de la VRAM.&lt;/li>
&lt;/ol>
&lt;p>En maîtrisant ces technologies avancées, maximisons les performances de développement de l&amp;rsquo;IA dans les limites de nos ressources matérielles. Dans ce domaine qui évolue à pas de géant, de nouveaux algorithmes d&amp;rsquo;économie de mémoire devraient continuer d&amp;rsquo;apparaître. La clé sera de vérifier régulièrement l&amp;rsquo;évolution des dernières bibliothèques et de les intégrer dans vos implémentations.&lt;/p></description></item></channel></rss>