GPUインデックス
Milvusは様々なGPUインデックスタイプをサポートし、特に高スループット、高リコールシナリオにおいて検索性能と効率を加速します。このトピックでは、MilvusがサポートするGPUインデックスタイプの概要、適した使用例、および性能特性について説明します。GPUを使用したインデックス構築については、GPUを使用したインデックスを参照してください。
GPUインデックスを使用すると、CPUインデックスを使用した場合と比較して、必ずしもレイテンシが減少するとは限らないことに注意することが重要です。スループットを完全に最大化したいのであれば、極めて高いリクエスト・プレッシャーか、大量のクエリ・ベクターが必要になります。
パフォーマンス
MilvusのGPUサポートはNvidiaRAPIDSチームによって提供されています。以下は現在MilvusがサポートしているGPUインデックスタイプです。
GPU_CAGRA
GPU_CAGRAはGPU用に最適化されたグラフベースのインデックスです。Milvus GPUバージョンを実行するために推論グレードのGPUを使用することは、高価なトレーニンググレードのGPUを使用することと比較して、費用対効果が高くなります。
インデックス構築パラメータ
パラメータ 説明 デフォルト値 intermediate_graph_degree
プルーニングの前にグラフの次数を決定することで、リコールと構築時間に影響する。推奨値は 32
または64
。128
graph_degree
プルーニング後のグラフの次数を設定することで、検索パフォーマンスと想起に影響する。この2つの次数の差が大きいほど、構築時間が長くなる。この値は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 (limit) 値に等しくなければならず、通常は 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
(積量子化)は、元の高次元ベクトル空間を の低次元ベクトル空間のデカルト積に一様に分解し、分解された低次元ベクトル空間を量子化します。積量子化により、対象ベクトルと全ユニットの中心との距離を計算する代わりに、対象ベクトルと各低次元空間のクラスタリング中心との距離を計算することが可能となり、アルゴリズムの時間的複雑性と空間的複雑性を大幅に削減することができる。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
[オプション] 各低次元ベクトルが格納されるビット数。 [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: 圧縮パラメータの設定に依存しますが、より小さなメモリフットプリントを使用します。