IVF_RABITQCompatible with Milvus 2.6.x
Der IVF_RABITQ-Index ist ein auf binärer Quantisierung basierender Indizierungsalgorithmus, der FP32-Vektoren in binäre Darstellungen quantisiert. Dieser Index bietet eine außergewöhnliche Speichereffizienz mit einem Komprimierungsverhältnis von 1 zu 32 bei gleichzeitig relativ guten Wiederfindungsraten. Er unterstützt optionale Verfeinerungen, um eine höhere Wiederauffindbarkeit auf Kosten von zusätzlichem Speicherplatz zu erreichen, was ihn zu einem vielseitigen Ersatz für IVF_SQ8 und IVF_FLAT in Szenarien mit Speicherbeschränkungen macht.
Überblick
IVF_RABITQ steht für Inverted File mit RaBitQ-Quantisierung und kombiniert zwei leistungsstarke Techniken für effiziente Vektorsuche und -speicherung.
IVF
Inverted File (IVF) organisiert den Vektorraum mit Hilfe von k-means clustering in verwaltbare Regionen. Jeder Cluster wird durch einen Zentroid repräsentiert, der als Referenzpunkt für die Vektoren innerhalb dieses Clusters dient. Dieser Clustering-Ansatz reduziert den Suchraum, indem er es dem Algorithmus ermöglicht, sich bei der Abfrageverarbeitung nur auf die relevantesten Cluster zu konzentrieren.
Mehr über die technischen Details von IVF erfahren Sie unter IVF_FLAT.
RaBitQ
RaBitQ ist eine hochmoderne binäre Quantisierungsmethode mit theoretischen Garantien, die in dem Forschungspapier "RaBitQ: Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search" von Jianyang Gao und Cheng Long vorgestellt wurde.
RaBitQ führt mehrere innovative Konzepte ein:
Angular Information Encoding: Im Gegensatz zur traditionellen räumlichen Kodierung kodiert RaBitQ Winkelinformationen durch Vektornormalisierung. In IVF_RABITQ werden die Datenvektoren anhand ihres nächstgelegenen IVF-Schwerpunkts normalisiert, wodurch die Präzision des Quantisierungsprozesses verbessert wird.
Theoretische Grundlage: Die Kernformel der Abstandsapproximation lautet:
Wobei:
- o ist ein Datenvektor aus dem Datensatz
- q ist ein Abfragevektor
- c ist der nächstgelegene IVF-Schwerpunktvektor für o
- C, ) und C , ) sind vorberechnete Konstanten
- o q steht für die Punkt-Produkt-Operation
Berechnungseffizienz: Die binäre Natur von AVX-512 VPOPCNTDQ Anweisungen auf Intel Ice Lake+ oder AMD Zen 4+ Prozessoren profitiert.
Algorithmische Weiterentwicklungen: RaBitQ lässt sich effektiv mit etablierten Verfahren wie dem FastScan -Ansatz und zufälligen Rotationen kombinieren, um die Leistung zu verbessern.
IVF + RaBitQ
Der IVF_RABITQ-Index kombiniert das effiziente Clustering von IVF mit der erweiterten binären Quantisierung von RaBitQ:
Coarse Filtering: IVF unterteilt den Vektorraum in Cluster, wodurch der Suchumfang durch die Konzentration auf die relevantesten Clusterregionen erheblich reduziert wird.
Binäre Quantisierung: Innerhalb jedes Clusters komprimiert RaBitQ die Vektoren in binäre Darstellungen, wobei wesentliche Abstandsbeziehungen durch theoretische Garantien erhalten bleiben.
Optionale Verfeinerung: Wenn diese Option aktiviert ist, speichert der Index zusätzliche verfeinerte Daten in Formaten mit höherer Genauigkeit (SQ6, SQ8, FP16, BF16 oder FP32), um die Wiederauffindungsrate auf Kosten eines größeren Speicherplatzes zu verbessern.
Milvus implementiert IVF_RABITQ unter Verwendung der folgenden FAISS-Fabrikstrings:
- Mit Verfeinerung:
"RR({dim}),IVF{nlist},RaBitQ,Refine({refine_index})" - Ohne Verfeinerung:
"RR({dim}),IVF{nlist},RaBitQ"
Index erstellen
Um einen IVF_RABITQ -Index für ein Vektorfeld in Milvus zu erstellen, verwenden Sie die Methode add_index() und geben Sie die Parameter index_type, metric_type und zusätzliche Parameter für den Index an.
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_RABITQ", # 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": 1024, # Number of clusters for the index
"refine": True, # Enable refinement for higher recall
"refine_type": "SQ8" # Refinement data format
} # Index building params
)
In dieser Konfiguration:
index_type: Der Typ des zu erstellenden Index. In diesem Beispiel setzen Sie den Wert aufIVF_RABITQ.metric_type: Die Methode zur Berechnung des Abstands zwischen Vektoren. Unterstützte Werte sindCOSINE,L2undIP. Einzelheiten finden Sie unter Metrische Typen.params: Zusätzliche Konfigurationsoptionen für den Aufbau des Index. Weitere Informationen finden Sie unter Indexerstellungsparameter.
Sobald die Indexparameter konfiguriert sind, können Sie den Index erstellen, indem Sie die Methode create_index() direkt verwenden oder die Indexparameter in der Methode create_collection übergeben. Weitere Informationen finden Sie unter Sammlung erstellen.
Suche im Index
Sobald der Index erstellt und die Entitäten eingefügt sind, können Sie Ähnlichkeitssuchen im Index durchführen.
search_params = {
"params": {
"nprobe": 128, # Number of clusters to search
"rbq_query_bits": 0, # Query vector quantization bits
"refine_k": 1 # Refinement magnification factor
}
}
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=3, # TopK results to return
search_params=search_params
)
In dieser Konfiguration:
params: Zusätzliche Konfigurationsoptionen für die Suche im Index. Details finden Sie unter Indexspezifische Suchparameter.
Der IVF_RABITQ-Index ist für eine optimale Leistung stark auf die Hardwareanweisung popcount angewiesen. Moderne CPU-Architekturen wie Intel IceLake+ oder AMD Zen 4+ mit AVX512VPOPCNTDQ -Befehlssätzen bieten erhebliche Leistungsverbesserungen für RaBitQ-Operationen.
Index-Parameter
Dieser Abschnitt bietet einen Überblick über die Parameter, die für den Aufbau eines Index und die Durchführung von Suchvorgängen im Index verwendet werden.
Indexaufbau-Parameter
In der folgenden Tabelle sind die Parameter aufgeführt, die in params beim Aufbau eines Index konfiguriert werden können.
Parameter |
Beschreibung |
Wertebereich |
Tuning-Vorschlag |
|
|---|---|---|---|---|
IVF |
|
Die Anzahl der Cluster, die mit dem k-means-Algorithmus während der Indexerstellung erstellt werden. Jeder Cluster, der durch einen Zentroid dargestellt wird, speichert eine Liste von Vektoren. Durch Erhöhen dieses Parameters wird die Anzahl der Vektoren in jedem Cluster reduziert, wodurch kleinere, konzentriertere Partitionen entstehen. |
Typ: Integer |
Größere |
RaBitQ |
|
Aktiviert den Verfeinerungsprozess und speichert die verfeinerten Daten. |
Typ: Boolesch |
Auf |
|
Definiert die Datendarstellung, die für die Verfeinerung verwendet wird, wenn |
Typ: String |
Die aufgelisteten Werte sind in der Reihenfolge ansteigender Wiederfindungsrate, abnehmender QPS und zunehmender Speichergröße aufgeführt. |
Indexspezifische Suchparameter
In der folgenden Tabelle sind die Parameter aufgeführt, die in search_params.params für die Suche im Index konfiguriert werden können.
Parameter |
Beschreibung |
Wertebereich |
Tuning-Vorschlag |
|
|---|---|---|---|---|
IVF |
|
Die Anzahl der Cluster, in denen nach Kandidaten gesucht wird. Höhere Werte erlauben es, mehr Cluster zu durchsuchen, was die Wiederauffindbarkeit durch Erweiterung des Suchbereichs verbessert, jedoch auf Kosten einer erhöhten Abfragelatenz. |
Typ: Integer |
Eine Erhöhung dieses Wertes verbessert die Auffindbarkeit, kann aber die Suche verlangsamen. Stellen Sie |
RaBitQ |
|
Legt fest, ob eine zusätzliche skalare Quantisierung eines Abfragevektors angewendet wird. Wenn der Wert auf |
Typ: Integer |
Der Standardwert |
|
Der Verfeinerungsprozess verwendet eine qualitativ hochwertigere Quantisierung, um die erforderliche Anzahl der nächsten Nachbarn aus einem |
Typ: Float |
Höhere |