GPUによるインデックス
このガイドでは、MilvusでGPUをサポートしたインデックスを構築する手順の概要を説明します。MilvusがサポートするGPUインデックスの種類については、GPUインデックスをご参照ください。
GPUメモリ制御のためのMilvus設定の構成
MilvusはGPUメモリを割り当てるためにグローバルグラフィックメモリプールを使用します。
Milvus設定ファイルでinitMemSize
とmaxMemSize
の2つのパラメータをサポートしています。プールサイズは最初はinitMemSize
に設定され、この制限を超えると自動的にmaxMemSize
に拡張されます。
デフォルトのinitMemSize
は Milvus 起動時に利用可能な GPU メモリの 1/2 で、デフォルトのmaxMemSize
は利用可能なすべての GPU メモリと等しくなります。
Milvus 2.4.1(バージョン2.4.1を含む)までは、Milvusは統合GPUメモリプールを使用していました。2.4.1以前のバージョン(バージョン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.
Milvus2.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 インデックスパラメータを設定する際に、index_type、metric_type、params を定義します:
index_type(文字列):index_type (string): ベクトル探索を加速するために使用するインデックスのタイプ。有効なオプションはGPU_CAGRA、GPU_IVF_FLAT、GPU_IVF_PQ、GPU_BRUTE_FORCEです。
metric_type(文字列):ベクトルの類似度を測定するために使用するメトリクスのタイプ。有効なオプションはIPとL2 です。
params(dict):インデックス固有の構築パラメータ。このパラメータに有効なオプションは、インデックスの種類に依存します。
以下は、異なるインデックス・タイプの構成例です:
GPU_CAGRAインデックス
index_params = { "metric_type": "L2", "index_type": "GPU_CAGRA", "params": { 'intermediate_graph_degree': 64, 'graph_degree': 32 } }
paramsに指定できるオプションは以下の通りです:
intermediate_graph_degree(int):プルーニングの前にグラフの次数を決定することで、リコールと構築時間に影響します。推奨値は32または64。
graph_degree(int):プルーニング後のグラフ次数を設定することで、検索パフォーマンスとリコールに影響する。通常、intermediate_graph_degreeの半分である。この2つの次数の差が大きいと、構築時間が長くなる。この値はintermediate_graph_degree の値より小さくなければならない。
build_algo(文字列):プルーニング前のグラフ生成アルゴリズムを選択する。可能なオプション:
IVF_PQ: 高品質を提供するが、構築時間がかかる。
NN_DESCENT:リコールが低くなる可能性があるが、短時間で構築できる。
cache_dataset_on_device(string,"true"|"false"):オリジナルデータセットをGPUメモリにキャッシュするかどうかを決定する。これを"true "に設定すると、検索結果が洗練されることでリコールが向上し、"false "に設定するとGPUメモリが節約されます。
GPU_IVF_FLATまたはGPU_IVF_PQインデックス
index_params = { "metric_type": "L2", "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ "params": { "nlist": 1024 } }
GPU_BRUTE_FORCEインデックス
index_params = { 'index_type': 'GPU_BRUTE_FORCE', 'metric_type': 'L2', 'params': {} }
追加のparams設定は必要ありません。
インデックスの構築
index_params でインデックスパラメータを設定した後、インデックスを構築するために create_index()
メソッドを呼び出してインデックスを構築します。
# Get an existing collection
collection = Collection("YOUR_COLLECTION_NAME")
collection.create_index(
field_name="vector", # Name of the vector field on which an index is built
index_params=index_params
)
検索
GPUインデックスを構築したら、次は検索を行う前に検索パラメータを準備します。
検索パラメータの準備
以下は、さまざまなインデックスタイプの構成例です:
GPU_BRUTE_FORCEインデックス
search_params = { "metric_type": "L2", "params": {} }
追加のパラメータ設定は必要ありません。
GPU_CAGRAインデックス
search_params = { "metric_type": "L2", "params": { "itopk_size": 128, "search_width": 4, "min_iterations": 0, "max_iterations": 0, "team_size": 0 } }
主な検索パラメータは以下の通り:
itopk_size:検索中に保持される中間結果のサイズを決定します。この値を大きくすると、検索パフォーマンスを犠牲にして再現率が向上する可能性があります。少なくとも最終的なtop-k(限界)値と等しくなければならず、通常は2のべき乗(例:16、32、64、128)である。
search_width: 検索中に CAGRA グラフに入る点の数を指定する。この値を大きくすると想起率が向上するが、検索パフォーマンスに影響する可能性がある。
min_iterations/max_iterations:これらのパラメータは検索の反復処理を制御する。デフォルトでは0 に設定されており、CAGRA はitopk_sizeとsearch_width に基づいて自動的に反復回数を決定する。これらの値を手動で調整することで、性能と精度のバランスをとることができます。
team_size:GPU上のメトリック距離計算に使用するCUDAスレッド数を指定します。一般的な値は2のべき乗から32までです(例:2、4、8、16、32)。これは検索性能に軽微な影響を与えます。デフォルト値は0で、milvusはベクトル次元に基づいて自動的にteam_sizeを選択します。
GPU_IVF_FLATまたはGPU_IVF_PQインデックス
search_params = { "metric_type": "L2", "params": {"nprobe": 10} }
これら2つのインデックス・タイプの検索パラメータは、IVF_FLATおよびIVF_PQで使用されるものと似ています。詳細については、ベクトル類似検索の実施を参照してください。
検索の実行
を使用します。 search()
メソッドを使用して、GPU インデックスのベクトル類似性検索を実行します。
# Load data into memory
collection.load()
collection.search(
data=[[query_vector]], # Your query vector
anns_field="vector", # Name of the vector field
param=search_params,
limit=100 # Number of the results to return
)
制限
GPU インデックスを使用する場合、特定の制約に注意してください:
GPU_IVF_FLAT の場合、limitの最大値は 1024 です。
GPU_IVF_PQとGPU_CAGRA の場合、limitの最大値は 1024 です。
GPU_BRUTE_FORCE にはlimitの上限は設定されていませんが、潜在的なパ フォーマンスの問題を避けるために 4096 を超えないことが推奨されます。
現在、GPUインデックスはCOSINE距離をサポートしていません。COSINE 距離が必要な場合は、まずデータを正規化し、それから内積 (IP) 距離で代用することができます。
GPUインデックスに対するOOM保護のロードは完全にはサポートされていません。
よくある質問
GPUインデックスはどのような場合に利用するのが適切ですか?
GPUインデックスは、高スループットや高リコールが要求される状況で特に有益です。例えば、大きなバッチを扱う場合、GPUインデックスのスループットはCPUインデックスのそれを100倍も上回ることができます。より小さなバッチを扱うシナリオでは、GPUインデックスが性能の点でCPUインデックスを大きく上回ることに変わりはありません。さらに、迅速なデータ挿入が必要な場合、GPUを組み込むことで、インデックスの構築プロセスを大幅にスピードアップすることができます。
CAGRA、GPU_IVF_PQ、GPU_IVF_FLAT、GPU_BRUTE_FORCE などの GPU インデックスは、どのようなシナリオに最適ですか?
CAGRA インデックスは、より多くのメモリを消費する代償はあるものの、より高いパフォーマンスを要求するシナリオに最適です。メモリの節約が優先される環境では、GPU_IVF_PQインデックスはストレージ要件を最小化するのに役立ちますが、これは精度の高い損失を伴います。GPU_IVF_FLATインデックスはバランスの取れたオプションとして機能し、性能とメモリ使用量の妥協点を提供します。最後に、GPU_BRUTE_FORCEインデックスは、網羅的検索操作のために設計されており、トラバーサル検索を実行することで、1の再現率を保証します。