<?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/es/categories/hardware/</link><description>Recent content in Hardware on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/es/categories/hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>¡Para largas sesiones de codificación! 5 teclados mecánicos recomendados para ingenieros</title><link>http://kenji.blog/es/p/engineer-mechanical-keyboard-recommendations/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/es/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 ¡Para largas sesiones de codificación! 5 teclados mecánicos recomendados para ingenieros" />&lt;h1 id="para-largas-sesiones-de-codificación-5-teclados-mecánicos-recomendados-para-ingenieros">¡Para largas sesiones de codificación! 5 teclados mecánicos recomendados para ingenieros
&lt;/h1>&lt;p>Para los profesionales que trabajan en la industria de TI, como programadores, ingenieros de sistemas o científicos de datos, el teclado no es solo un dispositivo de entrada. Es &amp;ldquo;una interfaz para convertir pensamientos en código&amp;rdquo; y la herramienta de trabajo más importante que tocan directamente durante muchas horas todos los días.&lt;/p>
&lt;p>Continuar usando un teclado de mala calidad no solo reduce la velocidad de escritura, sino que también aumenta excesivamente la carga en las articulaciones de la muñeca y los dedos, lo que a su vez incrementa el riesgo de tendinitis (como el síndrome del túnel carpiano). Por el contrario, adquirir un teclado que se adapte a tus manos, tenga una buena sensación al teclear y sea altamente personalizable, es la &amp;ldquo;mejor inversión&amp;rdquo; que mejorará enormemente tanto tu productividad como tu salud.&lt;/p>
&lt;p>En este artículo, dirigido a los ingenieros, iremos más allá de simples &amp;ldquo;recomendaciones&amp;rdquo; y explicaremos exhaustivamente desde la física del teclado hasta los circuitos electrónicos internos y las últimas tecnologías de firmware. A partir de ahí, presentaremos 5 teclados definitivos que verdaderamente soportan el uso práctico.&lt;/p>
&lt;h2 id="1-la-física-y-el-mecanismo-de-los-interruptores-de-teclas">1. La física y el mecanismo de los interruptores de teclas
&lt;/h2>&lt;p>El factor más importante que determina la sensación de escritura de un teclado es el &amp;ldquo;interruptor de tecla&amp;rdquo; (Key Switch). Los interruptores de los teclados mecánicos están compuestos por un resorte y un mecanismo de contacto, y sus características físicas se transmiten como retroalimentación a las yemas de nuestros dedos.&lt;/p>
&lt;h3 id="11-ley-de-hooke-y-constante-del-resorte">1.1 Ley de Hooke y constante del resorte
&lt;/h3>&lt;p>La fuerza de actuación (Actuation Force) de un interruptor mecánico está determinada principalmente por las características del resorte incorporado en su interior. El comportamiento de este resorte se puede aproximar por la &amp;ldquo;Ley de Hooke&amp;rdquo; de la mecánica clásica.&lt;/p>
$$ F = -k x $$&lt;p>Donde $F$ es la fuerza de restauración (la fuerza de repulsión que siente el dedo), $k$ es la constante elástica del resorte y $x$ es la distancia presionada (recorrido).
En el caso de los interruptores lineales (como el Red o Black), siguen casi fielmente esta ley de Hooke, teniendo una característica lineal donde la fuerza de repulsión aumenta proporcionalmente a medida que se presiona.&lt;/p>
&lt;h3 id="12-cálculo-integral-de-la-energía-de-actuación">1.2 Cálculo integral de la energía de actuación
&lt;/h3>&lt;p>El punto donde se reconoce que la tecla ha sido &amp;ldquo;ingresada&amp;rdquo; se llama punto de actuación (Actuation Point). La energía (trabajo) $E$ que el dedo gasta desde que comienza a presionar la tecla hasta alcanzar el punto de actuación $x_a$ se expresa como la integral de la fuerza con respecto a la distancia.&lt;/p>
$$ E = \int_{0}^{x_a} F(x) \, dx $$&lt;p>En el caso de los interruptores táctiles (Brown) o clicleantes (Blue), debido a que existe una resistencia física por el roce de los contactos (tactile bump), $F(x)$ no es una simple función lineal, sino que se convierte en una función que alcanza un pico no lineal en una posición específica del recorrido.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Inicio de presión con el dedo&amp;#34;] --&amp;gt; B{&amp;#34;Tipo de interruptor&amp;#34;}
B --&amp;gt;|Lineal| C[&amp;#34;La resistencia aumenta linealmente&amp;#34;]
B --&amp;gt;|Táctil| D[&amp;#34;Resistencia física en el medio (bump)&amp;#34;]
B --&amp;gt;|Clicky| E[&amp;#34;Mecanismo de sonido se activa junto con el bump&amp;#34;]
C --&amp;gt; F[&amp;#34;Alcanza el punto de actuación (Actuation Point)&amp;#34;]
D --&amp;gt; F
E --&amp;gt; F
F --&amp;gt; G[&amp;#34;Fondo (Bottom Out)&amp;#34;]
&lt;/pre>
&lt;p>Cuando un ingeniero pasa muchas horas codificando, si esta $E$ (energía de actuación) es demasiado grande, los dedos se cansarán fácilmente; si es demasiado pequeña, aumentarán los errores de escritura (typos accidentales). En general, se considera que los interruptores con una fuerza de actuación de alrededor de 45g a 55g equilibran la reducción de la fatiga con la precisión, y son preferidos por muchos ingenieros.&lt;/p>
&lt;h3 id="13-tecnologías-de-interruptores-de-vanguardia-capacitivo-sin-contacto-y-efecto-hall">1.3 Tecnologías de interruptores de vanguardia: Capacitivo sin contacto y Efecto Hall
&lt;/h3>&lt;p>También existen tecnologías de interruptores más avanzadas que no tienen contactos metálicos físicos.&lt;/p>
&lt;p>&lt;strong>Capacitivo sin contacto (Topre)&lt;/strong>
Utiliza un resorte cónico y una cúpula de goma (rubber dome), y determina la entrada detectando el cambio en la capacitancia al ser presionado. Dado que no hay contacto físico, el desgaste es extremadamente bajo y no se produce &amp;ldquo;chattering&amp;rdquo; (fenómeno donde una sola presión resulta en múltiples entradas). El sonido y la sensación táctil única producida por la cúpula de goma tiene un encanto del que es difícil separarse una vez que se prueba.&lt;/p>
&lt;p>&lt;strong>Interruptor magnético (Hall Effect)&lt;/strong>
Aprovechando el efecto Hall, un imán incrustado en el vástago (stem) se acerca a un sensor Hall en la placa base, y el cambio en la densidad del flujo magnético se lee como voltaje.
La fuerza electromotriz $V_H$ por el efecto Hall se expresa mediante la siguiente fórmula.&lt;/p>
$$ V_H = R_H \left( \frac{I \cdot B}{t} \right) $$&lt;p>Donde $R_H$ es el coeficiente de Hall, $I$ es la corriente, $B$ es la densidad de flujo magnético y $t$ es el grosor del conductor. Con esta tecnología, la profundidad de la pulsación de la tecla se puede adquirir continuamente como un valor analógico, lo que permite un control asombroso como &amp;ldquo;cambiar el punto de actuación en unidades de 0.1 mm&amp;rdquo; (Actuation Point Adjustment) o &amp;ldquo;apagar en el instante en que comienza a soltar la tecla&amp;rdquo; (Rapid Trigger).&lt;/p>
&lt;h2 id="2-circuitos-electrónicos-del-teclado-y-métricas-de-rendimiento">2. Circuitos electrónicos del teclado y métricas de rendimiento
&lt;/h2>&lt;p>Incluso si los interruptores son excelentes, si el circuito electrónico y el microcontrolador (Microcontroller) que los procesan tienen un rendimiento bajo, no se puede lograr el mejor rendimiento.&lt;/p>
&lt;h3 id="21-escaneo-de-matriz-y-polling-rate">2.1 Escaneo de matriz y Polling Rate
&lt;/h3>&lt;p>Dentro de un teclado, existen desde decenas hasta más de 100 interruptores, pero el número de pines del microcontrolador es limitado, por lo que es imposible conectar todos los interruptores a pines individuales. Por lo tanto, los interruptores se cablean en una cuadrícula (matriz) de filas (Row) y columnas (Column), y al escanear a alta velocidad, se determina qué tecla se ha presionado.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
M[&amp;#34;Microcontrolador (MCU)&amp;#34;] --&amp;gt;|Cambia la salida Row a 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;Interruptor 1,1&amp;#34;] &amp;amp; S12[&amp;#34;Interruptor 1,2&amp;#34;]
R2 --&amp;gt; S21[&amp;#34;Interruptor 2,1&amp;#34;] &amp;amp; S22[&amp;#34;Interruptor 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;|Detecta el voltaje y lo lee| M
&lt;/pre>
&lt;p>&lt;strong>Polling Rate (Tasa de sondeo)&lt;/strong> es la frecuencia con la que el teclado informa a la PC &amp;ldquo;el estado actual de las teclas&amp;rdquo;. Un teclado estándar es de 125Hz (una vez cada 8ms), pero los modelos de alta gama realizan comunicaciones ultrarrápidas de 1000Hz (una vez cada 1ms), y recientemente hay modelos que llegan a 8000Hz (una vez cada 0.125ms).
Para la codificación, 1000Hz es un rendimiento más que suficiente, pero brinda la tranquilidad de evitar pérdidas al escribir a velocidades ultrarrápidas.&lt;/p>
&lt;h3 id="22-n-key-rollover-nkro-y-anti-ghosting">2.2 N-Key Rollover (NKRO) y Anti-Ghosting
&lt;/h3>&lt;p>&lt;strong>N-Key Rollover (NKRO)&lt;/strong> es la capacidad de reconocer con precisión todas las teclas cuando se presionan múltiples teclas al mismo tiempo. En el pasado, debido a las restricciones de las conexiones USB, había límites como &amp;ldquo;hasta 6 teclas&amp;rdquo;, pero los teclados de alta gama actuales logran una presión simultánea virtualmente ilimitada (Full NKRO) al optimizar los reportes HID de USB.&lt;/p>
&lt;p>Para los ingenieros que usan muchos atajos de teclado complejos en editores como Vim o Emacs (ej. &lt;code>Ctrl + Shift + Alt + cualquier tecla&lt;/code>), el NKRO completo es un requisito indispensable.&lt;/p>
&lt;h3 id="23-retardo-de-debounce-debounce-delay">2.3 Retardo de Debounce (Debounce Delay)
&lt;/h3>&lt;p>En los interruptores mecánicos con contactos metálicos, ocurre un &amp;ldquo;fenómeno de rebote&amp;rdquo; (bounce) en el cual el contacto rebota microscópicamente cuando se presiona o se suelta. El tiempo de procesamiento para que el microcontrolador ignore esto es el &lt;strong>retardo de debounce&lt;/strong>. Normalmente, se establece un retraso intencional de aproximadamente 5ms a 20ms. Sin embargo, en el sistema capacitivo sin contacto y los interruptores magnéticos mencionados anteriormente, dado que no existe ruido de contacto físico, el retardo de debounce se puede ajustar a cero (o un valor mínimo), logrando una respuesta abrumadora.&lt;/p>
&lt;h2 id="3-firmware-y-personalización-qmk--via">3. Firmware y personalización (QMK / VIA)
&lt;/h2>&lt;p>Si el hardware es el &amp;ldquo;cuerpo&amp;rdquo;, el firmware es el &amp;ldquo;cerebro&amp;rdquo; del teclado. Los teclados modernos de alta gama para ingenieros no solo envían códigos de teclas, sino que tienen la capacidad de ejecutar programas avanzados.&lt;/p>
&lt;h3 id="31-qmk-firmware">3.1 QMK Firmware
&lt;/h3>&lt;p>&lt;strong>QMK (Quantum Mechanical Keyboard)&lt;/strong> es un firmware de teclado de código abierto. Está escrito en C y literalmente &amp;ldquo;todo&amp;rdquo; es posible, desde cambiar la asignación de teclas hasta crear macros y controlar animaciones LED.&lt;/p>
&lt;h3 id="32-funciones-avanzadas-de-asignación-de-teclas">3.2 Funciones avanzadas de asignación de teclas
&lt;/h3>&lt;p>Entre las características que ofrece QMK, las siguientes funciones aumentan explosivamente la productividad de los ingenieros:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Función de capas (Layers):&lt;/strong> Al igual que al cambiar entre &amp;ldquo;letras&amp;rdquo; y &amp;ldquo;números&amp;rdquo; en el teclado de un teléfono inteligente, todo el diseño del teclado cambia a otro diferente solo mientras mantienes presionada una tecla específica (como la tecla Fn). Permite introducir flechas, macros y símbolos sin alejar las manos de la posición base.&lt;/li>
&lt;li>&lt;strong>Mod-Tap:&lt;/strong> Asigna diferentes roles a una sola tecla dependiendo de si se hace un &amp;ldquo;toque corto&amp;rdquo; o una &amp;ldquo;pulsación prolongada&amp;rdquo;. Por ejemplo, al configurar la tecla de espacio como &amp;ldquo;Espacio al tocar, Shift al mantener presionado&amp;rdquo; (Space Cadet Shift), es posible un uso efectivo de los pulgares.&lt;/li>
&lt;li>&lt;strong>Home Row Mods:&lt;/strong> Un método para asignar modificadores al mantener presionado (Ctrl, Shift, Alt, GUI) a las teclas de la posición base (ASDF, JKL;, etc.). Elimina la necesidad de sobrecargar el dedo meñique al estirarlo para presionar la tecla Ctrl, reduciendo drásticamente la fatiga de la muñeca para los usuarios de Vim y Emacs.&lt;/li>
&lt;/ul>
&lt;h3 id="33-configuración-en-tiempo-real-con-via--vial">3.3 Configuración en tiempo real con VIA / VIAL
&lt;/h3>&lt;p>La desventaja de QMK era que &amp;ldquo;se necesitaba compilar el código fuente y flashear (escribir) el firmware cada vez que se cambiaba la configuración&amp;rdquo;. Quienes resolvieron esto fueron &lt;strong>VIA&lt;/strong> y &lt;strong>VIAL&lt;/strong>. Estos permiten acceder al teclado desde una aplicación GUI (o en el navegador web) y reescribir el mapa de teclas en tiempo real sin reiniciar.&lt;/p>
&lt;h2 id="4-ergonomía-y-la-ciencia-de-la-distribución-del-teclado">4. Ergonomía y la ciencia de la distribución del teclado
&lt;/h2>&lt;p>El diseño general de las teclas &amp;ldquo;Row-staggered&amp;rdquo; (con filas escalonadas) es un remanente para evitar que los brazos mecánicos de las máquinas de escribir se enredaran, y no se basa en la estructura de la mano humana.&lt;/p>
&lt;pre class="mermaid">
pie title Preferencias de distribución de teclado ideales para ingenieros (Datos estimados)
&amp;#34;Row-staggered (Tradicional)&amp;#34; : 45
&amp;#34;Alice Layout (Ergonómico)&amp;#34; : 15
&amp;#34;Ortholinear (Cuadrícula)&amp;#34; : 10
&amp;#34;Column-staggered (Dividido)&amp;#34; : 30
&lt;/pre>
&lt;p>Existen distribuciones más ergonómicas como las siguientes:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ortholinear (Cuadrícula):&lt;/strong> Una distribución donde las teclas están alineadas en una cuadrícula perfecta, horizontal y verticalmente. Flexionar y extender los dedos se vuelve un movimiento en línea recta, reduciendo los movimientos innecesarios.&lt;/li>
&lt;li>&lt;strong>Column-staggered (Escalonado por columnas):&lt;/strong> Una distribución en la que las columnas verticales están desplazadas para ajustarse a la longitud de los dedos humanos (dedo medio más largo, meñique más corto). Te permite escribir en una postura natural de la mano.&lt;/li>
&lt;li>&lt;strong>Dividido (Split):&lt;/strong> Las manos izquierda y derecha se pueden colocar completamente separadas, permitiéndote escribir en una postura natural con los hombros abiertos y el pecho expandido. Es muy efectivo para prevenir la rigidez en los hombros y la pérdida de la curvatura del cuello.&lt;/li>
&lt;/ul>
&lt;h2 id="5-5-teclados-mecánicos-definitivos-recomendados-para-ingenieros">5. 5 Teclados mecánicos definitivos recomendados para ingenieros
&lt;/h2>&lt;p>Teniendo en cuenta la física, los circuitos electrónicos, el firmware y la ergonomía, hemos seleccionado cuidadosamente 5 teclados para profesionales que pueden soportar largas horas de codificación.&lt;/p>
&lt;hr>
&lt;h3 id="1-serie-keychron-q-q1-pro--q8-etc---la-puerta-de-entrada-al-mundo-de-los-teclados-personalizados">1. Serie Keychron Q (Q1 Pro / Q8, etc.) - La puerta de entrada al mundo de los teclados personalizados
&lt;/h3>&lt;p>Keychron, originaria de Hong Kong, es líder en el reciente boom de teclados personalizados. Entre ellos, la &amp;ldquo;Serie Q&amp;rdquo; adopta un cuerpo pesado completamente de aluminio y una estructura &amp;ldquo;Gasket Mount&amp;rdquo; que ajusta el sonido de escritura al límite.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Interruptores:&lt;/strong> Mecánicos (Hot-swappable. Los interruptores se pueden cambiar libremente)&lt;/li>
&lt;li>&lt;strong>Firmware:&lt;/strong> Totalmente compatible con QMK/VIA&lt;/li>
&lt;li>&lt;strong>Características:&lt;/strong> Interruptor para cambiar entre macOS/Windows. Puedes elegir la distribución que prefieras, como el Alice layout Q8 o la distribución 75% Q1.&lt;/li>
&lt;li>&lt;strong>Ventajas para el ingeniero:&lt;/strong> A pesar de ser un producto comercial, puedes experimentar directamente desde la caja una sensación de escritura suprema y una personalización comparable a un teclado de fabricación casera. Es ideal para configurar una capa de flechas estilo Vim utilizando VIA.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="2-hhkb-studio---el-dispositivo-señalador-todo-en-uno-para-hackers">2. HHKB Studio - El dispositivo señalador todo en uno para hackers
&lt;/h3>&lt;p>&amp;ldquo;Happy Hacking Keyboard (HHKB)&amp;rdquo; es un teclado legendario nacido para los programadores de UNIX. El último &amp;ldquo;HHKB Studio&amp;rdquo; ha evolucionado aún más al adoptar interruptores mecánicos silenciosos desarrollados exclusivamente, en lugar de la tradicional capacitancia sin contacto.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Interruptores:&lt;/strong> Interruptores mecánicos silenciosos y lineales (Fabricados por Kailh, hot-swappable)&lt;/li>
&lt;li>&lt;strong>Características:&lt;/strong> Pointing stick (trackpoint) en el centro del teclado, 4 almohadillas de gestos (gesture pads).&lt;/li>
&lt;li>&lt;strong>Ventajas para el ingeniero:&lt;/strong> Las operaciones del cursor del ratón, el desplazamiento y el cambio de ventanas se completan sin levantar las manos de la posición base en ningún momento. Una vez que experimentes esta sensación de &amp;ldquo;todo se completa en la punta de tus dedos&amp;rdquo;, nunca querrás volver a estirar la mano derecha hacia el ratón.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="3-zsa-moonlander--ergodox-ez---ergonomía-dividida-definitiva">3. ZSA Moonlander / ErgoDox EZ - Ergonomía dividida definitiva
&lt;/h3>&lt;p>La cumbre de los teclados divididos desarrollados por la compañía canadiense ZSA. Como la izquierda y la derecha son independientes y se pueden colocar según el ancho de los hombros, la tensión en los hombros y el cuello se reduce sorprendentemente, incluso durante largas horas de mecanografía.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Interruptores:&lt;/strong> Mecánicos (Compatibles con Cherry MX, hot-swappable)&lt;/li>
&lt;li>&lt;strong>Firmware:&lt;/strong> Basado en QMK (Utiliza su propia y potente herramienta GUI &amp;ldquo;Oryx&amp;rdquo;)&lt;/li>
&lt;li>&lt;strong>Características:&lt;/strong> Distribución Column-staggered, grupo de teclas exclusivo para el pulgar, patas estándar para ajustar la inclinación (tenting).&lt;/li>
&lt;li>&lt;strong>Ventajas para el ingeniero:&lt;/strong> Al asignar Enter, Espacio, Retroceso y Cambio de Capa a los pulgares, se reduce drásticamente la carga sobre el dedo meñique, que es el más débil. Es un dispositivo que se convierte en el salvador para los ingenieros que sufren de síndrome del túnel carpiano.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="4-realforce-r3---confiabilidad-nacional-y-la-sensación-suprema-de-teclear-capacitivo-sin-contacto">4. REALFORCE R3 - Confiabilidad nacional y la sensación suprema de teclear (Capacitivo sin contacto)
&lt;/h3>&lt;p>Una obra maestra japonesa de la que Topre está orgulloso. Su historial de haber sido utilizado durante muchos años en campos profesionales como instituciones financieras no es por nada. A partir de la generación R3, también es compatible con conectividad Bluetooth.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Interruptores:&lt;/strong> Capacitivo sin contacto (Topre)&lt;/li>
&lt;li>&lt;strong>Características:&lt;/strong> Con la función APC (Actuation Point Changer), el punto de actuación se puede configurar tecla por tecla entre 0.8mm, 1.5mm, 2.2mm y 3.0mm.&lt;/li>
&lt;li>&lt;strong>Ventajas para el ingeniero:&lt;/strong> El toque suave de las teclas debido a la ausencia de contactos físicos se denomina &amp;ldquo;toque de pluma&amp;rdquo; (feather touch), y el estrés por repulsión en los dedos se mantiene al mínimo incluso durante largas sesiones de codificación. Es posible una personalización para que solo las teclas presionadas con el dedo meñique (como la &amp;lsquo;A&amp;rsquo; o el Enter) tengan un punto de actuación superficial (0.8mm), respondiendo con solo tocarlas ligeramente.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="5-wooting-60he---respuesta-revolucionaria-gracias-a-los-interruptores-magnéticos">5. Wooting 60HE - Respuesta revolucionaria gracias a los interruptores magnéticos
&lt;/h3>&lt;p>Originalmente desarrollado para jugadores de e-sports, pero su tecnología innovadora también es muy valorada entre los ingenieros que buscan la escritura y la respuesta más rápidas.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Interruptores:&lt;/strong> Lekker Switch (Interruptores magnéticos de efecto Hall)&lt;/li>
&lt;li>&lt;strong>Características:&lt;/strong> Función Rapid Trigger, punto de actuación ajustable en incrementos de 0.1mm desde 0.1mm hasta 4.0mm.&lt;/li>
&lt;li>&lt;strong>Ventajas para el ingeniero:&lt;/strong> Aprovechando la entrada analógica, es posible una configuración extrema (Dynamic Keystroke) como &amp;ldquo;minúscula si se presiona un poco, mayúscula si se presiona más profundo (combinación con Shift)&amp;rdquo;. Además, como la tecla se apaga en el momento en que se levanta ligeramente el dedo, evita la entrada continua involuntaria durante la escritura a alta velocidad, proporcionando una experiencia de entrada precisa sin igual.&lt;/li>
&lt;/ul>
&lt;h2 id="conclusión">Conclusión
&lt;/h2>&lt;p>Elegir un teclado es un proceso de &amp;ldquo;optimización de tu propia interfaz&amp;rdquo; a lo largo de tu carrera como ingeniero. Desde la sensación física de los resortes que obedecen la Ley de Hooke, pasando por la energía de actuación calculada por integración, la construcción de macros con QMK, hasta la ergonomía definitiva, la profundidad a explorar no tiene fin.&lt;/p>
&lt;p>Los cinco teclados presentados en esta ocasión (Keychron, HHKB Studio, Moonlander, REALFORCE, Wooting) son todos obras maestras que apuntan a &amp;ldquo;la mejor experiencia de entrada&amp;rdquo; desde diferentes enfoques. Por favor, encuentra a tu mejor compañero de acuerdo con tu propio estilo de escritura y los problemas físicos que enfrentes.&lt;/p>
&lt;p>La inversión en un teclado sin duda te traerá recompensas en forma de &amp;ldquo;millones de líneas de código sin errores&amp;rdquo;.&lt;/p></description></item><item><title>Configuración de monitores y gadgets para aliviar la fatiga visual de los programadores</title><link>http://kenji.blog/es/p/programmer-eye-strain-relief/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/es/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 Configuración de monitores y gadgets para aliviar la fatiga visual de los programadores" />&lt;p>Para los programadores e ingenieros de software, los &amp;ldquo;ojos&amp;rdquo; son la herramienta más importante y la que más se sobreesfuerza en el trabajo. En una vida en la que pasamos de 8 a 10 horas al día, y a veces más, frente a pantallas de editores, terminales y navegadores, casi todos los ingenieros se enfrentan a la &amp;ldquo;Fatiga visual (Computer Vision Syndrome: CVS)&amp;rdquo;.&lt;/p>
&lt;p>Generalmente, las medidas contra la fatiga visual tienden a limitarse a consejos superficiales como &amp;ldquo;usar gotas para los ojos&amp;rdquo;, &amp;ldquo;tomar descansos adecuados&amp;rdquo; o &amp;ldquo;usar gafas que bloquean la luz azul&amp;rdquo;. Sin embargo, como ingenieros, debemos identificar la causa raíz (Root Cause) del problema y buscar la optimización desde la capa del sistema (entorno).&lt;/p>
&lt;p>En este artículo, desde las perspectivas de la física (óptica), la bioquímica, la ergonomía y la arquitectura de hardware de las pantallas, analizaremos exhaustivamente los mecanismos de la fatiga visual de los programadores. Y para aliviarla, profundizaremos en la configuración definitiva del monitor y los gadgets, intercalando fórmulas matemáticas e ilustraciones.&lt;/p>
&lt;hr>
&lt;h1 id="capítulo-1-desentrañando-los-mecanismos-de-la-fatiga-visual-cvs-desde-la-física-y-la-bioquímica">Capítulo 1: Desentrañando los mecanismos de la fatiga visual (CVS) desde la física y la bioquímica
&lt;/h1>&lt;p>El Síndrome de Visión de Computadora (CVS) no es provocado por un solo factor. Como se muestra en el siguiente gráfico circular, varios elementos se entrelazan de forma compleja para causar fatiga ocular, dolor, ojos secos y una sensación de fatiga sistémica.&lt;/p>
&lt;pre class="mermaid">
pie title Causas del Síndrome de Visión de Computadora (CVS)
&amp;#34;Luz azul y reflejos&amp;#34; : 30
&amp;#34;Parpadeo de pantalla (PWM)&amp;#34; : 25
&amp;#34;Contraste e iluminación inadecuados&amp;#34; : 20
&amp;#34;Fatiga de enfoque (Músculo ciliar)&amp;#34; : 15
&amp;#34;Ojos secos (Parpadeo reducido)&amp;#34; : 10
&lt;/pre>
&lt;p>Aquí, explicaremos especialmente las &amp;ldquo;características físicas de la luz&amp;rdquo; y la &amp;ldquo;función de ajuste de enfoque del globo ocular&amp;rdquo;, que tienen un gran impacto.&lt;/p>
&lt;h2 id="11-características-físicas-de-la-luz-azul-y-energía-de-los-fotones">1.1 Características físicas de la luz azul y energía de los fotones
&lt;/h2>&lt;p>La luz azul (luz de color azul) emitida por las pantallas se sitúa en un rango de longitud de onda de aproximadamente $400 \text{ nm} \sim 490 \text{ nm}$. Por qué esto sobrecarga los ojos puede explicarse mediante la &amp;ldquo;relación de Planck-Einstein&amp;rdquo;, que es la base de la mecánica cuántica.&lt;/p>
&lt;p>La energía de la luz $E$ se expresa con la siguiente fórmula:&lt;/p>
$$ E = h\nu = \frac{hc}{\lambda} $$&lt;p>Aquí, cada variable tiene el siguiente significado:&lt;/p>
&lt;ul>
&lt;li>$E$ : Energía por fotón (Joules)&lt;/li>
&lt;li>$h$ : Constante de Planck ($6.626 \times 10^{-34} \text{ J}\cdot\text{s}$)&lt;/li>
&lt;li>$c$ : Velocidad de la luz en el vacío ($3.0 \times 10^8 \text{ m/s}$)&lt;/li>
&lt;li>$\lambda$ : Longitud de onda de la luz (m)&lt;/li>
&lt;li>$\nu$ : Frecuencia de la luz (Hz)&lt;/li>
&lt;/ul>
&lt;p>El hecho importante que muestra esta fórmula es que &lt;strong>&amp;ldquo;la energía de la luz $E$ es inversamente proporcional a la longitud de onda $\lambda$&amp;rdquo;&lt;/strong>. Es decir, la luz azul, que tiene la longitud de onda más corta dentro de la luz visible, posee una energía extremadamente alta. Estos fotones de alta energía no son fácilmente absorbidos o atenuados por la córnea o el cristalino, alcanzando el fondo de la retina y causando un fuerte estrés oxidativo en las células fotorreceptoras.&lt;/p>
&lt;h2 id="12-aberración-cromática-chromatic-aberration-y-desenfoque">1.2 Aberración cromática (Chromatic Aberration) y desenfoque
&lt;/h2>&lt;p>Además, desde el punto de vista óptico, la diferencia en la longitud de onda de la luz produce una diferencia en el &amp;ldquo;índice de refracción&amp;rdquo;. El índice de refracción $n$ de un medio (como el cristalino en este caso) depende de la longitud de onda $\lambda$ y se aproxima por la fórmula de dispersión de Cauchy:&lt;/p>
$$ n(\lambda) = B + \frac{C}{\lambda^2} $$&lt;p>($B, C$ son constantes específicas del medio)&lt;/p>
&lt;p>Como se puede ver en esta fórmula, cuanto más corta es la longitud de onda $\lambda$ de la luz azul, mayor es el índice de refracción $n$. Por lo tanto, incluso si la luz roja y otras están enfocadas exactamente en la retina, la luz azul se refracta considerablemente y forma la imagen &lt;strong>frente a la retina&lt;/strong>.
Cuando el cerebro percibe este &amp;ldquo;desenfoque de imagen debido a la luz azul (aberración cromática)&amp;rdquo;, envía continuamente señales al músculo ciliar para intentar reajustar el enfoque. Este es un factor importante por el cual los músculos del ojo se fatigan de forma subconsciente.&lt;/p>
&lt;h2 id="13-músculo-de-ajuste-de-enfoque-músculo-ciliar-y-la-fórmula-de-las-lentes">1.3 Músculo de ajuste de enfoque (músculo ciliar) y la fórmula de las lentes
&lt;/h2>&lt;p>Cuando enfocamos un texto pequeño en el monitor, estamos ajustando el grosor del cristalino (lente) dentro de nuestros ojos. La fórmula de las lentes delgadas es la siguiente:&lt;/p>
$$ \frac{1}{f} = \frac{1}{a} + \frac{1}{b} $$&lt;ul>
&lt;li>$f$: Distancia focal del cristalino&lt;/li>
&lt;li>$a$: Distancia del ojo al monitor (distancia del objeto)&lt;/li>
&lt;li>$b$: Distancia del cristalino a la retina (distancia de la imagen: aproximadamente constante en $24 \text{ mm}$ en el globo ocular de un adulto)&lt;/li>
&lt;/ul>
&lt;p>Durante la programación, si la distancia al monitor $a$ es corta (ejemplo: $40 \text{ cm} \sim 50 \text{ cm}$) y se mantiene por mucho tiempo, para formar una imagen exacta en la retina (mantener $b$ constante), debemos mantener la distancia focal $f$ extremadamente corta. Cuando el músculo ciliar se mantiene en un estado de contracción extrema durante horas, el músculo sufre espasmos, causando una fatiga visual severa acompañada de rigidez en los hombros y dolores de cabeza.&lt;/p>
&lt;hr>
&lt;h1 id="capítulo-2-selección-del-hardware-de-pantalla-y-eliminación-de-factores-de-fatiga">Capítulo 2: Selección del hardware de pantalla y eliminación de factores de fatiga
&lt;/h1>&lt;p>Para reducir la fatiga ocular, antes de configurar el software, primero debe comprobar y mejorar las especificaciones del hardware. En particular, el &amp;ldquo;método de atenuación&amp;rdquo; y la &amp;ldquo;tasa de refresco&amp;rdquo; son puntos en los que no se debe comprometer.&lt;/p>
&lt;h2 id="21-el-terror-de-la-atenuación-pwm-descubriendo-el-parpadeo-invisible">2.1 El terror de la atenuación PWM: Descubriendo el parpadeo invisible
&lt;/h2>&lt;p>Las tecnologías para ajustar el brillo de los monitores de cristal líquido (LCD) y OLED se dividen en términos generales en &amp;ldquo;Atenuación DC (Direct Current)&amp;rdquo; y &amp;ldquo;Atenuación PWM (Pulse-Width Modulation)&amp;rdquo;.&lt;/p>
&lt;p>La atenuación PWM ajusta el brillo de la pantalla de forma pseudo-óptica haciendo parpadear los LED de retroiluminación a una velocidad tan alta que es invisible para el ojo humano, cambiando la proporción del &amp;ldquo;tiempo de encendido&amp;rdquo; y el &amp;ldquo;tiempo de apagado&amp;rdquo;. El brillo promedio $L$ según el ciclo de trabajo (Duty Cycle) de PWM se expresa con la siguiente fórmula:&lt;/p>
$$ L = L_{max} \times \frac{T_{on}}{T_{on} + T_{off}} \times 100 \ (\%) $$&lt;ul>
&lt;li>$T_{on}$ : Tiempo que el LED está encendido&lt;/li>
&lt;li>$T_{off}$ : Tiempo que el LED está apagado&lt;/li>
&lt;li>$L_{max}$ : Brillo máximo en el pico&lt;/li>
&lt;/ul>
&lt;p>Cuando la frecuencia de atenuación PWM es baja (ejemplo: $200 \text{ Hz} \sim 300 \text{ Hz}$), aunque no sienta conscientemente el parpadeo (flicker) de la pantalla, su cerebro y pupilas reaccionarán subconscientemente a la luz intermitente, repitiendo la dilatación y constricción de la pupila. Esto causa fatiga extrema, dolores de cabeza y, en ocasiones, náuseas.&lt;/p>
&lt;p>&lt;strong>【Método de detección y contramedidas para PWM】&lt;/strong>
Para comprobar si su monitor utiliza atenuación PWM, abra la aplicación de cámara de su teléfono inteligente y, en modo &amp;ldquo;cámara lenta&amp;rdquo;, intente grabar una pantalla blanca (como una página en blanco en el navegador). Si se ven bandas negras (banding) moviéndose en el vídeo, significa que ese monitor emplea atenuación PWM de baja frecuencia.
Al elegir un monitor, los programadores siempre deben optar por aquellos que indiquen explícitamente &lt;strong>&amp;ldquo;Libre de parpadeos (Flicker-Free / atenuación DC)&amp;rdquo;&lt;/strong> en sus especificaciones.&lt;/p>
&lt;h2 id="22-tasa-de-refresco-hz-y-el-impacto-oftalmológico-del-desenfoque-de-movimiento">2.2 Tasa de refresco (Hz) y el impacto oftalmológico del desenfoque de movimiento
&lt;/h2>&lt;p>La tasa de refresco es un valor (Hz) que indica cuántas veces por segundo el monitor actualiza la pantalla.
Los monitores de oficina típicos son de $60 \text{ Hz}$, pero en los últimos años se han popularizado los monitores de alta tasa de refresco de $120 \text{ Hz}$ o $144 \text{ Hz}$. Esto es extremadamente beneficioso no solo para los jugadores, sino también para los programadores.&lt;/p>
&lt;p>Al desplazarse por grandes cantidades de código o cuando una gran cantidad de registros fluyen en el terminal, en una pantalla de $60 \text{ Hz}$, se produce un &amp;ldquo;desenfoque de movimiento (motion blur)&amp;rdquo; combinado con el límite de la velocidad de respuesta de los píxeles. Durante el desplazamiento, sus ojos intentan capturar inconscientemente la forma del texto para mantenerlo enfocado, pero si los caracteres están borrosos, la carga de procesamiento en la corteza visual del cerebro aumenta dramáticamente.
Con una pantalla de $120 \text{ Hz}$ o más, el texto en movimiento se puede ver claramente, por lo que esta carga subconsciente de movimiento ocular y ajuste de enfoque se puede reducir significativamente.&lt;/p>
&lt;h2 id="23-tipos-de-paneles-y-relación-de-contraste-ips-va-oled">2.3 Tipos de paneles y relación de contraste (IPS, VA, OLED)
&lt;/h2>&lt;p>La relación de contraste de la pantalla afecta directamente la legibilidad del texto.
La &amp;ldquo;Ley de Weber-Fechner&amp;rdquo;, que establece que la magnitud de la sensación humana es proporcional al logaritmo del estímulo, se expresa mediante la siguiente fórmula:&lt;/p>
$$ p = k \ln \left( \frac{S}{S_0} \right) $$&lt;p>($p$: magnitud de la sensación, $S$: magnitud física del estímulo, $S_0$: umbral, $k$: constante)&lt;/p>
&lt;p>En otras palabras, el ojo humano reacciona más fuertemente a la &amp;ldquo;proporción de brillo relativo (contraste)&amp;rdquo; que al brillo absoluto.
Cuando se lee código con resaltado de sintaxis durante largos períodos, los paneles VA con negros profundos (alta relación de contraste, ej: $3000:1$) o los paneles OLED que pueden apagar completamente los píxeles individuales ($1,000,000:1$ o más) hacen que los contornos de las letras sean muy nítidos, mejorando la visibilidad.
Sin embargo, como se mencionará más adelante, ver una pantalla de contraste extremadamente alto en una habitación completamente oscura hará que sus pupilas se contraigan demasiado, causando fatiga, por lo que es esencial equilibrarla con la luz ambiental.&lt;/p>
&lt;p>El siguiente gráfico compara la imagen del espectro de emisión de un monitor LCD estándar con el OLED (diseño de reducción de luz azul) que ha llamado la atención recientemente.&lt;/p>
&lt;pre class="mermaid">
xychart-beta
title Comparación del espectro de emisión de luz azul
x-axis &amp;#34;Longitud de onda (nm)&amp;#34; [400, 420, 440, 460, 480, 500]
y-axis &amp;#34;Intensidad relativa&amp;#34; 0 --&amp;gt; 100
bar &amp;#34;LCD estándar (W-LED)&amp;#34; [10, 30, 95, 80, 40, 20]
line &amp;#34;OLED moderno / Baja luz azul&amp;#34; [5, 10, 40, 75, 55, 30]
&lt;/pre>
&lt;hr>
&lt;h1 id="capítulo-3-calibración-de-monitores-y-configuración-del-sosoftware">Capítulo 3: Calibración de monitores y configuración del SO/Software
&lt;/h1>&lt;p>Tan importante como elegir el hardware es gestionar el espacio de color y la calibración en el lado del sistema operativo.&lt;/p>
&lt;h2 id="31-la-trampa-de-la-gama-de-colores-srgb-vs-dci-p3-y-los-perfiles-icc">3.1 La trampa de la gama de colores (sRGB vs DCI-P3) y los perfiles ICC
&lt;/h2>&lt;p>Los monitores recientes suelen presumir de una &amp;ldquo;amplia gama de colores&amp;rdquo;, como cubrir más del 95% de DCI-P3, pero esto puede ser contraproducente para fines de programación.
En un entorno Windows, si se usa un monitor de amplia gama de colores sin aplicar el perfil ICC (International Color Consortium) adecuado, el resaltado de sintaxis de VS Code especificado en el sRGB estándar (por ejemplo, colores de advertencia rojos o verdes) se mostrará de forma antinaturalmente colorida (sobresaturada).
Como estos colores intensos irritan los ojos, se recomienda encarecidamente instalar el perfil ICC correcto desde la configuración de pantalla del sistema operativo o cambiar al &amp;ldquo;modo de emulación sRGB&amp;rdquo; en la configuración OSD del monitor.&lt;/p>
&lt;p>El siguiente diagrama de secuencia muestra el proceso mediante el cual se aplica el perfil ICC correcto y se renderizan colores agradables a la vista.&lt;/p>
&lt;pre class="mermaid">
sequenceDiagram
participant OS as &amp;#34;Sistema Operativo&amp;#34;
participant LUT as &amp;#34;LUT de Color (Tabla de Búsqueda)&amp;#34;
participant Mon as &amp;#34;Pantalla del Monitor&amp;#34;
participant Eye as &amp;#34;Ojo del Programador&amp;#34;
OS-&amp;gt;&amp;gt;LUT: &amp;#34;Cargar el perfil ICC correcto (ej. sRGB)&amp;#34;
OS-&amp;gt;&amp;gt;LUT: &amp;#34;Aplicar configuración de luz nocturna (3400K)&amp;#34;
LUT-&amp;gt;&amp;gt;Mon: &amp;#34;Ajustar salida de señal RGB&amp;#34;
Mon-&amp;gt;&amp;gt;Eye: &amp;#34;Renderizar colores precisos y desaturados&amp;#34;
Eye--&amp;gt;&amp;gt;Eye: &amp;#34;Reducción de la tensión cortical visual&amp;#34;
&lt;/pre>
&lt;h2 id="32-soluciones-de-software-flux--night-light">3.2 Soluciones de software (f.lux / Night Light)
&lt;/h2>&lt;p>El software que cambia dinámicamente la temperatura de color (Color Temperature) según la hora del día es la medida más fácil y eficaz contra la luz azul.&lt;/p>
&lt;ul>
&lt;li>Windows: &lt;strong>Night Light (Luz nocturna)&lt;/strong>&lt;/li>
&lt;li>macOS: &lt;strong>Night Shift&lt;/strong>&lt;/li>
&lt;li>Terceros: &lt;strong>f.lux&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>La temperatura de color se expresa en Kelvin ($\text{K}$). La luz solar durante el día es de aproximadamente $5500\text{K} \sim 6500\text{K}$ (luz blanco-azulada), pero si nos exponemos a esta luz continuamente, la secreción de &amp;ldquo;melatonina (hormona del sueño)&amp;rdquo; en la glándula pineal del cerebro se suprime.
A partir de la tarde, utilizar estos programas para reducir la temperatura de color a $3400\text{K} \sim 1900\text{K}$ (tonos cálidos naranja-rojo) reduce físicamente la emisión de luz azul, mantiene la normalidad del ritmo circadiano (reloj biológico) y previene la llegada de fotones de alta energía al globo ocular.&lt;/p>
&lt;hr>
&lt;h1 id="capítulo-4-soluciones-de-hardware-definitivas-introducción-de-los-últimos-gadgets">Capítulo 4: Soluciones de hardware definitivas: Introducción de los últimos gadgets
&lt;/h1>&lt;p>Si su fatiga ocular persiste incluso después de aplicar las medidas analizadas hasta ahora, es hora de invertir en gadgets externos para cambiar drásticamente su entorno.&lt;/p>
&lt;h2 id="41-iluminación-sesgada-bias-lighting-y-barras-de-luz-para-monitores-screenbar">4.1 Iluminación sesgada (Bias Lighting) y barras de luz para monitores (ScreenBar)
&lt;/h2>&lt;p>Mirar fijamente a un monitor brillante en una habitación oscura crea un contraste severo entre el centro (alto brillo) y la periferia de su visión (bajo brillo). A esto se le llama &lt;strong>&amp;ldquo;Deslumbramiento molesto (Discomfort Glare)&amp;rdquo;&lt;/strong>.
Bajo este entorno, los ojos intentan captar luz abriendo las pupilas, mientras que simultáneamente intentan cerrarlas contra el deslumbramiento central. Este estado conflictivo fatiga severamente el músculo del iris.&lt;/p>
&lt;p>La solución para esto es la &amp;ldquo;Iluminación sesgada (Bias Lighting)&amp;rdquo;.
Lo que recomendamos especialmente son las &amp;ldquo;barras de luz que se cuelgan del monitor&amp;rdquo;, como la &lt;strong>BenQ ScreenBar&lt;/strong>.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Entorno de habitación oscura&amp;#34;] --&amp;gt; B[&amp;#34;Alto contraste de brillo (Monitor vs Habitación)&amp;#34;]
B --&amp;gt; C[&amp;#34;Conflicto de constricción/dilatación pupilar&amp;#34;]
C --&amp;gt; D[&amp;#34;Fatiga severa del músculo del iris&amp;#34;]
A --&amp;gt; E[&amp;#34;Instalar barra de luz para monitor (ej., ScreenBar)&amp;#34;]
E --&amp;gt; F[&amp;#34;Diseño óptico asimétrico (Sin reflejos en pantalla)&amp;#34;]
F --&amp;gt; G[&amp;#34;Brillo ambiental equilibrado&amp;#34;]
G --&amp;gt; H[&amp;#34;Iris relajado y fatiga visual aliviada&amp;#34;]
&lt;/pre>
&lt;p>La principal característica de la ScreenBar es su &amp;ldquo;Diseño óptico asimétrico (Asymmetrical Optical Design)&amp;rdquo;. Gracias a reflectores y lentes especiales, no emite luz directamente sobre la pantalla del monitor (evitando reflejos y deslumbramientos en la pantalla), iluminando de forma uniforme y exclusiva el espacio del teclado frente a usted y el área detrás del monitor. Esto alivia drásticamente la diferencia de brillo (relación de contraste) en todo el campo visual y hace desaparecer la carga sobre los ojos.&lt;/p>
&lt;h2 id="42-el-cambio-de-paradigma-de-las-pantallas-e-ink-dasung-y-boox">4.2 El cambio de paradigma de las pantallas E-Ink (Dasung y Boox)
&lt;/h2>&lt;p>Al leer grandes referencias de API, libros técnicos (PDF) o código, lo que podemos llamar la solución definitiva moderna es usar una &lt;strong>&amp;ldquo;Pantalla de E-Ink (papel electrónico)&amp;rdquo;&lt;/strong> como monitor secundario.&lt;/p>
&lt;p>A diferencia del LCD y OLED, las pantallas E-Ink no tienen su propia retroiluminación. Mueven partículas de pigmento blanco y negro cargadas (como dióxido de titanio) dentro de microcápsulas utilizando voltaje (método electroforético) y muestran texto reflejando la luz ambiental.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Emisión física de luz azul: Cero&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Parpadeo (Flicker) asociado con PWM o actualización: Completamente cero&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>Si coloca monitores E-Ink como la serie &lt;strong>Dasung Paperlike&lt;/strong> (ej. 25,3 pulgadas) o el &lt;strong>Onyx Boox Mira&lt;/strong> en orientación vertical como monitores secundarios dedicados al texto, puede leer documentos con la misma sensación que si estuviera leyendo material impreso en papel.
Tienen el inconveniente de la latencia de dibujo (baja tasa de refresco), pero si nos limitamos al &amp;ldquo;uso para lectura de texto estático&amp;rdquo; en un entorno de programación, no existe un dispositivo más amigable con la vista en el planeta.&lt;/p>
&lt;hr>
&lt;h1 id="capítulo-5-ergonomía-ingeniería-humana-y-reglas-operativas">Capítulo 5: Ergonomía (Ingeniería humana) y reglas operativas
&lt;/h1>&lt;p>Por muy excelente que sea el hardware que prepare, carecerá de sentido si la postura y las reglas de funcionamiento del ser humano que lo utiliza son incorrectas.&lt;/p>
&lt;h2 id="51-dinámica-de-fluidos-del-ojo-seco-y-ángulo-de-visión">5.1 Dinámica de fluidos del ojo seco y ángulo de visión
&lt;/h2>&lt;p>El ojo seco no es solo una sensación incómoda de &amp;ldquo;ojos resecos&amp;rdquo;; cuando se destruye la capa de lágrimas en la superficie de la córnea, la luz se refleja de forma difusa, la visión se vuelve borrosa y, como resultado, se crea un círculo vicioso que induce aún más fatiga visual (uso excesivo del músculo ciliar).
La cantidad de evaporación de las lágrimas es proporcional a la superficie del globo ocular expuesta al aire (área de la fisura palpebral).&lt;/p>
&lt;p>Se dice que el ángulo de visión ideal $\theta$ para la ubicación del monitor es de $15^\circ \sim 20^\circ$ hacia abajo desde la línea horizontal.
Dado que $d$ es la distancia horizontal desde el centro del monitor hasta los ojos, y $h$ es la diferencia de altura entre el centro del monitor y la altura de los ojos, se cumple la siguiente función trigonométrica:&lt;/p>
$$ \tan \theta = \frac{h}{d} $$&lt;p>Por ejemplo, si la distancia al monitor $d$ es $60 \text{ cm}$ (un entorno de escritorio típico), para que $\theta = 15^\circ$:&lt;/p>
$$ h = 60 \times \tan(15^\circ) \approx 60 \times 0.267 = 16.02 \text{ cm} $$&lt;p>En otras palabras, &lt;strong>lo ideal es que el centro del monitor esté a unos $16 \text{ cm}$ por debajo del nivel de los ojos&lt;/strong>.
Al mirar ligeramente hacia abajo, el párpado superior desciende naturalmente, reduciendo el área de exposición del globo ocular, lo que puede prevenir drásticamente la evaporación de las lágrimas. Utilice un brazo para monitor (como Ergotron) e introduzca esta altura con precisión milimétrica.&lt;/p>
&lt;h2 id="52-implementación-estricta-y-automatización-del-estándar-mundial-regla-20-20-20">5.2 Implementación estricta y automatización del estándar mundial &amp;ldquo;Regla 20-20-20&amp;rdquo;
&lt;/h2>&lt;p>El método de recuperación de la fatiga ocular al usar dispositivos digitales, recomendado por la Academia Americana de Oftalmología (AAO) y los oftalmólogos de todo el mundo, es la &lt;strong>&amp;ldquo;Regla 20-20-20&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>&amp;ldquo;Cada 20 minutos, mire algo que esté a 20 pies (unos 6 metros) de distancia durante 20 segundos&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>Con esta simple acción, los músculos ciliares, que se habían contraído extremadamente, se ven obligados a relajarse (aflojarse), el cristalino se vuelve más delgado y se restablece la función de ajuste del enfoque.
Dado que los programadores pierden la noción del tiempo cuando entran en un estado de concentración (flow), construir un mecanismo que obligue automáticamente a cumplir esta regla es una solución propia de un ingeniero.
A continuación, se muestra un ejemplo de un script extremadamente simple utilizando &lt;code>tkinter&lt;/code> de Python para mostrar de forma forzada un cuadro de diálogo de advertencia cada 20 minutos.&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"># Ocultar la ventana principal&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"># Esperar 20 minutos (1200 segundos)&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"># Mostrar el diálogo de advertencia en primer plano&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;Regla 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;¡Aparte los ojos de la pantalla y mire a más de 6 metros de distancia durante 20 segundos!&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">(Para relajar los músculos ciliares)&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 segundos para relajarse&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"># Ejecutar en segundo plano&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>Al registrar un script de este tipo en el inicio, o al ejecutarlo con el programador de tareas estándar del sistema operativo o Cron, puede incorporar un ciclo obligatorio de recuperación en su vida.&lt;/p>
&lt;hr>
&lt;h1 id="conclusión-medidas-contra-la-fatiga-ocular-como-inversión-para-el-futuro">Conclusión: Medidas contra la fatiga ocular como inversión para el futuro
&lt;/h1>&lt;p>Nuestras carreras como ingenieros de software continuarán durante décadas. Lo que sostiene esa carrera no es un teclado costoso ni la CPU más reciente, sino sin duda nuestros propios &amp;ldquo;ojos&amp;rdquo; y &amp;ldquo;cerebro&amp;rdquo;.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Comprender la energía de la luz ($E = hc/\lambda$) y la carga física del ajuste de enfoque&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Introducir un monitor libre de parpadeos (atenuación DC) y de alta tasa de refresco&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Optimizar el contraste relativo del entorno con iluminación sesgada (Bias Lighting) como ScreenBar&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Considerar el monitor E-Ink como el dispositivo definitivo para la lectura de texto&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Crear un ángulo de visión óptimo basado en $\tan \theta = h/d$ con un brazo de monitor, y sistematizar la &amp;ldquo;Regla 20-20-20&amp;rdquo;&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>Estas medidas pueden implicar algunos gastos y esfuerzos temporales, pero podrían decirse que son la &amp;ldquo;inversión tecnológica&amp;rdquo; más rentable para prolongar la esperanza de vida saludable de los ojos y maximizar la productividad y la calidad de vida (QOL) a lo largo de su vida. Revise su entorno de desarrollo de inmediato e intente implementar la compasión hacia sus ojos.&lt;/p></description></item><item><title>Técnicas de resolución para la escasez de memoria de GPU en el desarrollo de IA (Descarga de CPU, etc.)</title><link>http://kenji.blog/es/p/ai-gpu-vram-optimization-cpu-offloading/</link><pubDate>Fri, 11 Sep 2026 01:00:00 +0900</pubDate><guid>http://kenji.blog/es/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 Técnicas de resolución para la escasez de memoria de GPU en el desarrollo de IA (Descarga de CPU, etc.)" />&lt;h1 id="introducción-el-desarrollo-de-ia-y-el-muro-de-la-vram">Introducción: El desarrollo de IA y el &amp;ldquo;Muro de la VRAM&amp;rdquo;
&lt;/h1>&lt;p>En los últimos años, tecnologías de IA generativa como los Grandes Modelos de Lenguaje (LLM) y los Modelos de Difusión (Diffusion Models) han experimentado un rápido desarrollo. Sin embargo, al entrenar (ajuste fino / fine-tuning) o ejecutar la inferencia (Inference) de estos modelos de IA de vanguardia en entornos locales, muchos desarrolladores e investigadores se enfrentan a una barrera extremadamente física: &lt;strong>la falta de memoria de GPU (VRAM)&lt;/strong>.&lt;/p>
&lt;p>Incluso con las GPUs de gama alta para consumidores, como la NVIDIA GeForce RTX 4090, la VRAM máxima es de 24 GB, lo que hace completamente imposible cargar directamente modelos gigantescos como Llama 3 70B. Las opciones orientadas a centros de datos, como la H100 (80 GB) o la B200 (192 GB), son extremadamente costosas y no están fácilmente al alcance de individuos o equipos pequeños. Si no se puede atravesar este &amp;ldquo;Muro de la VRAM (The Wall of VRAM)&amp;rdquo;, ni siquiera será posible experimentar con los modelos más avanzados.&lt;/p>
&lt;p>En este artículo, explicaremos exhaustivamente desde la perspectiva tanto de la inferencia como del entrenamiento, las técnicas avanzadas para superar esta restricción física de la VRAM mediante ingenios en la arquitectura de software y hardware. Profundizaremos usando fórmulas matemáticas e ilustraciones en temas como la descarga de CPU, la optimización de la caché KV, los puntos de control de gradiente (Gradient Checkpointing) y las arquitecturas más recientes de memoria unificada (Unified Memory). Al leer este artículo, comprenderás profundamente el comportamiento de la VRAM y adquirirás conocimientos prácticos para manejar modelos gigantescos con recursos limitados.&lt;/p>
&lt;hr>
&lt;h1 id="1-anatomía-del-consumo-de-vram-de-los-modelos-de-ia-inferencia-y-entrenamiento">1. Anatomía del consumo de VRAM de los modelos de IA (Inferencia y Entrenamiento)
&lt;/h1>&lt;p>El primer paso para resolver la escasez de VRAM es comprender con precisión &amp;ldquo;qué&amp;rdquo; y &amp;ldquo;cuánta&amp;rdquo; memoria se está consumiendo desde una perspectiva microscópica. Si en lugar de tratarlo como una caja negra podemos estimarlo con precisión utilizando fórmulas matemáticas, podremos seleccionar los métodos de optimización adecuados.&lt;/p>
&lt;h2 id="11-cálculo-de-memoria-de-los-parámetros-del-modelo-pesos">1.1 Cálculo de memoria de los parámetros del modelo (pesos)
&lt;/h2>&lt;p>La cantidad básica de memoria consumida por los parámetros (Weights) que componen un modelo de IA se determina por el número total de parámetros del modelo y el tipo de datos (Precision: precisión) utilizado para representarlos.&lt;/p>
&lt;p>Los tipos de datos comúnmente utilizados en el aprendizaje profundo y el número de bytes por parámetro ($B$) son los siguientes:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>FP32 (Punto flotante de precisión simple):&lt;/strong> 4 bytes (precisión estándar durante el entrenamiento)&lt;/li>
&lt;li>&lt;strong>FP16 / BF16 (Punto flotante de media precisión):&lt;/strong> 2 bytes (inferencia general y entrenamiento de precisión mixta)&lt;/li>
&lt;li>&lt;strong>INT8 (Entero de 8 bits):&lt;/strong> 1 byte (modelos cuantizados)&lt;/li>
&lt;li>&lt;strong>INT4 (Cuantización de enteros de 4 bits):&lt;/strong> 0.5 bytes (cuantización extrema como GPTQ, AWQ, GGUF)&lt;/li>
&lt;/ul>
&lt;p>Si el número de parámetros de todo el modelo es $P$, la cantidad base de memoria $M_{weights}$ ocupada por los pesos en sí se expresa con la siguiente fórmula:&lt;/p>
$$ M_{weights} = P \times B $$&lt;p>Por ejemplo, si cargamos el modelo &amp;ldquo;Llama 3 8B&amp;rdquo; (aproximadamente 8 mil millones de parámetros) publicado por Meta en FP16 (media precisión), el cálculo sería el siguiente:&lt;/p>
$$ M_{weights} = 8,000,000,000 \times 2 \text{ bytes} \approx 16,000,000,000 \text{ bytes} \approx 16 \text{ GB} $$&lt;p>Es decir, simplemente cargar los pesos del modelo en la GPU consume 16 GB de VRAM. En una RTX 3060 (12 GB), se produciría un error de Out of Memory (OOM) en este punto. Sin embargo, si cuantizamos el modelo a INT4, pasaría a ser de $8 \times 0.5 = 4 \text{ GB}$, lo que permitiría cargarlo sin problemas.&lt;/p>
&lt;h2 id="12-consumo-de-memoria-durante-la-inferencia-aumento-de-la-caché-kv">1.2 Consumo de memoria durante la inferencia: Aumento de la caché KV
&lt;/h2>&lt;p>En la inferencia de LLMs (especialmente en la generación de texto autorregresiva), lo que presiona la VRAM con tanta o mayor intensidad que los pesos es la &lt;strong>caché KV (Key-Value Cache)&lt;/strong>.
En la arquitectura Transformer, para evitar recalcular la información de los tokens generados y procesados en el pasado, los tensores Key y Value de cada capa de atención se mantienen en caché en la VRAM. Esto mejora la velocidad de cálculo (Compute), pero a medida que la longitud del contexto (longitud del prompt de entrada + longitud de generación) aumenta, el consumo de memoria crece linealmente de forma explosiva.&lt;/p>
&lt;p>La cantidad de memoria de la caché KV consumida al procesar 1 token, $M_{kv\_token}$, se calcula estrictamente con la siguiente fórmula, basándose en la arquitectura del modelo:&lt;/p>
$$ M_{kv\_token} = 2 \times N_{layers} \times N_{heads\_kv} \times D_{head} \times B $$&lt;p>Aquí, cada variable tiene el siguiente significado:&lt;/p>
&lt;ul>
&lt;li>$2$ : Porque existen dos tensores, Key y Value&lt;/li>
&lt;li>$N_{layers}$ : Número de capas (layers) del Transformer&lt;/li>
&lt;li>$N_{heads\_kv}$ : Número de cabezales de atención KV (en el caso de GQA: Grouped Query Attention, será menor que el número habitual de cabezales)&lt;/li>
&lt;li>$D_{head}$ : Dimensionalidad de cada cabezal (generalmente, la dimensión de la capa oculta $D_{model} / N_{heads}$)&lt;/li>
&lt;li>$B$ : Número de bytes del tipo de datos (2 en el caso de FP16)&lt;/li>
&lt;/ul>
&lt;p>La cantidad total de caché KV, $M_{kv\_total}$, es el resultado de multiplicar esto por la longitud de la secuencia ($L_{seq}$) y el tamaño del lote ($BatchSize$).&lt;/p>
$$ M_{kv\_total} = M_{kv\_token} \times L_{seq} \times BatchSize $$&lt;p>&lt;strong>Ejemplo concreto: En el caso de Llama 2 7B&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>$N_{layers} = 32$&lt;/li>
&lt;li>$N_{heads\_kv} = 32$ (En el caso de MHA)&lt;/li>
&lt;li>$D_{head} = 128$&lt;/li>
&lt;li>FP16 ($B=2$)&lt;/li>
&lt;li>Tamaño del lote 1, longitud de secuencia 8192 (contexto de 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{ bytes} \approx 4 \text{ GB} $$&lt;p>Si ampliáramos el contexto a 32K (32768 tokens), consumiría aproximadamente 16 GB solo en la caché KV. Si aumentáramos el tamaño del lote a 4, serían 64 GB. El hecho de que empiece a exigir mucha más VRAM que el propio tamaño del modelo es uno de los grandes retos durante la inferencia.&lt;/p>
&lt;h2 id="13-consumo-de-memoria-durante-el-entrenamiento-optimizador-gradientes-y-activaciones">1.3 Consumo de memoria durante el entrenamiento: Optimizador, gradientes y activaciones
&lt;/h2>&lt;p>En comparación con la inferencia, el entrenamiento de un modelo (preentrenamiento o ajuste fino) consume mucha más VRAM. Esto se debe a que es necesario retener no solo información del paso hacia adelante (propagación hacia adelante), sino también de la propagación hacia atrás (backpropagation). La memoria durante el entrenamiento se compone principalmente de los siguientes cuatro elementos:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pesos del modelo (Model Weights):&lt;/strong> Similar a la inferencia, pero en el entrenamiento de precisión mixta, se pueden retener tanto los de FP16 como los de FP32 (pesos maestros).&lt;/li>
&lt;li>&lt;strong>Gradientes (Gradients):&lt;/strong> Gradientes calculados en la retropropagación por cada parámetro. En el caso de FP16, son 2 bytes por parámetro.&lt;/li>
&lt;li>&lt;strong>Estados del optimizador (Optimizer States):&lt;/strong> Optimizadores avanzados como AdamW mantienen un primer momento (Momentum) y un segundo momento (Variance) para cada parámetro. Para mantener la estabilidad del entrenamiento, estos se almacenan generalmente en FP32 (4 bytes). Es decir, consumen $4 + 4 = 8$ bytes/parámetro por los dos momentos.&lt;/li>
&lt;li>&lt;strong>Activaciones (Activations):&lt;/strong> Para el cálculo de los gradientes de retropropagación, es necesario conservar en la memoria la salida (estado intermedio) de cada capa obtenida durante la propagación hacia adelante. Esto depende enormemente del tamaño del lote y de la longitud de la secuencia, y puede volverse muy grande.&lt;/li>
&lt;/ol>
&lt;p>En resumen, en el entrenamiento de precisión mixta (Mixed Precision Training) utilizando el optimizador estándar de Adam, se requieren &lt;strong>aproximadamente entre 16 y 20 bytes&lt;/strong> por parámetro (4 de peso maestro + 2 de peso FP16 + 2 de gradiente + 8 del optimizador + α).&lt;/p>
$$ M_{train\_param} \approx P \times 16 \text{ bytes} $$&lt;p>Para entrenar un modelo de 7B (7 mil millones de parámetros), solo en aspectos relacionados con los parámetros se necesitarían $7B \times 16 = 112 \text{ GB}$, y al sumarle las activaciones, el cálculo arroja un sorprendente requerimiento de más de 140 GB de VRAM. Para ejecutar esto en una VRAM de 24 GB, es indispensable utilizar las agresivas técnicas de optimización que se explican a partir del próximo capítulo.&lt;/p>
&lt;hr>
&lt;h1 id="2-técnicas-para-el-ahorro-de-vram-en-la-inferencia">2. Técnicas para el ahorro de VRAM en la inferencia
&lt;/h1>&lt;p>Se han desarrollado muchas técnicas de software que traspasan los límites del hardware como enfoque para ejecutar modelos gigantescos durante la inferencia.&lt;/p>
&lt;h2 id="21-descarga-de-cpu-cpu-offloading-y-división-de-capas">2.1 Descarga de CPU (CPU Offloading) y división de capas
&lt;/h2>&lt;p>Cuando un modelo masivo no cabe en una o varias GPUs, la técnica de colocar una parte del modelo en la memoria del sistema (CPU RAM) y avanzar en los cálculos transfiriendo a la GPU solo cuando es necesario se conoce como &lt;strong>descarga de CPU (CPU Offloading)&lt;/strong>. Herramientas como &lt;code>llama.cpp&lt;/code> y &lt;code>Accelerate&lt;/code> de Hugging Face soportan esta funcionalidad.&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;RAM del Sistema (DDR4 / DDR5)&amp;#34;] --&amp;gt; B[&amp;#34;VRAM de la GPU (GDDR6X)&amp;#34;]
B[&amp;#34;VRAM de la GPU (GDDR6X)&amp;#34;] --&amp;gt; C[&amp;#34;Núcleos Tensor (Cálculo)&amp;#34;]
subgraph &amp;#34;División de Capas y Descarga&amp;#34;
D[&amp;#34;Capas Inferiores 1-15 (Fijadas en GPU)&amp;#34;]
E[&amp;#34;Capas Superiores 16-32 (Descargadas en CPU)&amp;#34;]
end
E[&amp;#34;Capas Superiores 16-32 (Descargadas en CPU)&amp;#34;] -.-&amp;gt; B[&amp;#34;VRAM de la GPU (GDDR6X)&amp;#34;]
&lt;/pre>
&lt;p>&lt;strong>Mecanismo y desafíos:&lt;/strong>
Dado que los modelos Transformer tienen una estructura donde las capas (layers) se apilan en serie, el cálculo de una capa no comienza hasta que termina el de la capa anterior. Aprovechando esto, solo las capas que caben en la GPU (por ejemplo, de la capa 1 a la 15) se mantienen residentes (fijadas) en la VRAM, mientras que el resto de las capas (de la 16 a la 32) se alojan en la RAM de la CPU, que es de gran capacidad pero más lenta. Durante la inferencia, al terminar los cálculos hasta la capa 15, los pesos de la capa 16 se transfieren (copian) desde la CPU a la GPU a través del bus PCIe, y el cálculo se ejecuta en la GPU.&lt;/p>
&lt;p>Sin embargo, &lt;strong>el ancho de banda (Bandwidth) del PCIe se convierte en un enorme cuello de botella&lt;/strong>. El ancho de banda máximo teórico del PCIe 4.0 x16 es de 32 GB/s (unidireccional), pero en comparación con el ancho de banda interno de la VRAM de las GPUs más recientes (por ejemplo, 1008 GB/s en la GDDR6X de la RTX 4090 y más de 3 TB/s en la HBM3 de la H100), es dos órdenes de magnitud más lento, por lo que el uso intensivo de la descarga de CPU reduce drásticamente la velocidad de inferencia (Tokens por Segundo).
Para minimizar la pérdida de velocidad, el punto práctico clave es colocar tantas capas como sea posible en la GPU (maximizar las capas de GPU) y reducir al mínimo las capas descargadas.&lt;/p>
&lt;h2 id="22-cuantización-de-la-caché-kv-y-pagedattention">2.2 Cuantización de la caché KV y PagedAttention
&lt;/h2>&lt;p>Contra la caché KV, principal culpable del consumo de VRAM durante la inferencia, también se aplican dos potentes optimizaciones.&lt;/p>
&lt;p>&lt;strong>1. Cuantización de la caché KV (KV Cache Quantization):&lt;/strong>
Es una técnica donde no solo los pesos del modelo, sino también la propia caché KV generada dinámicamente en tiempo de ejecución, se cuantiza a INT8, INT4 o FP8 para almacenarla en la VRAM. Esto permite reducir el tamaño de la caché KV entre la mitad y la cuarta parte. Los motores de inferencia más recientes (vLLM, llama.cpp) incorporan esta funcionalidad, logrando un ahorro significativo de VRAM mientras mantienen al mínimo la degradación de la precisión.&lt;/p>
&lt;p>&lt;strong>2. PagedAttention:&lt;/strong>
La aplicación del concepto de &amp;ldquo;paginación&amp;rdquo; de la memoria virtual de los sistemas operativos a la caché KV es lo que se conoce como &lt;strong>PagedAttention&lt;/strong>, introducido por el motor de inferencia vLLM. En los motores de inferencia convencionales, se reservaba de antemano un área continua de VRAM (Preasignación) de acuerdo con la longitud máxima de secuencia configurada. Por ello, cuando la entrada real era más corta, se producía fragmentación y un desperdicio de la memoria no utilizada, llegando a derrochar más del 60% de la VRAM.&lt;/p>
&lt;p>PagedAttention permite dividir la caché KV en bloques (páginas) de tamaño fijo y distribuirlos y almacenarlos en espacios no contiguos de memoria física. Esto reduce casi a cero el desperdicio de memoria (limitándolo solo a la fragmentación interna) y permite aumentar significativamente el tamaño del lote con la misma capacidad de VRAM.&lt;/p>
&lt;pre class="mermaid">
graph LR
A[&amp;#34;Caché KV Lógica&amp;#34;] --&amp;gt; B[&amp;#34;Bloques Físicos de VRAM&amp;#34;]
A1[&amp;#34;Token 1, 2, 3, 4&amp;#34;] --&amp;gt; B3[&amp;#34;Bloque 3 (Asignado)&amp;#34;]
A2[&amp;#34;Token 5, 6, 7, 8&amp;#34;] --&amp;gt; B1[&amp;#34;Bloque 1 (Asignado)&amp;#34;]
A3[&amp;#34;Tokens Futuros...&amp;#34;] -.-&amp;gt; B2[&amp;#34;Bloque 2 (Libre)&amp;#34;]
&lt;/pre>
&lt;h2 id="23-flashattention-superando-la-complejidad-de-memoria-en-el-cálculo-de-atención">2.3 FlashAttention: Superando la complejidad de memoria en el cálculo de atención
&lt;/h2>&lt;p>La escasez de VRAM no solo se produce por la cantidad de memoria para almacenar datos, sino también por la falta de un &amp;ldquo;espacio de trabajo temporal&amp;rdquo; durante los cálculos. El mecanismo de Self-Attention estándar del Transformer requiere materializar (instanciar) una matriz de atención gigante de $N \times N$ en la VRAM para una longitud de secuencia $N$. Esto resulta en una complejidad de memoria de $O(N^2)$, siendo la causa principal del OOM en contextos extensos.&lt;/p>
&lt;p>Quien resolvió esto fue &lt;strong>FlashAttention&lt;/strong> (y FlashAttention-2, 3).
FlashAttention es un algoritmo diseñado teniendo en cuenta la arquitectura de hardware de la GPU (la estructura jerárquica de la enorme pero lenta HBM y la diminuta pero ultrarrápida SRAM). Utiliza una técnica llamada mosaico (Tiling) que carga los datos en la SRAM por bloques para completar los cálculos de atención, evitando por completo el proceso de escribir la matriz de $N \times N$ en la HBM (VRAM).&lt;/p>
&lt;p>Gracias a esto, la complejidad de memoria en las capas de atención se redujo drásticamente de $O(N^2)$ a $O(N)$ (proporcional a la longitud de la secuencia), lo que alivió significativamente los límites en la longitud del contexto.&lt;/p>
&lt;h2 id="24-el-ascenso-de-la-memoria-unificada-unified-memory-y-apple-silicon">2.4 El ascenso de la Memoria Unificada (Unified Memory) y Apple Silicon
&lt;/h2>&lt;p>Quienes están abordando este problema desde las raíces de la arquitectura del PC son aquellos que han adoptado la &lt;strong>Arquitectura de Memoria Unificada (Unified Memory Architecture: UMA)&lt;/strong>, como Apple Silicon (las series Max y Ultra de M1/M2/M3/M4) y algunas APU recientes (como AMD Strix Point).&lt;/p>
&lt;p>En estas arquitecturas, la CPU y la GPU en la placa base comparten exactamente la misma memoria física (por ejemplo, hasta 192 GB de LPDDR5). Por lo tanto, el concepto de una &amp;ldquo;transferencia lenta de datos desde la CPU a la GPU a través del PCIe&amp;rdquo; simplemente no existe físicamente.&lt;/p>
&lt;pre class="mermaid">
graph TD
subgraph &amp;#34;Arquitectura de Memoria Unificada (ej. Apple Silicon)&amp;#34;
A[&amp;#34;Núcleos de CPU&amp;#34;] &amp;lt;--&amp;gt; C[&amp;#34;Controlador de Memoria Compartida&amp;#34;]
B[&amp;#34;Núcleos de GPU / Motor Neuronal&amp;#34;] &amp;lt;--&amp;gt; C[&amp;#34;Controlador de Memoria Compartida&amp;#34;]
C[&amp;#34;Controlador de Memoria Compartida&amp;#34;] &amp;lt;--&amp;gt; D[&amp;#34;Fondo de Memoria Unificada (ej. 192GB)&amp;#34;]
end
&lt;/pre>
&lt;p>La mayor ventaja de esta arquitectura es que no hay un límite estricto de VRAM, lo que permite utilizar casi toda la memoria del sistema directamente para cargar LLMs masivos. Con una Mac Studio que cuenta con 192 GB de memoria unificada, es posible cargar modelos gigantescos de la clase 70B o superiores (como Grok-1) sin cuantizar en un solo dispositivo e inferir rápidamente. El ancho de banda de acceso a memoria también alcanza los 800 GB/s en el M2 Ultra, presumiendo de velocidades comparables a las de las GPUs discretas para consumidores. Es un enfoque extremadamente poderoso que resuelve el dilema entre &amp;ldquo;capacidad de memoria&amp;rdquo; y &amp;ldquo;ancho de banda&amp;rdquo; a nivel de hardware.&lt;/p>
&lt;hr>
&lt;h1 id="3-técnicas-para-el-ahorro-de-vram-en-el-entrenamiento-ajuste-fino">3. Técnicas para el ahorro de VRAM en el entrenamiento (Ajuste fino)
&lt;/h1>&lt;p>Durante el entrenamiento (Training), que requiere aún más VRAM que la inferencia, también han surgido numerosos avances. Para realizar el ajuste fino con recursos limitados, es fundamental combinar las siguientes tecnologías.&lt;/p>
&lt;h2 id="31-puntos-de-control-de-gradiente-gradient-checkpointing">3.1 Puntos de control de gradiente (Gradient Checkpointing)
&lt;/h2>&lt;p>En la retropropagación (backpropagation) del aprendizaje profundo, es necesario retener en la memoria las salidas intermedias (Activations) de todas las capas de la propagación hacia adelante para poder calcular los gradientes. Cuando la longitud de la secuencia o el tamaño del lote aumentan, esta memoria de activaciones comienza a dominar la VRAM.&lt;/p>
&lt;p>&lt;strong>Los Puntos de control de gradiente (Gradient Checkpointing / Activation Recomputation)&lt;/strong> son una técnica genial que aprovecha el equilibrio entre la capacidad de memoria y el tiempo de cálculo (Compute).
En lugar de guardar todas las salidas intermedias en la memoria, solo se guardan las salidas de capas específicas (puntos de control). Durante la retropropagación, si se necesita un valor intermedio que no fue guardado en un punto de control, &lt;strong>se vuelve a calcular la propagación hacia adelante (recálculo) desde el punto de control guardado más cercano para restaurar ese valor&lt;/strong>.&lt;/p>
&lt;p>Aunque la cantidad de cálculo aumenta en aproximadamente un 20 a 30% y el tiempo total de entrenamiento se alarga, se logra reducir drásticamente el consumo de VRAM debido a las activaciones, pasando de $O(N)$ (donde $N$ es el número de capas) a $O(\sqrt{N})$. En el entrenamiento de grandes modelos en la actualidad, es un parámetro de configuración tan imprescindible que se podría decir que no se puede empezar sin él.&lt;/p>
&lt;h2 id="32-lora-y-qlora-adaptación-de-bajo-rango">3.2 LoRA y QLoRA (Adaptación de Bajo Rango)
&lt;/h2>&lt;p>El principal artífice que resolvió el problema de la escasez de VRAM de raíz es &lt;strong>LoRA&lt;/strong>, la técnica más representativa de PEFT (Ajuste Fino Eficiente en Parámetros / Parameter-Efficient Fine-Tuning).&lt;/p>
&lt;p>Se congela (Frozen) la enorme matriz de pesos original del modelo $W_0 \in \mathbb{R}^{d \times k}$, de modo que no sea entrenada. En su lugar, se introducen en paralelo dos matrices de bajo rango muy pequeñas, $A \in \mathbb{R}^{r \times k}$ y $B \in \mathbb{R}^{d \times r}$, y se entrena únicamente a $A$ y $B$. (Aquí, el rango $r$ es un valor pequeño tal que $r \ll d, k$).&lt;/p>
$$ W_{adapted} = W_0 + \Delta W = W_0 + B A $$&lt;p>Con esto, la cantidad de parámetros a entrenar se reduce a menos del 1% (a veces menos del 0.1%) del original y, consecuentemente, los &amp;ldquo;gradientes&amp;rdquo; y los &amp;ldquo;estados del optimizador&amp;rdquo; que devoraban memoria también caen de manera drástica a menos del 1%.&lt;/p>
&lt;p>Además, &lt;strong>QLoRA (Quantized LoRA)&lt;/strong> lleva esto a su máxima evolución.
En QLoRA, los pesos del modelo base $W_0$ se cuantizan al extremo en 4 bits (formato NF4: NormalFloat4) para cargarse en la VRAM. Luego, las pequeñas matrices $A, B$ de LoRA se entrenan en BF16 (16 bits) para conservar la precisión de los cálculos.&lt;/p>
&lt;p>Mientras que la cuantización de 4 bits reduce el tamaño en VRAM del modelo base a un cuarto del original, se emplea una técnica llamada &lt;strong>Paged Optimizers&lt;/strong> (optimizadores paginados) que, en caso de que la VRAM esté a punto de agotarse, automáticamente resguarda temporalmente (descarga) el estado del optimizador en la RAM de la CPU. De este modo, incluso con una única GPU de 24 GB de VRAM (como la RTX 4090), se hizo posible el ajuste fino de modelos supermasivos como Llama 3 70B.&lt;/p>
&lt;h2 id="33-deepspeed-zero-y-la-descarga-offloading">3.3 DeepSpeed ZeRO y la Descarga (Offloading)
&lt;/h2>&lt;p>En entornos donde se usan múltiples GPUs (Multi-GPU), la mera paralelización de datos (Data Parallelism) no resuelve el problema de la VRAM. Esto se debe a que, como cada GPU conserva una copia entera del modelo, no se puede superar el límite individual de la capacidad de cada VRAM.&lt;/p>
&lt;p>&lt;strong>ZeRO (Zero Redundancy Optimizer)&lt;/strong>, de la librería &lt;strong>DeepSpeed&lt;/strong> desarrollada por Microsoft, es una técnica que divide (fragmenta) exhaustivamente los parámetros, gradientes y estados del optimizador del modelo a lo largo de varias GPUs. Esto permite tratar la &amp;ldquo;suma total&amp;rdquo; de la VRAM de múltiples GPUs como un único y gigantesco fondo de memoria.&lt;/p>
&lt;pre class="mermaid">
graph TD
subgraph &amp;#34;Etapa 3 de ZeRO (Particionamiento de Parámetros)&amp;#34;
A[&amp;#34;GPU 0&amp;#34;] --&amp;gt; D[&amp;#34;Partición 0 (Almacena 1/3 de Pesos/Gradientes/Opts)&amp;#34;]
B[&amp;#34;GPU 1&amp;#34;] --&amp;gt; E[&amp;#34;Partición 1 (Almacena 1/3 de Pesos/Gradientes/Opts)&amp;#34;]
C[&amp;#34;GPU 2&amp;#34;] --&amp;gt; F[&amp;#34;Partición 2 (Almacena 1/3 de Pesos/Gradientes/Opts)&amp;#34;]
end
D[&amp;#34;Partición 0 (Almacena 1/3 de Pesos/Gradientes/Opts)&amp;#34;] &amp;lt;--&amp;gt; E[&amp;#34;Partición 1 (Almacena 1/3 de Pesos/Gradientes/Opts)&amp;#34;]
E[&amp;#34;Partición 1 (Almacena 1/3 de Pesos/Gradientes/Opts)&amp;#34;] &amp;lt;--&amp;gt; F[&amp;#34;Partición 2 (Almacena 1/3 de Pesos/Gradientes/Opts)&amp;#34;]
&lt;/pre>
&lt;ul>
&lt;li>&lt;strong>Etapa 1 de ZeRO:&lt;/strong> Se dividen los estados del optimizador en cada GPU&lt;/li>
&lt;li>&lt;strong>Etapa 2 de ZeRO:&lt;/strong> También se dividen los gradientes en cada GPU&lt;/li>
&lt;li>&lt;strong>Etapa 3 de ZeRO:&lt;/strong> Los propios parámetros del modelo (pesos) también se dividen en cada GPU&lt;/li>
&lt;/ul>
&lt;p>Además, al emplear una función llamada &lt;strong>ZeRO-Offload&lt;/strong>, se puede &lt;strong>descargar (offload) en la memoria de la CPU&lt;/strong> el cálculo de actualización de los gradientes y el estado del optimizador particionado por ZeRO, de forma que los ejecute la CPU anfitriona en lugar de la GPU. Gracias a esto, la carga de la VRAM de la GPU se reduce al mínimo, permitiendo el entrenamiento de modelos masivos incluso en entornos con GPUs limitadas. Puesto que los cálculos se realizan en la CPU y los resultados se devuelven a la GPU a través de PCIe, la velocidad de entrenamiento disminuye, pero así se evita la peor situación posible: que el &amp;ldquo;entrenamiento colapse por falta de memoria&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h1 id="4-ejemplos-de-implementación-accelerate-de-hugging-face-y-deepspeed">4. Ejemplos de implementación: Accelerate de Hugging Face y DeepSpeed
&lt;/h1>&lt;p>Para concluir, mostraremos un ejemplo sencillo de cómo implementar realmente la descarga de CPU y la optimización de VRAM mediante código en Python.&lt;/p>
&lt;h2 id="41-descarga-automática-con-device_mapauto-en-hugging-face">4.1 Descarga automática con &lt;code>device_map=&amp;quot;auto&amp;quot;&lt;/code> en Hugging Face
&lt;/h2>&lt;p>Con las librerías &lt;code>transformers&lt;/code> y &lt;code>accelerate&lt;/code> de Hugging Face, al cargar un modelo, las capas se pueden dividir automáticamente entre la GPU y la CPU.&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"># Mediante device_map=&amp;#34;auto&amp;#34;, lo que no quepa en la VRAM se descarga en la RAM de la CPU&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Con load_in_8bit=True, se cuantizan los pesos a 8 bits, permitiendo mayor ahorro de memoria&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 hace falta, es posible descargar incluso en disco (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>Al ejecutar este código, la librería &lt;code>accelerate&lt;/code> en segundo plano analizará el espacio libre disponible en la VRAM del sistema y en la RAM de la CPU, acomodando (Dispatch) las capas de la forma más óptima.&lt;/p>
&lt;h2 id="42-configuración-de-descarga-de-cpu-en-deepspeed-zero-2">4.2 Configuración de descarga de CPU en DeepSpeed (ZeRO-2)
&lt;/h2>&lt;p>A continuación, un ejemplo de un archivo de configuración (JSON) para activar la descarga de CPU con DeepSpeed durante el entrenamiento.&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>Con esta configuración, al especificar &lt;code>&amp;quot;cpu&amp;quot;&lt;/code> en &lt;code>offload_optimizer&lt;/code>, se obliga a que el mantenimiento del estado y los cálculos de actualización del optimizador (como Adam), que consumen una inmensa cantidad de VRAM, sean ejecutados por la CPU del sistema. Esto permite que la VRAM de la GPU se dedique en exclusiva a la tarea más importante: los cálculos de propagación hacia adelante y hacia atrás del modelo. Al establecer &lt;code>pin_memory: true&lt;/code>, se previenen los fallos de página (page faults), acelerando al máximo posible las transferencias de PCIe entre la CPU y la GPU.&lt;/p>
&lt;hr>
&lt;h1 id="resumen">Resumen
&lt;/h1>&lt;p>La escasez de memoria de GPU (Out of Memory) en el desarrollo de IA será un desafío eterno que seguirá acompañando a los desarrolladores a medida que los modelos aumenten de escala. Sin embargo, al combinar de forma adecuada una profunda comprensión del hardware (arquitectura) con técnicas de optimización a nivel algorítmico y de software como las explicadas en este artículo, se hace posible la inferencia y el entrenamiento de modelos masivos en un entorno local, algo que a primera vista podría parecer imposible.&lt;/p>
&lt;p>&lt;strong>Resumen de contramedidas durante la inferencia:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Cuantización (INT4 / INT8 / FP8):&lt;/strong> Comprime drásticamente el tamaño del modelo en sí y reduce la ocupación de VRAM.&lt;/li>
&lt;li>&lt;strong>Descarga de CPU (CPU Offloading):&lt;/strong> Traslada a la memoria del sistema las capas que no caben en la VRAM (asumiendo un compromiso con la pérdida de velocidad debida al ancho de banda del PCIe).&lt;/li>
&lt;li>&lt;strong>Optimización de la caché KV:&lt;/strong> Se utiliza la paginación (PagedAttention), la cuantización de caché y FlashAttention para asegurar la longitud de contexto (Context Length).&lt;/li>
&lt;li>&lt;strong>Aprovechamiento de la memoria unificada:&lt;/strong> Se utiliza la UMA de arquitecturas como Apple Silicon para emplear grandes capacidades de memoria de forma directa en la inferencia.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Resumen de contramedidas durante el entrenamiento:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>&lt;strong>PEFT (LoRA / QLoRA):&lt;/strong> Se limita el número de parámetros a entrenar y se cuantiza el modelo base al máximo.&lt;/li>
&lt;li>&lt;strong>Puntos de control de gradiente (Gradient Checkpointing):&lt;/strong> Se desechan las salidas intermedias de la propagación hacia adelante y se recalculan durante la retropropagación, conteniendo así el consumo de VRAM a cambio de un mayor tiempo de cálculo.&lt;/li>
&lt;li>&lt;strong>ZeRO y descarga de CPU (DeepSpeed):&lt;/strong> Supera los límites de VRAM dividiendo el estado del optimizador y los gradientes en múltiples GPUs, o descargándolos en la memoria de la CPU.&lt;/li>
&lt;/ol>
&lt;p>Al aprovechar al máximo estas tecnologías avanzadas, logremos extraer el mayor rendimiento posible en el desarrollo de IA dentro de unos recursos de hardware limitados. En este campo, que avanza a pasos agigantados día con día, es de esperar que en el futuro sigan apareciendo nuevos algoritmos para ahorrar memoria. La clave estará en revisar periódicamente las novedades en las últimas librerías y adoptarlas en nuestras implementaciones.&lt;/p></description></item></channel></rss>