2

模型

把模型讀成一連串運算、表示法與記憶體傳輸;它的架構會預示推論時哪一項資源先變得稀缺。

9 分鐘閱讀

印刷頁: 39–70

在 GitHub 加星

一口氣讀懂

生成式模型由大型神經網路組合而成,推論效能會跟著這些網路要求的工作形態改變。語言模型先把提示轉成 token,在 prefill 階段處理所有輸入位置,把可重用的 attention 狀態放進 KV cache,再於 decode 階段每次 forward pass 產生一個 token。prefill 通常受運算能力限制,主要決定 time to first token(TTFT);decode 通常受記憶體限制,主要決定 tokens per second(TPS)。diffusion 式影像與影片系統則會反覆細化整個 latent 表示,通常受運算能力限制。arithmetic intensity 是運算次數與記憶體流量的比值,可把不同工作放到硬體 roofline 上,解釋為什麼同一種最佳化不可能加速所有階段。理解架構,能把效能調校從經驗法則轉為依瓶頸選擇的工程。

模型架構形成兩種不同的服務瓶頸

token 輸入先流向 Transformer 工作再分支:prefill 路徑越過 roofline 轉折點後進入 compute-bound 區;decode 路徑則在轉折點下方進入 memory-bound 區。

  • token 輸入聊天模板與 tokenizer 產生模型要處理的序列。
  • Transformer 工作attention 與 feed-forward 層套用訓練得到的 weights。
  • prefill 路徑建立 KV cache 時,許多輸入位置會一起平行處理。
  • decode 路徑每次 forward pass 產生一個新 token,並反覆讀取模型 weights。
  • roofline 轉折點硬體每 byte 運算數的平衡點,分隔 bandwidth-bound 與 compute-bound 工作。
  • compute-bound 區高 arithmetic intensity 使可用運算能力成為限制資源。
  • memory-bound 區低 arithmetic intensity 使記憶體流量成為限制資源。
  • token 輸入Transformer 工作: 進入模型
  • Transformer 工作prefill 路徑: 處理提示
  • Transformer 工作decode 路徑: 產生下一個 token
  • prefill 路徑compute-bound 區: 高強度
  • decode 路徑memory-bound 區: 低強度
  • roofline 轉折點compute-bound 區: 高於平衡點
  • roofline 轉折點memory-bound 區: 低於平衡點

為何重要

模型不是一整塊均勻的浮點運算。線性層持有語言模型的大部分 weights;attention 會搬移並組合序列狀態;稀疏 expert 改變實際啟用哪些參數;媒體處理管線則在許多 denoising 步驟中呼叫多個元件模型。這些選擇決定 weights 讀取、中間張量、cache 成長、parallelism 機會,以及哪些近似方法可能傷害品質。若最佳化瞄準錯誤資源,最昂貴的路徑可能完全不變。

prefill 和 decode 的分界尤其重要,因為同一個請求會在執行途中更換瓶頸。更快的矩陣運算有助於運算密集的提示階段;逐 token 生成則主要受記憶體搬移與重用支配。若只看一個平均值,就會掩蓋 TTFT 與 TPS 為何對 batch 大小、硬體、kernel 和放置策略有不同反應。有用的推論模型必須保留階段,而不能把它們壓平。

推理時應先看執行形態,再看模型或 accelerator 品牌。模型設定檔會揭露層數、hidden dimension、attention head、詞彙表,以及 feed-forward 層採密集或 expert routing;請求資料則揭露序列長度、batch、輸出長度與媒體維度。兩者合起來,便能預測最大的張量和會反覆執行的迴圈。接著由硬體提供運算與頻寬上限,實作則決定工作能多接近上限。這個順序能跨越產品世代。它也解釋為什麼同一架構的不同變體可以承接相同 inference engine 支援,卻因尺寸不同而需要不同容量;也解釋為什麼換成更新 GPU,仍不會消除隨 context 或 latent volume 快速成長的演算法形態。若只從品牌或峰值規格開始,團隊容易把理論上更快的硬體配給實際受記憶體流量限制的 decode,或用為 token 生成設計的技巧處理全 latent denoising。從形態出發,才能先列出需要驗證的資源假設,再選擇真正可能改變瓶頸的模型、kernel 與硬體。

