IVF_RABITQCompatible with Milvus 2.6.x
L'indice IVF_RABITQ è un algoritmo di indicizzazione basato sulla quantizzazione binaria che quantizza i vettori FP32 in rappresentazioni binarie. Questo indice offre un'eccezionale efficienza di memorizzazione con un rapporto di compressione di 1 a 32, pur mantenendo tassi di richiamo relativamente buoni. Supporta il raffinamento opzionale per ottenere un richiamo più elevato al costo di una memoria aggiuntiva, rendendolo un sostituto versatile di IVF_SQ8 e IVF_FLAT in scenari con limitazioni di memoria.
Panoramica
IVF_RABITQ è l'acronimo di Inverted File with RaBitQ quantization (File invertito con quantizzazione RaBitQ), che combina due potenti tecniche di ricerca e memorizzazione vettoriale efficiente.
IVF
Inverted File (IVF) organizza lo spazio vettoriale in regioni gestibili utilizzando il clustering k-means. Ogni cluster è rappresentato da un centroide, che serve come punto di riferimento per i vettori all'interno del cluster. Questo approccio di clustering riduce lo spazio di ricerca, consentendo all'algoritmo di concentrarsi solo sui cluster più rilevanti durante l'elaborazione delle query.
Per saperne di più sui dettagli tecnici di IVF, consultare IVF_FLAT.
RaBitQ
RaBitQ è un metodo di quantizzazione binaria all'avanguardia con garanzie teoriche, introdotto nel documento di ricerca "RaBitQ: Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search" di Jianyang Gao e Cheng Long.
RaBitQ introduce diversi concetti innovativi:
Codifica dell'informazione angolare: A differenza della tradizionale codifica spaziale, RaBitQ codifica le informazioni angolari attraverso la normalizzazione del vettore. In IVF_RABITQ, i vettori di dati sono normalizzati rispetto al centroide IVF più vicino, migliorando la precisione del processo di quantizzazione.
Basi teoriche: La formula di base per l'approssimazione della distanza è
Dove:
- o è un vettore di dati dal dataset
- q è un vettore di interrogazione
- c è il vettore centroide FIV più vicino per o
- C, ) e C , ) sono costanti precalcolate
- o q rappresenta l'operazione del prodotto di punti
Efficienza di calcolo: La natura binaria di AVX-512 VPOPCNTDQ sui processori Intel Ice Lake+ o AMD Zen 4+.
Miglioramenti algoritmici: RaBitQ si integra efficacemente con tecniche consolidate come l'approccioFastScan e le rotazioni casuali per migliorare le prestazioni.
FIV + RaBitQ
L'indice IVF_RABITQ combina l'efficiente clustering di IVF con la quantizzazione binaria avanzata di RaBitQ:
Filtraggio grossolano: IVF suddivide lo spazio vettoriale in cluster, riducendo in modo significativo la portata della ricerca e concentrandosi sulle regioni dei cluster più rilevanti.
Quantizzazione binaria: All'interno di ciascun cluster, RaBitQ comprime i vettori in rappresentazioni binarie, preservando le relazioni di distanza essenziali attraverso garanzie teoriche.
Raffinamento opzionale: Se abilitato, l'indice memorizza dati raffinati aggiuntivi utilizzando formati di precisione più elevati (SQ6, SQ8, FP16, BF16 o FP32) per migliorare i tassi di richiamo al costo di una maggiore memorizzazione.
Milvus implementa IVF_RABITQ utilizzando le seguenti stringhe di fabbrica FAISS:
- Con raffinamento:
"RR({dim}),IVF{nlist},RaBitQ,Refine({refine_index})" - Senza raffinamento:
"RR({dim}),IVF{nlist},RaBitQ"
Costruire l'indice
Per costruire un indice IVF_RABITQ su un campo vettoriale in Milvus, utilizzare il metodo add_index(), specificando i parametri index_type, metric_type, e ulteriori parametri per l'indice.
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 questa configurazione:
index_type: Il tipo di indice da costruire. In questo esempio, impostare il valore suIVF_RABITQ.metric_type: Il metodo utilizzato per calcolare la distanza tra i vettori. I valori supportati sonoCOSINE,L2eIP. Per maggiori dettagli, consultare Tipi di metriche.params: Opzioni di configurazione aggiuntive per la costruzione dell'indice. Per i dettagli, fare riferimento a Parametri di costruzione dell'indice.
Una volta configurati i parametri dell'indice, si può creare l'indice usando direttamente il metodo create_index() o passando i parametri dell'indice nel metodo create_collection. Per i dettagli, fare riferimento a Creare una raccolta.
Ricerca nell'indice
Una volta costruito l'indice e inserite le entità, è possibile eseguire ricerche di similarità sull'indice.
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 questa configurazione:
params: Opzioni di configurazione aggiuntive per la ricerca sull'indice. Per i dettagli, fare riferimento a Parametri di ricerca specifici per l'indice.
L'indice IVF_RABITQ si basa molto sull'istruzione hardware popcount per ottenere prestazioni ottimali. Le moderne architetture di CPU, come Intel IceLake+ o AMD Zen 4+, con set di istruzioni AVX512VPOPCNTDQ, migliorano notevolmente le prestazioni delle operazioni RaBitQ.
Parametri dell'indice
Questa sezione fornisce una panoramica dei parametri utilizzati per la creazione di un indice e per l'esecuzione di ricerche sull'indice.
Parametri di costruzione dell'indice
La tabella seguente elenca i parametri che possono essere configurati in params quando si costruisce un indice.
Parametro |
Descrizione |
Valore Intervallo |
Suggerimento per la messa a punto |
|
|---|---|---|---|---|
FIV |
|
Numero di cluster da creare con l'algoritmo k-means durante la creazione dell'indice. Ogni cluster, rappresentato da un centroide, memorizza un elenco di vettori. Aumentando questo parametro si riduce il numero di vettori in ogni cluster, creando partizioni più piccole e mirate. |
Tipo: Intero |
Valori maggiori di |
RaBitQ |
|
Attiva il processo di raffinazione e memorizza i dati raffinati. |
Tipo: Booleano |
Impostare su |
|
Definisce la rappresentazione dei dati utilizzata per il raffinamento quando è abilitato |
Tipo: Stringa |
I valori elencati sono presentati in ordine crescente di tasso di richiamo, diminuzione del QPS e aumento della dimensione di archiviazione. |
Parametri di ricerca specifici per l'indice
La tabella seguente elenca i parametri che possono essere configurati in search_params.params per la ricerca sull'indice.
Parametro |
Descrizione |
Valore Intervallo |
Suggerimento per la messa a punto |
|
|---|---|---|---|---|
FIV |
|
Numero di cluster in cui cercare i candidati. Valori più alti consentono di cercare più cluster, migliorando il richiamo grazie all'espansione dell'ambito di ricerca, ma al costo di una maggiore latenza della query. |
Tipo: Intero |
L'aumento di questo valore migliora il richiamo, ma può rallentare la ricerca. Impostare |
RaBitQ |
|
Imposta se applicare una quantizzazione scalare aggiuntiva a un vettore di query. Se impostato su |
Tipo: Intero |
Il valore predefinito |
|
Il processo di raffinazione utilizza una quantizzazione di qualità superiore per scegliere il numero necessario di vicini da un pool |
Tipo: Variabile |
I valori più alti di |