開發并部署大模型應用肯定要考慮它們的服務成本。然而,錢并不是唯一的考慮因素,如果不能解決模型性能方面的問題,即使有很大的預算,大模型服務仍會受到影響。本文嘗試討論將 LLM 推理服務更改為高吞吐量引擎的挑戰與應對方法。
1. 大模型服務面臨的挑戰
大模型的能力令人驚嘆,但其獨特的工作特性卻給高性能服務部署帶來了挑戰。其處理過程主要分為兩個階段:預填充和解碼。在預填充階段,當你輸入提示詞(包含上下文、對話歷史、問題等信息)時,模型需要一次性處理所有輸入的 token。隨后進入解碼階段,模型開始逐個生成輸出 token,且每個新 token 的生成都嚴格依賴于之前生成的 token。可以這樣類比:預填充就像為一盤象棋游戲精心布局(耗時較長),而解碼則類似于后續一步接一步的落子(單步較快)。然而,現實并非如此輕松——部署大型模型遠非易事,必須仔細考量其帶來的延遲問題。
1.1 數據稀疏性問題
在神經網絡中,尤其是前饋網絡(FFN),許多神經元的激活值為零。這種稀疏性導致矩陣乘法中存在大量零元素,從而浪費了計算資源。如果我們能夠跳過這些零值,僅對非零元素進行計算,將顯著提升推理效率。
更重要的是,在深度學習系統中,數據在 CPU 和 GPU 之間傳輸所消耗的時間往往遠高于實際計算時間。此外,隨著模型規模的增長,一些包含數萬億參數的超大規模模型根本無法容納在單個 GPU 中,使得稀疏性優化變得尤為關鍵。
1.2 請求調度問題
大模型通常需要同時處理多個用戶請求。在這種多任務場景下,短小快速的請求(例如查詢天氣、時間或簡短答案)可能不得不排隊等待長時間請求完成。這導致整體平均響應時間主要受制于等待時間,而非實際計算耗時。
即使你的模型計算速度非常快,也必須等待前面的請求執行完畢才能開始處理下一個。因此,如何高效地調度和優先處理不同類型請求,是提升服務吞吐量與用戶體驗的關鍵挑戰。
1.3 順序解碼問題
當前的語言模型生成機制限制了token之間的并行化能力。每個前向傳播只能生成一個新 token(或少量 token),這意味著長文本回復必須逐字逐句地生成。這也是為什么像 ChatGPT 這類模型在生成長文時,通常采用“流式輸出”的方式呈現結果。
有趣的是,盡管流式輸出能帶來更即時的反饋體驗,但其本質仍然是串行生成過程。因此,“先看到一部分”并不意味著更快完成整個生成任務,反而揭示了當前解碼機制在并行性上的瓶頸。
1.4 KV 緩存增長問題
注意力機制是 LLM 推理的核心環節,尤其是在長序列中,計算所有 token 之間的相關性會帶來巨大的計算負擔。每當模型生成一個新的 token,都需要重復計算之前所有 token 的注意力權重,造成大量冗余操作。
KV 緩存(Key-Value Cache)是一種有效的優化策略,它通過緩存已生成 token 的中間狀態,避免重復計算,從而加速推理過程。然而,隨著生成序列變長,KV 緩存占用的內存也會持續增長,成為影響推理效率和部署成本的重要因素。
2. 推理優化之KV Cache 管理
KV 緩存是 LLM 推理過程中占用內存最多的部分之一。隨著上下文長度的增加,KV 緩存所需的存儲空間也隨之增長。例如,一個支持最大輸入長度為 2048 個 token 的模型,需要預留 2048 個緩存插槽。如果用戶僅輸入了一個包含 7 個 token 的提示詞,那么其余 2000 多個插槽雖然未被使用,卻依然被系統預留,造成內部內存碎片。
在每一步推理中,模型都會生成新的 KV 對,并在后續 attention 計算中使用,因此必須將它們緩存起來。KV 緩存通常以連續的內存塊或“頁”形式進行分配。然而,當某個序列生成完成后,其占用的內存頁被釋放,但這些頁可能并不連續。這就導致了外部內存碎片:大量小塊空閑內存分散在內存中,無法滿足后續請求所需的連續內存空間。
為了解決這一問題,研究者借鑒操作系統的內存管理機制,提出了頁面注意力機制(PagedAttention)。該機制將 KV 緩存組織成邏輯內存塊,并通過頁表進行管理,從而實現靈活的內存映射和高效利用。其核心思想包括以下幾個關鍵方式:
- 固定大小的內存塊:頁面注意力機制采用固定大小的小型內存單元(稱為“頁”)來存儲 KV 緩存,類似于操作系統中的分頁機制。
- 共享內存塊:這些內存頁可以在多個請求之間共享,提高資源利用率。
- 按需動態分配:內存塊根據生成過程動態分配,無需預先估計最大序列長度,避免了不必要的內存浪費。
通過引入這種高效的內存管理策略,頁面注意力機制顯著提升了推理時的內存利用率和并發處理能力,是當前大模型部署優化的重要方向之一。
2.1 基于 Radix Tree 的 KV 緩存優化
在計算機科學中,Radix Tree(也稱為緊湊前綴樹或壓縮 Trie 樹)是一種空間優化的樹形數據結構。它通過對具有相同前綴的節點進行合并,減少了存儲開銷,從而提升了查找效率。
在大語言模型(LLM)推理中,基于 Radix Tree 的 KV 緩存技術被用于高效地重用多個推理請求之間的緩存數據,尤其適用于多個請求共享相同輸入前綴的場景。通過將 KV 緩存組織為 Radix Tree 結構,系統可以快速檢索和復用已有的緩存內容,并在不同請求之間實現靈活共享。
相比傳統的線性緩存管理方式,Radix Tree 在內存利用和訪問效率上更具優勢。其構建成本約為 O(n log n),而在注意力計算中的額外開銷相對較小,約為 O(n2) 量級,這對于提升多請求并發處理能力具有重要意義。
2.2 多種注意力機制下的 KV 管理策略
多頭注意力機制(Multi-Head Attention)是 Transformer 模型的核心組成部分,也是當前大多數 LLM 的核心架構。每個注意力頭從不同的角度理解文本內容:有的關注主語與動詞的關系,有的聚焦詞匯本身,還有的分析句子結構。這種多頭設計顯著增強了模型的理解能力。
然而,每個注意力頭都需要獨立維護一組 Key 和 Value 向量,導致 KV 緩存的內存占用急劇上升。特別是在處理長文本或多任務并發時,這些向量會占用大量顯存資源,成為性能瓶頸。
為了緩解這一問題,研究者提出了多種優化方案:
- 組查詢注意力(Grouped Query Attention, GQA):允許部分注意力頭共享相同的 Key 和 Value 向量,從而減少整體緩存需求。
- 多查詢注意力(Multi-Query Attention, MQA):僅使用一組 Key 和 Value 向量供所有查詢頭共享,是目前最節省內存和計算時間的方法之一。
此外,像 DeepSeek 這類開源模型進一步引入了 Flash Multi-Latent Attention(Flash MLA) 技術,在訓練和推理階段實現了更高效的注意力計算。該方法通過低秩壓縮技術,將 Key 和 Value 向量向下投影到一個維度更低的潛在空間,從而大幅減小緩存體積。在實際計算注意力時再進行向上投影。
圖片
更巧妙的是,該方法還將向上投影的權重矩陣與查詢矩陣進行融合,從而加快注意力的計算速度,進一步提升推理效率。
3. 推理優化之 Query-sparsity attention
在 MIT 發表的論文《QUEST: Query-Aware Sparsity for Efficient Long-Context LLM Inference》中,研究者指出:Transformer 層中普遍存在高度稀疏性。這意味著,在實際推理過程中,并非網絡中的所有神經元都會被激活。
基于這一觀察,研究人員提出了一種高效的模型推理方法——利用這種稀疏性進行剪枝,從而顯著減少計算開銷。其背后的邏輯非常直觀:并不是每個 token 都對上下文理解有貢獻。
舉個簡單的例子:
我們輸入提示詞:“A is B, C is D. A is”,期望模型輸出下一個詞:“B”。在這個任務中,模型只需要關注最相關的幾個 token 即可完成預測,而其余部分則可以忽略。這表明,模型的注意力機制具有明顯的查詢依賴性,即“查詢感知稀疏性(Query-Aware Sparsity)”。
基于這一洞察,QUEST 提出了一種高效策略:在注意力計算中,只選擇與當前查詢最相關的 KV 緩存塊進行處理。具體來說,該方法會在所有數據塊中找出前 k 個最關鍵的數據塊來進行后續計算。
圖片
以下是 QUEST 的核心流程:
- 塊級特征提取對于每一個 KV 數據塊,QUEST 首先提取其最小和最大 Key 值以及通道極值。
- 查詢特征生成接著,根據當前查詢向量,逐元素生成對應的 max 和 min Key 值。
- 快速篩選機制通過上述技巧,系統能夠快速評估哪些 KV 塊與當前查詢最為相關,從而避免大量無效計算。
- Top-k 選擇最終,僅保留與查詢最相關的前 k 個 KV 塊,用于后續注意力計算。
通過這一系列優化,QUEST 顯著減少了注意力機制中的冗余計算,從而提升了長上下文場景下的推理效率。
當然,一個關鍵問題是:如何選擇合適的 k 值?
k 是一個需要通過實驗調優的超參數。研究表明,當設置 k = 4096 時,模型性能幾乎接近完整計算的水平(約 100%),同時又能帶來顯著的效率提升。因此,這是一個兼顧準確率與效率的推薦值。
4. 推理優化之推測性解碼
推測性解碼(Speculative Decoding) 是加速大語言模型推理的重要技術之一。這一方法的重要性也得到了 Andrej Karpathy 的認可,并在 2022 年由 Google 首次提出并應用于實際系統中。
其核心思想非常直觀且巧妙:與其僅依賴一個龐大、準確但緩慢的目標模型逐 token 地生成結果,不如先使用一個輕量級、快速但相對不夠精準的小模型(稱為“草稿模型”)來預測多個后續 token。然后,再由大模型(即目標模型)對這些預測進行驗證。
如果目標模型認同草稿模型的預測,則可以直接接受這些 token,從而大幅提升生成效率;如果不一致,則從分歧點開始重新生成。雖然這種機制存在一定的回退成本,但在多數情況下,草稿模型的預測是準確的,因此整體上節省了大量計算資源。
草稿模型可以是一個小型神經網絡模型,例如參數規模在 1B~3B 的模型,甚至也可以是基于統計的 N-gram 模型。而目標模型則通常是擁有數十億甚至上萬億參數的大模型。
盡管使用兩個模型看似會增加內存和計算開銷,但在實際應用中,由于草稿模型的預測準確率較高,尤其是對于常見詞匯(如“是的”、“這個”、“是”、“等等”)幾乎不會出錯,因此能顯著提升推理速度。
更重要的是,所有由草稿模型生成的 token 可以被目標模型一次性并行驗證,而不是傳統的逐 token 自回歸生成方式。這種方式大幅減少了生成延遲,為長文本輸出帶來了實質性的性能提升。
5. 推理優化之資源調度
在大模型推理中,調度(scheduling) 是一項關鍵挑戰,其核心在于如何在有限的硬件資源(如 GPU、CPU 和硬盤)之間實現高效的負載平衡。一個優秀的調度策略不僅能通過并行計算加速推理過程,還能讓擁有上百億參數的大模型(例如 100B 參數模型)在低配置設備(如搭載 T4 GPU 的 PC)上順利運行。
要實現這一目標,通常依賴于兩個關鍵技術要素:
- 智能地在 GPU、CPU 和硬盤之間加載和卸載模型權重
- 高效管理計算單元之間的數據 I/O 傳輸
為了解決這兩個問題,來自斯坦福大學、加州大學伯克利分校和卡內基梅隆大學的研究者提出了 FlexGen,這是一套具有代表性的系統級優化方案,旨在提升大規模語言模型在受限硬件上的推理效率。
5.1 FlexGen 的核心機制
FlexGen 將每個需要處理的數據塊定義為“一批數據”,這些數據被依次加載到模型的不同層進行計算。其中,列方向表示批處理維度,而行方向則對應模型層數的順序處理。
為了保證執行效率和資源約束,FlexGen 定義了一條“有效路徑”——即遍歷所有數據塊的最優執行路徑,必須滿足以下條件:
- 數據必須從左到右按順序執行
- 同一批次的所有數據必須位于同一設備上
- 激活值必須按照正確的滑動窗口進行處理
- KV 緩存需保留至當前批次完成
- 在任意時刻,設備上存儲的張量總大小不能超過其內存容量
假設我們有 N 個 token,每個 token 的數據將按照順序依次加載并計算。每層的權重僅在需要時加載,在計算完成后立即卸載。然而,這種頻繁的加載/卸載操作會帶來顯著的時間開銷——因為雖然 GPU 的計算速度極快,但內存傳輸卻相對緩慢。
5.2 FlexGen 的優化策略
為了解決上述瓶頸,FlexGen 引入了靈活的執行調度方式,例如通過調整掃描順序(從行到列、之字形塊調度等),從而避免不必要的 I/O 操作。它不僅能夠節省下一層模型權重的加載時間,還能提前保存下一批激活值。
在每個塊的執行過程中,FlexGen 會重疊執行以下三個步驟:
- 加載下一層的權重
- 存儲前一批的激活值 / KV 緩存
- 計算當前批次的數據
這種流水線式處理大大緩解了內存傳輸帶來的性能限制,提升了整體推理吞吐能力。
除了執行調度之外,另一個關鍵問題是:如何在不同的硬件設備上合理分配模型權重?
FlexGen 采用一種基于線性規劃的搜索策略,來尋找最優的權重分布方案,目標是最小化整個模型推理所需的時間。
圖片
這里:
- N: 每個序列的輸出token數
- ??: transformer層數
- block size: 在一個塊中處理多少個示例 (批次大小 × 批次數)
實驗數據顯示,FlexGen 在推理效率方面表現優異推理速度可達到主流框架的數倍以上,成為當前大模型部署中極具潛力的優化方案。
6. 系統級優化
當前主流的 LLM 服務系統(如 vLLM、LLMDeploy 等)通常采用先來先服務(FCFS)的調度策略,并以“運行至完成”的方式執行任務。這種機制雖然實現簡單,但在實際應用中存在一個嚴重問題:線頭阻塞(Head-of-line Blocking)。
6.1 長作業阻塞問題與 LLM 推理服務的調度挑戰
當一個長請求排在隊列前面時,它會阻塞后續的短請求,即使后者所需的計算資源和響應時間遠小于前者。結果是,短請求不得不等待長請求完成后才能開始處理,從而顯著增加了整體排隊延遲。研究表明,在真實工作負載中,排隊延遲可能占總延遲的高達 90%。
需要強調的是,這里所說的“短請求”和“長請求”,并不單純指輸入提示詞的長度,而是生成第一個 token 所需的時間——即所謂的 First Token Latency(首 token 延遲)。
6.2 解決方案:搶占式調度與多優先級隊列
為了解決這一問題,一種可行的方法是引入搶占式調度機制:當中間出現一個高優先級的短請求時,系統可以中斷當前正在執行的長請求,將已完成的部分結果緩存起來,保留未完成部分以便稍后繼續處理,然后切換去執行短請求。
一旦短請求處理完畢,系統再回到之前被中斷的長請求,繼續執行其剩余部分。要實現這樣的調度機制,系統必須支持多優先級隊列的設計。
然而,這種方法本身也存在潛在缺陷:如果高級別隊列中堆積了大量長請求,它們可能會被頻繁中斷并反復進入緩存狀態,導致:
- 緩存壓力增大
- 長請求的整體完成時間變長
- 系統調度開銷上升
6.3 FastServe 的優化方案:多級反饋隊列 + 智能 KV 緩存管理
為了解決上述問題,FastServe 提出了一個多級反饋隊列(Multi-level Feedback Queue)機制。該機制的核心思想是:
在請求到達系統時,首先預估其生成第一個 token 所需的時間,并根據這一估計值將請求路由到合適的優先級隊列中。
這種方式確保了短請求不會被長請求長時間阻塞,從而提升了整體服務質量與用戶體驗。
此外,FastServe 還結合了高效的 KV 緩存管理機制,允許在 GPU 切換隊列之間進行主動的數據遷移和緩存預加載,進一步降低了上下文切換帶來的延遲。
通過引入多級反饋隊列與智能調度策略,FastServe 成功緩解了傳統 LLM 服務系統中的線頭阻塞問題,提升了短請求的響應速度,同時又避免了長請求因頻繁中斷而導致的性能下降。這一方法為構建高性能、低延遲的大模型推理服務平臺提供了重要參考。
7. 推理優化的其他方法
在大語言模推理優化領域,有一些方法已經相對成熟,并被廣大工程師廣泛使用。這些技術涵蓋了從模型壓縮到推理加速的多個層面。
首先是量化技術,它通過降低模型權重和激活值的精度(例如從 FP16 降至 INT4 或 FP8),在幾乎不影響模型性能的前提下顯著縮小模型體積并提升推理速度。多種先進的量化方案已陸續被提出:AWQ 利用激活驅動的重要性評分實現激活感知量化,支持低位推理(如 INT3),無需再訓練;LLM.int8() 引入帶校準機制的 INT8 矩陣乘法,可在不損失準確率的前提下運行 Transformer 模型;SmoothQuant 則通過跨層對齊激活與權重范圍,提升后訓練量化效果;ZeroQuant 及其后續版本 V2/FP 結合了低比特量化與低秩補償技術,支持 INT4 和 FP4 的高效推理;LLM-FP4 展示了 FP4 表示方式在保持模型質量的同時大幅提升推理效率的能力;WINT8 是專為 MoE 架構模型設計的 INT8 量化方案,已在生產環境中落地應用;SpQR 將量化與稀疏性結合,實現了近似無損的 LLM 壓縮,適用于邊緣部署場景;FP8-LM 探索了 FP8 格式在 Transformer 模型中的訓練與推理優化,有效減少了內存占用與計算開銷;而 NVIDIA 定義的 FP8 格式,也正在成為深度學習系統的重要標準之一。
另一個值得關注的方向是早期退出機制。以 LITE 為例,該方法讓模型中間層學會做出預測,并在置信度足夠高時提前終止生成流程,從而節省高達 38% 的推理失敗成本,尤其適用于實時性要求高的場景。
在注意力機制方面,Flash Attention 是一個里程碑式的優化技術,它通過內存分塊策略,在速度和內存使用上都優于傳統注意力實現;ROFormer 引入旋轉位置嵌入,增強了模型在長距離依賴建模上的能力;StreamLLM 則支持在流式輸入過程中動態調整注意力窗口,提升了處理連續輸入的能力。
此外,非自回歸語言模型也在探索新的生成范式。例如 Diffusion-LM 首次將擴散模型的思想引入文本生成任務,為可控文本生成提供了新思路。
當然,所有這些技術最終都需要高效的工具鏈來落地。其中,vLLM 是目前最受歡迎的開源 LLM 推理庫之一,由加州大學伯克利分校團隊開發,專注于提供高吞吐、低延遲的語言模型服務。它起源于 Page Attention 的思想,目前已集成上述提到的幾乎所有主流推理優化技術,形成了完整的推理加速解決方案。vLLM 社區活躍、生態完善,已成為當前 LLM 推理優化領域最具影響力的技術平臺之一。