AISAQCompatible with Milvus 2.6.4+

AISAQはDISKANNを拡張し、最小限のDRAMフットプリントで10億スケールのデータセットを扱えるようにしたディスクベースのベクトルインデックスです。

圧縮ベクトルをメモリ上に保持するDISKANNとは異なり、AISAQはすべてのデータ構造をSSD上に保持する「ニアゼロDRAMアーキテクチャ」で設計されています。

AISAQは、パフォーマンスとストレージコストのバランスを取るためのオペレーションモードを提供しながら、標準的なサーバーを使用して超大規模データベースを実行することを可能にします。

AISAQの仕組み

上の図は、DISKANNAISAQ-PerformanceAISAQ-Scaleのストレージレイアウトを比較したもので、データ(生ベクトル、エッジリスト、PQコード)がRAMとディスクの間でどのように分配されるかを示しています。

Aisaq Vs Diskann AisaqとDiskannの比較

ファウンデーションDISKANNのまとめ

DISKANNでは、生のベクトルとエッジリストはディスクに保存され、PQ圧縮されたベクトルはメモリ(DRAM)に保存される。

DISKANNがノード(例えば、ベクトル0)にトラバースするとき:

  • 生のベクトル(raw_vector_0)とそのエッジリスト(edgelist_0)をディスクからロードします。

  • エッジリストは、次に訪問する隣接ノード(この例ではノード2、3、5)を示します。

  • 生ベクトルは、クエリーベクトルとの正確な距離を計算するために使用されます。

  • メモリ上のPQデータは、次の探索を導くための近似距離フィルタリングに使用される。

PQデータはすでにDRAMにキャッシュされているため、各ノードへのアクセスに必要なディスクI/Oは1回のみであり、適度なメモリ使用量で高いクエリー速度を実現する。

これらのコンポーネントとパラメータの詳細については、「DISKANN」を参照してください。

AISAQの動作モード

AISAQは、2つの異なるユースケースに対応するために、2つの動作モードを提供します:

パフォーマンスモード:オンライン・セマンティック検索など、低レイテンシーと高スループットを必要とするアプリケーションに最適化されています。

スケールモード:RAGやオフラインのセマンティック検索など、レイテンシの制約がより緩やかなアプリケーションに最適化されており、データセットをコスト効率よく超大規模に拡張することができます。

AISAQ-performanceモード

AISAQ-performanceは、データのコロケーションと冗長性により低IOPSを維持しながら、PQデータをメモリからディスクに移動することで、「Near-Zero DRAM footprint」を実現します。

  • 各ノードの生ベクトル、エッジ・リスト、および隣接ノードのPQデータは、ディスク上にまとめて保存されます。

  • このレイアウトにより、あるノード(例:ベクター0)を訪問しても、ディスクI/Oは1回で済みます。

  • PQデータは複数のノードの近傍に冗長に保存されるため、インデックスファイルのサイズは大幅に増加し、より多くのディスクスペースを消費します。

AISAQスケールモード

AISAQ-scaleは、ターゲットアプリケーションの性能要件を満たしながら、ディスク使用量を削減することに重点を置いています。

このモードでは

  • PQデータは、冗長性を持たせることなく、ディスク上に別々に保存されます。

  • この設計はインデックスサイズを最小化しますが、グラフのトラバーサル時にI/O操作が増えることになります。

  • IOPSオーバーヘッドを軽減するために、AISAQは2つの最適化を導入している:

    • データの局所性を向上させるために、PQベクトルを優先順位でソートするリアレンジアルゴリズム。

    • 頻繁にアクセスされるPQデータをキャッシュするDRAM内のPQキャッシュ(pq_read_page_cache_size)。

構成例

