微軟髮明全新「LLM語言」,AI智能體交互效率翻倍!

新智元報導  

編輯:alan

【新智元導讀】對於LLM來說,人類語言可能不是最好的交流媒介,正如《星戰》中的機器人有自己的一套語言,近日,來自微軟的研究人員改進了智能體間的交互方式,使模型的通信速度翻倍且不損失精度。

在《星球大戰》中,機器人R2-D2和其他機器人使用特殊的語言進行交流。

這種語言主要由蜂鳴聲和口哨聲組成,被稱為「二進製語」(Binary)或「機器人語」(Droidspeak)。

Droidspeak是專門為機器人之間的交流設計的,只有機器人能夠完全理解其精確含義。

電影中,C-3PO是唯一能夠完全理解R2-D2語言的角色,而天行者等人類則是通過長期與R2-D2相處,逐漸能夠猜測出它所表達的意思。

機器人之間的「專用」通信顯然更加高效,那對於LLM來說,是否也應該如此?

近日,來自微軟、芝加哥大學的研究人員推出了「Droidspeak」,讓AI智能體之間可以用自己的語言進行交流:

論文地址:https://arxiv.org/pdf/2411.02820論文地址:https://arxiv.org/pdf/2411.02820

結果表明,在不損失性能的情況下,Droidspeak使模型的通信速度提高了2.78倍。

所以,儘管人類用自然語言訓練出了LLM,但用自然語言輸出和交流,只是AI對於人類的一種「遷就」。

Droidspeak

下面是喜聞樂見的讀論文環節。

事先甩個鍋,說「發明全新LLM語言」或有標題黨之嫌,概括文章的思想,四個字足矣:緩存複用。

再具體一些:在很多智能體系統中,不同的Agents其實是同源的,大家從同一個base model微調而來,參數的差距並不大。

那麼,相同的輸入(經過差不多的weight)產生的計算結果也應該差不多。

在智能體系統中,前一個Agent(sender)的輸出,會作為後一個Agent(receiver)輸入的一部分。

而這部分需要prefill的計算,在之前其實已經做過了,那對於receiver來說,是不是能直接把sender的計算結果拿過來?

——直接傳遞模型中間的計算結果(緩存),而不需要轉換成人類能夠理解的自然語言,這就是「Droidspeak」的含義。

如果您是相關領域研究者,看到這裏基本就可以退出了,節約了您寶貴的時間。

(但是小編走不了,畢竟稿費是按字數算的……)

智能體面臨的挑戰

高端的食材往往只需要最樸素的烹飪方式,而簡單的idea往往得來並不簡單。

根據小學二年級學過的知識,LLM的推理可分為預填充(prefill)和解碼(decode)兩個階段:

prefill是LLM拿你提出的問題(詞向量序列),一股腦放進模型計算,填充所有層的kv cache;

而decode是用最後一個詞作為query,開始一個一個詞往外蹦。

從計算的角度來看,預填充階段是矩陣乘矩陣,為計算密集型;解碼階段是向量乘矩陣,相對來說訪存變多。

當我們長時間運行上下文密集的對話時,prefill的佔比會越來越高,包括計算和通信的開銷。

所以在需要頻繁交互的智能體系統中,prefill會成為瓶頸。

比如,在HotpotQA數據集中,Llama-3-70B-Instruct的平均預填充延遲為2.16秒,而解碼時間只有0.21秒;

在MapCoder這種級聯智能體系統中,前一個Agent的輸出最多可達到38,000個token,從而導致極高的預填充延遲。

親子關係

之前有工作探究過,利用kv cache來減少同一個模型的預填充延遲,這件事在智能體系統中貌似也能成立。

先測試一下親子之間的相似度。

實驗使用base model作為發送方,微調版本作為接收方,選擇了下面四組模型。

單從模型參數來看,絕對是親生的,相似度差別都是小數點後三位的水平:

那麼對於相同輸入,中間的計算結果有多大差別?

這裏的E cache指的是每層的輸入,即E通過投影矩陣計算出QKV。

相比於權重,每對模型的E cache和KV cache差別大了一點點,但也還好,那能不能直接複用呢?

方法探索

在最初的實驗構建中,要求微調版本在測試基準上的表現比基礎模型好得多,以便測試出複用緩存帶來的影響。

在此基礎上,如果只是簡單的複用全部的kv cache,效果稍顯慘不忍睹,Fine-tuned Model的性能直接被打回原形:

看上去需要更加細緻的操作,所以逐層分析一下E cache和KV cache的差別(注意是與base model的差別)。

因為緩存的差異因層而異,所以優化的應用也要按層來,這裏首先考慮重用KV cache的連續層(直到最後一層)。

下圖表明了重用KV cache帶來的精度影響,效果很不錯,但優化的自由度很低。

小編推測,這個「自由度低」的意思是:複用KV cache時,本層的輸入(E cache)就不需要了,沒有輸入就沒法算Q,就沒法算下一層,所以後面也只能複用KV cache(直到最後一層)。

所以,作者接下來就測試複用E cache的情況,因為有輸入可以繼續往下算,所以複用E cache時可以選擇任意的起點和終點。

如下圖所示,每個點代表在一定程度的預填充延遲下的最佳精度。

我們可以看到,重用E cache在保持生成質量的同時,將預填充延遲降低了1.8倍。

最終方案

作者表示,儘管重用 E cache在層方面提供了極大的靈活性,但它會在GPU內存、傳輸和計算方面產生開銷。

考慮發送方和接收方放置在兩個GPU節點上,並通過Infiniband鏈路互連:

在發送方,E cache需要先存儲在GPU內存中(內存開銷),發送E cache到接收方會產生額外的傳輸延遲;

在接收端,還需要額外的QKV投影操作,將E cache轉換為KV cache,這會導致額外的計算延遲。這三種類型的delay隨著重用層的數量呈線性增長,如圖12所示。

與之相對,重用KV cache沒什麼額外開銷,只是缺乏靈活性。

所以,兩種方法合體。

圖13在預填充延遲和準確性權衡方面,比較了單獨重用E cache與重用KV+E cache。圖13在預填充延遲和準確性權衡方面,比較了單獨重用E cache與重用KV+E cache。

對於實驗的三對模型,重用KV+E cache在延遲和準確性方面效果良好,且不會增加發送方的GPU內存開銷或接收方的計算開銷。

最後是端到端的整體架構:

如圖14所示,離線階段,DroidSpeak首先在示例分析數據集上分析每對要重用的層(複用配置);如圖14所示,離線階段,DroidSpeak首先在示例分析數據集上分析每對要重用的層(複用配置);

在線階段,當發送方與接收方LLM通信時,會根據複用配置將KV和E緩存發送給接收方。

然後,接收方會為那些不重用KV緩存的層重新計算新的KV緩存。

下圖展示了DroidSpeak相對於baseline的改進:

我們可以看到,與完全預填充相比,DroidSpeak的預填充延遲減少了1.69到2.77倍,而不會影響生成質量(重用所有E緩存或KV緩存時,生成質量會大大降低)。

水平虛線表示基礎模型的生成質量,DroidSpeak的質量損失與基礎模型和微調模型之間的差異相比微不足道。

參考資料:

‘Droidspeak’: AI Agents Now Have Their Own Language Thanks to Microsoft