心智模型

  • 神經網路透過輸入層、隱藏層與輸出層逐步轉換表示。文字 encoder 常把片段展開成具有語意的高維向量;影像模型則把數百萬像素壓縮至較小的 latent space。encoder 建立表示,decoder 利用表示產生輸出,完整模型與處理管線可以組合多個網路。
  • 線性層把輸入向量乘上學得的 weights 矩陣,再加上偏差值。若只堆疊線性運算,代數上可以合併成一次轉換,因此各層之間要用 activation function 插入非線性。matmul 和非線性的搭配,使深度能保存有用的內部結構。
  • decoder-only 語言模型先把 token 映射成 embedding,讓 hidden state 通過許多 transformer block,最後由語言模型輸出層為詞彙表每個項目產生一個 logit。每個 block 組合 attention、feed-forward 網路、正規化、residual 路徑與 activation。feed-forward 矩陣持有大部分 weights,attention 則建立序列關係。
  • 兩種生成方式可以統整本章。自回歸模型每次做一個選擇,持續延長 token 序列;diffusion 模型從雜訊開始,反覆更新整個 latent 物件。兩者都會使用 transformer 與 attention,但迴圈形態會形成截然不同的並行、記憶體與延遲行為。
  • roofline 把軟體工作連結到硬體上限。將運算的 arithmetic intensity 和 GPU 每 byte 可支援的運算數平衡點比較。低於平衡點時,資料無法足夠快地餵給 compute unit,因此受記憶體限制;高於平衡點時,每 byte 有足夠多運算,限制會轉為運算能力。

閱讀效能時,可以使用一條四段鏈。第一段辨識語意運算,例如 attention、feed-forward 層、expert routing 或 denoising;第二段辨識執行形態,是完整序列矩陣工作、單 token 向量工作、稀疏 routing,或整個 latent 的更新;第三段透過 byte、運算數、cache 狀態與重複次數,找出受到壓力的資源;最後把該資源連回產品指標,例如第一份輸出延遲、token 節奏、影像完成時間、影片完成時間、容量或成本。跳過任何一段都容易產生照抄式調校:看到別人使用某個 kernel 就直接套用,卻沒有確認自己的矩陣形狀和資料流;看到更高峰值運算量就換硬體,卻沒有確認記憶體是否才是上限。沿著整條鏈推理,能讓每個改動都有可檢驗假設,也能說清楚某項技術何時可以跨 modality 移植,何時因執行迴圈根本不同而失效。這條鏈還能協助溝通:模型研究者描述運算,系統工程師描述資源,產品團隊描述可見結果,三者用同一請求與量測互相對齊;變更後再用相同輸入與工作負載切片重新量測,才能確認改善不是資料差異或測試條件漂移造成。

核心概念

  • token 是子詞文字片段的數字識別碼。神經運算開始前,tokenizer 與模型專屬聊天模板會把提示、角色、工具與其他輸入攤平成單一序列。更有效率的 tokenization 能縮短序列;需要處理或生成的位置減少後,也可能改善端到端推論。
  • prefill 處理完整輸入序列、計算 attention 並建立 KV cache。decode 反覆執行 forward pass,把詞彙表 logits 轉成機率,依 temperature、top-k 或 top-p 限制選出 token,更新狀態,最後在 stop token 或長度上限停止。
  • attention 把 query 和 key 比較,再用所得分數組合 value。具因果遮罩的 self-attention 只讓語言 token 關聯到序列中允許的位置;cross-attention 則用另一個序列或 modality 提供條件。多個 head 可以平行學習不同的關係模式。
  • 若不重用,每個新 token 都要重新計算先前位置的 key 與 value。KV cache 儲存這些結果,讓增量 decode 的 attention 從反覆平方工作變成隨既有序列長度線性增加。它在 prefill 建立,在 decode 中讀取並延伸,通常占用 GPU 記憶體。
  • mixture of experts(MoE)以許多 expert 矩陣和 router 取代單一密集 feed-forward 矩陣;每個 token 在每一層只啟用一小部分 expert。單一請求的有效參數可能遠少於總參數,但 batch 內不同請求合計可能碰到大多數 expert。這種結構也開啟以 expert 為單位的多 GPU parallelism。
  • 影像生成是一條處理管線,不是單一整體模型:文字 encoder 表示提示;denoiser 依條件反覆更新帶雜訊的 latent 資料;variational autoencoder 最後把 latent 轉成像素。在壓縮 latent space 中工作,才能讓涵蓋整張影像的 attention 變得可行。
  • 傳統影像請求常執行三十到五十個 denoising 步驟,每一步又把有條件與無條件 forward pass 透過 guidance 結合。解析度、步數、guidance、正向提示與負向提示都會影響工作量或輸出。少步數模型把迴圈縮到八步以下,但接受品質取捨。
  • 現代影片模型把空間與時間一起放進單一 latent volume,讓每個 frame 在每次更新時都能注意其他 frame,避免逐幀生成的誤差累積。代價是對固定短片進行極大量運算;原書版本描述的模型甚至常讓整個八張 GPU 節點只服務一個請求。