# milvus.yaml
knowhere:
  AISAQ:
    build:
      max_degree: 56 # Controls the maximum number of connections (edges) each data point can have in the Vamana graph
      search_list_size: 100 # During index construction, this parameter defines the size of the candidate pool used when searching for the nearest neighbors for each node. For every node being added to the graph, the algorithm maintains a list of the search_list_size best candidates found so far. The search for neighbors stops when this list can no longer be improved. From this final candidate pool, the top max_degree nodes are selected to form the final edges
      inline_pq: -1 # Number of PQ vectors stored inline per Index node (read when node is accessed, to reduce IO)
      rearrange: true # Re-arrange the PQ vectors data structure to improve data locality and reduce disk accesses during search (ignored in performance mode)
      num_entry_points: 100 # Number of candidate entry points to optimize search entry-point selection
      pq_code_budget_gb_ratio: 0.125 # Controls the size of the PQ codes (compressed representations of data points) compared to the size of the uncompressed data
      disk_pq_code_budget_gb_ratio: 0.25 # Controls the size of the PQ codes of the high precision vectors stored in the index (used for re-ranking), compared to the size of the uncompressed data
      pq_cache_size: 0 # PQ vectors cache size in DRAM (bytes). The PQ vectors cache is loaded during Index load and used during search to reduce IOs (ignored in performance mode)
      search_cache_budget_gb_ratio: 0 # Controls the amount of DRAM to be used for caching frequently accessed index nodes. This cache is loaded during index load and used during search to reduce IOs
    search:
      search_list: 16 # During a search operation, this parameter determines the size of the candidate pool that the algorithm maintains as it traverses the graph. A larger value increases the chances of finding the true nearest neighbors (higher recall) but also increases search latency
      beamwidth: 8 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read the index nodes
      vectors_beamwidth: 1 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read groups of neighboring PQ vectors (ignored in performance mode)
      pq_read_page_cache_size: 5242880 (5MiB) # PQ read cache size in DRAM per search thread (bytes). It caches frequently accessed data pages containing PQ vectors (ignored in performance mode and applicable only when rearrange is true). The PQ read cache memory is reused across all AISAQ segments

AISAQパラメータ

AISAQは、DISKANNからいくつかのパラメータ(max_degreesearch_list_sizepq_code_budget_gb_ratio )を継承している。

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

これらのパラメータはAISAQインデックスの構築方法に影響します。これらを調整することで、インデックスサイズ、構築時間、検索品質に影響を与えることができます。

パラメータ

説明

値の範囲

チューニングの提案

max_degree

Vamana グラフで各データポイントが持つことのできる接続 (エッジ) の最大数を制御する。

タイプ整数

範囲[1, 512]

デフォルト値56

より高い値は、より密なグラフを作成し、潜在的にリコールを増加させる(より関連性の高い結果を見つける)が、メモリ使用量とビルド時間を増加させる。ほとんどの場合、この範囲内の値を設定することをお勧めします:[10, 100].

search_list_size

インデックス構築中、このパラメータは各ノードの最近傍を検索する際に使用される候補プールのサイズを定義します。グラフに追加される各ノードに対して、アルゴリズムはこれまでに見つかった最良の候補のリストをsearch_list_sizeで保持します。このリストが改善されなくなった時点で、近傍探索は停止する。この最終的な候補プールから、最終的な辺を形成するために最大次数のノードが選択される。

型は整数

範囲[1, 512]

デフォルト値100

search_list_sizeを大きくすると、各ノードの真の最近傍を見つける可能性が高くなり、より高品質なグラフと検索パフォーマンス(リコール)を向上させることができる。しかし、その代償としてインデックス構築時間が大幅に長くなります。常にmax_degree以上の値に設定すべきである。

inline_pq

インデックスノードごとにインラインで保存されるPQベクトルの数(IOを減らすため、ノードがアクセスされたときに読み込まれる)

:整数

