指令是計算機程序給計算機處理器的命令。在最低級別上,每條指令是一個 0 和 1 的序列,描述了計算機要執行的物理操做。在計算機的彙編器語言中,每條語言語句通常對應一條處理器指令。CPU 依靠指令來計算和控制系統,指令執行能力是衡量 CPU 性能的重要指標。指令集也與 CPU 效率有密切關係。ios
Advanced Vector Extensions(AVX)是 x86 架構微處理器中的指令集,由英特爾在 2008 年 3 月提出,並在 2011 年發佈的 Sandy Bridge 系列處理器中首次支持。AVX 指令集提供了新的特性、指令和編碼方案。AVX2 指令集將大多數整數命令操做擴展到 256 位,並引入了熔合乘法累積(FMA)運算。AVX-512 則使用新的 EVEX 前綴編碼將 AVX 指令進一步擴展到 512 位。git
Milvus 是一款開源的向量類似度搜索引擎,支持使用多種 AI 模型將非結構化數據向量化,併爲向量數據提供搜索服務,可普遍應用於圖像處理、機器視覺、天然語言處理、語音識別以及推薦系統。 從 0.7.0 版本開始,Milvus 新增了對 AVX-512 指令集的支持。Milvus 理論上可支持全部包含 AVX-512 指令集的 CPU。本文將介紹和分析 Milvus 不一樣索引類型在 AVX-512 和 AVX2 兩種指令上的性能表現。github
配置算法
Milvus 參數緩存
Note: nlist 是使用客戶端建立索引設置的參數,nprobe 則是進行搜索設置的參數。IVFLAT 和 SQ8 索引都是經過聚類算法把大量的向量劃分紅不少‘桶’,nlist 指的就是聚類時劃分桶的總數。經過索引查詢時,第一步先找到和目標向量最接近的若干個桶,第二步在這若干個桶裏經過比較向量距離查找出最類似的 k 條向量。nprobe 指的就是第一步若干個桶的數量。數據結構
數據集架構
本次咱們所使用的是 SIFT10M 數據集,其包含了 1000 萬條 128 維的向量,常被用於分析相應的近似最近鄰搜索方法的性能。本次咱們經過對比兩種指令集在 nq = [1, 10, 100, 500, 1000] 時的 top-1 檢索時間,對兩種指令集進行性能比對。性能
向量索引學習
向量索引是經過必定的數學模型創建在向量上的一種省時、省空間的數據結構。經過向量索引,咱們能夠高效地查詢多個與目標向量類似的向量。因爲精確檢索一般很是耗時,所以Milvus的向量索引類型大多采用 ANNS(近似最近鄰搜索)。測試
本次咱們共測試了三種索引:IVF_FLAT,IVF_SQ8 和 HNSW。下面咱們對其結果逐一進行分析。
IVF_FLAT
IVF(Inverted File)是一種基於量化的索引類型。IVF_FLAT 是最基本的 IVF 索引,每一個單元中存儲的編碼數據與原始數據一致。
IVF_SQ8
IVF_SQ8 根據 IVF 對放入單元的每一個向量進行標量量化。標量量化將原始向量的每一個維度從一個 4 字節的浮點數轉換爲一個 1 字節的無符號整數,因此 IVF_SQ8 索引文件比 IVF_FLAT 索引文件佔用的空間小得多。
HNSW
HNSW(Hierarchical Small World Graph)是一種基於圖的索引算法。從最上層開始搜索,在這一層找到最接近目標的節點,而後進入下一層開始再次搜索。通過屢次迭代,能夠快速接近目標位置。
小結
經過分析上面三種索引在兩種指令集上的性能表現,咱們能夠發現不一樣索引使用 AVX-512 指令集時的檢索速度均稍快於其在 AVX2 上的速度。這是由於相比於 AVX2 支持 256 位的計算,AVX-512 支持 512 位,在這個層面上 AVX-512 應該比 AVX2 快一倍。可是,Milvus 在搜索時除去計算還有其它的耗時,因此 AVX-512 的總體檢索時間並無高於 AVX2 一倍。
索引對比
經過觀察可得,HNSW 的檢索速度明顯快於另外兩種索引,而在兩種指令集上 IVF_SQ8 的檢索速度均稍快於 IVF_FLAT。這一現象多是由於 SQ8 的所需內存帶寬只有 IVF_FLAT 的1/4。IVF_FLAT 每一個向量維度要加載 4 個字節,而 SQ8 只加載 1 個字節。計算所需的時間極可能是受到內存帶寬的約束。所以 SQ8 不只佔用較少的空間,並且檢索速度更快。
本文測試並分析了 Milvus 不一樣索引在 AVX-512 和 AVX2 兩種指令集上的性能表現。Milvus 在使用各種索引時均表現出了極優的性能,而且在 AVX-512 指令集上獲得了進一步的提高。目前,Milvus 能夠對接各類深度學習平臺,並運用於衆多 AI 領域。在最新的 0.11.0 版本中,Milvus 新增了標量字段過濾和在查詢時指定距離計算方式兩種功能。將來 Milvus 會持續增長更多功能,助力用戶高效完成非結構化數據檢索。關於 Milvus 的更多應用場景請參考:
|歡迎加入 Milvus 社區
http://github.com/milvus-io/milvus | 源碼
http://milvus.io | 官網
http://milvusio.slack.com | Slack 社區
http://space.bilibili.com/478166626 | Bilibili