運作機制

  1. 套用模型的聊天模板和 tokenizer。把輸入 token、可選推理 token 與最大輸出 token 一起計入 context window,因為序列長度會影響 attention 工作、cache 大小和總回應時間。
  2. 對輸入矩陣執行 prefill。大型 matmul 會在許多位置重用 weights,形成高 arithmetic intensity,並為每個提示 token 建立 attention key 與 value。這個運算密集階段設定第一份輸出的等待時間。
  3. 每個輸出 token 執行一次 transformer。每次 pass 都為相對少量的向量矩陣工作讀取模型 weights,產生詞彙表 logits、套用選擇規則,並加入選中的 token 與新 cache 狀態。低 arithmetic intensity 使記憶體搬移通常成為限制。
  4. 在 block 內建立 query、key 與 value 表示,計算 attention 分數、正規化,再組合 value。接著讓 hidden state 通過 feed-forward 層和 residual 正規化路徑。這套流程穿過許多 block 後才到達輸出層。
  5. 影像流程先編碼文字,以雜訊初始化 latent,再透過重複 denoising 步驟更新整個 latent。依 guidance 設定組合有條件與無條件 pass,最後把完成的 latent decode 成像素。
  6. 影片流程為 latent 加入時間維度並一起更新所有 frame。attention 比逐幀串鏈更能維持全域一致性,但更大的 latent 和模型使每個 denoising 步驟都成為昂貴的運算工作。
  7. 針對昂貴的 kernel,計算浮點運算數和讀寫 byte 數。把工作量除以流量,將結果和硬體每 byte 運算數比較,再最佳化飽和的資源。序列形態、batch 大小、精度、實作、模型或硬體改變時,都要重新計算。
arithmetic intensity = 浮點運算數 ÷ 搬移的 byte 數
這個比值描述單一運算對已載入資料的重用程度;與硬體平衡點比較後,就能判斷落在 memory-bound 或 compute-bound 區。

關鍵指標

arithmetic intensity

每搬移一個 byte 執行的運算數

定位運算相對於硬體 roofline 轉折點的位置。

硬體平衡點

每秒尖峰運算數 ÷ 每秒尖峰 byte 數

針對選定精度,提供記憶體限制和運算限制之間的比較點。

prefill 延遲

TTFT 的主要來源

追蹤處理提示位置與建立 KV cache 的運算密集工作。

decode 節奏

TPS 的主要來源

追蹤記憶體密集階段中反覆讀取 weights 與逐 token 生成。

KV cache 用量

狀態隨活躍序列長度成長

顯示保留 attention 狀態造成的記憶體容量與搬移壓力。

denoising 工作量

步驟數 × 每步 forward pass 數

把影像或影片延遲連結到迴圈長度、guidance、latent 大小與模型成本。

取捨

實作與演算法

FlashAttention 類 fused kernel 能移除多餘的記憶體流量而不改變模型輸出,PagedAttention 則管理碎片化的 KV cache 區塊;兩者都保留原本 attention 規則與成長速度。sliding-window、gated、linear、compressed 或 multi-latent attention 會改變工作本身,可能以品質換取較佳時間或空間複雜度。Mamba 等 state-space 架構以遞迴狀態更新取代 attention,混合模型則結合兩類區塊。

密集與稀疏 expert

密集模型會以可預期方式使用所有參數。MoE 能降低單一 token 的有效參數量,卻讓 routing、expert 放置與多樣化 batch 請求的記憶體使用及多 GPU 執行更複雜。

重新計算與 cache 記憶體

KV cache 避免重複計算先前 key 與 value,讓 decode attention 成為可行的增量工作。它也會占用持續成長的 GPU 記憶體,促成分頁、放置與重用策略。

denoising 步數與影像品質

更多 diffusion 步驟會反覆細化影像,也會增加 forward pass。少步數一致性模型或蒸餾模型可以大幅加速,但品質下降明顯;對延遲敏感的即時特效仍可能適用。

影片全域一致性與運算量

更新完整時空 latent 能限制逐幀漂移,並讓 frame 跨時間互相注意,卻固定短輸出長度並要求極昂貴 attention。自回歸元件嘗試放鬆這項成本,又不回到失控的誤差累積。

