GPU 索引
Milvus 支援多種 GPU 索引類型,以加速搜尋效能與效率,尤其是在高吞吐量與高回撥的情況下。本主題概述 Milvus 支援的 GPU 索引類型、適合的使用案例以及效能特性。有關使用 GPU 建立索引的資訊,請參閱Index with GPU。
值得注意的是,與使用 CPU 索引相比,使用 GPU 索引不一定會減少延遲。如果您想要完全發揮吞吐量的最大效益,您需要極高的請求壓力或大量的查詢向量。
效能
Milvus 的 GPU 支援由 NvidiaRAPIDS團隊貢獻。以下是 Milvus 目前支援的 GPU 索引類型。
GPU_CAGRA
GPU_CAGRA 是針對 GPU 最佳化的圖形索引,相較於使用昂貴的訓練級 GPU,使用推理級 GPU 來執行 Milvus GPU 版本可以更符合成本效益。
索引建立參數
參數 說明 預設值 intermediate_graph_degree
影響召回率和建立時間,方法是在剪枝之前先決定圖表的度。建議值為 32
或64
。128
graph_degree
影響搜尋效能和召回率,方法是在剪枝後設定圖表的度。這兩個程度之間的差異越大,建立時間越長。其值必須小於intermediate_graph_degree 的值。 64
build_algo
選擇剪枝前的圖形生成演算法。可能的值: IVF_PQ
:提供更高的品質,但建立時間較慢。NN_DESCENT
: 提供更快的建立速度,但召回率可能較低。IVF_PQ
cache_dataset_on_device
決定是否在 GPU 記憶體中快取原始資料集。可能的值: “true”
:快取原始資料集,藉由精煉搜尋結果來提高召回率。“false”
:不快取原始資料集以節省 GPU 記憶體。“false”
adapt_for_cpu
決定是否使用 GPU 建立索引,並使用 CPU 進行搜尋。
將此參數設定為true
需要在搜尋請求中有ef
參數。“false”
搜尋參數
參數 說明 預設值 itopk_size
決定搜尋期間保留的中間結果大小。較大的值可能會提高召回率,但會犧牲搜尋效能。它應該至少等於最終 top-k (限制) 值,而且通常是 2 的幂次 (例如 16、32、64、128)。 空 search_width
指定搜尋期間進入 CAGRA 圖形的入口點數量。增加此值可提高召回率,但可能會影響搜尋效能(例如:1、2、4、8、16、32)。 空 min_iterations
/max_iterations
控制搜尋的迭代過程。預設值為 0
,CAGRA 會根據itopk_size
和search_width
自動決定迭代次數。手動調整這些值有助於平衡效能與精確度。0
team_size
指定用於計算 GPU 公制距離的 CUDA 線程數。常見的值是 2 的幂次,最高為 32 (例如 2、4、8、16、32)。它對搜尋效能影響不大。預設值是 0
,Milvus 會根據向量維度自動選擇team_size
。0
ef
指定查詢時間/精確度的權衡。 ef
值越高,搜尋準確度越高,但搜尋速度越慢。
如果您在建立索引時將adapt_for_cpu
設定為true
,則必須使用此參數。[top_k, int_max]
搜尋限制
參數 範圍 limit
(top-K)<= 1024 limit
(top-K)<=max(( itopk_size
+ 31)// 32,search_width
)* 32
GPU_IVF_FLAT
與IVF_FLAT 相似,GPU_IVF_FLAT 也會將向量資料分割成nlist
叢集單位,然後比較目標輸入向量與每個叢集中心的距離。根據系統設定查詢的叢集數量 (nprobe
),類似性搜尋結果只會根據目標輸入與最相似叢集中向量的比較結果傳回 - 大幅縮短查詢時間。
透過調整nprobe
,可以在特定情況下找到精確度與速度之間的理想平衡。IVF_FLAT 效能測試的結果顯示,當目標輸入向量的數量 (nq
) 和要搜尋的叢集數量 (nprobe
) 增加時,查詢時間也會大幅增加。
GPU_IVF_FLAT 是最基本的 IVF 索引,每個單元儲存的編碼資料與原始資料一致。
在進行搜尋時,請注意您可以針對 GPU_IVF_FLAT 索引的資料集,將任何搜尋的 top-K 設定為最高 256。
索引建立參數
參數 說明 範圍 預設值 nlist
群組單位數量 [1, 65536] 128
cache_dataset_on_device
決定是否在 GPU 記憶體中快取原始資料集。可能的值: “true”
:快取原始資料集,藉由精煉搜尋結果來提高召回率。“false”
: 不快取原始資料集,以節省 GPU 記憶體。"true"
"flase"
"false"
搜尋參數
一般搜尋
參數 說明 範圍 預設值 nprobe
要查詢的單位數量 [1, nlist] 8
搜尋限制
參數 範圍 limit
(top-K)<= 2048
GPU_IVF_PQ
PQ
(Product Quantization) 將原始的高維向量空間均勻地分解為 低維向量空間的笛卡兒乘積,然後將分解後的低維向量空間進行量化。乘積量化不需要計算目標向量與所有單元中心的距離,可以計算目標向量與每個低維空間的聚類中心的距離,大大降低了演算法的時間複雜度和空間複雜度。m
IVF_PQ 在量化向量的乘積之前先執行 IVF 索引聚類。其索引檔案比 IVF_SQ8 更小,但在搜尋向量時也會造成精確度的損失。
索引建立參數和搜尋參數因 Milvus 分佈而異。請先選擇您的 Milvus 分佈。
進行搜尋時,請注意您可以針對 GPU_IVF_FLAT 索引集合的任何搜尋,將 top-K 設定為最高 8192。
索引建立參數
參數 說明 範圍 預設值 nlist
群組單位數量 [1, 65536] 128
m
乘積量化的因子數、 dim mod m or = 0
0
nbits
[Optional] 每個低維向量儲存的位元數。 [1, 16] 8
cache_dataset_on_device
決定是否在 GPU 記憶體中快取原始資料集。可能的值: “true”
:快取原始資料集,藉由精煉搜尋結果來提高召回率。“false”
: 不快取原始資料集,以節省 GPU 記憶體。"true"
"false"
"false"
搜尋參數
一般搜尋
參數 說明 範圍 預設值 nprobe
要查詢的單位數量 [1, nlist] 8
搜尋限制
參數 範圍 limit
(top-K)<= 1024
GPU_BRUTE_FORCE
GPU_BRUTE_FORCE 適用於對召回率要求極高的情況,透過將每個查詢與資料集中的所有向量進行比較,保證召回率為 1。它只需要度量類型 (metric_type
) 和 top-k (limit
) 作為索引建立和搜尋參數。
對於 GPU_BRUTE_FORCE,不需要額外的索引建立參數或搜尋參數。
結論
目前,Milvus 會將所有索引載入 GPU 記憶體,以進行有效率的搜尋作業。可載入的資料量取決於 GPU 記憶體的大小:
- GPU_CAGRA:記憶體使用量約為原始向量資料的 1.8 倍。
- GPU_IVF_FLAT和GPU_BRUTE_FORCE:需要相等於原始資料大小的記憶體。
- GPU_IVF_PQ: 使用較小的記憶體佔用量,這取決於壓縮參數的設定。