LLM 模型推理入門
概述
隨着生成式 AI 的迅速發展,大語言模型(LLM)的推理性能和成本已成爲其大規模應用的關鍵障礙。LLM 推理是指利用僅解碼器的 Transformer 模型生成詞元(token),其中大多數挑戰及其解決方案都源於這一特定架構和用例。
本文將深入探討 LLM 推理過程的兩個階段:預填充階段(Prefilling)和解碼階段(Decoding),並詳細介紹如何通過算法創新和系統優化來提升 LLM 的推理效率。具體內容包括:
-
LLM 推理基礎知識:介紹 Transformer 架構及其關鍵組件,如自注意力機制、多頭注意力機制和前饋網絡。同時,詳細說明從輸入詞元到生成輸出詞元的預填充階段和解碼階段的推理過程。
-
LLM 推理優化方向:探討通過算法創新和系統優化來提升 LLM 推理效率的方法,包括優化解碼算法、優化架構設計和模型壓縮等。
-
LLM 推理性能指標:介紹衡量 LLM 推理性能的關鍵指標,如每秒請求數(RPS)、首字輸出時間(TTFT)和字符間延遲(ITL)等。
術語解釋
-
詞元(Token):在自然語言處理中,詞元是文本數據的最小單位。它可以是一個詞、一部分詞、一個字符,或者是一個子詞。詞元化是將文本拆分成這些最小單位的過程,以便於計算機處理和分析。
-
預填充階段(Prefilling):在 LLM 推理過程中,預填充階段是指模型在收到輸入序列後,生成第一個輸出詞元之前的計算過程。
-
解碼階段(Decoding):解碼階段是指在預填充階段生成第一個詞元后,模型通過迭代生成後續詞元的過程,直到生成結束標誌或達到最大序列長度。
-
自注意力機制(Self-Attention Mechanism):Transformer 模型中的一種機制,通過計算輸入序列中不同部分的重要性,使模型能夠在生成過程中聚焦於輸入序列的不同部分。
-
前饋網絡(Feed-Forward Network, FFN):Transformer 模型中的組件,包含兩個線性變換和一個非線性激活函數,能夠增加模型的非線性表達能力。
-
多頭注意力機制(Multi-Head Attention):Transformer 模型中的一種機制,通過在不同的表示空間中同時關注輸入序列的不同部分,提高模型的表現力。
-
位置編碼(Position Encoding):在 Transformer 模型中,位置編碼爲序列中的每個詞元添加位置信息,使模型能夠識別輸入序列中的相對位置關係。
-
量化(Quantization):通過減少表示模型權重和激活值的比特位數來降低計算成本和內存佔用的一種技術。
-
模型並行(Model Parallelism):一種將模型的不同部分分配到多個設備上並行計算的方法,用於加速推理過程。
-
數據並行(Data Parallelism):一種將不同的數據樣本分配到多個設備上並行處理的方法,用於提高處理速度。
-
網絡剪枝(Network Pruning):通過移除模型中不重要的參數來減少模型大小和計算需求的一種技術。
LLM 推理基礎知識
Transformer 介紹
當前主流的 LLM 比如 OpenAI 的 GPT 系列、Meta 的 Llama 系列還有如 OPT、BLOOM、Mistral 等等,其核心是基於自注意力機制的 Transformer 架構,該機制允許模型在做出預測時對輸入數據的不同部分的重要性進行權重計算。
自注意力機制
在 Transformer 模型中,自注意力機制通過線性變換計算輸入序列 X 的查詢 Q、鍵 K 和值 V。自注意力分數計算公式如下:
前饋網絡(FFN)
Transformer 的每一層中都包含前饋網絡(FFN),顯著增加了計算強度。FFN 通常由兩個線性變換和一個非線性激活函數(通常是 ReLU)組成,公式如下:
Transformer 其他組件
Transformer 模型還包括其他關鍵組件,如位置編碼(position encoding),它爲序列中的每個標記添加位置信息;多頭注意力機制(multi-head attention),允許模型在不同的表示空間中關注序列的不同部分。這些組件共同作用,使得 Transformer 模型能夠捕捉廣泛的語言上下文和細微差別,在各種 NLP 任務中設立了新的基準。
LLM 推理過程:預填充 + 解碼
在介紹完 Transformer 結構之後,我們來看下 Decoder-Only 的模型如何進行模型推理。爲簡單起見,我們假設一次只處理一個序列(即批處理大小爲 1)。在下圖中,我描述了一個簡單的基於 Transformer 的解碼器的主要層,用於從一系列輸入詞元中生成輸出詞元。
簡單起見,我們假設解碼策略是模型的一部分,這些接受詞元序列作爲輸入,並返回相應輸出詞元的實體通常被稱爲執行引擎或推理引擎。
如果要生成多個詞元呢?使用基於 Transformer 的解碼器,從一個輸入文本序列(稱爲 prompt)中生成文本(稱爲 completion)通常包含以下步驟:
-
將模型權重加載到 GPU。
-
在 CPU 上對輸入文本進行分詞,並將文本序列詞元傳輸到 GPU。
-
利用模型運行輸入詞元,輸出第一個詞元(預填充階段)。
-
將生成的詞元添加到輸入的詞元序列中,然後作爲新的輸入,生成下一個詞元,直到生成停止詞元(比如 EOS)或者到達預先配置的最大序列長度(解碼階段)。
-
將生成的詞元傳輸到 CPU,並進行逆詞元化(de-tokenization)獲得生成的文本。
上述介紹了最基礎的 LLM 推理過程,目前也有一些更爲先進的技術,流程上可能會有所不同。
LLM 推理優化方向
在《Towards Efficient Generative Large Language Model Serving: A Survey from Algorithms to Systems》論文中,將現有的 LLM 推理優化的方向分成兩類:
-
算法創新(Algorithmic Innovation):算法創新主要集中在改進和優化模型本身的推理過程,以提高效率和降低計算複雜度。
-
系統優化(System optimizations):系統優化則側重於在硬件和系統層面上進行改進,以提升整體推理效率。
算法創新
這些創新旨在優化大型語言模型(LLM)的推理過程,以提高效率、減少計算複雜度,並在不顯著降低性能的情況下減小模型的計算資源需求。
優化解碼算法(Decoding Algorithm)
1. 非自迴歸解碼(Non-autoregressive Decoding)
- 基本概念:傳統的自迴歸解碼方法一次生成一個輸出標記,依賴於前一個標記。這種方法計算複雜度高,速度較
慢。非自迴歸解碼試圖並行生成多個輸出標記,從而提高解碼速度。
- 實現方法:通過假設輸出標記之間的某種獨立性來進行並行解碼。常見的方法包括用半自迴歸解碼來部分解決輸出質量下降的問題,或者通過塊並行解碼來預測多個未來位置的標記。
2. 推測性解碼(Speculative Decoding)
-
基本概念:推測性解碼通過提前生成多個可能的輸出並並行驗證這些輸出,從而提高解碼效率。
-
實現方法:使用一個較小的草稿模型(參數更少)快速生成多個預測,然後通過原始模型進行驗證。如果預測錯誤,可以回退到正確的生成路徑。這種方法增加了並行性而不改變最終輸出。
3. 提前退出(Early Exiting)
-
基本概念:利用模型的多層架構,在淺層模型能夠自信地做出預測時提前終止計算,從而減少不必要的計算。
-
實現方法:在模型的淺層添加內部分類器,並在滿足特定條件時提前輸出結果。這種方法適用於計算量較小的簡單推理請求。
4. 級聯推理(Cascade Inference)
-
基本概念:根據輸入的複雜程度選擇適當規模的模型,以減少不必要的計算開銷。
-
實現方法:採用一組不同規模的模型,並根據輸入的複雜度自適應選擇合適的模型進行推理。例如,對於簡單的輸入,可以使用較小的模型;對於複雜的輸入,則使用完整的大模型。
優化架構設計(Architecture Design)
1. 配置縮減(Configuration Downsizing)
-
基本概念:通過減少模型參數或層數來降低計算成本。
-
實現方法:使用淺層編碼器或解碼器、權重共享、縮小詞彙表等方法來減小模型尺寸。儘管這種方法可能會影響性能,但通過適當調整可以在性能和效率之間找到平衡。
2. 注意力機制簡化(Attention Simplification)
-
基本概念:自注意力機制計算複雜度高(O(𝐿²),其中 𝐿 是序列長度),簡化注意力機制可以顯著減少計算複雜度。
-
實現方法:使用稀疏化、核化和分解等技術來簡化注意力計算。例如,滑動窗口注意力、哈希注意力和稀疏注意力等方法,通過減少計算量來提高效率。
3. 激活共享(Activation Sharing)
-
基本概念:在不同層之間共享中間激活值,以提高計算效率。
-
實現方法:觀察不同層的注意力矩陣分佈相似性,重用這些注意力矩陣以減少計算成本。多查詢注意力(MQA)和組查詢注意力(GQA)等方法,通過共享鍵和值向量來減少內存帶寬需求。
4. 條件計算(Conditional Computing)
-
基本概念:稀疏激活的專家混合模型(MoE)通過根據輸入選擇性激活部分專家網絡,減少計算和內存需求。
-
實現方法:使用特定路由機制(如任務級路由)來選擇激活不同的專家網絡,只對相關的專家進行計算,從而提高效率。
5. 循環單元(Recurrent Unit)
-
基本概念:循環神經網絡(RNN)及其變體(如 LSTM 和 GRU)在處理序列數據時具有顯著優勢,尤其是在捕捉長距離依賴關係方面。然而,傳統的 RNN 在處理長序列時可能會遇到梯度消失或爆炸的問題。儘管 Transformer 模型在很大程度上解決了這些問題,但一些研究仍然嘗試使用循環單元來替代 Transformer 模塊,以在推理過程中實現線性計算和內存複雜度。
-
實現方法:RWKV 模型結合了 RNN 和 Transformer 的優點,利用線性遞歸單元(LRU)在推理過程中實現線性複雜度。RWKV 通過引入遞歸機制,使模型在每個時間步只需要線性計算,從而大幅減少計算量和內存佔用。
模型壓縮(Model Compression)
1. 知識蒸餾(Knowledge Distillation)
-
基本概念:訓練一個較小的學生模型,使其從大型教師模型中學習,從而在保持性能的同時減少計算需求。
-
實現方法:通過教師模型的監督信息訓練學生模型,使其在較少參數的情況下達到類似的性能。常見的知識蒸餾方法包括白盒蒸餾和黑盒蒸餾。
2. 網絡剪枝(Network Pruning)
-
基本概念:移除模型中不重要的參數以減少模型大小和計算需求。
-
實現方法:採用結構化剪枝方法(如去除特定的注意力頭和 MLP 參數)和非結構化剪枝方法(如隨機去除參數)來壓縮模型。近年來的研究表明,網絡剪枝可以顯著減少模型的計算量而不顯著影響性能。
這些算法創新方法,通過優化模型結構和推理過程,可以顯著提高大型語言模型的推理效率,使其更適用於實際應用中的各種場景。
系統優化(System Optimizations)
系統優化主要集中在硬件和系統層面,通過改進底層實現和資源管理,提高大型語言模型(LLM)推理的效率。以下是幾種主要的系統優化方法:
低位量化(Low-bit Quantization)
-
基本概念:使用較少的比特位(如 INT8 或 INT4)來表示模型權重和激活值,從而減少內存消耗並加速推理。
-
實現方法:
-
量化感知訓練(QAT):在訓練過程中引入量化,通過模擬低精度運算來調整模型參數,使其在低精度下仍能保持較高性能。這種方法在訓練階段需要更多的計算資源,但可以在推理階段顯著提高效率。
-
訓練後量化(PTQ):在模型訓練完成後對其進行量化,將模型權重和激活值的精度降低到 INT8 或 INT4。PTQ 方法不需要重新訓練模型,因此更適用於已經訓練好的模型。通過自定義 CUDA 內核或編譯器優化,實現低精度計算,顯著提升推理效率。
並行計算(Parallel Computation)
-
基本概念:並行計算通過在多個處理器或設備上分配計算任務,加速推理過程。
-
實現方法:
-
模型並行(Model Parallelism):將模型的不同部分分配到多個設備上並行計算,如張量模型並行和流水線模型並行。
-
數據並行(Data Parallelism):將不同的數據樣本分配到多個設備上並行處理。
-
分佈式推理(Decentralized Inference):利用多個分散的節點協作處理推理任務,適用於地理分佈的硬件資源。
內存管理(Memory Management)
-
基本概念:有效的內存管理對於減少推理過程中內存佔用和提升效率至關重要。
-
實現方法:
-
動態 KV 緩存管理:通過細粒度的內存管理機制減少 KV 緩存的內存使用,如 vLLM 中的分頁注意力和 SpecInfer 中的樹注意力。
-
內存碎片管理:在複雜的解碼場景中,通過精細的內存管理機制減少內存碎片。
請求調度(Request Scheduling)
-
基本概念:高效的請求調度可以最大化資源利用率,保證響應時間在延遲服務級別目標(SLO)內。
-
實現方法:
-
動態批處理(Dynamic Batching):通過批處理請求提高硬件利用率。
-
迭代級調度(Iteration-level Scheduling):根據請求的長度和複雜度進行調度,如 Orca 中的先到先服務(FCFS)和 FastServe 中的預處理機制。
內核優化(Kernel Optimization)
-
基本概念:內核級優化通過提升模型推理過程中關鍵操作的性能,提高整體推理效率。
-
實現方法:
-
內核融合(Kernel Fusion):將多個計算內核融合爲一個內核,以減少內存訪問和內核啓動的開銷。
-
定製注意力機制(Tailored Attention):爲注意力計算定製優化內核,如 cuDNN 的融合多頭注意力內核和 FlashDecoding 的塊級並行注意力計算。
-
採樣優化(Sampling Optimization):優化採樣算法,提高生成質量和效率,如 LightSeq 中的層次化實現。
-
變長序列處理(Variable Sequence Length Processing):
減少填充和優化批處理,提高對變長序列的處理效率,如 Packing technique 和 Ragged tensor。- 自動編譯(Automatic Compilation):使用自動化編譯工具優化模型在不同硬件平臺上的執行效率,如 TVM、MLIR、JAX、OpenAI Triton。
這些系統優化方法通過改進底層硬件利用和資源管理,顯著提高了大型語言模型的推理效率,使其在實際應用中更加高效和可靠。
LLM 推理性能指標
下面是 Anyscale 公司,在 llmperf 工具中採用的一些推理性能測試指標:
-
每分鐘完成請求數(RPS,Requests Per Second):衡量模型在一定時間內能處理的請求數量,反映了併發處理能力。
-
首字輸出時間(TTFT,Time to First Token):從接收到請求到輸出第一個字符的時間,表示初始響應速度。
-
字符間延遲(ITL,Inter-Token Latency):連續生成字符之間的平均時間,影響生成文本的流暢性和速度。
-
端到端延遲(End-to-End Latency):從請求發出到完成整個響應的時間,總體響應速度的體現。
-
每次典型請求的成本(Cost per Typical Request):綜合考慮性能指標的成本效率。
參考資料
-
Towards Efficient Generative Large Language Model Serving: A Survey from Algorithms to Systems
-
LLM Inference Series: 2. The two-phase process behind LLMs’ responses | by Pierre Lienhart | Medium
-
Reproducible Performance Metrics for LLM inference
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jOOD1wlyFOX0_jgHzT474Q