HNSW_SQ

HNSW_SQ結合了 Hierarchical Navigable Small World (HNSW) 圖形與 Scalar Quantization (SQ),創造了一種先進的向量索引方法,提供可控制的大小與精確度權衡。與標準HNSW 相比,此索引類型在索引建置時間略有增加的同時,仍能維持較高的查詢處理速度。

概觀

HNSW_SQ 結合了兩種索引技術:HNSW用於基於圖表的快速導覽,而SQ則用於有效率的向量壓縮。

HNSW

HNSW 會建構一個多層圖表,其中每個節點對應資料集中的向量。在這個圖形中,節點是根據其相似性連接起來的,因此可以快速遍歷資料空間。層級結構可讓搜尋演算法縮小候選鄰近點的範圍,大幅加速高維空間的搜尋過程。

如需詳細資訊,請參閱HNSW

SQ

SQ 是一種壓縮向量的方法,用較少的位元來表示向量。舉例來說:

  • SQ8使用 8 位元,將值映射成 256 層。 如需詳細資訊,請參閱IVF_SQ8

  • SQ6使用 6 位元來表示每個浮點值,因此有 64 個離散的層級。

Hnsw Sq Hnsw Sq

這種精確度的降低大幅減少了記憶體佔用量,並加快了計算速度,同時保留了資料的基本結構。

SQ4UCompatible with Milvus 2.6.8+

針對要求極高查詢速度和最小記憶體使用量的情況,Milvus 推出SQ4U, 4 位元統一標量量化。這是一種進取的標量量化形式,可將每個維度的浮點值壓縮為4 位元無符號整數。

SQ4U 中的 "U" 代表 Uniform。非統一標量量化通常會獨立計算每個維度的最小值和最大值(Per-Dimension Quantization),與此不同,SQ4U 強制執行全局統一量化策略:

  1. 全局統計:系統計算單一最小值vmin單一值範圍vdiff ,適用於向量的所有維度(或整個向量段)。

  2. 統一映射:全域值範圍分為 16 個相等的區間。向量中的每個浮點值,不論其屬於哪個維度,都會使用這些共用參數映射為 4 位元整數 (0-15)。

效能優勢:

  • 8 倍壓縮比:FP32 相比,可縮小 8 倍,與SQ8 相比,可縮小 2 倍,大幅降低記憶體頻寬壓力 - 這通常是向量搜尋的瓶頸。

  • SIMD 最佳化:精簡的結構允許現代 CPU (AVX2/AVX-512) 在每個週期處理更多維度。最重要的是,全局參數的使用消除了在計算距離期間載入不同標度/偏移值的需要,使指令流水線保持完全飽和。

  • 快取記憶體效率:較小的向量尺寸意味著 CPU 快取記憶體可容納更多資料,減少存取記憶體所造成的延遲。

由於全局參數共享,SQ4U 在規範化資料或各維值分佈一致的資料集上表現最佳。

HNSW + SQ

HNSW_SQ 結合了 HNSW 和 SQ 的優點,以實現高效的近似近鄰搜尋。以下是這個過程的運作方式:

  1. 資料壓縮:SQ 會使用sq_type (例如 SQ6 或 SQ8) 來壓縮向量,以減少記憶體使用量。這種壓縮可能會降低精確度,但卻能讓系統處理更大的資料集。

  2. 圖形建構:壓縮向量用於建立 HNSW 圖形。由於資料已壓縮,因此產生的圖形較小,搜尋速度也較快。

  3. 候選檢索:當提供查詢向量時,演算法會使用壓縮資料,從 HNSW 圖中快速找出候選鄰居。

  4. (可選)結果精進:初始候選結果可以根據下列參數進行精煉,以獲得更高的精確度:

    • refine:控制是否啟動此精煉步驟。當設定為true 時,系統會使用更高精度或未壓縮的表示來重新計算距離。

    • refine_type:指定精煉過程中使用的資料精確度等級(例如 SQ6、SQ8、BF16)。更高精度的選擇,例如FP32 ,可以產生更精確的結果,但需要更多的記憶體。這必須比原始壓縮資料集的精確度高出sq_type

    • refine_k:作為放大係數。舉例來說,如果您的 topk是 100,而refine_k 是 2,系統會重新排序前 200 名候選人,並傳回最佳的 100 名,以提高整體精確度。

如需參數及有效值的完整清單,請參閱索引參數

建立索引

要在 Milvus 的向量場上建立HNSW_SQ 索引,請使用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="HNSW_SQ", # 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={
        "M": 64, # Maximum number of neighbors each node can connect to in the graph
        "efConstruction": 100, # Number of candidate neighbors considered for connection during index construction
        "sq_type": "SQ6", # Scalar quantizer type
        "refine": true, # Whether to enable the refinement step
        "refine_type": "SQ8" # Precision level of data used for refinement
    } # Index building params
)

