Puck百度自研高性能 ANN 檢索引擎
Puck 是百度自研的高性能 ANN 檢索引擎,名稱取自經(jīng)典 MOBA 游戲 DOTA 中的智力英雄 - Puck,是飄逸、靈動(dòng)的代表。ANN 全稱近似最近鄰檢索(Approximate Nearest Neighbor),目標(biāo)是從全量向量數(shù)據(jù)中尋找距離最近的 TopK 個(gè)向量,同時(shí)需要平衡檢索效果和檢索成本。
在工業(yè)應(yīng)用場(chǎng)景中,有限的內(nèi)存、昂貴的計(jì)算機(jī)資源和不斷增大的數(shù)據(jù)庫(kù)規(guī)模對(duì)于所有搜索應(yīng)用來(lái)說(shuō)都同樣重要。隨著檢索業(yè)務(wù)服務(wù)的快速發(fā)展,對(duì)高檢索延遲和珍貴但有限的資源提出了更高的要求,Puck 的誕生正是為了滿足這種需求。
Puck 開(kāi)源項(xiàng)目包含兩種百度自研的檢索算法 Puck&Tinker,該項(xiàng)目用 C++ 編寫,并有 python3 封裝。
Puck 是一種針對(duì)大規(guī)模數(shù)據(jù)集的高效方法,在 NeurIPS'21 賽道的多個(gè) 1B 數(shù)據(jù)集中表現(xiàn)最佳。此后,Puck 的性能提高了 70%。Puck 包括反轉(zhuǎn)索引和數(shù)據(jù)集多級(jí)量化的兩層架構(gòu)設(shè)計(jì)。如果內(nèi)存會(huì)成為瓶頸,Puck 可以解決你的問(wèn)題。
Tinker 是一種針對(duì)較小數(shù)據(jù)集(如 10M、100M)的有效方法,在 big-ann-benchmarks 中比 Nmslib 具有更好的性能。Thinker 比 Puck 消耗更多內(nèi)存,但性能比 Puck 更好。如果你想要更好的搜索性能并且不需要關(guān)心內(nèi)存使用,Tinker是更好的選擇。
Puck 支持余弦相似度、L2(Euclidean) 和 IP(Inner Product, conditioned)。當(dāng)兩個(gè)向量歸一化時(shí),L2 距離等于 2 - 2 * cos。IP2COS是一種將IP距離轉(zhuǎn)換為cos距離的變換方法。搜索結(jié)果中的距離值始終為L(zhǎng)2。
Puck 使用壓縮向量(PQ 之后)代替原始向量,默認(rèn)情況下,內(nèi)存消耗僅為原始向量的 1/4。隨著數(shù)據(jù)量的增加,Puck的優(yōu)勢(shì)更加明顯。Tinker需要保存相似點(diǎn)的關(guān)系,默認(rèn)情況下內(nèi)存消耗比原始向量多(小于Nmslib)?;鶞?zhǔn)測(cè)試中的更多性能細(xì)節(jié)。參閱此自述文件以了解更多詳細(xì)信息。
Puck 的優(yōu)勢(shì)
- 易用性:提供簡(jiǎn)單易用的 API 接入,盡量少的暴露參數(shù),大部分參數(shù)使用默認(rèn)即可達(dá)到良好性能。
- 擴(kuò)展性:采用完全自研的索引結(jié)構(gòu),支持多種功能擴(kuò)展,適應(yīng)多種場(chǎng)景,項(xiàng)目模塊劃分合理,便于改造優(yōu)化,可方便用戶接口自行添加。
- 高性能:在 benchmark 的千萬(wàn)、億、十億等多個(gè)數(shù)據(jù)集上,Puck 性能優(yōu)勢(shì)明顯,均顯著超過(guò)競(jìng)品。
- 可靠性:經(jīng)過(guò)多年在實(shí)際大規(guī)模場(chǎng)景下的驗(yàn)證打磨,廣泛應(yīng)用于百度內(nèi)部包括搜索、推薦等三十余條產(chǎn)品線,支撐萬(wàn)億級(jí)索引數(shù)據(jù)和海量檢索請(qǐng)求。
Puck 功能拓展
- 實(shí)時(shí)插入:支持無(wú)鎖結(jié)構(gòu)的實(shí)時(shí)插入,做到數(shù)據(jù)的實(shí)時(shí)更新。
- 條件查詢:支持檢索過(guò)程中的條件查詢,從底層索引檢索過(guò)程中就過(guò)濾掉不符合要求的結(jié)果,解決多路召回歸并經(jīng)常遇到的截?cái)鄦?wèn)題,更好滿足組合檢索的要求。
- 分布式建庫(kù):索引的構(gòu)建過(guò)程支持分布式擴(kuò)展,全量索引可以通過(guò) map-reduce 一起建庫(kù),無(wú)需按分片 build,大大加快和簡(jiǎn)化建庫(kù)流程。
- 自適應(yīng)參數(shù):ANN 方法檢索參數(shù)眾多,應(yīng)用起來(lái)有不小門檻,不了解技術(shù)細(xì)節(jié)的用戶并不容易找到最優(yōu)參數(shù),Puck 提供參數(shù)自適應(yīng)功能,在大部分情況下使用默認(rèn)參數(shù)即可得到很好效果 。
