微軟發(fā)明全新「LLM語(yǔ)言」,AI智能體交互效率翻倍!
在《星球大戰(zhàn)》中,機(jī)器人R2-D2和其他機(jī)器人使用特殊的語(yǔ)言進(jìn)行交流。
這種語(yǔ)言主要由蜂鳴聲和口哨聲組成,被稱為「二進(jìn)制語(yǔ)」(Binary)或「機(jī)器人語(yǔ)」(Droidspeak)。
Droidspeak是專門為機(jī)器人之間的交流設(shè)計(jì)的,只有機(jī)器人能夠完全理解其精確含義。
電影中,C-3PO是唯一能夠完全理解R2-D2語(yǔ)言的角色,而天行者等人類則是通過(guò)長(zhǎng)期與R2-D2相處,逐漸能夠猜測(cè)出它所表達(dá)的意思。
機(jī)器人之間的「專用」通信顯然更加高效,那對(duì)于LLM來(lái)說(shuō),是否也應(yīng)該如此?
近日,來(lái)自微軟、芝加哥大學(xué)的研究人員推出了「Droidspeak」,讓AI智能體之間可以用自己的語(yǔ)言進(jìn)行交流:
論文地址:https://arxiv.org/pdf/2411.02820
結(jié)果表明,在不損失性能的情況下,Droidspeak使模型的通信速度提高了2.78倍。
所以,盡管人類用自然語(yǔ)言訓(xùn)練出了LLM,但用自然語(yǔ)言輸出和交流,只是AI對(duì)于人類的一種「遷就」。
Droidspeak
下面是喜聞樂(lè)見的讀論文環(huán)節(jié)。
事先甩個(gè)鍋,說(shuō)「發(fā)明全新LLM語(yǔ)言」或有標(biāo)題黨之嫌,概括文章的思想,四個(gè)字足矣:緩存復(fù)用。
再具體一些:在很多智能體系統(tǒng)中,不同的Agents其實(shí)是同源的,大家從同一個(gè)base model微調(diào)而來(lái),參數(shù)的差距并不大。
那么,相同的輸入(經(jīng)過(guò)差不多的weight)產(chǎn)生的計(jì)算結(jié)果也應(yīng)該差不多。
在智能體系統(tǒng)中,前一個(gè)Agent(sender)的輸出,會(huì)作為后一個(gè)Agent(receiver)輸入的一部分。
而這部分需要prefill的計(jì)算,在之前其實(shí)已經(jīng)做過(guò)了,那對(duì)于receiver來(lái)說(shuō),是不是能直接把sender的計(jì)算結(jié)果拿過(guò)來(lái)?
——直接傳遞模型中間的計(jì)算結(jié)果(緩存),而不需要轉(zhuǎn)換成人類能夠理解的自然語(yǔ)言,這就是「Droidspeak」的含義。
如果您是相關(guān)領(lǐng)域研究者,看到這里基本就可以退出了,節(jié)約了您寶貴的時(shí)間。
(但是小編走不了,畢竟稿費(fèi)是按字?jǐn)?shù)算的......)
智能體面臨的挑戰(zhàn)
高端的食材往往只需要最樸素的烹飪方式,而簡(jiǎn)單的idea往往得來(lái)并不簡(jiǎn)單。
根據(jù)小學(xué)二年級(jí)學(xué)過(guò)的知識(shí),LLM的推理可分為預(yù)填充(prefill)和解碼(decode)兩個(gè)階段:
prefill是LLM拿你提出的問(wèn)題(詞向量序列),一股腦放進(jìn)模型計(jì)算,填充所有層的kv cache;
而decode是用最后一個(gè)詞作為query,開始一個(gè)一個(gè)詞往外蹦。
從計(jì)算的角度來(lái)看,預(yù)填充階段是矩陣乘矩陣,為計(jì)算密集型;解碼階段是向量乘矩陣,相對(duì)來(lái)說(shuō)訪存變多。
當(dāng)我們長(zhǎng)時(shí)間運(yùn)行上下文密集的對(duì)話時(shí),prefill的占比會(huì)越來(lái)越高,包括計(jì)算和通信的開銷。
所以在需要頻繁交互的智能體系統(tǒng)中,prefill會(huì)成為瓶頸。
比如,在HotpotQA數(shù)據(jù)集中,Llama-3-70B-Instruct的平均預(yù)填充延遲為2.16秒,而解碼時(shí)間只有0.21秒;
在MapCoder這種級(jí)聯(lián)智能體系統(tǒng)中,前一個(gè)Agent的輸出最多可達(dá)到38,000個(gè)token,從而導(dǎo)致極高的預(yù)填充延遲。
親子關(guān)系
之前有工作探究過(guò),利用kv cache來(lái)減少同一個(gè)模型的預(yù)填充延遲,這件事在智能體系統(tǒng)中貌似也能成立。
先測(cè)試一下親子之間的相似度。
實(shí)驗(yàn)使用base model作為發(fā)送方,微調(diào)版本作為接收方,選擇了下面四組模型。
單從模型參數(shù)來(lái)看,絕對(duì)是親生的,相似度差別都是小數(shù)點(diǎn)后三位的水平:
那么對(duì)于相同輸入,中間的計(jì)算結(jié)果有多大差別?
這里的E cache指的是每層的輸入,即E通過(guò)投影矩陣計(jì)算出QKV。
相比于權(quán)重,每對(duì)模型的E cache和KV cache差別大了一點(diǎn)點(diǎn),但也還好,那能不能直接復(fù)用呢?
方法探索
在最初的實(shí)驗(yàn)構(gòu)建中,要求微調(diào)版本在測(cè)試基準(zhǔn)上的表現(xiàn)比基礎(chǔ)模型好得多,以便測(cè)試出復(fù)用緩存帶來(lái)的影響。
在此基礎(chǔ)上,如果只是簡(jiǎn)單的復(fù)用全部的kv cache,效果稍顯慘不忍睹,F(xiàn)ine-tuned Model的性能直接被打回原形:
看上去需要更加細(xì)致的操作,所以逐層分析一下E cache和KV cache的差別(注意是與base model的差別)。
因?yàn)榫彺娴牟町愐驅(qū)佣?,所以?yōu)化的應(yīng)用也要按層來(lái),這里首先考慮重用KV cache的連續(xù)層(直到最后一層)。
下圖表明了重用KV cache帶來(lái)的精度影響,效果很不錯(cuò),但優(yōu)化的自由度很低。
小編推測(cè),這個(gè)「自由度低」的意思是:復(fù)用KV cache時(shí),本層的輸入(E cache)就不需要了,沒有輸入就沒法算Q,就沒法算下一層,所以后面也只能復(fù)用KV cache(直到最后一層)。
所以,作者接下來(lái)就測(cè)試復(fù)用E cache的情況,因?yàn)橛休斎肟梢岳^續(xù)往下算,所以復(fù)用E cache時(shí)可以選擇任意的起點(diǎn)和終點(diǎn)。
如下圖所示,每個(gè)點(diǎn)代表在一定程度的預(yù)填充延遲下的最佳精度。
我們可以看到,重用E cache在保持生成質(zhì)量的同時(shí),將預(yù)填充延遲降低了1.8倍。
最終方案
作者表示,盡管重用 E cache在層方面提供了極大的靈活性,但它會(huì)在GPU內(nèi)存、傳輸和計(jì)算方面產(chǎn)生開銷。
考慮發(fā)送方和接收方放置在兩個(gè)GPU節(jié)點(diǎn)上,并通過(guò)Infiniband鏈路互連:
在發(fā)送方,E cache需要先存儲(chǔ)在GPU內(nèi)存中(內(nèi)存開銷),發(fā)送E cache到接收方會(huì)產(chǎn)生額外的傳輸延遲;
在接收端,還需要額外的QKV投影操作,將E cache轉(zhuǎn)換為KV cache,這會(huì)導(dǎo)致額外的計(jì)算延遲。這三種類型的delay隨著重用層的數(shù)量呈線性增長(zhǎng),如圖12所示。
與之相對(duì),重用KV cache沒啥額外開銷,只是缺乏靈活性。
所以,兩種方法合體。
圖13在預(yù)填充延遲和準(zhǔn)確性權(quán)衡方面,比較了單獨(dú)重用E cache與重用KV+E cache。
對(duì)于實(shí)驗(yàn)的三對(duì)模型,重用KV+E cache在延遲和準(zhǔn)確性方面效果良好,且不會(huì)增加發(fā)送方的GPU內(nèi)存開銷或接收方的計(jì)算開銷。
最后是端到端的整體架構(gòu):
如圖14所示,離線階段,DroidSpeak首先在示例分析數(shù)據(jù)集上分析每對(duì)要重用的層(復(fù)用配置);
在線階段,當(dāng)發(fā)送方與接收方LLM通信時(shí),會(huì)根據(jù)復(fù)用配置將KV和E緩存發(fā)送給接收方。
然后,接收方會(huì)為那些不重用KV緩存的層重新計(jì)算新的KV緩存。
下圖展示了DroidSpeak相對(duì)于baseline的改進(jìn):
我們可以看到,與完全預(yù)填充相比,DroidSpeak的預(yù)填充延遲減少了1.69到2.77倍,而不會(huì)影響生成質(zhì)量(重用所有E緩存或KV緩存時(shí),生成質(zhì)量會(huì)大大降低)。
水平虛線表示基礎(chǔ)模型的生成質(zhì)量,DroidSpeak的質(zhì)量損失與基礎(chǔ)模型和微調(diào)模型之間的差異相比微不足道。