<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Flash Attention on KnightLi Blog</title>
        <link>https://www.knightli.com/es/tags/flash-attention/</link>
        <description>Recent content in Flash Attention on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Thu, 23 Apr 2026 00:15:00 +0800</lastBuildDate><atom:link href="https://www.knightli.com/es/tags/flash-attention/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Qué significan realmente las métricas comunes de benchmark GPU: FA, pp512, tg128 y Q4_0</title>
        <link>https://www.knightli.com/es/2026/04/23/how-to-read-llm-cuda-scoreboard-fa-pp512-tg128-q4-0/</link>
        <pubDate>Thu, 23 Apr 2026 00:15:00 +0800</pubDate>
        
        <guid>https://www.knightli.com/es/2026/04/23/how-to-read-llm-cuda-scoreboard-fa-pp512-tg128-q4-0/</guid>
        <description>&lt;p&gt;En cuanto empiezas a mirar benchmarks de LLM locales o inferencia GPU, aparece una pila de abreviaturas: &lt;code&gt;FA&lt;/code&gt;, &lt;code&gt;pp512&lt;/code&gt;, &lt;code&gt;tg128&lt;/code&gt; y &lt;code&gt;Q4_0&lt;/code&gt;. Todas parecen métricas de rendimiento, pero sin contexto pueden ser sorprendentemente difíciles de interpretar.&lt;/p&gt;
