✏️ 作者介紹:
黃偉,趨勢科技(中國)資深研發工程師
前期調研趨勢科技(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 秒。
準備好開啟你的向量搜尋之旅嗎?