Milvus 在趨勢科技的實踐

✏️  作者介紹:


黃偉,趨勢科技(中國)資深研發工程師  



  前期調研


趨勢科技(TrendMicro)是一家全球領先的信息安全軟件公司,專爲全球軟件廠商及個人用戶提供安全解決方案。本文作者目前負責構建移動安全 APP 和開發基礎設施。工作流程爲爬取 Google play 等平臺上的外部 APK (Android application package,即 Android 應用程序包),運用趨勢科技的算法檢測出攜帶病毒的 APK。使用 Milvus 在趨勢科技 APK 庫中對攜帶病毒的外部 APK 進行相似性檢索。如發現外部攜帶病毒的 APK 與庫中 APK 相似,需要及時通知企業與個人用戶相關的病毒信息。


上述工作要求系統高效檢索相似 APK。由於項目前期的 APK 樣本數量不大,團隊可以利用 SQL 語言在 MySQL 中進行 APK 相似性檢索。但隨着 APK 樣本數量急劇增大,使用 MySQL 無法保證性能,因此團隊開始探索新的解決方案。


Faiss

Facebook 於 2017 年發佈了 Faiss 算法庫。Faiss 能快速檢索相似向量,還提供 IndexFlatL2、IndexFlatIP、HNSW、IVF 等多個索引,可以解決大部分相似性檢索的問題。


但是 Faiss 只是一個基礎算法庫,存在如下問題:無法管理向量數據、不具備高可用性、缺乏監控手段、缺乏分佈式方案、缺少各種語言版本的 SDK 等。


基於 Faiss 等近似最近鄰搜索(Approximate Nearest Neighbor Search, ANN)算法庫開發插件

行業內基於 Faiss、NMSLIB 等近似最鄰近算法庫開發了一些插件,例如以 Faiss、NMSLIB 作爲底層庫開發的 ES (Elasticsearch) 插件,如下圖所示:


此類解決方案的優勢在於無需額外寫一套分佈式代碼。由於 ES 插件已經非常成熟,用戶能夠快速掌握提供 ES 的 DSL。一套 ES 能夠同時檢索文本和向量,而且支持標量字段過濾。


目前阿里、網易、亞馬遜都採用此類解決方案。京東也基於 Faiss 開發了一套分佈式系統 Vearch,但目前 Vearch 仍處於起步階段且社區並不活躍。 


此類解決方案的問題在於消耗內存大,且不易於性能調優。爲獲取最佳性能,需要進行 segment 合併。


Milvus

使用 C++ 語言開發的 Milvus 開源向量相似度搜索引擎在衆多主流方案中脫穎而出。Milvus 與其他方案的對比情況如下圖所示: 



對比分析可知 Mlivus 性能好,具備以下優點:

  • 集成了 Faiss、NMSLIB、Annoy 等主流向量索引庫。

  • 提供了一整套簡單直觀的 API,可以針對不同場景選擇不同的索引類型。

  • 在高可用、分佈式以及監控方面有相對成熟的解決方案。

  • 用戶較多,社區活躍,目前 star 數超過 5000。


趨勢科技最終決定選擇 Milvus 作爲內部的向量檢索組件。 



  項目背景和架構設計


目前趨勢科技在 MySQL 中存儲了千萬級的 APK 樣本數據,且每日增量達數十萬。算法團隊針對 APK 的不同部分抽取計算出其 Thash 特徵值,用於相似性檢索。團隊還會利用不同的 Sha256 算法將 APK 視作二進制文件,根據字節流 hash 分別計算出多個 256 bit 長的 Sha256 哈希值,用於區分不同的 APK。不同 APK 的 Sha256 哈希值不同。每個 APK 的 Thash 特徵值對應多個不同的 Sha256 哈希值。


簡而言之,Sha256 哈希值僅用於區分不同 APK,而 Thash 特徵值用於相似性檢索。相似的 APK 可能會產生相同的 Thash 特徵值,但 Sha256 哈希值不同。


目前,趨勢科技需要開發一套系統,檢索相似的 Thash 特徵值,並返回此 Thash 特徵值對應的多個 Sha256 哈希值,最終檢索出相似的 APK。在此過程中,趨勢科技需要開發存儲和檢索 Thash 特徵值的功能。在 Milvus 的支持下,趨勢科技團隊只需將 Thash 特徵值轉化成二值型向量,並存儲在 Milvus 中即可。


檢索出相似向量後,團隊還需要在 MySQL 中查詢 Thash 特徵值對應的多個 Sha256 哈希值。趨勢科技在架構設計中增加了緩存 Redis 來存儲 Thash 特徵值和 Sha256 哈希值的映射,以減少查詢時間。架構如下圖所示:



Milvus 支持多種向量的距離計算方式和索引類型,如下圖所示: 



趨勢科技將 Thash 轉化成二值型向量存儲在 Milvus 中。爲配合業務方,趨勢科技採用漢明距離計算不同向量的 ANN 距離。 


據瞭解,Milvus 未來版本會增加 string 類型 ID。此功能的發佈可以免去緩存 Redis,簡化當前架構。


目前,趨勢科技採用上雲方案,很多任務都部署在 Kubernetes 上。爲實現向量檢索的高可用,我們選擇了 Mishards——一個用 Python 開發的 Milvus 集羣分片中間件,如下圖所示:



趨勢科技採用 AWS 提供 EFS (Elastic File System) 來存儲實際的向量數據。這種存儲和計算分離的的做法將成爲趨勢。此外,趨勢科技可以藉助 Kubernetes 啓動多個讀節點,並基於這些讀節點創建 LoadBalancer 類型的服務,保證一個或多個節點無法使用時整個集羣依舊可用。


最初,Milvus 的架構爲單節點,而非貫穿始終的分佈式系統。出於對一致性的考量,Milvus 目前只支持一個寫節點。但在未來,分佈式 Milvus 將改進這一問題。



  監控和警報


Milvus 基於 Prometheus 搭建監控系統,使用開源的時序數據分析及可視化平臺 Grafana 展示各項性能指標。 


使用 Prometheus 監控、存儲性能指標:

  • Prometheus Server:收集和存儲時序數據

  • Client 代碼庫:定製監控指標

  • Pushgateway:推送指標數據,確保 Prometheus 可以獲取生命週期短且難以被及時提取的監控指標

  • Alertmanager:實現報警機制


監控指標較全面,包括:

  • Milvus 性能指標

  • 系統運行指標:CPU/GPU 使用狀況

  • 網絡、磁盤讀取等指標

  • 硬件存儲指標:數據大小,數據文件及存儲情況等指標 



  系統運行效果


目前,趨勢科技基於 Milvus 搭建的 ThashSearch 服務已上線數月。完整鏈路查詢的平均延遲在 95 毫秒以內,具體表現如下圖所示:


整體結果達到當初設計時制定的目標。數據導入速度也很快。導入300 萬條192 維向量數據大約只需要 10 秒。



更多 Mlivus 用戶案例

· 圖形商標近似檢索-知擎者的 Milvus 實踐

· 基於語義向量的內容召回和短文本分類的錯誤查找-搜狐的 Milvus 實戰

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

· 我的機器人新同事




   歡迎加入 Milvus 社區


github.com/milvus-io/milvus | 源碼
milvus.io | 官網
milvusio.slack.com | Slack 社區
zhihu.com/org/zilliz-11| 知乎
zilliz.blog.csdn.net | CSDN 博客
space.bilibili.com/478166626 | Bilibili

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

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