單一請求與 batch

單一請求的 decode arithmetic intensity 偏低。batching 以同一次 weights 載入完成更多工作,讓運算更接近 compute-bound,但也會改變延遲、cache 需求,以及哪些 expert 被啟用。

工程檢查表

  • 選擇執行路徑前,檢查模型設定、層維度、attention 形式、密度與元件處理管線。
  • 使用正確 tokenizer 與聊天模板,並記錄輸入、推理和輸出 token 長度。
  • 分開剖析 prefill 與 decode,避免把 TTFT 和 TPS 壓成單一平均值。
  • 最佳化運算或頻寬之前,估算昂貴 kernel 的運算數與記憶體流量。
  • 納入活躍序列的 KV cache 成長、碎片、存取與生命週期。
  • 在真實 batch 下量測 expert 啟用,不要假設有效參數量等於伺服器總工作量。
  • 媒體模型要記錄 latent 維度、denoising 步數、guidance pass、元件模型、輸出大小與 batch 大小。
  • 判斷 attention 最佳化屬於無品質損失的實作工作,或會影響品質的演算法改變,再用對應方式驗證。

術語

hidden state
在神經網路各層之間傳遞的中間向量表示。
matmul
把訓練得到的 weights 矩陣套用至輸入向量或矩陣的核心運算。
prefill
處理所有輸入位置,並建立該請求 attention cache 的階段。
decode
反覆產生並選擇下一個 token 的自回歸階段。
KV cache
先前 token 的 attention key 與 value,在 decode 中重用並繼續延伸。
MoE
router 在每個 token 與每一層選擇一部分 expert 矩陣的稀疏架構。
latent space
媒體模型執行生成工作的壓縮內部表示空間。
arithmetic intensity
一項運算所執行的計算量,除以它傳輸的 byte 數。
roofline 模型
把 arithmetic intensity 和頻寬上限、尖峰運算效能上限連結起來的圖。
paged attention
透過查找表存取 cache 區塊,而不要求單一連續配置的實作。

原書索引

  • 印刷頁 41–42

    介紹神經模型、transformer、自回歸與反覆 denoising。

  • 印刷頁 42–46

    建立表示、層、matmul 與非線性 activation 的直覺。

  • 印刷頁 46–49

    追蹤 token 準備、prefill、decode、logits、取樣與停止。

  • 印刷頁 49–53

    解釋 transformer block、attention 輸入、head、mask 與 KV cache。

  • 印刷頁 53–54

    說明稀疏 expert routing 和生產 batch 下的行為。

  • 印刷頁 55–59

    整理影像管線、latent diffusion、guidance、架構成長與少步數模型。

  • 印刷頁 59–61

    解釋時空 latent 生成、全域 attention 與資源限制。

  • 印刷頁 61–63

    定義 arithmetic intensity 與 roofline 上從 memory-bound 轉為 compute-bound 的位置。

  • 印刷頁 63–67

    從工作量與記憶體流量推導 prefill、decode、影像與影片瓶頸。

  • 印刷頁 67–70

    概覽 attention 實作、分頁、近似方法與 state-space 替代架構。

Generative-model foundations, transformers, autoregressive generation, and iterative denoising
印刷頁: 41–42; PDF 頁: 43–44
Neural-network layers, representations, encoders, decoders, matmul, and activation functions
印刷頁: 42–46; PDF 頁: 44–48
Tokens, templates, sequences, prefill, decode, logits, sampling, and stop conditions
印刷頁: 46–49; PDF 頁: 48–51
Architecture metadata, transformer blocks, feed-forward layers, attention, and KV caching
印刷頁: 49–53; PDF 頁: 51–55
Mixture-of-experts routing, active parameters, batching effects, and expert parallelism
印刷頁: 53–54; PDF 頁: 55–56
Image-generation pipelines, latent diffusion, guidance, architectures, and few-step models
印刷頁: 55–59; PDF 頁: 57–61
Video latent space, temporal attention, fixed output length, compute cost, and autoregressive directions
印刷頁: 59–61; PDF 頁: 61–63
Compute, memory bandwidth, ops-to-byte balance, arithmetic intensity, and roofline regions
印刷頁: 61–63; PDF 頁: 63–65
Prefill, decode, media bottlenecks, and the memory movement behind attention
印刷頁: 63–67; PDF 頁: 65–69
Attention implementation, paging, approximate variants, windowing, compression, and state-space alternatives
印刷頁: 67–70; PDF 頁: 69–72