揭秘老黃演講中關(guān)鍵技術(shù):PD分離!UCSD華人團(tuán)隊(duì)力作,LLM吞吐量躍升4倍
現(xiàn)在,PD分離已經(jīng)成為兵家必爭(zhēng)之地。
前有Mooncake/DeepSeek等公司采用這種技術(shù)來(lái)優(yōu)化大模型的推理服務(wù),后有Nvidia/PyTorch基于該技術(shù)孵化下一代LLM服務(wù)系統(tǒng)。
甚至最近,黃仁勛也在2025 GTC的舞臺(tái)上提到了PD分離(Prefill-Decode Disaggregation)技術(shù),進(jìn)一步證明了這一技術(shù)獲得的廣泛關(guān)注。
去年,來(lái)自UCSD的一個(gè)華人團(tuán)隊(duì)發(fā)布的一篇博客,就深入剖析了這一技術(shù)的原理和它的應(yīng)用場(chǎng)景。
博客地址:https://hao-ai-lab.github.io/blogs/distserve/
如今,大語(yǔ)言模型應(yīng)用有著不同的延遲需求。
例如,聊天機(jī)器人需要快速響應(yīng)(比如低于0.2秒),而解碼速度可以較為適中,僅需與人類閱讀速度相匹配;代碼補(bǔ)全則要求快速生成,以便實(shí)時(shí)提供代碼建議。
文章中展示了現(xiàn)有的優(yōu)化吞吐量的服務(wù)系統(tǒng),在延遲標(biāo)準(zhǔn)下并不理想。
作者提議使用「有效吞吐量」(goodput)作為大模型服務(wù)性能的改進(jìn)衡量標(biāo)準(zhǔn),它不僅關(guān)注每秒完成請(qǐng)求的數(shù)量,而且符合服務(wù)級(jí)目標(biāo)(SLO),更好地平衡成本和用戶體驗(yàn)。
為了提升有效吞吐量,文章提出了「預(yù)填充-解碼分離」(prefill-decode disaggregation),即將預(yù)填充和解碼分配到不同的GPU上。
通過(guò)這個(gè)方法,作者搭建了一個(gè)系統(tǒng)原型DistServe,在保持嚴(yán)格的延遲約束下,達(dá)到了比現(xiàn)有系統(tǒng)高出4.48倍的有效吞吐量,或者10.2倍更嚴(yán)格的SLO。
一個(gè)請(qǐng)求通過(guò)一個(gè)具有分離預(yù)填充和解碼的LLM服務(wù)引擎
吞吐量與有效吞吐量
LLM正在改變行業(yè)對(duì)AI的應(yīng)用,但LLM服務(wù)成本仍然很高。
為了降低成本,很多公司專注于提升LLM系統(tǒng)的吞吐量,即每秒處理的請(qǐng)求數(shù)(rps),作為每個(gè)請(qǐng)求成本($/req)的替代指標(biāo)。
大多數(shù)流行的LLM服務(wù)引擎,如vLLM和TensorRT-LLM,都用吞吐量來(lái)衡量性能。
然而,實(shí)際應(yīng)用對(duì)延遲的要求各不相同,因此服務(wù)級(jí)目標(biāo)(SLO)也不同。常見的SLO包括:
- 首次token延遲(TTFT):測(cè)量LLM生成第一個(gè)token的時(shí)間
- 每個(gè)輸出token的時(shí)間(TPOT):測(cè)量?jī)蓚€(gè)連續(xù)生成的token之間的平均延遲
應(yīng)用程序有著多樣的SLO要求
吞吐量只關(guān)注處理的請(qǐng)求或token數(shù),卻忽視了這些延遲需求。作者引入了有效吞吐量(goodput),它衡量每秒完成的符合SLO的請(qǐng)求數(shù)(同時(shí)滿足TTFT和TPOT要求)。這比吞吐量更能反映服務(wù)質(zhì)量,因?yàn)樗紤]了成本和用戶體驗(yàn)。
那么,到底什么是有效吞吐量?假設(shè)一個(gè)應(yīng)用要求90%的請(qǐng)求TTFT小于200毫秒,TPOT小于50毫秒,那么有效吞吐量就是每秒能完成的最大請(qǐng)求數(shù),且至少90%的請(qǐng)求同時(shí)滿足這兩個(gè)條件。
一個(gè)高吞吐量的應(yīng)用可能有低的有效吞吐量。雖然吞吐量是10個(gè)請(qǐng)求每秒,但因?yàn)檠舆t約束,只有3個(gè)請(qǐng)求符合SLO,最終的有效吞吐量只有每秒3個(gè)請(qǐng)求。可以想象,盡管這種系統(tǒng)的吞吐量很高,但它的用戶服務(wù)將很差。
高吞吐量≠高有效吞吐量
以下是在本小節(jié)中引入的術(shù)語(yǔ):
- 有效吞吐量:衡量LLM服務(wù)系統(tǒng)效能的指標(biāo),考慮了成本和用戶滿意度。它定義為每秒系統(tǒng)可以完成的請(qǐng)求數(shù)量,同時(shí)滿足指定的服務(wù)級(jí)目標(biāo)(SLO)。
- 吞吐量:LLM服務(wù)系統(tǒng)每秒處理的已完成請(qǐng)求數(shù)量。
- 服務(wù)級(jí)目標(biāo)(SLO):LLM服務(wù)系統(tǒng)必須滿足的目標(biāo),以提供令人滿意的用戶體驗(yàn)。常見的SLO包括首次token延遲(TTFT)、每個(gè)輸出token時(shí)間(TPOT)、端到端延遲(E2E)和指數(shù)加權(quán)平均(EMA)延遲。
- 預(yù)填充:LLM推理的第一階段,處理所有輸入token,填充KV緩存,并生成第一個(gè)輸出token。
- 解碼:隨后的階段,通過(guò)自回歸方式生成token,直到完成。
- 首次token延遲(TTFT):LLM服務(wù)系統(tǒng)響應(yīng)用戶請(qǐng)求時(shí),生成第一個(gè)token所需的時(shí)間。
- 每個(gè)輸出token的時(shí)間(TPOT):LLM服務(wù)系統(tǒng)響應(yīng)用戶請(qǐng)求時(shí),生成后續(xù)token所需的平均時(shí)間。
為什么現(xiàn)有系統(tǒng)無(wú)法實(shí)現(xiàn)高有效吞吐量?
在深入分析之前,需要回顧一下LLM服務(wù)請(qǐng)求的流程。
下圖展示了這個(gè)過(guò)程:請(qǐng)求進(jìn)入LLM推理引擎,系統(tǒng)首先處理用戶輸入生成的第一個(gè)token(預(yù)填充),然后通過(guò)自回歸生成后續(xù)token(解碼)。一個(gè)請(qǐng)求通常包括一個(gè)預(yù)填充步驟和多個(gè)解碼步驟,直到生成完成。
傳統(tǒng)LLM服務(wù)系統(tǒng)中請(qǐng)求的處理過(guò)程
LLM服務(wù)系統(tǒng)通常將預(yù)填充和解碼一起批處理,使用迭代調(diào)度或連續(xù)批處理技術(shù),使GPU能盡量大批量處理,從而提高吞吐量(每秒token數(shù)),vLLM和TensorRT-LLM等系統(tǒng)都廣泛采用這一方法。
然而,預(yù)填充和解碼在計(jì)算上有非常不同的特點(diǎn)。
預(yù)填充非常依賴計(jì)算,意味著即使是一個(gè)小批量的預(yù)填充,或者僅僅是一個(gè)足夠長(zhǎng)的預(yù)填充,也會(huì)迅速飽和GPU計(jì)算資源。
另一方面,解碼需要更大的批量來(lái)達(dá)到計(jì)算瓶頸,且更容易受到GPU內(nèi)存帶寬限制的影響。
不過(guò),預(yù)填充和解碼在計(jì)算上差異很大:預(yù)填充計(jì)算密集型,容易迅速飽和GPU;而解碼則需要更大批量才能達(dá)到計(jì)算瓶頸,同時(shí)也更受GPU內(nèi)存帶寬的限制。
由于它們的計(jì)算模式和SLO目標(biāo)差異巨大,將這兩者一起處理并不有利于優(yōu)化有效吞吐量,原因有二:
- 預(yù)填充和解碼之間會(huì)互相干擾,導(dǎo)致性能下降
- 預(yù)填充和解碼的資源分配及并行策略會(huì)相互耦合,難以優(yōu)化
預(yù)填充和解碼的干擾
下圖展示了預(yù)填充和解碼之間的干擾。
- 左:把兩個(gè)請(qǐng)求批量到一個(gè)GPU,結(jié)果看到解碼(R1)延遲顯著增加,預(yù)填充(R2)延遲稍微上升。
- 右:穩(wěn)定請(qǐng)求流中,每次解碼遇到預(yù)填充請(qǐng)求時(shí)就會(huì)被「卡住」,解碼延遲因此意外增加。
連續(xù)批處理導(dǎo)致的干擾
這種干擾導(dǎo)致下圖中展示的情況:為了滿足TTFT和TPOT的SLO,系統(tǒng)必須過(guò)度配置資源以滿足延遲目標(biāo),尤其當(dāng)某個(gè)SLO特別嚴(yán)格時(shí)。
為了滿足SLO,預(yù)填充和解碼共同處理的系統(tǒng)需要過(guò)度配置資源
此外,預(yù)填充和解碼的資源分配和并行策略是耦合的。由于計(jì)算模式和延遲目標(biāo)不同,最優(yōu)的并行策略也不一樣。
比如,當(dāng)TTFT要求嚴(yán)格時(shí),預(yù)填充階段適合用張量并行(TP)來(lái)滿足緊湊的延遲目標(biāo),而解碼則更傾向于數(shù)據(jù)并行或流水線并行來(lái)提升吞吐量。
分離預(yù)填充和解碼
直覺(jué)很簡(jiǎn)單:將預(yù)填充(Prefill)和解碼(Decode)分配到不同的GPU,并為每個(gè)階段定制并行策略。
這自然解決了上面提到的兩個(gè)問(wèn)題:
- 預(yù)填充和解碼之間沒(méi)有干擾,使得兩個(gè)階段都可以更快完成,并更容易滿足各自的SLO(服務(wù)水平目標(biāo))
- 資源分配和并行策略解耦,優(yōu)化可以針對(duì)預(yù)填充和解碼分別進(jìn)行
下圖展示了在這種分離系統(tǒng)中請(qǐng)求的處理方式。
預(yù)填充/解碼分離時(shí)請(qǐng)求的處理過(guò)程
當(dāng)請(qǐng)求到達(dá)系統(tǒng)時(shí):
- 首先進(jìn)入預(yù)填充工作節(jié)點(diǎn)并完成預(yù)填充階段
- 然后,系統(tǒng)將其中間狀態(tài)(主要是KV緩存)遷移到解碼工作節(jié)點(diǎn),并進(jìn)行多個(gè)解碼步驟以生成后續(xù)token
- 請(qǐng)求在生成完成后離開系統(tǒng)
通過(guò)一個(gè)簡(jiǎn)單的實(shí)驗(yàn),即可驗(yàn)證Prefill-Decode分離的效果。
在單個(gè)A100-80GB GPU上運(yùn)行一個(gè)13B的LLM,使用一個(gè)輸入長(zhǎng)度為512、輸出長(zhǎng)度為64的合成工作負(fù)載,并假設(shè)請(qǐng)求按泊松分布到達(dá)。
逐漸增加請(qǐng)求速率(x軸),并測(cè)量這兩種延遲(P90 TTFT和P90 TPOT,y軸)中的變化。
假設(shè)將SLO設(shè)置為P90 TTFT小于0.4秒,P90 TPOT小于0.04秒,作者觀察到,現(xiàn)有系統(tǒng)使用1個(gè)GPU時(shí),大約支持3個(gè)rps(Request rate per second),而TPOT則支持1.6個(gè)rps。
由于需要同時(shí)滿足這兩個(gè)約束,現(xiàn)有共同處理系統(tǒng)的有效吞吐量為:有效吞吐量(同時(shí)滿足) = min(3, 1.6) = 1.6 rps(每個(gè)GPU)。
共同處理(a)相較于分離(b),后者在為預(yù)填充分配2個(gè)GPU、為解碼分配1個(gè)GPU(2P1D)時(shí)更具靈活性
分離后,性能顯著提升。
預(yù)填充工作節(jié)點(diǎn)和解碼工作節(jié)點(diǎn)在僅處理單個(gè)階段時(shí),可以分別達(dá)到比之前更好的rps——預(yù)填充工作節(jié)點(diǎn)大約可以達(dá)到5.6 rps,解碼工作節(jié)點(diǎn)大約可以達(dá)到10 rps。
更重要的是,現(xiàn)在我們可以靈活地分配2個(gè)預(yù)填充工作節(jié)點(diǎn)與1個(gè)解碼工作節(jié)點(diǎn)(記作2P1D),總共使用3個(gè)GPU。此時(shí)的有效吞吐量變?yōu)椋?/span>
有效吞吐量(2P1D) = min(5.6 x 2, 10) = 10 reqs/s / 3 GPUs ≈ 3.3 reqs/s(平均每個(gè)GPU)。
這個(gè)實(shí)驗(yàn)表明,簡(jiǎn)單的分離方法在沒(méi)有任何并行化的情況下就能實(shí)現(xiàn)2倍的有效吞吐量(3.3rps VS 1.6rps)。
額外的好處是,預(yù)填充與解碼的分離還能夠?yàn)槊總€(gè)階段選擇最佳的并行策略來(lái)優(yōu)化有效吞吐量(作者稱之為「定制并行tailored parallelism」)。
KV緩存?zhèn)鬏?/h3>
分離的一個(gè)代價(jià)是需要在預(yù)填充和解碼GPU之間傳輸中間狀態(tài)(即KV緩存)。
乍一看,KV緩存是LLM推理中一個(gè)大的內(nèi)存開銷,而在GPU之間傳輸KV緩存似乎是一個(gè)瓶頸。
但相反,通過(guò)合理的放置,KV緩存?zhèn)鬏數(shù)拈_銷可以被有效地最小化,低至小于一個(gè)解碼步驟的時(shí)間,這得益于今天高速的網(wǎng)絡(luò)技術(shù),如NVLink和PCI-e 5.0。
為了驗(yàn)證這一點(diǎn),假設(shè)有8通道PCIe 5.0 x 16(每個(gè)鏈路64GB/s)作為GPU之間的節(jié)點(diǎn)內(nèi)網(wǎng)絡(luò)。
給定一個(gè)2048token的請(qǐng)求,可以估算在服務(wù)OPT-175B(OPT,即Open Pre-trained Transformer由Meta AI開發(fā))時(shí),傳輸KV緩存的延遲為:
延遲 = 2048token *(4.5 MB/token)/(64GB/s * 8) = 17.6毫秒
這個(gè)延遲小于OPT-175B的單個(gè)解碼步驟的時(shí)間(約30-50毫秒,使用A100)。
對(duì)于更大的模型、更長(zhǎng)的序列或更先進(jìn)的網(wǎng)絡(luò)(例如,具有600GB/s帶寬的A100-NVLink),如下圖所示,KV緩存?zhèn)鬏數(shù)谋容^開銷與單個(gè)解碼步驟相比變得更加微不足道。
KV緩存?zhèn)鬏旈_銷可以被有效最小化,低于一個(gè)解碼步驟的時(shí)間
精心放置預(yù)填充和解碼工作節(jié)點(diǎn)以利用高帶寬網(wǎng)絡(luò),可以有效地隱藏KV緩存?zhèn)鬏數(shù)拈_銷。
DistServe:評(píng)估分離的效果
作者在一個(gè)名為DistServe的系統(tǒng)原型中實(shí)現(xiàn)了所提出的技術(shù),并在三個(gè)具有不同延遲約束的工作負(fù)載和數(shù)據(jù)集上與現(xiàn)有系統(tǒng)進(jìn)行了比較:聊天機(jī)器人、代碼補(bǔ)全和摘要,詳細(xì)信息見下表。
下圖展示了DistServe與vLLM的對(duì)比結(jié)果:
在各種數(shù)據(jù)集上評(píng)估DistServe與vLLM的表現(xiàn)
- 聊天機(jī)器人:DistServe的有效吞吐量比vLLM高2.0倍到3.41倍。
- 代碼補(bǔ)全:DistServe的有效吞吐量比vLLM高3.2倍,并且SLO比vLLM嚴(yán)格1.5倍。作為實(shí)時(shí)編碼助手,代碼補(bǔ)全任務(wù)比聊天機(jī)器人要求更低的TTFT,這使得兩個(gè)系統(tǒng)最終都受到TTFT要求的限制。然而,通過(guò)消除解碼任務(wù)的干擾,并為預(yù)填充定制張量并行策略,DistServe減少了預(yù)填充任務(wù)的平均延遲,從而滿足更多請(qǐng)求的TTFT要求。
- 摘要:DistServe的有效吞吐量比vLLM高4.48倍,并且SLO比vLLM嚴(yán)格10.2倍。如預(yù)期的那樣,由于vLLM將預(yù)填充和解碼放在一起,它在解碼階段的減速更大,未能滿足TPOT要求。
團(tuán)隊(duì)成員介紹
以上研究出自加州大學(xué)圣地亞哥分校的Hao AI實(shí)驗(yàn)室,全部來(lái)自于華人研究者。
Junda Chen
2023年秋季入學(xué)的計(jì)算機(jī)科學(xué)博士生。研究興趣:高效的LLM服務(wù)系統(tǒng)、推理系統(tǒng)和算法。
Yinmin Zhong
北京大學(xué)計(jì)算機(jī)系統(tǒng)研究組的一名三年級(jí)博士生,導(dǎo)師是金鑫。在此之前,在北京大學(xué)獲得了計(jì)算機(jī)科學(xué)學(xué)士學(xué)位。對(duì)構(gòu)建高效的系統(tǒng)來(lái)訓(xùn)練和提供深度學(xué)習(xí)模型有廣泛的興趣,目前主要關(guān)注大語(yǔ)言模型。
Hao Zhang
加州大學(xué)圣地亞哥分校計(jì)算機(jī)科學(xué)與工程系的助理教授。在UCSD領(lǐng)導(dǎo)Hao AI實(shí)驗(yàn)室,對(duì)設(shè)計(jì)強(qiáng)大、高效和安全的機(jī)器學(xué)習(xí)模型和算法,以及構(gòu)建可擴(kuò)展、實(shí)用的分布式系統(tǒng)以支持現(xiàn)實(shí)世界的機(jī)器學(xué)習(xí)工作負(fù)載感興趣。