milvus-logo
LFAI
Casa
  • Concetti

Indice in-memory

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.

Attualmente, un campo vettoriale supporta solo un tipo di indice. Milvus cancella automaticamente il vecchio indice quando si cambia tipo di indice.

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
  • Set di dati relativamente piccolo
  • Richiede un tasso di richiamo del 100%.
FIV_FLAT Indice basato sulla quantizzazione
  • Interrogazione ad alta velocità
  • Richiede un tasso di richiamo il più alto possibile
IVF_SQ8 Indice basato sulla quantizzazione
  • Interrogazione ad alta velocità
  • Risorse di memoria limitate
  • Accetta un piccolo compromesso nel tasso di richiamo
FIV_PQ Indice basato sulla quantizzazione
  • Interrogazione ad altissima velocità
  • Risorse di memoria limitate
  • Accetta un compromesso sostanziale nel tasso di richiamo
HNSW Indice basato su grafici
  • Interrogazione ad altissima velocità
  • Richiede un tasso di richiamo il più alto possibile
  • Grandi risorse di memoria
SCANN Indice basato sulla quantizzazione
  • Interrogazione ad altissima velocità
  • Richiede un tasso di richiamo il più alto possibile
  • Grandi risorse di memoria
Indice supportato Classificazione Scenario
BIN_FLAT Indice basato sulla quantizzazione
  • Dipende da insiemi di dati relativamente piccoli.
  • Richiede una precisione perfetta.
  • Non si applica alcuna compressione.
  • Garantisce risultati di ricerca esatti.
BIN_IVF_FLAT Indice basato sulla quantizzazione
  • Interrogazione ad alta velocità
  • Richiede un tasso di richiamo il più alto possibile
Indice supportato Classificazione Scenario
INDICE SPARSO_INVERTITO Indice invertito
  • Dipende da insiemi di dati relativamente piccoli.
  • Richiede un tasso di richiamo del 100%.
SPARSE_WAND Indice invertito
  • AlgoritmoWeak-AND accelerato
  • Può ottenere un significativo miglioramento della velocità sacrificando solo una piccola quantità di richiamo.

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

    ParametroDescrizioneGamma
    metric_type[La metrica di distanza scelta.Vedere Metriche supportate.

IVF_FLAT

IVF_FLAT divide i dati vettoriali in unità di cluster nlist, quindi 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

    ParametroDescrizioneIntervalloValore predefinito
    nlistNumero di unità cluster[1, 65536]128
  • Parametri di ricerca

    • Ricerca comune

      ParametroDescrizioneIntervalloValore predefinito
      nprobeNumero di unità da interrogare[1, nlist]8
    • Ricerca dell'intervallo

      ParametroDescrizioneIntervalloValore predefinito
      max_empty_result_bucketsNumero 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

    ParametroDescrizioneIntervallo
    nlistNumero di unità di cluster[1, 65536]
  • Parametri di ricerca

    • Ricerca comune

      ParametroDescrizioneIntervalloValore predefinito
      nprobeNumero di unità da interrogare[1, nlist]8
    • Ricerca dell'intervallo

      ParametroDescrizioneIntervalloValore predefinito
      max_empty_result_bucketsNumero 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

    ParametroDescrizioneIntervallo
    nlistNumero di unità di cluster[1, 65536]
    mNumero di fattori di quantizzazione del prodottodim 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

      ParametroDescrizioneIntervalloValore predefinito
      nprobeNumero di unità da interrogare[1, nlist]8
    • Ricerca dell'intervallo

      ParametroDescrizioneIntervalloValore predefinito
      max_empty_result_bucketsNumero 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

    ParametroDescrizioneIntervallo
    nlistNumero di unità di cluster[1, 65536]
    with_raw_dataSe includere i dati grezzi nell'indiceTrue o False. L'impostazione predefinita è True.

    A differenza di IVF_PQ, i valori predefiniti si applicano a m e nbits per ottimizzare le prestazioni.

  • Parametri di ricerca

    • Ricerca comune

      ParametroDescrizioneIntervalloValore predefinito
      nprobeNumero di unità da interrogare[1, nlist]
      reorder_kNumero di unità candidate da interrogare[top_k, ∞]top_k
    • Ricerca dell'intervallo

      ParametroDescrizioneIntervalloValore predefinito
      max_empty_result_bucketsNumero 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, può 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

    ParametroDescrizioneIntervallo
    MM 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]
    efConstructionef_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

    ParametroDescrizioneIntervallo
    efParametro 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

    ParametroDescrizioneIntervallo
    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

    ParametroDescrizioneIntervallo
    nlistNumero di unità di cluster[1, 65536]
  • Parametri di ricerca

    • Ricerca comune

      ParametroDescrizioneIntervalloValore predefinito
      nprobeNumero di unità da interrogare[1, nlist]8
    • Ricerca dell'intervallo

      ParametroDescrizioneIntervalloValore predefinito
      max_empty_result_bucketsNumero 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

    ParametroDescrizioneIntervallo
    drop_ratio_buildPercentuale 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

    ParametroDescrizioneIntervallo
    drop_ratio_searchPercentuale 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

    ParametroDescrizioneIntervallo
    drop_ratio_buildPercentuale 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

    ParametroDescrizioneIntervallo
    drop_ratio_searchPercentuale 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

Tradotto daDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?