<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>LLM on KnightLi的博客</title>
        <link>https://www.knightli.com/zh-tw/tags/llm/</link>
        <description>Recent content in LLM 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/llm/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>
        <item>
        <title>大模型常見張量類型入門：FP32、FP16、BF16、TF32 與 FP8</title>
        <link>https://www.knightli.com/zh-tw/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/</link>
        <pubDate>Wed, 22 Apr 2026 22:40:00 +0800</pubDate>
        
        <guid>https://www.knightli.com/zh-tw/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/</guid>
        <description>&lt;p&gt;只要你開始接觸大模型訓練、推理或部署，很快就會遇到一組高頻縮寫：&lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt;、&lt;code&gt;BF16&lt;/code&gt;、&lt;code&gt;TF32&lt;/code&gt;、&lt;code&gt;FP8&lt;/code&gt;。它們看起來像是模型頁面上的幾個附加標籤，但實際影響遠不只是「寫法不同」。&lt;/p&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;/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;/ul&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;/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;在大模型裡，尾數精度當然重要，但很多時候模型更怕的是數值範圍不夠，也就是指數位太小，導致溢出或訓練不穩定。很多張量格式的設計，本質上就是在「範圍」與「細節」之間重新分配有限的 bit 數。&lt;/p&gt;
&lt;p&gt;下面這張圖可以先幫你建立一個整體印象：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/tensor-format-overview.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP32、FP16、BF16、TF32 與 FP8 的位寬結構總覽&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;fp32最穩但最貴&#34;&gt;FP32：最穩，但最貴
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;FP32&lt;/code&gt; 是最傳統的單精度浮點格式，總共 32 bit，也就是 4 個位元組。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/fp32-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP32 位寬結構示意圖&#34;
	
	
&gt;&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;/ul&gt;
&lt;p&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;顯存占用 ≈ 參數量 × 每個參數的位元組數
&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;如果一個 27B 模型完全用 &lt;code&gt;FP32&lt;/code&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;27B × 4 bytes ≈ 108GB
&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;這還沒算激活值、KV Cache、優化器狀態與其他執行期開銷。也就是說，&lt;code&gt;FP32&lt;/code&gt; 在今天的大模型推理與訓練裡，已經不是「預設選擇」，而更像是「最穩的基線格式」。&lt;/p&gt;
&lt;h2 id=&#34;fp16體積減半但穩定性一般&#34;&gt;FP16：體積減半，但穩定性一般
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;FP16&lt;/code&gt; 把每個參數壓縮到 2 個位元組，顯存占用相較 &lt;code&gt;FP32&lt;/code&gt; 直接減半。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/fp16-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP16 位寬結構示意圖&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;對同一個 27B 模型來說，如果只看權重體積：&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;27B × 2 bytes ≈ 54GB
&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;這就已經能解釋為什麼很多部署說明裡，27B 模型的顯存需求會落在 50GB 左右。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FP16&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;但它的問題在於指數位偏小，動態範圍不夠大。對大模型訓練來說，這會讓溢出更容易發生，需要額外依賴 loss scaling 一類技巧來補救，工程上比較麻煩。&lt;/p&gt;
&lt;p&gt;所以現在 &lt;code&gt;FP16&lt;/code&gt; 仍然常見，但在很多場景裡，它已經不再是最舒服的選擇。&lt;/p&gt;
&lt;h2 id=&#34;bf16大模型時代更實用的半精度&#34;&gt;BF16：大模型時代更實用的半精度
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;BF16&lt;/code&gt; 同樣只占 2 個位元組，但和 &lt;code&gt;FP16&lt;/code&gt; 的設計重點不一樣。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/bf16-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;BF16 位寬結構示意圖&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;它保留了更大的指數範圍，讓它在動態範圍上更接近 &lt;code&gt;FP32&lt;/code&gt;，只是犧牲了一部分尾數精度。這種取捨對大模型尤其友好，因為很多時候模型對「範圍」更敏感，對尾數少幾位反而沒那麼敏感。&lt;/p&gt;
&lt;p&gt;這也是為什麼現在很多訓練框架、很多大模型論文與大量實際部署方案，都更偏向 &lt;code&gt;BF16&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;你可以把它理解成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顯存成本接近 &lt;code&gt;FP16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;穩定性體驗更接近 &lt;code&gt;FP32&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果一套 27B 部署方案寫的是 50GB 左右顯存，而另一套經過進一步優化後接近 30GB，前者往往還停留在 &lt;code&gt;FP16/BF16&lt;/code&gt; 這一層，後者則通常已經繼續往更低精度或量化方向走了。&lt;/p&gt;
&lt;h2 id=&#34;tf32不是省顯存而是加速-fp32-工作流&#34;&gt;TF32：不是省顯存，而是加速 FP32 工作流
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;TF32&lt;/code&gt; 很容易被誤會成「又一種更省的格式」，但它的定位其實不太一樣。&lt;/p&gt;
&lt;p&gt;從常見理解上看，它可以近似視為一種保留較大指數範圍、但縮短尾數精度的計算格式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/tf32-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;TF32 計算格式示意圖&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;不過要注意，&lt;code&gt;TF32&lt;/code&gt; 更像是一條 Tensor Core 計算路徑裡的內部計算格式，而不是像 &lt;code&gt;FP16/BF16&lt;/code&gt; 那樣主要拿來做權重存儲。&lt;/p&gt;
&lt;p&gt;它主要是 NVIDIA 在較新的 GPU 上提供的一種計算模式，目標不是減少顯存占用，而是讓原本基於 &lt;code&gt;FP32&lt;/code&gt; 的訓練流程，在盡量不大改程式碼的前提下跑得更快。&lt;/p&gt;
&lt;p&gt;它的特點可以概括成一句話：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;對外看起來還是 &lt;code&gt;FP32&lt;/code&gt; 工作流&lt;/li&gt;
&lt;li&gt;底層在矩陣乘法時做了更快的近似計算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 &lt;code&gt;TF32&lt;/code&gt; 主要解決的是「&lt;code&gt;FP32&lt;/code&gt; 太慢」的問題，而不是「&lt;code&gt;FP32&lt;/code&gt; 太占顯存」的問題。如果你關心的是為什麼同一個模型部署時顯存需求不一樣，&lt;code&gt;TF32&lt;/code&gt; 不是最主要的答案。&lt;/p&gt;
&lt;h2 id=&#34;fp8進一步壓縮但更考驗工程能力&#34;&gt;FP8：進一步壓縮，但更考驗工程能力
&lt;/h2&gt;&lt;p&gt;再往下走就是 &lt;code&gt;FP8&lt;/code&gt;。它把單個數值繼續壓縮到更少 bit 數，進一步降低顯存頻寬與存儲成本。&lt;/p&gt;
&lt;p&gt;它常見的不是單一一種格式，而是兩類變體：&lt;code&gt;E4M3&lt;/code&gt; 和 &lt;code&gt;E5M2&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/fp8-layout.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;FP8 兩種常見變體示意圖&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;但 &lt;code&gt;FP8&lt;/code&gt; 的代價也很明顯：位數太少以後，你很難同時兼顧範圍和精度，因此實際工程裡通常會針對不同階段採用不同變體，分別照顧前向、反向與梯度的穩定性。&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;/ul&gt;
&lt;p&gt;它很有前景，但對一般使用者來說，日常最常碰到的核心分界點，通常還是 &lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt; 和 &lt;code&gt;BF16&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;為什麼理解這些類型很重要&#34;&gt;為什麼理解這些類型很重要
&lt;/h2&gt;&lt;p&gt;很多人第一次看到這些縮寫，會把它們理解成「模型下載頁上的一些實作細節」。但實際上，它們會直接改變你對模型訓練與部署的理解方式。&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;p&gt;也正因如此，理解 &lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt;、&lt;code&gt;BF16&lt;/code&gt;、&lt;code&gt;TF32&lt;/code&gt; 和 &lt;code&gt;FP8&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;FP32&lt;/code&gt;：最穩、最貴&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FP16&lt;/code&gt;：更省顯存，但範圍偏小&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BF16&lt;/code&gt;：顯存接近 &lt;code&gt;FP16&lt;/code&gt;，穩定性更適合大模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TF32&lt;/code&gt;：主要解決 &lt;code&gt;FP32&lt;/code&gt; 太慢，不主要解決顯存&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FP8&lt;/code&gt;：更激進的壓縮與加速路線&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://www.knightli.com/2026/04/22/common-tensor-formats-fp32-fp16-bf16-tf32-fp8/tensor-format-summary.svg&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;常見張量類型總結圖&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;當你以後再看到模型下載頁裡寫著 &lt;code&gt;fp16&lt;/code&gt;、&lt;code&gt;bf16&lt;/code&gt;、&lt;code&gt;fp8&lt;/code&gt;，或者看到不同部署教學給出完全不一樣的顯存門檻時，就不會再覺得那只是「寫法不同」。它們背後其實對應的是完全不同的精度預算與工程取捨。&lt;/p&gt;
&lt;h2 id=&#34;結語&#34;&gt;結語
&lt;/h2&gt;&lt;p&gt;大模型裡的張量類型，表面上是在討論 bit 數，實際上討論的是一整套工程取捨。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FP32&lt;/code&gt;、&lt;code&gt;FP16&lt;/code&gt;、&lt;code&gt;BF16&lt;/code&gt;、&lt;code&gt;TF32&lt;/code&gt; 和 &lt;code&gt;FP8&lt;/code&gt; 沒有絕對的好壞，它們只是分別站在不同的位置上，幫你在穩定性、範圍、精度、顯存和速度之間做平衡。&lt;/p&gt;
&lt;p&gt;如果把這一層看懂，後面無論你是在讀訓練論文、調推理參數，還是比較不同部署方案，都會更容易抓住重點。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