&lt;p&gt;Por ejemplo, puedes ver una línea como:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CUDA Scoreboard for Llama 2 7B, Q4_0 (no FA)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Y justo debajo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pp512 t/s
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tg128 t/s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si no desarmas estos términos, cuesta entender qué mide realmente el benchmark o cómo comparar los resultados de dos GPUs distintas.&lt;/p&gt;
&lt;p&gt;Este artículo no trata sobre qué GPU conviene comprar. Trata específicamente de explicar las métricas más comunes que aparecen en benchmarks de inferencia GPU.&lt;/p&gt;
&lt;h2 id=&#34;primero-qué-dice-realmente-la-línea-del-título&#34;&gt;Primero, qué dice realmente la línea del título
&lt;/h2&gt;&lt;p&gt;Una línea como &lt;code&gt;CUDA Scoreboard for Llama 2 7B, Q4_0 (no FA)&lt;/code&gt; ya te cuenta casi todo el setup de prueba.&lt;/p&gt;
&lt;p&gt;Como mínimo, contiene cuatro capas de información:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CUDA&lt;/code&gt;: el benchmark corre por la ruta NVIDIA CUDA&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Llama 2 7B&lt;/code&gt;: el modelo probado es la versión 7B de &lt;code&gt;Llama 2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Q4_0&lt;/code&gt;: el modelo usa un formato cuantizado de 4 bits&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no FA&lt;/code&gt;: &lt;code&gt;Flash Attention&lt;/code&gt; estuvo desactivado en esta prueba&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En términos prácticos, este título suele significar:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Un benchmark de un modelo grande cuantizado corriendo en una GPU NVIDIA, medido bajo una ruta de inferencia concreta.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-fa-flash-attention&#34;&gt;Qué significa FA: Flash Attention
&lt;/h2&gt;&lt;p&gt;Aquí, &lt;code&gt;FA&lt;/code&gt; significa &lt;code&gt;Flash Attention&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Es una de las técnicas de aceleración más importantes en entrenamiento e inferencia de modelos grandes, principalmente porque optimiza cómo se calcula la atención. En modelos Transformer, la atención ya es una de las partes más caras y más intensivas en ancho de banda de memoria.&lt;/p&gt;
&lt;p&gt;Una implementación tradicional de atención suele sufrir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lecturas y escrituras frecuentes de memoria&lt;/li&gt;
&lt;li&gt;muchos resultados intermedios&lt;/li&gt;
&lt;li&gt;movimiento repetido entre VRAM y caché on-chip&lt;/li&gt;
&lt;li&gt;overhead que crece rápido al aumentar el contexto&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lo que hace &lt;code&gt;Flash Attention&lt;/code&gt;, en términos simples, es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reorganizar el orden de cálculo&lt;/li&gt;
&lt;li&gt;reducir cuántas veces los resultados intermedios vuelven a VRAM&lt;/li&gt;
&lt;li&gt;mantener más trabajo dentro de caché rápida&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eso le da tres ventajas típicas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;es más rápida&lt;/li&gt;
&lt;li&gt;ahorra memoria&lt;/li&gt;
&lt;li&gt;es matemáticamente equivalente a la atención estándar, no un atajo de menor precisión&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por eso muchos frameworks modernos de inferencia y entrenamiento la tratan como una optimización clave.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-no-fa&#34;&gt;Qué significa no FA
&lt;/h2&gt;&lt;p&gt;Si &lt;code&gt;FA&lt;/code&gt; significa &lt;code&gt;Flash Attention&lt;/code&gt;, &lt;code&gt;no FA&lt;/code&gt; simplemente significa que no se activó &lt;code&gt;Flash Attention&lt;/code&gt; para esa prueba.&lt;/p&gt;
&lt;p&gt;Es decir, el benchmark se midió usando una implementación de atención más tradicional.&lt;/p&gt;
&lt;p&gt;Las tablas suelen marcar explícitamente &lt;code&gt;no FA&lt;/code&gt; por varias razones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mantener una línea base de comparación&lt;/li&gt;
&lt;li&gt;soportar hardware o software donde &lt;code&gt;FA&lt;/code&gt; no está disponible&lt;/li&gt;
&lt;li&gt;evitar mezclar resultados de condiciones de optimización distintas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que cuando veas &lt;code&gt;no FA&lt;/code&gt;, no lo leas como &amp;ldquo;esta GPU es débil&amp;rdquo;. Una lectura más precisa es:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Esta puntuación se midió sin Flash Attention activado.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-q4_0-un-formato-de-cuantización&#34;&gt;Qué significa Q4_0: un formato de cuantización
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Q4_0&lt;/code&gt; se refiere a un formato de cuantización de 4 bits.&lt;/p&gt;
&lt;p&gt;Los pesos del modelo original normalmente no se guardan con tan baja precisión. La cuantización comprime pesos de mayor precisión en una representación de menos bits para que el modelo sea más fácil de ejecutar en GPUs de consumo.&lt;/p&gt;
&lt;p&gt;Una forma aproximada de pensarlo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Q&lt;/code&gt;: Quantization&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4&lt;/code&gt;: 4-bit&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_0&lt;/code&gt;: identificador de un esquema concreto de cuantización&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Su importancia práctica es directa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;menor tamaño de modelo&lt;/li&gt;
&lt;li&gt;menos requisitos de VRAM&lt;/li&gt;
&lt;li&gt;más probabilidad de caber en hardware de consumo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que &lt;code&gt;Llama 2 7B, Q4_0&lt;/code&gt; no significa solo &amp;ldquo;un modelo 7B normal&amp;rdquo;. Significa &amp;ldquo;un modelo 7B ya comprimido con un formato de cuantización de 4 bits.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-pp512-ts&#34;&gt;Qué significa pp512 t/s
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; suele significar:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Prompt Processing 512 tokens&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mide qué tan rápido el modelo procesa el prompt de entrada, normalmente en &lt;code&gt;t/s&lt;/code&gt;, es decir, &lt;code&gt;tokens per second&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Aquí, &lt;code&gt;512&lt;/code&gt; significa que la longitud de prompt usada en la prueba fue de &lt;code&gt;512 tokens&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Esta métrica no mide velocidad de salida. Mide qué tan rápido el modelo codifica y calcula sobre la entrada antes de empezar a responder. Puedes pensarla como la velocidad de la etapa &amp;ldquo;leer primero el prompt&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Una propiedad importante de esta etapa es que normalmente es mucho más paralelizable.&lt;/p&gt;
&lt;p&gt;Como la secuencia de entrada puede procesarse en batches, la GPU puede mantener sus unidades de cómputo muy ocupadas. Por eso los números de &lt;code&gt;pp512&lt;/code&gt; pueden verse extremadamente altos.&lt;/p&gt;
&lt;p&gt;Si ves algo como:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pp512 ~= 14000 t/s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;no hay razón para preocuparse. Mide throughput de procesamiento de prompt, no velocidad de generación token por token.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-tg128-ts&#34;&gt;Qué significa tg128 t/s
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;tg128&lt;/code&gt; suele significar:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Text Generation 128 tokens&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mide la velocidad media de generar &lt;code&gt;128 tokens&lt;/code&gt;, también en &lt;code&gt;t/s&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Esta métrica está mucho más cerca de lo que la gente quiere decir intuitivamente cuando pregunta si un modelo se siente rápido, porque mide directamente la etapa de salida.&lt;/p&gt;
&lt;p&gt;La diferencia principal frente a &lt;code&gt;pp512&lt;/code&gt; es que la generación de texto suele ser autoregresiva.&lt;/p&gt;
&lt;p&gt;Eso significa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;el modelo debe generar el primer token&lt;/li&gt;
&lt;li&gt;luego usarlo para generar el segundo&lt;/li&gt;
&lt;li&gt;y seguir así&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esta etapa no puede paralelizarse como el procesamiento de prompt, así que naturalmente es mucho más lenta.&lt;/p&gt;
&lt;p&gt;Por eso es normal ver:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pp512&lt;/code&gt; en decenas de miles de &lt;code&gt;t/s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tg128&lt;/code&gt; solo en cientos de &lt;code&gt;t/s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No es un error de benchmark. Son workloads fundamentalmente distintos.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-pp512-y-tg128-difieren-tanto&#34;&gt;Por qué pp512 y tg128 difieren tanto
&lt;/h2&gt;&lt;p&gt;Esta suele ser la primera confusión al leer un scoreboard.&lt;/p&gt;
&lt;p&gt;La explicación corta:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; mide algo más cercano al throughput paralelo, mientras &lt;code&gt;tg128&lt;/code&gt; mide capacidad de generación token por token.&lt;/p&gt;
&lt;p&gt;Más detalladamente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la etapa de entrada es más fácil de paralelizar&lt;/li&gt;
&lt;li&gt;la etapa de salida depende de generación secuencial&lt;/li&gt;
&lt;li&gt;la generación suele ser más sensible a ancho de banda y caché&lt;/li&gt;
&lt;li&gt;por eso la generación es mucho más lenta que el procesamiento de prompt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto también explica un patrón interesante:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;una GPU puede ser más fuerte en &lt;code&gt;pp512&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;otra puede terminar ligeramente más rápida en &lt;code&gt;tg128&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No es contradictorio. Una métrica se inclina más hacia throughput de cómputo pico; la otra refleja comportamiento de memoria y latencia en la ruta de generación.&lt;/p&gt;
&lt;h2 id=&#34;cómo-pensar-sobre-ts&#34;&gt;Cómo pensar sobre t/s
&lt;/h2&gt;&lt;p&gt;Aquí, &lt;code&gt;t/s&lt;/code&gt; significa &lt;code&gt;tokens per second&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Indica cuántos tokens el modelo puede procesar o generar por segundo.&lt;/p&gt;
&lt;p&gt;Pero hay una salvedad importante: un &lt;code&gt;token&lt;/code&gt; no equivale exactamente a un carácter o una palabra. Es la unidad producida por el tokenizer del modelo, y su longitud real puede variar mucho entre modelos e idiomas.&lt;/p&gt;
&lt;p&gt;En la práctica, &lt;code&gt;t/s&lt;/code&gt; sirve sobre todo para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;comparar GPUs con el mismo modelo&lt;/li&gt;
&lt;li&gt;comparar ajustes distintos en el mismo entorno&lt;/li&gt;
&lt;li&gt;comparar un framework antes y después de activar una optimización concreta&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es mucho menos fiable como métrica absoluta universal entre modelos, frameworks y tokenizers distintos.&lt;/p&gt;
&lt;h2 id=&#34;en-qué-fijarse-primero-al-leer-un-scoreboard&#34;&gt;En qué fijarse primero al leer un scoreboard
&lt;/h2&gt;&lt;p&gt;Si no quieres enterrarte bajo abreviaturas, empieza por estas preguntas.&lt;/p&gt;
&lt;h3 id=&#34;1-qué-modelo-se-está-probando&#34;&gt;1. Qué modelo se está probando
&lt;/h3&gt;&lt;p&gt;¿Es &lt;code&gt;Llama 2 7B&lt;/code&gt;? ¿Es la misma variante cuantizada, como &lt;code&gt;Q4_0&lt;/code&gt;? Si cambia el modelo o el formato de cuantización, comparar directamente pierde sentido.&lt;/p&gt;
&lt;h3 id=&#34;2-si-las-optimizaciones-clave-están-activadas&#34;&gt;2. Si las optimizaciones clave están activadas
&lt;/h3&gt;&lt;p&gt;El ejemplo más común es &lt;code&gt;FA&lt;/code&gt;. Si un benchmark usa &lt;code&gt;Flash Attention&lt;/code&gt; y otro no, las puntuaciones no son directamente comparables.&lt;/p&gt;
&lt;h3 id=&#34;3-si-la-métrica-mide-entrada-o-salida&#34;&gt;3. Si la métrica mide entrada o salida
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; y &lt;code&gt;tg128&lt;/code&gt; miden etapas distintas. Una se acerca a velocidad de lectura de prompt; la otra a velocidad de generación de respuesta.&lt;/p&gt;
&lt;h3 id=&#34;4-si-te-importa-throughput-o-sensación-de-uso&#34;&gt;4. Si te importa throughput o sensación de uso
&lt;/h3&gt;&lt;p&gt;Si te importa procesar rápido un prompt largo, &lt;code&gt;pp512&lt;/code&gt; pesa más. Si te importa qué tan rápido se siente el modelo al responder, &lt;code&gt;tg128&lt;/code&gt; suele estar más cerca de la experiencia real.&lt;/p&gt;
&lt;h2 id=&#34;una-forma-práctica-de-recordarlo&#34;&gt;Una forma práctica de recordarlo
&lt;/h2&gt;&lt;p&gt;Puedes resumirlo así:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Q4_0&lt;/code&gt;: el modelo está comprimido en una versión cuantizada de 4 bits&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FA&lt;/code&gt;: si Flash Attention está activado&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pp512&lt;/code&gt;: velocidad para procesar una entrada de 512 tokens&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tg128&lt;/code&gt;: velocidad para generar una salida de 128 tokens&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t/s&lt;/code&gt;: unidad de velocidad, tokens por segundo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con esos cinco puntos claros, es mucho más fácil juzgar qué mide realmente un CUDA Scoreboard.&lt;/p&gt;
&lt;h2 id=&#34;cierre&#34;&gt;Cierre
&lt;/h2&gt;&lt;p&gt;Las tablas de benchmark GPU a menudo parecen más complicadas de lo que son, no porque las métricas sean misteriosas, sino porque identidad del modelo, cuantización, flags de optimización y etapas distintas de throughput se comprimen en abreviaturas cortas.&lt;/p&gt;
&lt;p&gt;Cuando desarmas términos como &lt;code&gt;FA&lt;/code&gt;, &lt;code&gt;Q4_0&lt;/code&gt;, &lt;code&gt;pp512&lt;/code&gt; y &lt;code&gt;tg128&lt;/code&gt;, estas tablas se vuelven mucho más legibles.&lt;/p&gt;
&lt;p&gt;Lo importante no es recordar solo una puntuación, sino saber:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;de qué configuración de modelo viene&lt;/li&gt;
&lt;li&gt;si las optimizaciones clave estaban activadas&lt;/li&gt;
&lt;li&gt;si midió entrada o salida&lt;/li&gt;
&lt;li&gt;si refleja throughput de cómputo o algo más cercano a la sensación real de generación&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eso facilita juzgar qué significan realmente los resultados.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
