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