2024 年,向量數據庫的性能捲到什麼程度了?

本文作者爲 Zilliz 首席工程師 Alexandr Guzhva、Zilliz 首席工程師 劉力

對於數據庫(尤其是向量數據庫)而言,“性能”是一個十分關鍵的指標,其用於衡量數據庫是否能夠在有限資源內,高效處理大量用戶請求。對於向量數據庫用戶而言,儘管可能在某些情況下對延時的要求不高,但對性能指標的高要求卻一如既往,從未改變。

這也很好理解,原因在於:

  1. 基於近似最近鄰搜索(ANNS)的向量搜索,可能會爲了提高性能而犧牲一點精度。但性能的提高卻可以讓用戶在滿足相同業務需求場景下,擴大搜索、提高準確度。

  2. 在查詢延遲相同,使用資源相同的情況下,數據庫性能越高、吞吐量越高,可以適應更大的用戶數量。

  3. 相同場景下,性能越高意味着需要更少的計算資源。

向量數據庫本質上是計算密集型的數據庫,在計算向量距離時需要使用大量資源——通常超過總體資源的 80%。因此,負責處理向量搜索任務的向量搜索引擎,是決定向量數據庫整體性能的關鍵因素。

Zilliz 一直致力於提升向量數據庫性能,無論是 Milvus(https://github.com/milvus-io/milvus) 還是全託管的 Zilliz Cloud(https://zilliz.com.cn/cloud),與競品相比都展現出了卓越的性能。其中,Milvus 的向量搜索引擎 Knowhere(https://github.com/zilliztech/knowhere),發揮了重要作用,爲新一代的向量搜索引擎奠定了基礎。而 Zilliz Cloud 最近發佈的核心向量搜索引擎 Cardinal,直接將搜索引擎的性能比原來提升了 3 倍,搜索性能(QPS)是 Milvus 的 10 倍。

我們通過開源向量數據庫性能測試工具(https://github.com/zilliztech/VectorDBBench)評估了新版 Zilliz Cloud 的性能,並將其與使用舊引擎的 Milvus 和 Zilliz Cloud 進行了比較,評估結果如下圖所示:

Cardinal 究竟是何方神聖?爲何能有如此出色的表現?底層邏輯是什麼?本文將一一揭曉。

01.Cardinal 是什麼?

Cardinal 是 Zilliz 專門研發的多線程、基於 C++ 語言開發的向量搜索引擎,其整合了最實用、最流行的 ANNS 方法,使用 Cardinal 可以實現高效的計算資源使用率。

Cardinal 能夠:

  • 執行暴搜

  • 創建和修改 ANNS 索引

  • 執行索引 Top-K 和索引範圍搜索(Range Search)

  • 處理包括 FP32、FP16 和 BF16 在內的各種輸入數據格式

  • 使用內存中數據或提供基於內存、磁盤和 MMap 等不同方式的索引

  • 根據用戶提供的標準在搜索過程中過濾結果

Cardinal 的能力包括:

  • Zilliz internal 的高性能 ANN 算法實現,通過大量可調整參數適配多種場景。默認會自動調整參數適配不同的場景,在保持合理精度(召回率)的同時最大化搜索速度(QPS,每秒查詢數)。

  • 高效實現支持 ANNS 的各種算法,例如,提供樣本過濾功能的算法。

  • 爲搜索或索引構建過程中大多數計算密集型操作優化的專用 low-level 內核,支持多種硬件平臺。除了各種相似度類型外,Cardinal 還包含 fused 內核和數據預處理內核。

  • 支持異步操作、內存映射 I/O 能力、緩存、內存分配器、日誌記錄等功能。

02.Knowhere vs Cardinal

Knowhere 是 Milvus 的內部核心引擎,負責向量搜索,是基於行業標準開源庫(如 Faiss、DiskANN 和 hnswlib 等)的增強版本。

以下爲 Knowhere 和 Cardinal 的比較結果:

可以看到:

  • 兩者均已生產就緒,並提供 Milvus 和 Zilliz Cloud 所需的所有可擴展性。

  • Knowhere 設計時考慮到實驗性和靈活性;Cardinal 的範圍更狹窄,優先考慮增強現有功能以提高速度和性能,而不是引入廣泛的新功能。

  • 由於 Knowhere 屬於開源,其部署環境更多樣,可在所有主機類型上運行;Cardinal 則專門針對 Zilliz Cloud 主機環境進行了優化。

  • Knowhere 依賴於 OSS 庫(如 Faiss、DiskANN 和 hnswlib);Cardinal 則進行了針對性的改進和優化。

03.Cardinal 高性能的原因

Cardinal 實現了各種與算法相關的工程優化,它引入了 AUTOINDEX 機制,自動選擇適合於數據集最佳的搜索策略和索引。開發者無需手動調優,能夠節省時間和精力。

算法優化

算法的優化顯著提高了搜索過程的準確性和有效性,Cardinal 內部算法優化具體包括:

  • 搜索算法,包括基於 IVF 和基於圖的方法

  • 幫助搜索保持所需召回率的算法,不論過濾樣本的百分比如何

  • 更高效的 Best-First 搜索算法迭代方法

  • 定製了優先隊列數據結構中的算法

將算法參數化幫助開發者靈活權衡性能與 RAM 使用率。因此,Cardinal 的算法優化還涉及在參數範圍內選擇最佳操作點。

工程優化

雖然算法最初是針對抽象的圖靈機設計的,但真正實現時卻面臨着網絡延遲、雲提供商對 IOPS 的限制以及機器 RAM 限制等挑戰(RAM 是一種寶貴而有限的資源)。

工程優化可以確保 Cardinal 的向量搜索 Pipeline 保持實用,並符合計算、RAM 和其他資源限制。在 Cardinal 的開發中,Zilliz 融合了標準實踐和創新技術。這種方法使 C++ 編譯器能夠生成計算上最優的編譯代碼,同時保持標準化的性能測試、易於擴展的源代碼,便於快速添加新功能。

以下是在 Cardinal 中工程優化的具體示例:

  • 專門的內存分配器和內存池

  • 合理的多線程代碼

  • 組件的層次結構,便於將元素組合成各種搜索 Pipeline

  • 針對特定、關鍵用例的定製化代碼

其他優化

  1. 搜索時間大部分都花在稱爲內核的相對較小的代碼片段上,最簡單的例子是計算兩個向量之間 L2 距離的內核。Cardinal 中包括爲不同目的編寫和優化的衆多計算內核,每個內核都針對特定的硬件平臺和用例進行了特別優化。

  2. Cardinal 支持 x86 和 ARM 硬件平臺,同時也可以輕鬆添加其他平臺。

其中,對於 x 86 平臺,Cardinal 內核使用 AVX-512 的F、CD、VL、BW、DQ、VPOPCNTDQ、VBMI、VBMI2、VNNI、BF16 和 FP16 擴展。此外,我們還在探索使用新的 AMX 指令集。對於 ARM 平臺,Cardinal 內核支持 NEON 和 SVE 指令集。

  1. 確保 Cardinal 爲計算內核獲取最優的代碼。

爲了實現這一點,我們不僅依賴現代 C++ 編譯器,還使用專用工具,如 Linux perf 來分析熱點和 CPU 指標;同時使用機器代碼分析工具,如 GodBolt Compiler Explorer 和 uiCA,以確保最佳使用硬件“資源”,如 RAM/緩存訪問次數、使用的CPU指令、寄存器、計算端口。此外,還使用迭代方法,交錯進行設計、性能測試、性能分析和彙編代碼分析階段。

  1. 優化後的計算內核可能比一個簡單但未優化的內核速度提升 2-3 倍,這可能進一步轉化爲 2 倍的 QPS 值,又或是在雲主機機器上降低 20% 的內存要求。

AutoIndex:搜索策略選擇

向量搜索是一個涉及許多獨立組件的複雜過程,包括量化、索引構建、搜索算法、數據結構等。每個組件都有大量可調參數,它們共同形成了高度多樣化的向量搜索策略範圍,不同的數據集和場景需要不同的搜索策略。

爲了更好地挖掘性能改進的潛力,Cardinal 除了支持每個組件中的多種策略外,還實現了一套基於 AI 的動態策略選擇機制,稱爲 AUTOINDEX。它根據給定數據集的分佈、提供的查詢和硬件配置自適應選擇最合適的策略,可以滿足用戶對搜索質量的需求的同時實現最佳性能。

04.Cardinal 性能測試

我們測試環境中採用了 ANN-benchmarks(https://github.com/erikbern/ann-benchmarks)。ANN benchmarks 是一個標準的性能測試工具,用於評估 ANNS 實現,並在使用不同距離度量的幾個標準數據集上運行。每次性能評估都限定在單線程的 docker 容器內進行;指標基於多次評估迭代,並使用了大量單一查詢請求;每個評估框架的結果彙總成一個“召回率 vs QPS”帕累託邊界(Pareto frontier)。

所有測試都在與 ann-benchmarks 相同的機器類型上進行,即 Amazon EC2 r6i.16xlarge(https://aws.amazon.com/cn/ec2/instance-types/r6i/) 機器,配置如下:

  • CPU: Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz

  • CPU core: 32 核

  • 禁用超線程

  • RAM: 512 GB

  • 操作系統: Ubuntu 22.04.3 LTS , Linux 內核 6.2.0-1017-aws;未啓用 huge page;測試使用--parallelism=31選項運行;使用 clang 17.0.6 compiler 編譯 Cardinal。

下面呈現的性能測試結果僅針對 Cardinal 引擎,不包括 Zilliz Cloud 提供的其他非索引優化(包含 Zilliz Cloud 特定優化的結果可在文章開頭獲取)。

以下圖表是通過 ANN-benchmark GitHub 頁面上呈現的圖表結果,並添加一個 Cardinal 曲線而生成的:

在所有性能測試中,Cardinal 的表現都十分出色。當然,我們未來還會面臨更多挑戰,例如要處理用戶不同的需求、更大的數據集等,Cardinal 也需進一步成長,請大家拭目以待。

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