IVF_SQ8
IVF_SQ8インデックスは、大規模な類似検索の課題に取り組むために設計された量子化ベースのインデックス作成アルゴリズムです。このインデックスタイプは、網羅的検索手法と比較して、より少ないメモリフットプリントで高速な検索を実現します。
概要
IVF_SQ8 インデックスは2つの主要なコンポーネントに基づいて構築されている:
転置ファイル(IVF):データをクラスタに整理し、検索アルゴリズムが最も関連性の高いベクトルのサブセットのみにフォーカスできるようにする。
スカラー量子化(SQ8):ベクトルをよりコンパクトな形に圧縮し、メモリ使用量を大幅に削減すると同時に、高速な類似度計算のための十分な精度を維持します。
IVF
IVFは、本の索引を作るようなものです。すべてのページ(私たちの場合はすべてのベクトル)をスキャンする代わりに、インデックスで特定のキーワード(クラスタ)を検索し、関連するページ(ベクトル)をすばやく見つけます。このシナリオでは、ベクターはクラスターにグループ化され、アルゴリズムはクエリーベクターに近いいくつかのクラスター内を検索します。
以下がその仕組みだ:
クラスタリング:ベクトルデータセットは、k-meansのようなクラスタリングアルゴリズムを使用して、指定された数のクラスタに分割されます。各クラスタにはセントロイド(クラスタを代表するベクトル)があります。
割り当て:各ベクトルは、セントロイドが最も近いクラスタに割り当てられます。
転置インデックス:各クラスタのセントロイドを、そのクラスタに割り当てられたベクトルのリストにマッピングするインデックスが作成されます。
検索:最近傍を検索する場合、検索アルゴリズムはクエリベクトルとクラスタ重心を比較し、最も有望なクラスタを選択します。そして、その選択されたクラスタ内のベクトルに検索が絞り込まれます。
技術的な詳細については、IVF_FLATを参照してください。
SQ8
スカラー量子化(SQ)は、高次元ベクトルの値をより小さくコンパクトな表現に置き換えることで、そのサイズを縮小するために使用される手法です。SQ8では、ベクトルの各次元の値を格納するのに、一般的な32ビット浮動小数点数の代わりに8ビット整数を使用します。これにより、データの保存に必要なメモリ量が大幅に削減される。
SQ8の仕組みは以下の通り:
範囲の特定まず、ベクトル内の最小値と最大値を特定します。この範囲が量子化の境界となる。
正規化:式を使用して、ベクトル値を0から1の範囲に正規化します:
これにより、すべての値が標準化された範囲に比例してマッピングされ、圧縮に備えます。
8ビット圧縮:正規化された値に255(8ビット整数の最大値)を掛け、その結果を最も近い整数に丸めます。これにより、各値が効果的に 8 ビット表現に圧縮されます。
ディメンジョン値が 1.2 で、最小値が -1.7、最大値が 2.3 であるとします。次の図は、float32 値を int8 整数に変換するために SQ8 がどのように適用されるかを示しています。
IVF SQ8
IVF + SQ8
IVF_SQ8 インデックスは、IVF と SQ8 を組み合わせて効率的に類似検索を行います:
IVF は検索範囲を狭める:データセットをクラスタに分割し、クエリが発行されると、IVF はまずクエリとクラスタのセントロイドを比較し、最も関連性の高いクラスタを選択する。
SQ8は距離計算を高速化する:選択されたクラスタ内で、SQ8はベクトルを8ビット整数に圧縮し、メモリ使用量を削減し、距離計算を高速化する。
IVFで探索を絞り込み、SQ8で計算を高速化することで、IVF_SQ8は高速な探索時間とメモリ効率の両方を実現しています。
インデックスの構築
Milvusでベクトル場にIVF_SQ8 インデックスを構築するには、add_index() メソッドを使用し、index_type 、metric_type 、インデックスの追加パラメータを指定します。
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_SQ8", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 64, # Number of clusters to create using the k-means algorithm during index building
} # Index building params
)
この構成では
index_type:構築するインデックスのタイプ。この例ではIVF_SQ8とします。metric_type:ベクトル間の距離の計算方法。サポートされている値には、COSINE、L2、IPがあります。詳細については、メトリック・タイプを参照してください。params:インデックスを構築するための追加設定オプション。nlist:インデックス構築時に k-means アルゴリズムを使用して作成するクラスタの数。
IVF_SQ8インデックスで利用可能な構築パラメータの詳細については、インデックス構築パラメータを参照してください。
インデックス・パラメータを構成したら、create_index() メソッドを直接使用するか、create_collection メソッドでインデックス・パラメータを渡してインデックスを作成できます。詳細は、コレクションの作成 を参照してください。
インデックスでの検索
インデックスが構築され、エンティティが挿入されると、インデックス上で類似検索を実行できます。
search_params = {
"params": {
"nprobe": 8, # Number of clusters to search for candidates
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=10, # TopK results to return
search_params=search_params
)
この構成では
params:インデックスで検索するための追加構成オプション。nprobe:候補を検索するクラスタの数。
IVF_SQ8インデックスで利用可能な検索パラメータについては、インデックス固有の検索パラメータを参照してください。
インデックスパラメータ
このセクションでは、インデックスを構築し、インデックス上で検索を実行する際に使用するパラメータの概要を説明します。
インデックス構築パラメータ
以下の表は、params でインデックスを構築する際に設定できるパラメータの一覧です。
パラメータ |
説明 |
値の範囲 |
チューニングの提案 |
|
|---|---|---|---|---|
IVF |
|
インデックス構築時にk-meansアルゴリズムを使用して作成するクラスタの数。 |
型:整数:[1, 65536] デフォルト値: |
|
インデックス固有の検索パラメータ
次の表は、search_params.params でインデックス検索時に設定できるパラメータの一覧です。
パラメータ |
説明 |
値の範囲 |
チューニングサジェスチョン |
|
|---|---|---|---|---|
IVF |
|
候補を検索するクラスタの数。 |
型:整数Range:[1,nlist] デフォルト値: |
値を大きくすると、より多くのクラスターを検索できるようになり、検索範囲が広がることでリコールが向上しますが、その代償としてクエリの待ち時間が長くなります。速度と精度のバランスをとるために、 ほとんどの場合、この範囲内の値を設定することをお勧めします:[1, nlist]。 |