Indice in memoria
Questo argomento elenca i vari tipi di indici in-memory supportati da Milvus, gli scenari più adatti a ciascuno di essi e i parametri che gli utenti possono configurare per ottenere migliori prestazioni di ricerca. Per gli indici su disco, vedere Indice su disco.
L'indicizzazione è il processo di organizzazione efficiente dei dati e svolge un ruolo importante nel rendere utile la ricerca per similarità, accelerando notevolmente le interrogazioni che richiedono molto tempo su grandi insiemi di dati.
Per migliorare le prestazioni delle query, è possibile specificare un tipo di indice per ogni campo vettoriale.
Indici vettoriali ANNS
La maggior parte dei tipi di indici vettoriali supportati da Milvus utilizza algoritmi di ricerca approssimativa dei vicini (ANNS). Rispetto al reperimento accurato, che di solito richiede molto tempo, l'idea centrale di ANNS non si limita più a restituire il risultato più accurato, ma cerca solo i vicini del target. ANNS migliora l'efficienza del reperimento sacrificando l'accuratezza entro un intervallo accettabile.
In base ai metodi di implementazione, l'indice vettoriale ANNS può essere classificato in quattro tipi: Ad albero, a grafo, ad hash e a quantizzazione.
Indici supportati in Milvus
Milvus supporta diversi tipi di indici, classificati in base al tipo di incorporazioni vettoriali che gestiscono: incorporazioni in virgola mobile (note anche come vettori in virgola mobile o vettori densi), incorporazioni binarie (note anche come vettori binari) e incorporazioni rade (note anche come vettori radi).
Indici per le incorporazioni in virgola mobile
Per le incorporazioni in virgola mobile (vettori) a 128 dimensioni, la memoria occupata è 128 * la dimensione del float = 512 byte. Le metriche di distanza utilizzate per le incorporazioni in virgola mobile sono la distanza euclidea (L2
) e il prodotto interno (IP
).
Questi tipi di indici includono FLAT
, IVF_FLAT
, IVF_PQ
, IVF_SQ8
, HNSW
e SCANN
per le ricerche di RNA basate su CPU.
Indici per le incorporazioni binarie
Per le incorporazioni binarie a 128 dimensioni, la memoria che occupano è 128 / 8 = 16 byte. Le metriche di distanza utilizzate per le incorporazioni binarie sono JACCARD
e HAMMING
.
Questo tipo di indici include BIN_FLAT
e BIN_IVF_FLAT
.
Indici per le incorporazioni rade
La metrica di distanza supportata per le incorporazioni rade è solo IP
.
I tipi di indici includono SPARSE_INVERTED_INDEX
e SPARSE_WAND
.
Indice supportato | Classificazione | Scenario |
---|---|---|
PIATTO | N/D |
|
FIV_FLAT | Indice basato sulla quantizzazione |
|
IVF_SQ8 | Indice basato sulla quantizzazione |
|
FIV_PQ | Indice basato sulla quantizzazione |
|
HNSW | Indice basato su grafici |
|
SCANN | Indice basato sulla quantizzazione |
|
Indice supportato | Classificazione | Scenario |
---|---|---|
BIN_FLAT | Indice basato sulla quantizzazione |
|
BIN_IVF_FLAT | Indice basato sulla quantizzazione |
|
Indice supportato | Classificazione | Scenario |
---|---|---|
INDICE SPARSO_INVERTITO | Indice invertito |
|
SPARSE_WAND | Indice invertito |
|
PIATTO
Per le applicazioni di ricerca di similarità vettoriale che richiedono una precisione perfetta e dipendono da insiemi di dati relativamente piccoli (su scala di milioni), l'indice FLAT è una buona scelta. FLAT non comprime i vettori ed è l'unico indice in grado di garantire risultati di ricerca esatti. I risultati di FLAT possono anche essere utilizzati come punto di confronto per i risultati prodotti da altri indici che hanno un richiamo inferiore al 100%.
FLAT è accurato perché adotta un approccio esaustivo alla ricerca, il che significa che per ogni query l'input di destinazione viene confrontato con ogni insieme di vettori in un set di dati. Questo rende FLAT l'indice più lento del nostro elenco e poco adatto a interrogare dati vettoriali massicci. Non sono richiesti parametri per l'indice FLAT in Milvus e il suo utilizzo non richiede l'addestramento dei dati.
Parametri di ricerca
Parametro Descrizione Gamma metric_type
[La metrica di distanza scelta. Vedere Metriche supportate.
IVF_FLAT
IVF_FLAT divide i dati vettoriali in unità cluster nlist
e confronta le distanze tra il vettore di input di destinazione e il centro di ciascun cluster. A seconda del numero di cluster che il sistema è impostato per interrogare (nprobe
), i risultati della ricerca di similarità vengono restituiti in base al confronto tra l'input di destinazione e i vettori nei soli cluster più simili, riducendo drasticamente il tempo di interrogazione.
Regolando nprobe
, è possibile trovare un equilibrio ideale tra precisione e velocità per un determinato scenario. I risultati del test sulle prestazioni di IVF_FLAT dimostrano che il tempo di interrogazione aumenta bruscamente all'aumentare del numero di vettori di input target (nq
) e del numero di cluster da ricercare (nprobe
).
IVF_FLAT è l'indice IVF più elementare e i dati codificati memorizzati in ogni unità sono coerenti con i dati originali.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo Valore predefinito nlist
Numero di unità cluster [1, 65536] 128 Parametri di ricerca
Ricerca comune
Parametro Descrizione Intervallo Valore predefinito nprobe
Numero di unità da interrogare [1, nlist] 8 Ricerca dell'intervallo
Parametro Descrizione Intervallo Valore predefinito max_empty_result_buckets
Numero massimo di bucket che non restituiscono alcun risultato di ricerca.
È un parametro di ricerca per intervallo e termina il processo di ricerca quando il numero di bucket vuoti consecutivi raggiunge il valore specificato.
Aumentando questo valore si può migliorare il tasso di richiamo al costo di un aumento del tempo di ricerca.[1, 65535] 2
IVF_SQ8
IVF_FLAT non esegue alcuna compressione, quindi i file di indice che produce hanno più o meno le stesse dimensioni dei dati vettoriali originali non indicizzati. Ad esempio, se il set di dati SIFT 1B originale è di 476 GB, i file di indice IVF_FLAT saranno leggermente più piccoli (~470 GB). Il caricamento di tutti i file di indice in memoria consumerà 470 GB di memoria.
Quando le risorse di memoria del disco, della CPU o della GPU sono limitate, IVF_SQ8 è un'opzione migliore di IVF_FLAT. Questo tipo di indice può convertire ogni FLOAT (4 byte) in UINT8 (1 byte) eseguendo la quantizzazione scalare (SQ). Questo riduce il consumo di memoria su disco, CPU e GPU del 70-75%. Per il set di dati 1B SIFT, i file di indice IVF_SQ8 richiedono solo 140 GB di memoria.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo nlist
Numero di unità di cluster [1, 65536] Parametri di ricerca
Ricerca comune
Parametro Descrizione Intervallo Valore predefinito nprobe
Numero di unità da interrogare [1, nlist] 8 Ricerca dell'intervallo
Parametro Descrizione Intervallo Valore predefinito max_empty_result_buckets
Numero massimo di bucket che non restituiscono alcun risultato di ricerca.
È un parametro di ricerca per intervallo e termina il processo di ricerca quando il numero di bucket vuoti consecutivi raggiunge il valore specificato.
Aumentando questo valore si può migliorare il tasso di richiamo al costo di un aumento del tempo di ricerca.[1, 65535] 2
IVF_PQ
PQ
(Product Quantization) decompone uniformemente lo spazio vettoriale originale ad alta dimensione in prodotti cartesiani di m
spazi vettoriali a bassa dimensione, quindi quantizza gli spazi vettoriali a bassa dimensione decomposti. Invece di calcolare le distanze tra il vettore target e il centro di tutte le unità, la quantizzazione del prodotto consente di calcolare le distanze tra il vettore target e il centro di raggruppamento di ogni spazio a bassa dimensione, riducendo notevolmente la complessità temporale e spaziale dell'algoritmo.
IVF_PQ esegue il clustering dell'indice IVF prima di quantizzare il prodotto dei vettori. Il suo file di indici è ancora più piccolo di IVF_SQ8, ma comporta una perdita di precisione nella ricerca dei vettori.
I parametri di costruzione dell'indice e di ricerca variano a seconda della distribuzione Milvus. Selezionare prima la distribuzione Milvus.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo nlist
Numero di unità di cluster [1, 65536] m
Numero di fattori di quantizzazione del prodotto dim mod m == 0
nbits
[Numero di bit in cui viene memorizzato ogni vettore a bassa dimensione. [1, 64] (8 per impostazione predefinita) Parametri di ricerca
Ricerca comune
Parametro Descrizione Intervallo Valore predefinito nprobe
Numero di unità da interrogare [1, nlist] 8 Ricerca dell'intervallo
Parametro Descrizione Intervallo Valore predefinito max_empty_result_buckets
Numero massimo di bucket che non restituiscono alcun risultato di ricerca.
È un parametro di ricerca per intervallo e termina il processo di ricerca quando il numero di bucket vuoti consecutivi raggiunge il valore specificato.
Aumentando questo valore si può migliorare il tasso di richiamo al costo di un aumento del tempo di ricerca.[1, 65535] 2
SCANN
ScaNN (Scalable Nearest Neighbors) è simile a IVF_PQ in termini di clustering vettoriale e quantizzazione del prodotto. Le differenze risiedono nei dettagli di implementazione della quantizzazione del prodotto e nell'uso di SIMD (Single-Instruction / Multi-data) per un calcolo efficiente.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo nlist
Numero di unità di cluster [1, 65536] with_raw_data
Se includere i dati grezzi nell'indice True
oFalse
. L'impostazione predefinita èTrue
.A differenza di IVF_PQ, i valori predefiniti si applicano a
m
enbits
per ottimizzare le prestazioni.Parametri di ricerca
Ricerca comune
Parametro Descrizione Intervallo Valore predefinito nprobe
Numero di unità da interrogare [1, nlist] reorder_k
Numero di unità candidate da interrogare [ top_k
, ∞]top_k
Ricerca dell'intervallo
Parametro Descrizione Intervallo Valore predefinito max_empty_result_buckets
Numero massimo di bucket che non restituiscono alcun risultato di ricerca.
È un parametro di ricerca per intervallo e termina il processo di ricerca quando il numero di bucket vuoti consecutivi raggiunge il valore specificato.
Aumentando questo valore si può migliorare il tasso di richiamo al costo di un aumento del tempo di ricerca.[1, 65535] 2
HNSW
HNSW (Hierarchical Navigable Small World Graph) è un algoritmo di indicizzazione basato su grafi. Costruisce una struttura di navigazione multistrato per un'immagine in base a determinate regole. In questa struttura, gli strati superiori sono più radi e le distanze tra i nodi sono maggiori; gli strati inferiori sono più densi e le distanze tra i nodi sono maggiori. La ricerca inizia dal livello più alto, trova il nodo più vicino all'obiettivo in questo livello e poi passa al livello successivo per iniziare una nuova ricerca. Dopo diverse iterazioni, è possibile avvicinarsi rapidamente alla posizione del target.
Per migliorare le prestazioni, HNSW limita il grado massimo dei nodi su ciascun livello del grafo a M
. Inoltre, è possibile utilizzare efConstruction
(quando si costruisce l'indice) o ef
(quando si cercano i target) per specificare un intervallo di ricerca.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo M
M definisce il numero massimo di connessioni in uscita nel grafico. Un numero più alto di M porta a una maggiore precisione/tempo di esecuzione a ef/efCostruzione fissa. [2, 2048] efConstruction
ef_construction controlla il compromesso tra velocità di ricerca e velocità di costruzione dell'indice. L'aumento del parametro efConstruction può migliorare la qualità dell'indice, ma tende anche ad allungare i tempi di indicizzazione. [1, int_max] Parametri di ricerca
Parametro Descrizione Intervallo ef
Parametro che controlla il compromesso tempo di ricerca/accuratezza. Un valore più alto di ef
porta a una ricerca più accurata ma più lenta.[ top_k
, int_max]
BIN_FLAT
Questo indice è esattamente uguale a FLAT, ma può essere usato solo per le incorporazioni binarie.
Per le applicazioni di ricerca di similarità vettoriale che richiedono una precisione perfetta e dipendono da insiemi di dati relativamente piccoli (su scala di milioni), l'indice BIN_FLAT è una buona scelta. BIN_FLAT non comprime i vettori ed è l'unico indice in grado di garantire risultati di ricerca esatti. I risultati di BIN_FLAT possono anche essere utilizzati come punto di confronto per i risultati prodotti da altri indici che hanno un richiamo inferiore al 100%.
BIN_FLAT è preciso perché adotta un approccio esaustivo alla ricerca, il che significa che per ogni query l'input di destinazione viene confrontato con i vettori di un set di dati. Questo rende BIN_FLAT l'indice più lento del nostro elenco e poco adatto a interrogare dati vettoriali massicci. Non ci sono parametri per l'indice BIN_FLAT in Milvus e il suo utilizzo non richiede una formazione dei dati o una memorizzazione aggiuntiva.
Parametri di ricerca
Parametro Descrizione Intervallo metric_type
[La metrica di distanza scelta. Vedere Metriche supportate.
BIN_IVF_FLAT
Questo indice è esattamente uguale a IVF_FLAT, ma può essere usato solo per le incorporazioni binarie.
BIN_IVF_FLAT divide i dati vettoriali in unità di cluster nlist
e poi confronta le distanze tra il vettore di input target e il centro di ciascun cluster. A seconda del numero di cluster che il sistema è impostato per interrogare (nprobe
), i risultati della ricerca di similarità vengono restituiti in base al confronto tra l'input di destinazione e i vettori nei cluster più simili, riducendo drasticamente il tempo di interrogazione.
Regolando nprobe
, è possibile trovare un equilibrio ideale tra precisione e velocità per un determinato scenario. Il tempo di interrogazione aumenta bruscamente all'aumentare del numero di vettori di input target (nq
) e del numero di cluster da ricercare (nprobe
).
BIN_IVF_FLAT è l'indice BIN_IVF più semplice e i dati codificati memorizzati in ogni unità sono coerenti con i dati originali.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo nlist
Numero di unità di cluster [1, 65536] Parametri di ricerca
Ricerca comune
Parametro Descrizione Intervallo Valore predefinito nprobe
Numero di unità da interrogare [1, nlist] 8 Ricerca dell'intervallo
Parametro Descrizione Intervallo Valore predefinito max_empty_result_buckets
Numero massimo di bucket che non restituiscono alcun risultato di ricerca.
È un parametro di ricerca per intervallo e termina il processo di ricerca quando il numero di bucket vuoti consecutivi raggiunge il valore specificato.
Aumentando questo valore si può migliorare il tasso di richiamo al costo di un aumento del tempo di ricerca.[1, 65535] 2
INDICE SPARSE_INVERTITO
Ogni dimensione mantiene un elenco di vettori che hanno un valore non nullo in quella dimensione. Durante la ricerca, Milvus itera attraverso ogni dimensione del vettore di interrogazione e calcola i punteggi per i vettori che hanno valori non nulli in quelle dimensioni.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo drop_ratio_build
Percentuale di valori piccoli del vettore che vengono esclusi durante il processo di indicizzazione. Questa opzione consente di regolare con precisione il processo di indicizzazione, stabilendo un compromesso tra efficienza e accuratezza, ignorando i valori piccoli durante la costruzione dell'indice. [0, 1] Parametri di ricerca
Parametro Descrizione Intervallo drop_ratio_search
Percentuale di valori piccoli del vettore che vengono esclusi durante il processo di ricerca. Questa opzione consente di regolare con precisione il processo di ricerca, specificando la proporzione dei valori più piccoli del vettore di query da ignorare. Aiuta a bilanciare la precisione della ricerca e le prestazioni. Più piccolo è il valore impostato per drop_ratio_search
, meno questi valori piccoli contribuiscono al punteggio finale. Ignorando alcuni valori piccoli, è possibile migliorare le prestazioni della ricerca con un impatto minimo sulla precisione.[0, 1]
BANDA SPARSA
Questo indice presenta analogie con SPARSE_INVERTED_INDEX
, ma utilizza l'algoritmo Weak-AND per ridurre ulteriormente il numero di valutazioni della distanza IP completa durante il processo di ricerca.
In base ai nostri test, SPARSE_WAND
supera generalmente gli altri metodi in termini di velocità. Tuttavia, le sue prestazioni possono deteriorarsi rapidamente all'aumentare della densità dei vettori. Per risolvere questo problema, l'introduzione di un drop_ratio_search
non nullo può migliorare significativamente le prestazioni, con una perdita minima di precisione. Per ulteriori informazioni, consultare Vettore sparso.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo drop_ratio_build
Percentuale di valori vettoriali piccoli che vengono esclusi durante il processo di indicizzazione. Questa opzione consente di regolare con precisione il processo di indicizzazione, stabilendo un compromesso tra efficienza e accuratezza, ignorando i valori piccoli durante la costruzione dell'indice. [0, 1] Parametri di ricerca
Parametro Descrizione Intervallo drop_ratio_search
Percentuale di valori piccoli del vettore che vengono esclusi durante il processo di ricerca. Questa opzione consente di regolare con precisione il processo di ricerca, specificando la proporzione dei valori più piccoli del vettore di query da ignorare. Aiuta a bilanciare la precisione della ricerca e le prestazioni. Più piccolo è il valore impostato per drop_ratio_search
, meno questi valori piccoli contribuiscono al punteggio finale. Ignorando alcuni valori piccoli, è possibile migliorare le prestazioni della ricerca con un impatto minimo sulla precisione.[0, 1]
FAQ
Qual è la differenza tra indice FLAT e indice IVF_FLAT?
L'indice IVF_FLAT divide uno spazio vettoriale in nlist
cluster. Se si mantiene il valore predefinito di nlist
come 16384, Milvus confronta le distanze tra il vettore di destinazione e i centri di tutti i 16384 cluster per ottenere i cluster nprobe
più vicini. Quindi Milvus confronta le distanze tra il vettore target e i vettori nei cluster selezionati per ottenere i vettori più vicini. A differenza di IVF_FLAT, FLAT confronta direttamente le distanze tra il vettore target e ogni singolo vettore.
Pertanto, quando il numero totale di vettori è all'incirca pari a nlist
, IVF_FLAT e FLAT presentano poche differenze nel modo di calcolo richiesto e nelle prestazioni di ricerca. Ma quando il numero di vettori cresce fino a due volte, tre volte o n volte nlist
, l'indice IVF_FLAT inizia a mostrare vantaggi sempre maggiori.
Per ulteriori informazioni, vedere Come scegliere un indice in Milvus.
Cosa c'è dopo
- Per saperne di più sulle metriche di somiglianza supportate da Milvus.