IVF_RABITQCompatible with Milvus 2.6.x

IVF_RABITQ索引是一種基於二進位量化的索引演算法,可將 FP32 向量量化為二進位表示。此索引提供卓越的儲存效率,其壓縮率為 1 比 32,同時保持相對良好的召回率。它支援可選的精煉功能,以額外的儲存空間為代價,達到更高的召回率,因此在記憶體受限的情況下,它是IVF_SQ8IVF_FLAT的多功能替代品。

概述

IVF_RABITQInverted File with RaBitQ quantization 的縮寫,結合了兩種強大的技術,以達到有效率的向量搜尋與儲存。

IVF

Inverted File (IVF)使用k-means 聚類將向量空間組織成可管理的區域。每個簇由一個中心點代表,作為該簇內向量的參考點。這種聚類方法允許演算法在查詢處理過程中只專注於最相關的聚類,從而縮小了搜尋空間。

要瞭解有關 IVF 技術細節的更多資訊,請參閱IVF_FLAT

RaBitQ

RaBitQ是一種具有理論保證的最先進的二進位量化方法,在高健陽和龍成的研究論文「RaBitQ: Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search」中提出。

RaBitQ 引入了多個創新概念:

角度資訊編碼:與傳統的空間編碼不同,RaBitQ 透過向量規範化來編碼角度資訊。在 IVF_RABITQ 中,資料向量會針對其最接近的 IVF 中心點進行規範化,以提高量化過程的精確度。

理論基礎:核心距離近似公式為

orqr2orco2+qrco22C(or,co)o~,qrco+C1(or,co)\lVert \mathbf{o_r} - \mathbf{q_r} \rVert^2 \approx \lVert \mathbf{o_r} - \mathbf{c_o} \rVert^2 + \lVert \mathbf{q_r} - \mathbf{c_o} \rVert^2 - 2 \cdot C(\mathbf{o_r}, \mathbf{c_o}) \cdot \langle \tilde{\mathbf{o}}, \mathbf{q_r} - \mathbf{c_o} \rangle + C_1(\mathbf{o_r}, \mathbf{c_o})

其中:

  • or\mathbf{o_r}o是資料集中的資料向量
  • qr\mathbf{q_r}q是查詢向量
  • co\mathbf{c_o}c or\mathbf{o_r}o的最近 IVF 中心向量
  • C(or,co)C(\mathbf{o_r}, \mathbf{c_o})C, ) 和C1(or,co)C_1(\mathbf{o_r}, \mathbf{c_o})C , )是預先計算的常量。
  • o~\tilde\{mathbf{o}}
  • ⟨o~,qr-co⟩\langle\tilde{\mathbf{o}}, \mathbf{q_r} - \mathbf{c_o}\rangle oq代表點-積運算。

計算效率o~\tilde{\mathbf{o}} AVX-512 VPOPCNTDQ 指令的現代 CPU 架構。

演算法強化:RaBitQ 可有效整合FastScan 方法隨機旋轉等既有技術,以提升效能。

IVF + RaBitQ

IVF_RABITQ索引結合了 IVF 的高效聚類與 RaBitQ 先進的二進位量化:

  1. 粗過濾(Coarse Filtering):IVF 將向量空間劃分為叢集,透過集中於最相關的叢集區域,大幅縮小搜尋範圍。

  2. 二進位量化:在每個簇內,RaBitQ 將向量壓縮成二元表示法,同時透過理論保證保留基本的距離關係。

  3. 可選精煉:啟用時,索引會使用更高精度的格式 (SQ6、SQ8、FP16、BF16 或 FP32) 儲存額外的精煉資料,以增加儲存空間的代價來提高召回率。

Milvus 使用下列 FAISS 工廠字串實作 IVF_RABITQ:

  • 有精煉:"RR({dim}),IVF{nlist},RaBitQ,Refine({refine_index})"
  • 無精煉"RR({dim}),IVF{nlist},RaBitQ"

建立索引

要在 Milvus 中的向量場上建立IVF_RABITQ 索引,請使用add_index() 方法,指定index_type,metric_type, 以及索引的附加參數。

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
    field_name="your_vector_field_name", # Name of the vector field to be indexed
    index_type="IVF_RABITQ", # Type of the index to create
    index_name="vector_index", # Name of the index to create
    metric_type="L2", # Metric type used to measure similarity
    params={
        "nlist": 1024, # Number of clusters for the index
        "refine": True, # Enable refinement for higher recall
        "refine_type": "SQ8" # Refinement data format
    } # Index building params
)