在此設定中

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

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

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

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

在索引上搜尋

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

search_params = {
    "params": {
        "ef": 10, # Parameter controlling query time/accuracy trade-off
        "refine_k": 1 # The 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
)

在此配置中

索引參數

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

索引建立參數

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

參數

說明

值範圍

調整建議

HNSW

M

每個節點在圖表中可擁有的最大連線(或邊緣)數量,包括傳出和傳入的邊緣。

此參數會直接影響索引建構和搜尋。

類型:整數

範圍:[2, 2048]

預設值30 (每個節點最多 30 條出邊和 30 條入邊)

較大的M 通常會帶來較高的精確度,但會增加記憶體開銷並減慢索引建立和搜尋的速度

對於高維度的資料集或高召回率非常重要時,請考慮增加M

如果記憶體佔用量和搜尋速度是主要考量,則考慮降低M

在大多數情況下,我們建議您在此範圍內設定一個值:[5, 100].

efConstruction

索引建構期間考慮連接的候選鄰居數量。

每個新元素都會評估更多的候選鄰居,但實際建立的最大連線數仍受限於M

類型:整數

範圍:[1,int_max]

預設值360

較高的efConstruction 通常會產生更精確的索引,因為會探索更多的潛在連線。不過,這也會導致建立索引的時間變長,並增加建構過程中的記憶體使用量

考慮增加efConstruction 以提高精確度,尤其是在索引時間不太重要的情況下。

在資源有限的情況下,可考慮降低efConstruction ,以加快索引建置速度。

在大多數情況下,我們建議您設定此範圍內的值:[50, 500].

SQ

sq_type

指定壓縮向量的標量量化方法。每個選項都在壓縮和精確度之間提供不同的平衡:

  • SQ4U:使用 4 位元統一量化來編碼向量。此模式提供最高的速度和壓縮率。

  • SQ6:使用 6 位元整數編碼向量。

  • SQ8:使用 8 位整數編碼向量。

  • BF16:使用 Bfloat16 格式。

  • FP16:使用標準 16 位元浮點格式。

類型:字串

範圍:[SQ4U,SQ6,SQ8,BF16,FP16 ]

預設值SQ8

sq_type 的選擇取決於特定應用程式的需求。選擇SQ4U 是為了獲得最高的速度和記憶體效率。SQ6SQ8 也許適合用於平衡效能。另一方面,如果精確度是最重要的,BF16FP16 可能是首選。

refine

一個布林標誌,用來控制是否在搜尋過程中應用精煉步驟。精煉包括透過計算查詢向量與候選項之間的精確距離,重新排列初始結果。

類型:布林

範圍:[true,false]

預設值false

如果高準確度是必要的,而且您可以容忍稍慢的搜尋時間,請設定為true 。如果速度是優先考量,且可以接受精確度的輕微折衷,則使用false

refine_type

決定用於精煉的資料精確度。

此精確度必須高於壓縮向量的精確度 (由sq_type 設定),這會影響重新排序向量的精確度及其記憶體佔用量。

類型:字串

範圍:[SQ6,SQ8,BF16,FP16,FP32 ]。

預設值:無

使用FP32 可在較高記憶體成本下獲得最高精確度,使用SQ6/SQ8 則可獲得更好的壓縮效果。BF16FP16 提供了一個平衡的替代方案。

特定於索引的搜尋參數

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

參數

說明

值範圍

調整建議

HNSW

ef

控制最近鄰檢索時的搜尋範圍。它決定要造訪多少節點,並將其評估為潛在最近鄰居。

此參數只會影響搜尋過程,並只適用於圖形的底層。

類型:整數

範圍:[1、int_max]

預設值:limit(要回傳的 TopK 最近鄰居)

較大的ef 通常會導致較高的搜尋準確度,因為會考慮更多的潛在鄰居。不過,這也會增加搜尋時間

當達到高召回率是關鍵,而搜尋速度較不重要時,請考慮增加ef

考慮降低ef 以優先加快搜尋速度,尤其是在可以接受稍微降低精確度的情況下。

在大多數情況下,我們建議您設定此範圍內的值:[K, 10K]。

SQ

refine_k

放大係數,用來控制在精細化階段中,相對於要求的前 K 個結果,有多少額外的候選人會被檢驗。

類型:浮動

範圍:[1,float_max)

預設值: 1

refine_k 的較高值可以提高召回率和精確度,但也會增加搜尋時間和資源使用。值為 1 表示精煉過程只考慮初始的前 K 個結果。

免費嘗試托管的 Milvus

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

開始使用
反饋

這個頁面有幫助嗎?