GPU 索引概述

在 Milvus 中建立支援 GPU 的索引,可以大幅提升高吞吐量和高召回情境下的搜尋效能。

下圖比較了不同索引配置、硬體設定、向量資料集(Cohere 和 OpenAI)和搜尋批次大小的查詢吞吐量(每秒查詢次),顯示GPU_CAGRA 的表現持續優於其他方法。

Gpu Index Performance GPU 索引效能

為 Milvus 設定 GPU 記憶池

Milvus 支援全域 GPU 記憶體池並在Milvus 配置檔中提供兩個配置參數initMemSizemaxMemSize

gpu:
  initMemSize: 0 # set the initial memory pool size.
  maxMemSize: 0 # sets the maximum memory usage limit. When the memory usage exceeds initMemSize, Milvus will attempt to expand the memory pool.

當 Milvus 啟動時,預設的initMemSize 通常是一半的 GPU 記憶體,而maxMemSize 則預設為整個 GPU 記憶體。GPU 記憶池大小初始設定為initMemSize ,並會視需要自動擴充至maxMemSize

當指定啟用 GPU 的索引時,Milvus 會在搜尋之前將目標集合資料載入 GPU 記憶體,因此maxMemSize 必須至少是資料大小。

限制

  • 對於GPU_IVF_FLAT,limit 的最大值是 1,024 。

  • 對於GPU_IVF_PQGPU_CAGRAlimit 的最大值為 1,024。

  • 雖然limit 沒有設定GPU_BRUTE_FORCE ,但建議不要超過 4,096 以避免潛在的效能問題。

  • 目前,GPU 索引不支援COSINE 距離。如果需要COSINE 距離,應先將資料規格化,然後再使用內積 (IP) 距離作為替代。

  • 不完全支援 GPU 索引的載入 OOM 保護,太多資料可能會導致 QueryNode 當機。

  • GPU 索引不支援範圍搜尋及群組搜尋等搜尋功能。

支援的 GPU 索引類型

下表列出 Milvus 支援的 GPU 索引類型。

索引類型

說明

記憶體使用量

GPU_CAGRA

GPU_CAGRA 是針對 GPU 最佳化的圖形索引,使用推理等級的 GPU 來執行 Milvus GPU 版本比使用昂貴的訓練等級 GPU 更具成本效益。

記憶體使用量約為原始向量資料的 1.8 倍。

GPU_IVF_FLAT

GPU_IVF_FLAT 是最基本的 IVF 索引,每個單元儲存的編碼資料與原始資料一致。在進行搜尋時,請注意您可以針對 GPU_IVF_FLAT 索引的資料集,將任何搜尋的 top-k (limit) 設定為最高 256。

需要相等於原始資料大小的記憶體。

GPU_IVF_PQ

GPU_IVF_PQ 會在量化向量的乘積之前執行 IVF 索引聚類。進行搜尋時,請注意您可以針對 GPU_IVF_FLAT 索引集合的任何搜尋,將 top-k (limit) 設定為最多 8,192 個。

利用較小的記憶體佔用空間,這取決於壓縮參數的設定。

GPU_BRUTE_FORCE

GPU_BRUTE_FORCE 專為需要極高召回率的情況量身打造,透過將每個查詢與資料集中的所有向量進行比較,保證召回率為 1。它只需要度量類型 (metric_type) 和 top-k (limit) 作為索引建立和搜尋參數。

需要與原始資料大小相等的記憶體。

為 GPU 記憶體控制配置 Milvus 設定

Milvus 使用全局圖形記憶體池來分配 GPU 記憶體。它在Milvus 配置檔中支援兩個參數initMemSizemaxMemSize 。記憶體池大 小初始設定為initMemSize ,超過此限制後會自動擴充至maxMemSize

當 Milvus 啟動時,預設的initMemSize 是可用 GPU 記憶體的 1/2,而預設的maxMemSize 是等於所有可用的 GPU 記憶體。

在 Milvus 2.4.1 之前,Milvus 使用統一的 GPU 記憶池。對於 2.4.1 之前的版本,建議將這兩個值都設定為 0。

gpu:
  initMemSize: 0 #set the initial memory pool size.
  maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 

從 Milvus 2.4.1 起,GPU 記憶體池僅在搜尋時用於臨時 GPU 資料。因此,建議將其設定為 2048 和 4096。

gpu:
  initMemSize: 2048 #set the initial memory pool size.
  maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 

要瞭解如何建立 GPU 索引,請參閱各索引類型的特定指南。

常見問題

  • 何時適合使用 GPU 索引?

    GPU 索引特別適用於需要高吞吐量或高召回率的情況。例如,在處理大量批次時,GPU 索引的吞吐量可比 CPU 索引高出 100 倍之多。在批次較小的情況下,GPU 索引在效能上仍遠遠優於 CPU 索引。此外,如果需要快速插入資料,整合 GPU 可大幅加快建立索引的過程。

  • GPU 索引(如 GPU_CAGRA、GPU_IVF_PQ、GPU_IVF_FLAT 和 GPU_BRUTE_FORCE)最適合哪些應用場景?

    GPU_CAGRA indexes are ideal for scenarios that demand enhanced performance, albeit at the cost of consuming more memory.對於以節省記憶體為優先考量的環境,GPU_IVF_PQ 索引可幫助將儲存需求降至最低,儘管這會帶來較高的精確度損失。GPU_IVF_FLAT 索引是一個平衡的選擇,在效能與記憶體使用量之間取得折衷。最後,GPU_BRUTE_FORCE 索引專為徹底搜尋作業而設計,透過執行遍歷搜尋,保證召回率為 1。

免費嘗試托管的 Milvus

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

開始使用
反饋

這個頁面有幫助嗎?