Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale
Dalla computer vision alla scoperta di nuovi farmaci, i motori di ricerca per similarità vettoriale sono alla base di molte applicazioni di intelligenza artificiale (AI) molto diffuse. Una componente importante di ciò che rende possibile interrogare in modo efficiente i dataset di milioni, miliardi o addirittura trilioni di vettori su cui si basano i motori di ricerca per similarità è l'indicizzazione, un processo di organizzazione dei dati che accelera drasticamente la ricerca sui big data. Questo articolo illustra il ruolo dell'indicizzazione nel rendere efficiente la ricerca per similarità vettoriale, i diversi tipi di indici di file invertiti vettoriali (IVF) e i consigli su quale indice utilizzare in diversi scenari.
Vai a:
- Accelerazione della ricerca per similarità su dati molto grandi con l'indicizzazione vettoriale
- In che modo l'indicizzazione vettoriale accelera la ricerca per similarità e l'apprendimento automatico?
- Quali sono i diversi tipi di indici FIV e per quali scenari sono più adatti?
- FLAT: Ottimo per la ricerca di insiemi di dati relativamente piccoli (su scala milionaria) quando è richiesto un richiamo del 100%.
- IVF_FLAT: Migliora la velocità a scapito della precisione (e viceversa).
- IVF_SQ8: più veloce e meno avido di risorse di IVF_FLAT, ma anche meno accurato.
- IVF_SQ8H: nuovo approccio ibrido GPU/CPU ancora più veloce di IVF_SQ8.
- Per saperne di più su Milvus, una piattaforma di gestione dei dati vettoriali su larga scala.
- Metodologia
In che modo l'indicizzazione vettoriale accelera la ricerca per similarità e l'apprendimento automatico?
I motori di ricerca per similarità funzionano confrontando un input con un database per trovare gli oggetti più simili all'input. L'indicizzazione è il processo di organizzazione efficiente dei dati e svolge un ruolo fondamentale nel rendere utile la ricerca per similarità, accelerando drasticamente le interrogazioni che richiedono molto tempo su grandi insiemi di dati. Una volta indicizzato un enorme insieme di dati vettoriali, le query possono essere indirizzate verso i cluster, o sottoinsiemi di dati, che hanno maggiori probabilità di contenere vettori simili alla query di input. In pratica, questo significa sacrificare un certo grado di accuratezza per velocizzare le interrogazioni su dati vettoriali molto grandi.
Si può fare un'analogia con un dizionario, dove le parole sono ordinate alfabeticamente. Quando si cerca una parola, è possibile navigare rapidamente verso una sezione che contiene solo parole con la stessa iniziale, accelerando drasticamente la ricerca della definizione della parola inserita.
Quali sono i diversi tipi di indici FIV e per quali scenari sono più adatti?
Esistono numerosi indici progettati per la ricerca di similarità vettoriali ad alta dimensione, e ognuno di essi comporta dei compromessi in termini di prestazioni, precisione e requisiti di archiviazione. Questo articolo tratta di diversi tipi di indici FIV comuni, dei loro punti di forza e di debolezza e dei risultati dei test sulle prestazioni per ciascun tipo di indice. I test sulle prestazioni quantificano i tempi di interrogazione e i tassi di richiamo per ciascun tipo di indice in Milvus, una piattaforma open source per la gestione dei dati vettoriali. Per ulteriori informazioni sull'ambiente di test, consultare la sezione metodologia in fondo a questo articolo.
FLAT: Ottimo per la ricerca di insiemi di dati relativamente piccoli (su scala milionaria) quando è richiesto un richiamo del 100%.
Per le applicazioni di ricerca per similarità vettoriale che richiedono una precisione perfetta e dipendono da insiemi di dati relativamente piccoli (su scala milionaria), 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 vettore di un set di dati. Per questo motivo FLAT è l'indice più lento del nostro elenco e non è adatto all'interrogazione di dati vettoriali massicci. Non ci sono parametri per l'indice FLAT in Milvus e il suo utilizzo non richiede la formazione dei dati o la memorizzazione aggiuntiva.
Risultati dei test sulle prestazioni di FLAT:
Il test delle prestazioni del tempo di interrogazione FLAT è stato condotto in Milvus utilizzando un set di dati composto da 2 milioni di vettori a 128 dimensioni.
Blog_Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale_2.png
Principali risultati:
- All'aumentare di nq (il numero di vettori target per una query), aumenta il tempo di interrogazione.
- Utilizzando l'indice FLAT in Milvus, si può notare che il tempo di interrogazione aumenta bruscamente una volta che nq supera 200.
- In generale, l'indice FLAT è più veloce e coerente quando Milvus viene eseguito su GPU rispetto alla CPU. Tuttavia, le query FLAT su CPU sono più veloci quando nq è inferiore a 20.
IVF_FLAT: Migliora la velocità a scapito della precisione (e viceversa).
Un modo comune per accelerare il processo di ricerca delle somiglianze a scapito dell'accuratezza è quello di condurre una ricerca approssimativa dei vicini (ANN). Gli algoritmi RNA riducono i requisiti di memorizzazione e il carico di calcolo raggruppando i vettori simili, rendendo più veloce la ricerca vettoriale. IVF_FLAT è il tipo di indice di file invertito più semplice e si basa su una forma di ricerca ANN.
IVF_FLAT divide i dati vettoriali in un certo numero di unità di cluster (nlist), quindi 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. I risultati del nostro test sulle prestazioni di IVF_FLAT dimostrano che il tempo di interrogazione aumenta drasticamente all'aumentare del numero di vettori di input target (nq) e del numero di cluster da ricercare (nprobe). IVF_FLAT non comprime i dati vettoriali, tuttavia i file di indice includono metadati che aumentano marginalmente i requisiti di archiviazione rispetto al set di dati vettoriali grezzi non indicizzati.
Risultati dei test sulle prestazioni di IVF_FLAT:
I test sulle prestazioni dei tempi di interrogazione di IVF_FLAT sono stati condotti in Milvus utilizzando il dataset pubblico 1B SIFT, che contiene 1 miliardo di vettori a 128 dimensioni.
Blog_Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale_3.png
Aspetti salienti:
- Quando viene eseguito su CPU, il tempo di interrogazione per l'indice IVF_FLAT in Milvus aumenta con nprobe e nq. Ciò significa che più vettori di input contiene una query o più cluster ricerca, più lungo sarà il tempo di interrogazione.
- Su GPU, l'indice mostra una minore variazione di tempo rispetto alle variazioni di nq e nprobe. Questo perché i dati dell'indice sono di grandi dimensioni e la copia dei dati dalla memoria della CPU a quella della GPU rappresenta la maggior parte del tempo totale della query.
- In tutti gli scenari, tranne quando nq = 1.000 e nprobe = 32, l'indice IVF_FLAT è più efficiente se eseguito su CPU.
Il test delle prestazioni di richiamo di IVF_FLAT è stato condotto in Milvus utilizzando sia il dataset pubblico 1M SIFT, che contiene 1 milione di vettori a 128 dimensioni, sia il dataset glove-200-angular, che contiene 1+ milione di vettori a 200 dimensioni, per la costruzione dell'indice (nlist = 16.384).
Blog_Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale_4.png
Aspetti salienti:
- L'indice IVF_FLAT può essere ottimizzato per l'accuratezza, raggiungendo un tasso di richiamo superiore a 0,99 sul set di dati SIFT da 1M quando nprobe = 256.
IVF_SQ8: più veloce e meno avido di risorse di IVF_FLAT, ma anche meno accurato.
IVF_FLAT non esegue alcuna compressione, quindi i file di indice che produce hanno all'incirca 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ù grandi (~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 una quantizzazione scalare. 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.
Risultati dei test sulle prestazioni di IVF_SQ8:
I test sui tempi di interrogazione di IVF_SQ8 sono stati condotti in Milvus utilizzando il dataset pubblico 1B SIFT, che contiene 1 miliardo di vettori a 128 dimensioni, per la costruzione dell'indice.
Blog_Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale_5.png
Aspetti salienti:
- Riducendo le dimensioni dei file di indice, IVF_SQ8 offre notevoli miglioramenti delle prestazioni rispetto a IVF_FLAT. IVF_SQ8 segue una curva di prestazioni simile a IVF_FLAT, con tempi di interrogazione che aumentano con nq e nprobe.
- Analogamente a IVF_FLAT, IVF_SQ8 registra prestazioni più elevate quando viene eseguito sulla CPU e quando nq e nprobe sono più piccoli.
Il test delle prestazioni di richiamo di IVF_SQ8 è stato condotto in Milvus utilizzando sia il dataset pubblico 1M SIFT, che contiene 1 milione di vettori a 128 dimensioni, sia il dataset glove-200-angular, che contiene 1+ milione di vettori a 200 dimensioni, per la costruzione dell'indice (nlist = 16.384).
Blog_Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale_6.png
Aspetti salienti:
- Nonostante la compressione dei dati originali, IVF_SQ8 non registra una diminuzione significativa dell'accuratezza delle query. Con diverse impostazioni di nprobe, IVF_SQ8 ha al massimo un tasso di richiamo inferiore dell'1% rispetto a IVF_FLAT.
IVF_SQ8H: nuovo approccio ibrido GPU/CPU ancora più veloce di IVF_SQ8.
IVF_SQ8H è un nuovo tipo di indice che migliora le prestazioni delle query rispetto a IVF_SQ8. Quando un indice IVF_SQ8 eseguito su CPU viene interrogato, la maggior parte del tempo totale di interrogazione viene impiegato per trovare i cluster nprobe più vicini al vettore di input di destinazione. Per ridurre il tempo di interrogazione, IVF_SQ8 copia i dati per le operazioni di quantizzazione grossolana, che sono più piccoli dei file dell'indice, nella memoria della GPU, accelerando notevolmente le operazioni di quantizzazione grossolana. Quindi gpu_search_threshold determina quale dispositivo esegue la query. Quando nq >= gpu_search_threshold, la GPU esegue la query; altrimenti, la CPU esegue la query.
IVF_SQ8H è un tipo di indice ibrido che richiede la collaborazione di CPU e GPU. Può essere utilizzato solo con Milvus abilitato alle GPU.
Risultati dei test sulle prestazioni di IVF_SQ8H:
Il test delle prestazioni del tempo di interrogazione IVF_SQ8H è stato condotto in Milvus utilizzando il dataset pubblico 1B SIFT, che contiene 1 miliardo di vettori a 128 dimensioni, per la costruzione dell'indice.
Blog_Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale_7.png
Aspetti salienti:
- Quando nq è inferiore o uguale a 1.000, IVF_SQ8H registra tempi di interrogazione quasi doppi rispetto a IVFSQ8.
- Quando nq = 2000, i tempi di interrogazione per IVFSQ8H e IVF_SQ8 sono uguali. Tuttavia, se il parametro gpu_search_threshold è inferiore a 2000, IVF_SQ8H supera IVF_SQ8.
- Il tasso di richiamo delle query di IVF_SQ8H è identico a quello di IVF_SQ8, il che significa che si ottiene un minor tempo di interrogazione senza alcuna perdita in termini di accuratezza della ricerca.
Per saperne di più su Milvus, una piattaforma di gestione dei dati vettoriali su larga scala.
Milvus è una piattaforma di gestione dei dati vettoriali in grado di alimentare applicazioni di ricerca per similarità in campi che spaziano dall'intelligenza artificiale all'apprendimento profondo, ai calcoli vettoriali tradizionali e altro ancora. Per ulteriori informazioni su Milvus, consultate le seguenti risorse:
- Milvus è disponibile con licenza open-source su GitHub.
- In Milvus sono supportati altri tipi di indici, compresi quelli a grafo e ad albero. Per un elenco completo dei tipi di indice supportati, vedere la documentazione sugli indici vettoriali in Milvus.
- Per saperne di più sull'azienda che ha lanciato Milvus, visitate Zilliz.com.
- Chiacchierate con la comunità di Milvus o chiedete aiuto per un problema su Slack.
Metodologia
Ambiente di test delle prestazioni
La configurazione del server utilizzata per i test delle prestazioni citati in questo articolo è la seguente:
- Intel ® Xeon ® Platinum 8163 @ 2,50GHz, 24 core
- GeForce GTX 2080Ti x 4
- 768 GB di memoria
Concetti tecnici rilevanti
Sebbene non siano necessari per la comprensione di questo articolo, ecco alcuni concetti tecnici utili per interpretare i risultati dei nostri test sulle prestazioni degli indici:
Blog_Accelerazione della ricerca di similarità su dati veramente grandi con l'indicizzazione vettoriale_8.png
Risorse
Per questo articolo sono state utilizzate le seguenti fonti:
- "Enciclopedia dei sistemi di database", Ling Liu e M. Tamer Özsu.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word