
直接跑模型和用推理引擎跑模型完全是兩碼事。你可能已經體驗過同一個大模型用Transformers庫的原生代碼在A100上推理顯存動不動就爆吞吐上不去并發一高延遲就飛了換成vLLM之后同樣的卡同樣的模型吞吐能翻好幾倍。這個差距不是玄學正是推理引擎在背后把你平時沒注意到的底層算子調度、顯存管理、批處理策略全部重新梳理了一遍。這篇內容我不打算堆概念而是從推理引擎實際解決什么問題、它的核心優化手段到底在做什么、主流方案怎么選、以及我實際部署時踩過的坑這幾個角度展開。適合正在做大模型服務化、做AI應用落地或者剛入行準備做推理優化的同學。1. 模型能跑和模型跑得好是兩回事先理清一個基本認知推理引擎不是一個“可選項”而是把模型從“實驗環境”搬到“生產環境”的必經橋梁。1.1 為什么原生PyTorch推理撐不住生產負載如果你用PyTorch直接加載一個7B模型做推理很快會遇到三個硬傷。第一個是顯存用得太浪費。7B模型用FP16加載光權重就要14GB左右這還只是權重。模型推理過程中每一層的中間激活值、注意力機制的KV Cache也都在吃顯存尤其是長上下文時KV Cache增長極快。你用原生代碼跑一次推理顯存分配是“一次性申請一整塊用完不精細回收”碎片化和閑置浪費都很嚴重。更關鍵的是KV Cache是動態增長的如果預分配不足中途就OOM。第二個是吞吐太低。原生PyTorch推理默認是逐請求處理的一個請求算完再算下一個GPU利用率很低。GPU的并行能力其實很強但單請求的自回歸生成過程是一個token一個token蹦出來的計算量呈鋸齒狀波動GPU大部分時間都在“等待”而非“計算”。第三個是延遲不穩定。尤其在高并發場景請求排隊越長延遲越高而PyTorch沒有做任何調度優化來的請求只能先進先出硬排隊。這三個問題不是模型本身不行而是缺少一個“翻譯層”——把深度學習框架算子和底層硬件算力高效匹配起來。這就是推理引擎的工作范圍。1.2 推理引擎的定位一套完整的部署解決方案推理引擎位于訓練框架與硬件之間它負責將訓練好的模型進行圖優化、算子融合、量化壓縮、運行時調度、顯存管理最終以服務形式對外提供推理能力。如果打個比方模型權重像發動機推理引擎則像整車的傳動、變速箱、供油系統。發動機再好沒有一個好的“傳動鏈路”真實開到路上還是又慢又費油。需要特別注意推理引擎不是訓練框架的替代品。你做訓練、微調還是要用PyTorch、TensorFlow或者MindSpore。推理引擎只負責“已經訓好的模型如何在線上高效跑起來”。也因此推理引擎對模型的通用支持能力、算子覆蓋度、硬件適配度比訓練框架更聚焦也更深。從工作流程上看一條典型的模型部署鏈路是這樣模型訓練得到checkpoint轉換格式比如轉成ONNX或者直接加載HF格式交給推理引擎做圖優化和量化然后由推理引擎內置或外掛的HTTP服務框架對外提供服務。1.3 推理引擎具體在“推理”什么名字叫“推理引擎”但它處理的事情其實很工程化。我從實際部署的角度拆解它至少干四件事模型計算圖級別的優化把能合并的算子合并能重排的算子重排減少內存讀寫和顯存占用。運行時資源調度管理GPU顯存的分配與回收把多個請求動態組織成batch讓GPU一直處于高利用率狀態。壓縮與加速策略量化、蒸餾后的模型怎么部署精度損失怎么控制推理引擎提供一整套工具鏈。服務化接口提供HTTP/gRPC API、負載均衡、動態批處理、流式輸出等能力讓上層應用可以直接接入。在AI工程化實踐里這一整套東西有沒有做好直接決定了模型在線上是“能用”還是“好用”。這也是為什么說推理引擎在實際項目中往往比訓練框架更考驗工程能力。2. 推理引擎的核心優化手段每一招都在解決具體問題這一章拆開講推理引擎的關鍵技術點。你會發現這些優化不是炫技每一個都對應一個真實的工程痛點。2.1 算子融合內存帶寬瓶頸下的必然選擇先看一個基礎概念。GPU算力很強但數據搬運的速度比計算慢一個數量級。這意味著很多算子如果分成很多次執行瓶頸根本不是算得快不快而是數據來回拷貝浪費的時間。典型場景Transformer里的LayerNorm。LayerNorm的計算本身不復雜但它需要對每個token做均值方差歸一化如果LayerNorm和前面的殘差連接、后面的線性層分開執行中間結果就要反復讀寫顯存耗時大幅度增加。算子融合的思路是把這些算子合并成一個大的kernel在片上一次算完減少顯存訪問次數。推理引擎做圖優化時會把網絡中的多個算子做融合典型做法包括QKV融合、FFN模塊融合、殘差與歸一化融合等。實際效果上Fusion后推理速度提升常常是倍數級的這就是為什么同樣的GPU同樣的模型不同引擎跑出的性能天差地別。2.2 量化用精度換吞吐的核心手段量化是部署中幾乎繞不開的一步。核心思路是將FP16的權重壓到INT8甚至INT4降低顯存占用和計算量。用7B模型舉例FP16下權重14GBINT8下是7GBINT4下只有3.5GB。顯存占用變小意味著能塞進更小的卡或者留出更多空間給KV Cache直接決定你的batch size能開多大。但量化有代價尤其是對激活值敏感的場景。不同的量化方案影響很大——per-tensor量化實現簡單但精度損失明顯per-channel或者per-group量化更精細精度更好但計算開銷也更高。實際部署中我建議先用校準集做AWQ或者GPTQ之類的量化再在業務數據上驗證效果而不是盲目一刀切壓到INT4。關于量化校準和精度評估后面專門說。2.3 KV Cache與PagedAttention長上下文下的顯存救星自回歸模型的推理過程中每個token在生成時會計算Key和Value向量用于后續token的注意力計算。為了不重復計算這些向量會被緩存下來稱為KV Cache。上下文越長、并發請求越多KV Cache占用的顯存增長速度就越驚人。傳統實現里KV Cache是預先分配一塊連續顯存但請求長度不可預知要么預分配太多浪費顯存要么預分配不夠中途OOM。而且連續顯存分配會帶來碎片化問題顯存利用率不高。PagedAttention的思路是像操作系統管理內存頁一樣管理KV Cache把邏輯上連續的KV數據切塊存儲到物理上不連續的顯存頁里。這樣既避免碎片化又能按需分配動態擴展。這個機制是vLLM的核心競爭力之一也正是它能把吞吐拉上去的重要原因。理解了KV Cache的管理策略再看各家引擎的顯存優化方案思路基本是一通百通。2.4 連續批處理動態組織并發請求的藝術早期推理服務是靜態批處理批量收集請求湊滿一個batch后一起計算batch內所有請求都完成后再返回結果再收集下一批。靜態批處理的問題在于一個batch里有的請求生成了50個token有的請求生成了500個token后者沒算完前者只能干等GPU利用率被拖累。連續批處理則是當一個請求生成結束后立刻從等待隊列里取一個新的請求補位。這就意味著同一個batch里可以同時存在處于不同生成階段的請求GPU一直處于“滿負荷”狀態。實際部署中這個機制的影響非常直觀壓測同樣的并發量開啟連續批處理的引擎吞吐可能比靜態批處理高一半甚至更多。2.5 投機解碼自回歸速度的“作弊”方案自回歸生成一次只能生成一個token這是模型結構決定的很難繞過。投機解碼的思路是先用一個又快又小的草稿模型一次生成多個候選token再讓大模型并行驗證這些token。如果草稿模型預測的token是對的直接接收一次遞進多個token如果錯了退回一步重新來。這套方案在批量解碼時能有效減少大模型的解碼步數。但它的收益高度依賴草稿模型與大模型的“重合度”不同模型組合效果差異很大。我實測下來投機解碼對短prompt、長生成長度的場景收益明顯但對本身已經很快的小模型意義不大。2.6 Prefix Caching多輪對話場景的性能放大器大模型對話場景下每輪請求都會帶上歷史上下文這部分上下文在計算時會產生大量重復計算。Prefix Caching的思路是如果新請求的prompt前綴和之前某個請求的前綴相同直接復用之前緩存好的中間結果而不用重新計算。對多輪對話、Agent多次調用這類場景這個優化能把首token延遲和整體延遲都大幅下降。像vLLM的prefix caching和SGLang的RadixAttention都是這方面的經典實現。你在做AI Agent類應用時這段優化尤其值得關注因為Agent通常要在一次任務里連續調用模型很多次每次都帶上長上下文Prefix Caching能省下不少錢和延遲。3. 選型不是越多越好主流推理引擎的定位差異與評估方法主流推理引擎各有側重。選型時盲目跟風不可取要看你自己的部署規模、硬件條件和使用場景。3.1 常見推理引擎的橫向對比我整理了一張常用引擎的定位對比表方便不同需求的讀者快速判斷。引擎核心定位擅長場景主要局限vLLM高吞吐LLM服務化大模型并發服務、高吞吐、Prefix Caching、PagedAttention對自定義模型結構支持需要適配部分算子需針對性優化TensorRT-LLMNVIDIA GPU極致性能追求最低延遲、最高吞吐配合NVIDIA生態做深度優化對非NVIDIA硬件不支持模型轉換有額外工程成本ONNX Runtime跨平臺跨硬件ONNX模型轉換、多后端運行、CPU/GPU/Mobile全覆蓋對大型Transformer模型需額外配置優化策略llama.cpp輕量本地部署CPU推理、Mac/Mobile端、低資源設備高并發服務能力較弱適合單機小規模Triton Inference Server生產級模型服務管理器多模型混合部署、動態批處理、模型版本管理自身不偏向某個引擎需要配合后端使用SGLang結構化生成與長上下文Agent場景、結構化輸出、RadixAttention做前綴復用生態較新生產案例相對少3.2 選型前先問自己三個問題第一個問題部署目標是服務化還是嵌入式如果做的是線上API服務vLLM、TensorRT-LLM、Triton是主流方向如果做的是本地跑一跑或端側部署llama.cpp更合適如果目標是嵌入式設備就得看ONNX Runtime Mobile或專用推理框架。第二個問題硬件環境是什么NVIDIA GPU一統天下的時代TensorRT-LLM無疑性能最強但如果你的環境有國產加速卡或者混合異構硬件vLLM和ONNX Runtime的適配性更好。選型時不要只盯性能先確認硬件和驅動版本是否在支持列表里。第三個問題模型規模和并發量級是多少小模型1B以下對推理引擎的紅利并不明顯可能用ONNX Runtime就夠7B以上而且并發較高vLLM和TensorRT-LLM的收益就很明顯了如果你還要跑多模態大模型那得重點看引擎對視覺編碼器、圖像嵌入等算子的支持程度。我遇到過一些團隊模型只有幾百M一開始就上了TensorRT-LLM花了大量時間做算子適配和轉換收益卻微乎其微這就是典型的選型過度。先評估需求再選引擎別為了堆技術而堆技術。3.3 推理引擎評估的三個維度評估一個推理引擎不能只看“跑一遍模型耗時多少”。我常用的評估維度有三個。功能完備性是否支持你的模型結構、量化算法、部署環境是否具備PagedAttention、Prefix Caching、連續批處理等高級特性。性能指標不只是快還要看TTFT首token延遲、TPOT每輸出一個token的耗時、端到端延遲、吞吐量每秒生成token數、顯存峰值占用。生態成熟度社區活躍度、Bug修復速度、第三方擴展、文檔質量和兼容版本——這些決定了你在遇到問題時能否快速止損。在這三個維度中功能完備性必須排在第一位。如果引擎不支持你的模型算子一開始就得改模型結構來適配后面再高性能都白搭。4. 部署實戰一次從OOM到延遲飆升的完整排查鏈路理論講再多不如實戰踩一次坑。這里把我實際部署一個LLM服務時的完整排查過程寫出來供參考。4.1 場景還原與初始配置我部署的是一個約13B參數的對話模型使用兩卡A100 40GB推理引擎用的vLLM開啟服務后接壓測。初始配置大致是python -m vllm.entrypoints.openai.api_server \ --model /path/to/model \ --tensor-parallel-size 2 \ --gpu-memory-utilization 0.9 \ --max-model-len 8192壓測并發上去之后問題接踵而至。4.2 第一個問題顯存OOM服務直接崩潰并發跑到32時日志里出現CUDA out of memory。排查過程先用nvidia-smi看顯存占用發現模型權重只占了一半但KV Cache把剩余顯存全吃掉了。我又把max-model-len從8192拉到默認4096OOM次數明顯減少但并發還是上不去。這里的關鍵點在于vLLM會根據gpu-memory-utilization設置盡量把剩下的顯存全部用于KV Cache緩存。你設置0.9它會優先保證權重加載然后把剩余90%都給KV Cache。并發越大KV Cache占用越多一旦超過剩余顯存就OOM。解決辦法有幾個方向降低max-model-len限制單請求最大長度給更多請求騰出空間調整gpu-memory-utilization比如0.7留一點余量避免GPU顯存抖動開啟enable-prefix-caching減少重復前綴計算和重復KV存儲如果模型支持量化換Q4/Q8版本權重占顯存減小KV Cache就能騰出更多空間。我最后采用了“限制最大長度開啟前綴緩存”的組合并發能力從32提升到64OOM不再出現。4.3 第二個問題并發上去了TTFT飆到離譜并發到64之后OOM不發生了但發現所有請求的首token延遲TTFT從原來的幾百毫秒飆升到十幾秒。這個問題的根子在對顯存和調度策略的理解。高并發下vLLM會盡量把多個請求組織成連續批處理但如果顯存里KV Cache被占滿新請求進來后必須先等上一批請求把KV Cache釋放出來才能開始計算。這個“等”的時間就是TTFT飆升的元兇。具體排查時我先看了vllm日志里的調度統計確認排隊時間長于計算時間然后調整了調度策略。vLLM通過--max-num-seqs控制單批處理的請求數調小這個值可以讓GPU更頻繁地切換批次避免大批請求長時間占據顯存。但這也會降低整體吞吐需要權衡。另一個優化角度是控制請求的并發上限。壓測時發現vLLM本身支持同時處理大量請求但網絡層和業務層并不需要對每個請求都在同一時刻進行處理。在網關層做隊列控制限制同時訪問引擎的請求數在合理范圍隊列滿時直接返回503比讓所有請求在引擎內部堆積要健康得多。4.4 第三個問題TPOT不穩生成一段話像卡帶一樣第三個問題出現在單請求體驗上。并發不高時生成速度還算穩定并發一高每個token的輸出時間波動很大。這個現象往往和顯存帶寬爭搶有關。當多個請求在同一個GPU上同時解碼而GPU顯存帶寬有限每個請求能分到的帶寬變少token生成速度就不穩。解決思路還是從引擎配置和業務策略兩條線出發適當降低并發上限讓單請求的token生成更穩定如果模型支持投機解碼開啟后能減少實際解碼步數降低帶寬爭搶業務側如果對“連貫性”要求高可以考慮把長生成任務拆分成多個短任務配合Prefix Caching減少重復計算。4.5 量化精度損失排查別讓模型變傻另一個常見坑是量化后模型效果大幅下降。我一開始圖省事直接對模型做了INT4量化結果線上反饋明顯變差典型的對話質量下降、邏輯混亂。排查原因后發現問題出在校準集選擇。量化不是簡單的“把權重低精度化”而是需要通過校準集統計每層的激活值分布來決定量化參數。如果校準集和實際業務數據分布差異大量化后的效果就跑偏。一個可靠的優化路徑是先用業務真實數據構建校準集再使用AWQ等算法做量化量化后分別在業務數據和公開測試集上對比量化前后的效果。別只看一兩個case就下結論最好做一個批量評估。如果你在精度和性能之間猶豫有一個折中方案模型權重用INT8做per-channel量化激活值保持FP16這樣精度損失通常可控性能提升也明顯比直接上INT4穩妥得多。5. 不同應用場景下推理引擎的角色重心完全不同推理引擎不是萬能的不同業務場景對它的訴求差異很大。這部分結合各類AI落地場景聊聊。5.1 大模型對話服務吞吐優先對話類應用聊天機器人、客服等是推理引擎最典型的場景。核心指標是吞吐——在GPU資源固定的情況下支持盡可能多的并發對話。這類場景最看重的優化手段是連續批處理、KV Cache管理、Prefix Caching。vLLM和TensorRT-LLM是主力選手。如果預算有限也可以考慮SGLang它在多輪對話和前綴復用上有獨特優勢。5.2 AI編程工具延遲優先代碼補全、代碼生成這類工具對延遲極其敏感。用戶在敲代碼時補全結果晚了一秒體驗斷崖式下降。AI編程場景的優化重點減小模型規模比如用7B而不是70B的模型使用投機解碼用一個小模型先快速出候選結果推理引擎需要支持流式輸出讓用戶邊想邊看到結果連續批處理在代碼補全場景同樣重要因為不同用戶的補全長度差異很大靜態批處理會非常痛苦。5.3 AI Agent與多輪任務調度效率優先AI Agent場景下模型常常被多次調用且每次調用的上下文越來越長。這類場景真正決定體驗的不只是單次推理的延遲而是整個任務鏈路里多次推理之間的調度效率。推理引擎的Prefix Caching在Agent場景下價值被放大。試想一個Agent在執行任務時不斷會向同一個模型發起帶歷史上下文的調用如果沒有前綴復用每次調用都在重復計算相同的prompt前綴時間和算力浪費非常嚴重。SGLang提出的RadixAttention就是一種針對這種場景的優化方案它把不同請求的前綴按樹結構組織最大程度復用計算成果。如果你在做Agent類產品這個概念值得重點研究。5.4 端側部署資源受限是最高優先級端側部署手機、PC、嵌入式設備是最特殊的一類。設備算力有限、內存受限還要考慮功耗和散熱。此時推理引擎的角色傾向于“極限壓縮”——量化、算子精簡、內存復用甚至蒸餾后模型直接轉成專用格式。llama.cpp在CPU和Mac端場景下表現突出ONNX Runtime Mobile則適合嵌入式設備。端側部署還經常需要根據具體芯片制定定制化的推理方案通用引擎只能是起點最終還要做大量針對性適配。5.5 評估與觀測沒有指標優化無從談起最后說一個貫穿所有場景的底層能力——可觀測性。我在部署推理服務時一定會在引擎層、網關層、業務層三層分別埋點。引擎層記錄TTFT、TPOT、吞吐、KV Cache命中率、顯存占用網關層記錄請求排隊時間、超時率、錯誤率業務層記錄端到端延遲、用戶體感指標。只有三層數據對得上問題才能快速定位。一個常見誤區是只盯端到端延遲一旦變慢就懷疑推理引擎結果排查半天發現是網絡或向量數據庫拖慢了整體鏈路。可觀測性做扎實了排查效率能提升一個量級。6. 推理引擎的幾個進階方向與邊界推理引擎目前還在快速演進中這里聊幾個我關注的方向以及在真實工程中對它們的冷靜判斷。6.1 長上下文支持大而不笨才談得上好用長上下文已成為模型標配百萬token級別的模型逐漸出現。但推理引擎在這一趨勢下要解決的問題遠不是“把序列長度參數調大”這么簡單。序列越長KV Cache膨脹越厲害注意力計算量呈平方增長顯存和計算量指數級上升。最值得關注的方向是稀疏注意力、滑動窗口注意力等結構優化。但不是所有模型都天然支持這些算法需要引擎在注意力計算側做針對性適配。實際部署長上下文模型時優先驗證引擎在長輸入下的TTFT和KV Cache占用再考慮是否啟用相關優化。6.2 多模態推理新一輪復雜度多模態模型文本圖像音頻對推理引擎提出了更復雜的要求視覺編碼器、音頻編碼器、跨模態投影層結構各異。推理引擎在算子融合、量化、顯存調度上都要額外適配。目前多模態推理的成熟度不如純文本模型。實際落地時盡量選已經經過驗證的多模態推理鏈路比如vLLM對常見VLM的預適配不要指望引擎能自動優化所有自定義結構。6.3 推理時計算推理引擎的新戰場模型在推理時通過額外計算進行“思考”已經是重要的新方向。這類模型在生成前會先產生大段內部推理token推理時長成倍增長。推理引擎在這個場景下的核心挑戰是用于“思考”和最終答案的顯存分配比例如何動態調整長內部推理過程的KV Cache優化多請求調度時如何避免“思考”時間過長的請求拖垮整體吞吐。目前業界還沒有統一的成熟方案各家還在快速迭代。如果業務準備上線這類模型建議先做小流量壓測確認引擎在計算密集場景下的表現。6.4 多硬件適配一個容易被忽視的工程問題大模型部署不只在NVIDIA GPU上進行。蘋果的M系列芯片、各種國產加速卡、CPU集群、移動端NPU都已經成為真實落地方案的一部分。推理引擎的多硬件適配價值正在顯現。你會發現有的引擎在NVIDIA上性能平平但在國產卡上表現突出或者在CPU上比自家NVIDIA版還快。選型時不光橫向對比性能要結合目標硬件的適配成熟度。7. 最終實踐我如何從零搭一套推理服務到這里全套推理引擎的角色拆解基本完成。最后把我在新項目里搭建推理服務的完整流程和決策過程寫出來給想照步驟走一遍的讀者參考。第一步明確需求模型參數規模、并發量峰值、響應延遲要求、硬件預算、是否需要流式輸出。這些指標決定后面所有技術選擇。第二步選底座框架如果是NVIDIA GPU上的大模型服務vLLM作為起點是穩妥的圍繞它做優化空間充足。如果是多模型長存的內部推理平臺Triton更合適。端側場景從llama.cpp或ONNX Runtime入手。第三步搭通服務鏈路接入模型、起HTTP服務、配置自動擴縮容、接入監控。注意vLLM的OpenAI兼容接口可以直接復用現有上層應用這是個很大的效率優勢。第四步壓測并優化三個關鍵指標TTFT、TPOT、吞吐。根據壓測結果調整并行度、KV Cache策略、量化方案、調度參數。第五步灰度上線持續觀測。上線后要在真實流量下持續跟蹤指標用真實數據驗證壓測結論再決定是否需要繼續調參。我個人的習慣是先跑通一個最小可用的鏈路再做性能調優。很多團隊一上來就在追求極致性能結果配置過度、參數復雜反而讓問題排查變得非常困難。先讓它能穩定跑起來再做精細調優這條路對絕大多數項目來說都是最短路徑。最后分享一個特定技巧如果你用vLLM記得關注max-model-len與gpu-memory-utilization的平衡關系。很多性能問題根源不是引擎不行而是顯存分配比例沒調對。把這兩個參數理解透了大模型推理服務的基本盤就穩了。