範囲: [0, max_degree[0,max_degree]

デフォルト値-1

inline_pq の値を大きくするとパフォーマンスが向上するが、ディスク容量が増加する。

AISAQをスケール・モードで使用する場合は、inline_pq=0に設定する。

inline_pq=-1 に設定すると、スケール・モードの AISAQ をさらに最適化するために、インデックス内の未使用スペースが自動的に PQ ベクターで満たされます。

パフォーマンス・モードのAISAQでは、inline_pq=max_degreeに設定します。

inline_pq 0からmax_degreeの間で設定することで、パフォーマンスとディスクスペース消費のバランスを調整することができます。

rearrange

PQベクトルデータ構造を再整理して、データの局所性を向上させ、探索中のディスクアクセスを削減する(パフォーマンスモードでは無視される)。

タイプブール値

範囲:[true, false[true, false]

デフォルト値true

trueの場合、メモリとインデックス構築時間のわずかな増加で、検索中のIOを減らす。

num_entry_points

検索エントリーポイントの選択を最適化するための候補エントリーポイントの数。

:整数

範囲: [0, 1000[0, 1000]

デフォルト値100

高い値は、より近いエントリーポイントから検索を開始することにより、検索時間を短縮することができる。

大きなセグメント(例えば 10M ベクトル以上の場合は 1000 を使用)には大きな値を設定する。

pq_code_budget_gb_ratio

PQ コード(データポイントの圧縮表現)のサイズを、非圧縮データのサイズと比較して制御する。

タイプFloat

範囲:(0.0、0.25]

デフォルト値0.125

比率が高いほど、より正確な検索結果が得られ、元のベクトルに関するより多くの情報が効果的に保存されますが、検索時の計算複雑度が増します。

ほとんどの場合、この範囲内の値(0.0417, 0.25)を設定することをお勧めします。

disk_pq_code_budget_gb_ratio

インデックスに格納された高精度ベクトル(再順位付けに使用)のPQコードのサイズを、非圧縮データのサイズと比較して制御します。

タイプ浮動小数点数

範囲: [0, 0.25[0, 0.25]

デフォルト値0.25

デフォルト値0.25では、ベクトルは元のサイズの25%に量子化され(4倍圧縮)、精度の影響を比較的小さくしながらディスクの占有量を減らします。

再順位付けのためにディスク・インデックスに全精度のベクトルを保存するには、値を0に設定します。値を大きくすると再現率は高くなるが、ディスク使用量は増加する。

pq_cache_size

DRAM内のPQベクトル・キャッシュ・サイズ(バイト)。PQベクトルキャッシュはインデックスロード時にロードされ、IOを減らすために検索時に使用される(パフォーマンスモードでは無視される)。

タイプ:整数

範囲: [0, 107374182[0, 1073741824]

デフォルト値0

より大きなキャッシュはクエリ・パフォーマンスを向上させますが、DRAM使用量を増加させます。

search_cache_budget_gb_ratio

頻繁にアクセスされるインデックス・ノードのキャッシュに使用する DRAM の量を制御します。

このキャッシュはインデックスロード時にロードされ、IOを減らすために検索時に使用される。

タイプFloat

範囲:[0.0, 0.3[0.0, 0.3)

デフォルト値0

高い値を指定すると、キャッシュのためにより多くのメモリを割り当て、ディスクIOを減らすが、より多くのシステムメモリを消費する。低い値を指定すると、キャッシュに使用するメモリが少なくなり、ディスクアクセスの必要性が増す可能性がある。

インデックス検索パラメータ

これらのパラメータはAISAQがどのように検索を行うかに影響します。これらを調整することで、検索速度、待ち時間、リソース使用量に影響を与えることができます。

パラメータ

説明

値の範囲

チューニングの提案

search_list

検索操作中、このパラメータはアルゴリズムがグラフを横断する際に維持する候補プールのサイズを決定します。値を大きくすると、真の最近傍を見つける可能性が高くなりますが(より高いリコール)、検索の待ち時間も長くなります。

タイプ整数

範囲:[topk, int32_max] とする。

デフォルト値16

性能と精度のバランスをとるために、この値は検索したい結果の数 (top_k) と同じか、それより少し大きく設定することを推奨する。

beamwidth

インデックスノードを読み込むための並列ディスクI/O要求の最大数を決定することにより、検索中の並列性の程度を制御する。

型は整数

範囲[1, 16]

デフォルト値8

値を大きくすると並列性が高まり、強力なCPUとSSDを持つシステムで検索を高速化できる。ただし、値を高く設定しすぎると、リソースが過剰に競合する可能性がある。

ほとんどの場合、値を 2 に設定することを推奨する。

vectors_beamwidth

隣接する PQ ベクトルのグループを読み取るための並列ディスク I/O 要求の最大数を決定することで、検索中の並列性の程度を制御します(パフォーマンスモードでは無視されます)。

タイプ整数

範囲:[1, 4] <=beamwidthでなければならない。

デフォルト値1

値を大きくすると並列性が高まり、強力なCPUやSSDを搭載したシステムで検索を高速化できる。しかし、この値を高く設定しすぎると、隣接する PQ ベクトルグループが最大 max_degree ベクトルを含む可能性があるため、過剰なリソース競合につながる可能性があります。

ほとんどの場合、値を 1 に設定することを推奨します。

pq_read_page_cache_size

検索スレッドごとの DRAM 内の PQ リード・キャッシュ・サイズ(バイト)。これは、PQ ベクターを含む、頻繁にアクセスされるデータ・ページをキャッシュする(パフォーマンス・モードでは無視され、rearrange が true の場合にのみ適用される)。

PQ リード・キャッシュ・メモリはすべての AISAQ セグメントで再利用される。

:整数

範囲:[0, 33554432[0, 33554432]

デフォルト値5242880 (5MiB)

キャッシュを大きくすると、クエリのパフォーマンスは向上しますが、DRAM 使用量は増加します。

推奨値は、小セグメント(1 M ベクタ)で 2 MiB、中セグメント(50 M ベクタ)で 5 MiB、大セグメント(250 M ベクタ)で 10 MiB です。

Try Managed Milvus for Free

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

Get Started
フィードバック

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