• Milvusについて
  • スタート
  • コンセプト
  • ユーザーガイド
  • データインポート
  • AIツール
  • 管理ガイド
  • ツール
  • 統合
  • チュートリアル
  • よくあるご質問
  • API Reference

GPUインデックスの概要

MilvusでGPUをサポートしたインデックスを構築することで、高スループット、高リコールシナリオでの検索性能を大幅に向上させることができます。

以下の図は、インデックス構成、ハードウェアセットアップ、ベクトルデータセット(CohereとOpenAI)、検索バッチサイズにおけるクエリスループット(クエリ/秒)を比較したもので、GPU_CAGRA が一貫して他の方法を上回っていることを示しています。

Gpu Index Performance GPUインデックス性能

MilvusのGPUメモリプールの設定

MilvusはグローバルGPUメモリプールをサポートしており、Milvus設定ファイルにinitMemSizemaxMemSize の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インデックスは範囲検索や グループ検索のような検索機能をサポートしていません。

サポートされるGPUインデックス・タイプ

以下の表はMilvusがサポートするGPUインデックスタイプの一覧です。

インデックスタイプ

説明

メモリ使用量

GPU_CAGRA

GPU_CAGRAはGPU用に最適化されたグラフベースのインデックスです。Milvus GPUバージョンを実行するために推論グレードの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 の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_CAGRA GPU_IVF_FQ、GPU_IVF_FLAT、GPU_BRUTE_FORCE のような GPU インデックスは、より多くのメモリを消費する代償はあるにせよ、より高いパフォーマンスを求めるシナリオに最適です。メモリの節約が優先される環境では、GPU_IVF_PQ インデックスがストレージ要件を最小化するのに役立ちますが、これは精度の高い損失を伴います。GPU_IVF_FLAT インデックスは、性能とメモリ使用量の妥協点を提供する、バランスの取れたオプションとして機能する。最後に、GPU_BRUTE_FORCE インデックスは、網羅的な検索操作のために設計されており、トラバーサル検索を実行することで、想起率1を保証している。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
フィードバック

このページは役に立ちましたか ?