milvus-logo
LFAI
フロントページへ
  • ユーザーガイド

GPUによるインデックス

このガイドでは、MilvusでGPUをサポートしたインデックスを構築する手順の概要を説明します。MilvusがサポートするGPUインデックスの種類については、GPUインデックスをご参照ください。

GPUメモリ制御のためのMilvus設定の構成

MilvusはGPUメモリを割り当てるためにグローバルグラフィックメモリプールを使用します。

Milvus設定ファイルでinitMemSizemaxMemSize の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_typemetric_typeparams を定義します:

  • index_type(文字列):index_type (string): ベクトル探索を加速するために使用するインデックスのタイプ。有効なオプションはGPU_CAGRAGPU_IVF_FLATGPU_IVF_PQGPU_BRUTE_FORCEです。

  • metric_type(文字列):ベクトルの類似度を測定するために使用するメトリクスのタイプ。有効なオプションはIPL2 です。

  • 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
        }
    }
    

    paramsオプションはIVF_FLATおよびIVF_PQ で使用されるものと同じです。

  • 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_sizesearch_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_PQGPU_CAGRA の場合、limitの最大値は 1024 です。

  • GPU_BRUTE_FORCE にはlimitの上限は設定されていませんが、潜在的なパ フォーマンスの問題を避けるために 4096 を超えないことが推奨されます。

  • 現在、GPUインデックスはCOSINE距離をサポートしていません。COSINE 距離が必要な場合は、まずデータを正規化し、それから内積 (IP) 距離で代用することができます。

  • GPUインデックスに対するOOM保護のロードは完全にはサポートされていません。

  • GPUインデックスは範囲検索や グループ検索のような検索機能をサポートしていません。

よくある質問

  • 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の再現率を保証します。

翻訳DeepL

Try Managed Milvus for Free

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

Get Started
フィードバック

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