在此設定中

  • index_type:要建立的索引類型。在本範例中,設定值為IVF_RABITQ

  • metric_type:用來計算向量間距離的方法。支援的值包括COSINE,L2, 和IP 。如需詳細資訊,請參閱公制類型

  • params:建立索引的附加設定選項。詳情請參閱索引建立參數

索引參數配置完成後,您可以直接使用create_index() 方法或在create_collection 方法中傳入索引參數來建立索引。如需詳細資訊,請參閱建立集合

在索引上搜尋

索引建立且實體插入後,您就可以在索引上執行相似性搜尋。

search_params = {
    "params": {
        "nprobe": 128, # Number of clusters to search
        "rbq_query_bits": 0, # Query vector quantization bits
        "refine_k": 1 # Refinement magnification factor
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field", # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
    limit=3, # TopK results to return
    search_params=search_params
)

在此配置中

IVF_RABITQ 索引嚴重依賴popcount 硬體指令以獲得最佳效能。現代的 CPU 架構,如 Intel IceLake+ 或 AMD Zen 4+ 搭配AVX512VPOPCNTDQ 指令集,可大幅改善 RaBitQ 作業的效能。

索引參數

本節概述用於建立索引和在索引上執行搜尋的參數。

索引建立參數

下表列出了建立索引時可在params 中設定的參數。

參數

說明

值範圍

調整建議

IVF

nlist

在建立索引時使用 k-means 演算法建立的叢集數目。每個簇由中心點代表,儲存向量清單。增加此參數可減少每個叢集中的向量數量,建立更小、更集中的分割。

類型:整數
範圍:[1, 65536]
預設值128

較大的nlist 值會透過建立更精細的叢集來改善召回率,但會增加索引建立時間。根據資料集大小和可用資源進行最佳化。在大多數情況下,我們建議您設定此範圍內的值:[32, 4096].

RaBitQ

refine

啟用精煉程序並儲存精煉資料。

類型:布林
範圍:[true,false]
預設值false

如果需要 0.9+ 的召回率,請設定為true 。啟用精煉可提高精確度,但會增加儲存需求和索引建立時間。

refine_type

定義refine 啟用時精煉所使用的資料表示法。

類型:字串
範圍:[SQ6,SQ8,FP16,BF16,FP32]
預設值:無

列出的值依召回率增加、QPS 減少、儲存大小增加的順序顯示。SQ8 建議作為起點,在精確度與資源使用之間提供良好的平衡。

特定於索引的搜尋參數

下表列出在索引上搜尋時,可在search_params.params 中設定的參數。

參數

說明

值範圍

調整建議

IVF

nprobe

搜尋候選人的叢集數量。較高的值允許搜尋更多的叢集,藉由擴大搜尋範圍來改善召回率,但代價是增加查詢延遲。

類型:整數
範圍:[1,nlist]
預設值8

增加此值可提高召回率,但可能會減慢搜尋速度。設定nprobenlist 成比例,以平衡速度與精確度。在大多數情況下,我們建議您設定此範圍內的值:[1,nlist]。

RaBitQ

rbq_query_bits

設定是否應用查詢向量的額外標量量化。如果設定為0 ,則採用不量化的查詢方式。如果設定為 [1, 8] 以內的值,查詢會使用 n 位元標量化預先處理。

類型:整數
範圍:[0, 8]
預設值0

0 預設值提供最大的召回率,但效能最慢。我們建議測試值0,8, 和6, 因為它們提供相似的召回率,其中6 的召回率最快。若召回率要求較高,請使用較小的值。

refine_k

精煉程序使用更高的量化品質,從refine_k 倍大的候選者池中挑選所需數量的最近鄰居,這些候選者是使用 IVF_RABITQ 挑選出來的。

類型:浮點數
範圍:[1,float_max)
預設值1

refine_k 值越高,QPS 越低,但召回率越高。從1 開始,然後測試2,3,4, 和5 的值,為您的資料集找出 QPS 和召回率之間的最佳權衡。

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?