GPUインデックスの概要
MilvusでGPUをサポートしたインデックスを構築することで、高スループット、高リコールシナリオでの検索性能を大幅に向上させることができます。
以下の図は、インデックス構成、ハードウェアセットアップ、ベクトルデータセット(CohereとOpenAI)、検索バッチサイズにおけるクエリスループット(クエリ/秒)を比較したもので、GPU_CAGRA が一貫して他の方法を上回っていることを示しています。
GPUインデックス性能
MilvusのGPUメモリプールの設定
MilvusはグローバルGPUメモリプールをサポートしており、Milvus設定ファイルにinitMemSize とmaxMemSize の2つの設定パラメータを提供しています。
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.
デフォルトのinitMemSize は通常Milvus起動時のGPUメモリの半分で、maxMemSize はGPUメモリ全体がデフォルトです。GPU メモリ・プール・サイズは、最初はinitMemSize に設定され、必要に応じてmaxMemSize に自動的に拡張されます。
GPU-enabledインデックスが指定されている場合、Milvusは検索前にターゲットコレクションデータをGPUメモリにロードするので、maxMemSize は少なくともデータサイズでなければなりません。
限界
GPU_IVF_FLATの場合、limitの最大値は 1,024 です。GPU_IVF_PQおよびGPU_CAGRAの場合、limitの最大値は 1,024 です。GPU_BRUTE_FORCEについては、limitの設定はありませんが、潜在的なパフォーマンスの問題を避けるため、4,096 を超えないことが推奨されます。現在、GPU インデックスは
COSINE距離をサポートしていません。COSINE距離が必要な場合は、まずデータを正規化し、それから内積(IP)距離を代用として使用します。GPU インデックスの OOM 保護のロードは完全にはサポートされておらず、データが多すぎると QueryNode がクラッシュする可能性があります。
サポートされるGPUインデックス・タイプ
以下の表はMilvusがサポートするGPUインデックスタイプの一覧です。
インデックスタイプ |
説明 |
メモリ使用量 |
|---|---|---|
GPU_CAGRAはGPU用に最適化されたグラフベースのインデックスです。Milvus GPUバージョンを実行するために推論グレードのGPUを使用することは、高価なトレーニンググレードのGPUを使用することと比較して、より費用対効果が高くなります。 |
メモリ使用量は元のベクトルデータの約1.8倍です。 |
|
GPU_IVF_FLATは最も基本的なIVFインデックスで、各ユニットに格納されるエンコードされたデータは元のデータと一致します。検索を行う場合、GPU_IVF_FLAT インデックスのコレクションに対する検索では、top-k ( |
元データのサイズと同じメモリが必要です。 |
|
GPU_IVF_PQはベクトルの積を量子化する前にIVFインデックスのクラスタリングを行います。検索を行う場合、GPU_IVF_FLAT インデックス付きコレクションに対する検索では、 top-k ( |
圧縮パラメータの設定に依存しますが、より小さなメモリフットプリントを使用します。 |
|
GPU_BRUTE_FORCEは、非常に高いリコールが重要なケース向けに調整されており、各クエリをデータセット内のすべてのベクトルと比較することで、1のリコールを保証します。インデックス構築と検索のパラメータとして、メトリックタイプ( |
元データのサイズに等しいメモリを必要とする。 |
GPUメモリ制御のためのMilvus設定
MilvusはGPUメモリを割り当てるためにグローバルグラフィックメモリプールを使用します。Milvus設定ファイルのinitMemSize とmaxMemSize の2つのパラメータをサポートしています。プールサイズは最初はinitMemSize に設定され、この制限を超えると自動的にmaxMemSize に拡張されます。
デフォルトのinitMemSize は Milvus 起動時に利用可能な 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.
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インデックスはどのような場合に利用するのが適切ですか?
GPUインデックスは、高スループットまたは高リコールが要求される状況で特に有益です。例えば、大きなバッチを扱う場合、GPUインデックスのスループットはCPUインデックスのそれを100倍も上回ることができます。より小さなバッチを扱うシナリオでは、GPUインデックスが性能の点でCPUインデックスを大きく上回ることに変わりはありません。さらに、迅速なデータ挿入が必要な場合、GPUを組み込むことで、インデックスの構築プロセスを大幅にスピードアップすることができます。
GPU_CAGRA、GPU_IVF_PQ、GPU_IVF_FLAT、GPU_BRUTE_FORCE などの GPU インデックスは、どのようなシナリオに最適ですか?
GPU_CAGRAGPU_IVF_FQ、GPU_IVF_FLAT、GPU_BRUTE_FORCE のような GPU インデックスは、より多くのメモリを消費する代償はあるにせよ、より高いパフォーマンスを求めるシナリオに最適です。メモリの節約が優先される環境では、GPU_IVF_PQインデックスがストレージ要件を最小化するのに役立ちますが、これは精度の高い損失を伴います。GPU_IVF_FLATインデックスは、性能とメモリ使用量の妥協点を提供する、バランスの取れたオプションとして機能する。最後に、GPU_BRUTE_FORCEインデックスは、網羅的な検索操作のために設計されており、トラバーサル検索を実行することで、想起率1を保証している。