milvus-logo
LFAI
フロントページへ
  • コンセプト

GPUインデックス

Milvusは様々なGPUインデックスタイプをサポートし、特に高スループット、高リコールシナリオにおいて検索性能と効率を加速します。このトピックでは、MilvusがサポートするGPUインデックスタイプの概要、適した使用例、および性能特性について説明します。GPUを使用したインデックス構築については、GPUを使用したインデックスを参照してください。

GPUインデックスを使用すると、CPUインデックスを使用した場合と比較して、必ずしもレイテンシが減少するとは限らないことに注意することが重要です。スループットを完全に最大化したいのであれば、極めて高いリクエスト・プレッシャーか、大量のクエリ・ベクターが必要になります。

performance パフォーマンス

MilvusのGPUサポートはNvidiaRAPIDSチームによって提供されています。以下は現在MilvusがサポートしているGPUインデックスタイプです。

GPU_CAGRA

GPU_CAGRAはGPU用に最適化されたグラフベースのインデックスです。Milvus GPUバージョンを実行するために推論グレードのGPUを使用することは、高価なトレーニンググレードのGPUを使用することと比較して、費用対効果が高くなります。

  • インデックス構築パラメータ

    パラメータ説明デフォルト値
    intermediate_graph_degreeプルーニングの前にグラフの次数を決定することで、リコールと構築時間に影響する。推奨値は32 または64128
    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_sizesearch_width に基づいて自動的に反復回数を決定する。これらの値を手動で調整することで、性能と精度のバランスをとることができます。0
    team_sizeGPU でのメトリック距離計算に使用する CUDA スレッド数を指定します。一般的な値は2の累乗から32までです(例:2、4、8、16、32)。これは検索性能に軽微な影響を与えます。デフォルト値は0 で、milvus はベクトル次元に基づいて自動的にteam_size を選択します。0
    efクエリ時間と精度のトレードオフを指定します。ef の値を高くすると、検索精度は高くなりますが、検索速度は遅くなります。
    インデックス作成時にadapt_for_cputrue に設定した場合、このパラメータは必須となります。
    [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 = 00
    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: 圧縮パラメータの設定に依存しますが、より小さなメモリフットプリントを使用します。

翻訳DeepL

Try Managed Milvus for Free

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

Get Started
フィードバック

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