貝殼找房基於Milvus的向量搜索實踐(一)

摘要:本系列文章分爲三部分,第一部分主要講基本概念、背景、選型及服務的整體架構;第二部分主要講針對低延時、高吞吐需求,我們對Milvus部署方式的一種定製;第三部分主要講實現數據更新、保證數據一致性,以及保證服務穩定及提高資源利用率做的一些事情。

1.名詞解釋

Milvus[1]:一種基於Faiss[5],NMSLIB[6] 和 Annoy[7]的相似特徵向量搜索引擎。

向量:即特徵向量,是對客觀世界物體特徵的數值表示;比如我們用RGB(紅綠藍)三元色來表示物體的顏色,那麼對於一個像素點,我們可以用數組[255,255,255]表示白色,用數組[0,0,0]表示黑色,這裏[255,255,255]、[0,0,0]可以認爲是物體該像素點的特徵向量。

向量搜索:也叫最鄰近搜索,是指按照一定的相似/距離算法[9-12],從指定集合中搜索(計算)出與輸入的某個向量最相似的N個向量(即topN)。

2.背景

隨着計算機技術及機器學習技術的發展,特徵向量作爲一種對多媒體數據(複雜文本、語音、圖片)的描述方式,逐漸成熟起來,而向量搜索(向量相似計算)也逐漸成爲一種通用的需求。

近些年,貝殼找房業務迅猛發展,在搜索、推薦、圖譜、智能客服等業務場景下,對向量搜索提出了比較強的需求。

面對多業務的需求,結合對業界已有工具的調研,最終選擇了milvus做爲底層引擎,建設了一個通用的向量搜索平臺,以解決向量相似計算這個共性的問題。

3. 技術選型

在技術選型階段,我們調研了業界已經比較成熟的工具,如facebook的faiss[5]、微軟的SPTAG[8],以及國內發起的開源項目Vearch[13],Milvus[1]。具體對比見表1,2。

Vearch和Milvus屬於同類型產品,對比faiss和SPTAG的優勢在於,後兩者爲開發庫,不能開箱即用,在生產環境中使用涉及更多的開發、維護成本。Milvus和Vearch是兩款基於現有的開發庫,開箱即用的應用,在實現基本的相似計算功能的基礎上,圍繞服務整體易用性、部署、穩定性等方面做了更多工作。另外,Milvus對比Vearch,在社區活躍度、支持度上具有更明顯的優勢。基於以上的調研,綜合考慮各方面的成本,我們選擇Milvus作爲底層引擎。

表1:Milvus對比FAISS、SPTAG [3]
表2:Milvus對比Vearch(2019.11數據)

4. Milvus引擎簡介

如圖1所示,Milvus基於Faiss、Annoy等比較成熟的開源庫,並針對性做了定製,支持結構化查詢、多模查詢等業界比較急需的功能;Milvus支持cpu、gpu、arm等多種類型的處理器;同時使用mysql存儲元數據,並且在共享存儲的支持下,Milvus可以支持分佈式部署。

圖1 Milvus架構 [1]

5.服務整體架構

圖2 服務整體架構

如圖2所示,整體架構分三層,網關層、應用層和引擎層。

網關層:主要負責服務整體的訪問控制和監控報警,並對外暴露api,屬於應用的通用能力,這裏不詳細講。

應用層:應用層的定位是面向使用方,提供通用的向量搜索能力,同時屏蔽掉底層引擎的細節;應用層主要分爲讀模塊、寫模塊以及管理模塊。寫模塊定位是數據更新,抽象出了一組通用的寫入api,以實現對數據的更新,並保證數據更新的一致性。讀模塊定位是支撐向量搜索,適配用戶的查詢請求,轉換成具體引擎的查詢,最後把結果轉換成通用格式;讀模塊藉助讀緩存,來提高有重複查詢請求時的整體吞吐量。我們使用ID映射模塊來完成業務id和引擎id的內部轉換,爲通用讀/寫做支撐。另外,我們使用集羣管理模塊來實現集羣的創建、配置更新以及狀態的監控。

引擎層:引擎層基於docker+kubernetes,實現了Milvus引擎的部署、服務發現、數據存儲以及資源的管理。

6.參考文獻

  1. https://github.com/milvus-io/milvus
  2. https://github.com/milvus-io/milvus/tree/0.11.1/shards
  3. https://github.com/milvus-io/docs/blob/master/v0.6.0/site/en/reference/comparison.md
  4. https://milvus.io/docs/v0.11.0/vector.md
  5. https://github.com/facebookresearch/faiss
  6. https://github.com/nmslib/nmslib
  7. https://github.com/spotify/annoy
  8. https://github.com/microsoft/SPTAG
  9. https://en.wikipedia.org/wiki/Euclidean_distance
  10. https://en.wikipedia.org/wiki/Taxicab_geometry
  11. https://en.wikipedia.org/wiki/Hamming_distance
  12. https://en.wikipedia.org/wiki/Minkowski_distance
  13. https://github.com/vearch/vearch

作者簡介

下期精彩

Milvus的向量搜索實踐(二):Milvus項目在調研、實施以及最終上線使用過程中,遇到的問題。


本文分享自微信公衆號 - ZILLIZ(Zilliztech)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章