<?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的博客</title>
        <link>https://www.knightli.com/zh-tw/tags/flash-attention/</link>
        <description>Recent content in Flash Attention on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Thu, 23 Apr 2026 00:15:00 +0800</lastBuildDate><atom:link href="https://www.knightli.com/zh-tw/tags/flash-attention/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>顯卡推理速度測試的常用指標具體含義：FA、pp512、tg128、Q4_0 都是什麼意思</title>
        <link>https://www.knightli.com/zh-tw/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/zh-tw/2026/04/23/how-to-read-llm-cuda-scoreboard-fa-pp512-tg128-q4-0/</guid>
        <description>&lt;p&gt;只要你開始看本地大模型或顯卡推理速度測試，很快就會遇到一堆縮寫：&lt;code&gt;FA&lt;/code&gt;、&lt;code&gt;pp512&lt;/code&gt;、&lt;code&gt;tg128&lt;/code&gt;、&lt;code&gt;Q4_0&lt;/code&gt;。它們看起來都像是效能指標，但如果沒有上下文，確實很容易看得一頭霧水。&lt;/p&gt;
&lt;p&gt;例如你可能會看到這樣一行：&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;再往下看，又會看到像這樣的欄位：&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;如果不把這些詞拆開理解，你很難真正看懂這類速度測試到底在測什麼，也很難知道兩張不同顯示卡的成績到底該怎麼比。&lt;/p&gt;
&lt;p&gt;這篇文章不打算討論「哪張卡更值得買」，而是專門把顯卡推理速度測試裡最常見的幾個指標拆開講清楚。&lt;/p&gt;
&lt;h2 id=&#34;先看整行標題到底在說什麼&#34;&gt;先看整行標題到底在說什麼
&lt;/h2&gt;&lt;p&gt;像 &lt;code&gt;CUDA Scoreboard for Llama 2 7B, Q4_0 (no FA)&lt;/code&gt; 這樣一行，其實已經把測試背景交代得差不多了。&lt;/p&gt;
&lt;p&gt;它至少包含四層資訊：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CUDA&lt;/code&gt;：說明跑分是在 NVIDIA GPU 的 CUDA 路徑上完成的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Llama 2 7B&lt;/code&gt;：說明測試對象是 &lt;code&gt;Llama 2&lt;/code&gt; 的 &lt;code&gt;7B&lt;/code&gt; 參數版本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Q4_0&lt;/code&gt;：說明模型用了 4-bit 量化格式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no FA&lt;/code&gt;：說明這次測試關閉了 &lt;code&gt;Flash Attention&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是說，這種標題的完整意思通常是：&lt;/p&gt;
&lt;p&gt;「在 NVIDIA 顯示卡上，執行某個量化版本的大模型，並測量它在特定推理路徑下的速度表現。」&lt;/p&gt;
&lt;h2 id=&#34;fa-是什麼flash-attention&#34;&gt;FA 是什麼：Flash Attention
&lt;/h2&gt;&lt;p&gt;這裡的 &lt;code&gt;FA&lt;/code&gt;，指的是 &lt;code&gt;Flash Attention&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它是大模型推理和訓練中非常關鍵的一類加速技術，主要目標是優化注意力機制的計算方式。因為在 Transformer 模型裡，注意力計算本來就是最耗時、最吃顯存頻寬的部分之一。&lt;/p&gt;
&lt;p&gt;傳統注意力實作的一個問題是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要頻繁讀寫顯存&lt;/li&gt;
&lt;li&gt;中間結果很多&lt;/li&gt;
&lt;li&gt;資料會在顯存和片上快取之間來回搬運&lt;/li&gt;
&lt;li&gt;上下文一長，開銷會非常明顯&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Flash Attention&lt;/code&gt; 做的事情，可以簡單理解成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重新組織計算順序&lt;/li&gt;
&lt;li&gt;減少中間結果落到顯存的次數&lt;/li&gt;
&lt;li&gt;讓更多操作留在更快的快取裡完成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以它的典型效果通常有三點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更快&lt;/li&gt;
&lt;li&gt;更省顯存&lt;/li&gt;
&lt;li&gt;在數學上和普通注意力等價，不是「犧牲精度換速度」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這也是為什麼今天很多推理框架、訓練框架都把它當成非常重要的優化項。&lt;/p&gt;
&lt;h2 id=&#34;no-fa-是什麼意思&#34;&gt;no FA 是什麼意思
&lt;/h2&gt;&lt;p&gt;既然 &lt;code&gt;FA&lt;/code&gt; 是 &lt;code&gt;Flash Attention&lt;/code&gt;，那麼 &lt;code&gt;no FA&lt;/code&gt; 就很好理解了：這次測試沒有啟用 &lt;code&gt;Flash Attention&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;也就是說，跑分用的是更傳統的注意力實作。&lt;/p&gt;
&lt;p&gt;之所以很多跑分表會特地把 &lt;code&gt;no FA&lt;/code&gt; 標出來，通常是為了下面幾件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;做對照組，方便看出開啟 &lt;code&gt;FA&lt;/code&gt; 後到底提升了多少&lt;/li&gt;
&lt;li&gt;相容某些不支援 &lt;code&gt;FA&lt;/code&gt; 的硬體或軟體環境&lt;/li&gt;
&lt;li&gt;避免不同測試項混在一起，導致資料不可比&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以你看到 &lt;code&gt;no FA&lt;/code&gt; 時，不要把它理解成「這張卡不行」，更準確的理解是：&lt;/p&gt;
&lt;p&gt;「這個成績是在沒有開啟 Flash Attention 優化的前提下測出來的。」&lt;/p&gt;
&lt;h2 id=&#34;q4_0-是什麼量化格式&#34;&gt;Q4_0 是什麼：量化格式
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Q4_0&lt;/code&gt; 指的是一種 4-bit 量化格式。&lt;/p&gt;
&lt;p&gt;大模型原始權重通常不是這種低精度格式，直接載入時體積會非常大。量化做的事情，本質上就是把原本更高精度的權重壓縮成更低位寬的表示方式，讓模型更容易在消費級顯示卡上運行。&lt;/p&gt;
&lt;p&gt;你可以先把它粗略理解成：&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;：某一種具體量化方案的標識&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的重要意義在於：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;減少模型體積&lt;/li&gt;
&lt;li&gt;降低顯存需求&lt;/li&gt;
&lt;li&gt;讓本來裝不下的模型變得能跑起來&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 &lt;code&gt;Llama 2 7B, Q4_0&lt;/code&gt; 的意思，不是「一個普通的 7B 模型」，而是「一個已經經過 4-bit 量化壓縮的 7B 模型」。&lt;/p&gt;
&lt;h2 id=&#34;pp512-ts-是什麼意思&#34;&gt;pp512 t/s 是什麼意思
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; 一般指的是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Prompt Processing 512 tokens&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;它衡量的是模型處理輸入提示詞時的速度，單位通常是 &lt;code&gt;t/s&lt;/code&gt;，也就是 &lt;code&gt;tokens per second&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這裡的 &lt;code&gt;512&lt;/code&gt;，表示測試時輸入的提示詞長度是 &lt;code&gt;512 token&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這個指標測的不是「吐字速度」，而是模型在開始回答之前，對輸入內容做編碼和計算的速度。你可以把它理解成模型在「先把你說的話讀完」的階段有多快。&lt;/p&gt;
&lt;p&gt;這個階段通常有一個很重要的特點：並行度比較高。&lt;/p&gt;
&lt;p&gt;因為輸入序列可以成批處理，所以 GPU 在這個階段往往能把算力壓得很滿。也正因如此，&lt;code&gt;pp512&lt;/code&gt; 的數值經常會非常高，看起來甚至高得有點誇張。&lt;/p&gt;
&lt;p&gt;所以如果你看到：&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;不要驚訝，這測的是「輸入處理吞吐量」，不是模型一邊一邊吐字的速度。&lt;/p&gt;
&lt;h2 id=&#34;tg128-ts-是什麼意思&#34;&gt;tg128 t/s 是什麼意思
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;tg128&lt;/code&gt; 一般指的是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Text Generation 128 tokens&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;它測的是模型連續生成 &lt;code&gt;128 token&lt;/code&gt; 時的平均生成速度，單位同樣是 &lt;code&gt;t/s&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這個指標更接近我們平時對「模型回答快不快」的直覺感受，因為它真的在測輸出階段。&lt;/p&gt;
&lt;p&gt;但它和 &lt;code&gt;pp512&lt;/code&gt; 最大的不同在於：文本生成通常是自回歸的。&lt;/p&gt;
&lt;p&gt;簡單說就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要先算出第一個 token&lt;/li&gt;
&lt;li&gt;才能繼續算第二個 token&lt;/li&gt;
&lt;li&gt;再繼續算第三個 token&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以這個階段沒法像輸入處理那樣大規模並行，速度天然會慢很多。&lt;/p&gt;
&lt;p&gt;這也是為什麼你經常會看到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pp512&lt;/code&gt; 是上萬 &lt;code&gt;t/s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tg128&lt;/code&gt; 卻只有幾百 &lt;code&gt;t/s&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這不是跑分出錯，而是它們本來就在測兩種完全不同的工作負載。&lt;/p&gt;
&lt;h2 id=&#34;為什麼-pp512-和-tg128-會差這麼多&#34;&gt;為什麼 pp512 和 tg128 會差這麼多
&lt;/h2&gt;&lt;p&gt;這是很多人第一次看 scoreboard 時最困惑的一點。&lt;/p&gt;
&lt;p&gt;原因可以概括成一句話：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; 更像在測並行吞吐，&lt;code&gt;tg128&lt;/code&gt; 更像在測逐 token 生成能力。`&lt;/p&gt;
&lt;p&gt;再展開一點說：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;輸入階段更容易並行&lt;/li&gt;
&lt;li&gt;輸出階段更依賴逐步遞推&lt;/li&gt;
&lt;li&gt;生成階段通常更吃顯存頻寬和快取效率&lt;/li&gt;
&lt;li&gt;所以生成速度遠低於輸入處理速度是正常現象&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也正因為這樣，很多時候兩張卡的表現會出現一種很有意思的情況：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;pp512&lt;/code&gt; 上，一張卡更強&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;tg128&lt;/code&gt; 上，另一張卡反而略快&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這並不矛盾。因為一個更偏算力峰值，一個更偏實際生成路徑下的頻寬和延遲表現。&lt;/p&gt;
&lt;h2 id=&#34;ts-到底怎麼理解&#34;&gt;t/s 到底怎麼理解
&lt;/h2&gt;&lt;p&gt;這裡的 &lt;code&gt;t/s&lt;/code&gt;，就是 &lt;code&gt;tokens per second&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它表示模型每秒能處理或生成多少個 token。&lt;/p&gt;
&lt;p&gt;但需要注意，&lt;code&gt;token&lt;/code&gt; 不是「字」，也不是「單詞」，它是模型分詞器切出來的單位。不同模型、不同語言環境下，一個 token 對應的文本長度可能差別很大。&lt;/p&gt;
&lt;p&gt;所以在實際閱讀跑分時，&lt;code&gt;t/s&lt;/code&gt; 更適合用來做：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同模型下不同顯示卡對比&lt;/li&gt;
&lt;li&gt;同環境下不同參數設定對比&lt;/li&gt;
&lt;li&gt;同一框架裡開啟或關閉某個優化項前後的對比&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而不太適合直接拿來跨模型、跨框架、跨分詞器硬比「誰絕對更快」。&lt;/p&gt;
&lt;h2 id=&#34;看-scoreboard-時最該先抓住哪幾個點&#34;&gt;看 scoreboard 時，最該先抓住哪幾個點
&lt;/h2&gt;&lt;p&gt;如果你不想每次都被一堆縮寫淹沒，可以先抓這幾個核心問題：&lt;/p&gt;
&lt;h3 id=&#34;1-測試模型是什麼&#34;&gt;1. 測試模型是什麼
&lt;/h3&gt;&lt;p&gt;比如是不是 &lt;code&gt;Llama 2 7B&lt;/code&gt;，是不是同一個量化版本，例如 &lt;code&gt;Q4_0&lt;/code&gt;。模型不同、量化不同，成績直接橫比意義不大。&lt;/p&gt;
&lt;h3 id=&#34;2-有沒有開啟關鍵優化&#34;&gt;2. 有沒有開啟關鍵優化
&lt;/h3&gt;&lt;p&gt;最常見的就是 &lt;code&gt;FA&lt;/code&gt;。如果一個測試開了 &lt;code&gt;Flash Attention&lt;/code&gt;，另一個沒開，那兩邊成績不能簡單直接對讀。&lt;/p&gt;
&lt;h3 id=&#34;3-看的是輸入速度還是輸出速度&#34;&gt;3. 看的是輸入速度還是輸出速度
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;pp512&lt;/code&gt; 和 &lt;code&gt;tg128&lt;/code&gt; 分別在測不同階段。一個更像「讀題速度」，一個更像「回答速度」。&lt;/p&gt;
&lt;h3 id=&#34;4-關注的是吞吐還是體感&#34;&gt;4. 關注的是吞吐還是體感
&lt;/h3&gt;&lt;p&gt;如果你更在意長提示詞載入速度，&lt;code&gt;pp512&lt;/code&gt; 更有參考價值；如果你更在意模型回答時的流暢程度，&lt;code&gt;tg128&lt;/code&gt; 往往更貼近真實體感。&lt;/p&gt;
&lt;h2 id=&#34;一個更實用的理解方式&#34;&gt;一個更實用的理解方式
&lt;/h2&gt;&lt;p&gt;如果要把這些指標壓縮成一句最容易記住的話，可以這樣理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Q4_0&lt;/code&gt;：模型被壓縮成了 4-bit 量化版本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FA&lt;/code&gt;：是不是啟用了 Flash Attention 加速&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pp512&lt;/code&gt;：處理 512 token 輸入時有多快&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tg128&lt;/code&gt;：生成 128 token 輸出時有多快&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t/s&lt;/code&gt;：速度單位，每秒多少 token&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只要先把這五件事分清楚，再看類似的 CUDA Scoreboard 時，就更容易判斷「這個分數到底是在測什麼」。&lt;/p&gt;
&lt;h2 id=&#34;結語&#34;&gt;結語
&lt;/h2&gt;&lt;p&gt;很多 GPU 跑分表看起來複雜，不是因為指標本身特別神祕，而是因為它把模型、量化、優化項和不同階段的吞吐都壓縮進了很短的幾行縮寫裡。&lt;/p&gt;
&lt;p&gt;一旦把 &lt;code&gt;FA&lt;/code&gt;、&lt;code&gt;Q4_0&lt;/code&gt;、&lt;code&gt;pp512&lt;/code&gt;、&lt;code&gt;tg128&lt;/code&gt; 這些詞拆開，你會發現這類 scoreboard 其實並不難讀。&lt;/p&gt;
&lt;p&gt;真正重要的，不是只記住某張卡跑了多少分，而是知道：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;這個分數是在什麼模型下測的&lt;/li&gt;
&lt;li&gt;有沒有開關鍵優化&lt;/li&gt;
&lt;li&gt;它測的是輸入，還是輸出&lt;/li&gt;
&lt;li&gt;它更反映算力，還是更接近實際生成體驗&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這樣你以後再看類似跑分表時，就更容易判斷這些結果分別對應什麼測試條件和性能含義。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
