Indice GPU
Milvus supporta diversi tipi di indici GPU per accelerare le prestazioni e l'efficienza della ricerca, soprattutto in scenari ad alto rendimento e ad alto richiamo. Questo argomento fornisce una panoramica dei tipi di indice GPU supportati da Milvus, dei casi d'uso adatti e delle caratteristiche delle prestazioni. Per informazioni sulla creazione di indici con le GPU, consultare la sezione Indici con le GPU.
È importante notare che l'uso di un indice GPU non necessariamente riduce la latenza rispetto all'uso di un indice CPU. Per massimizzare al massimo il throughput, è necessaria una pressione di richiesta estremamente elevata o un numero elevato di vettori di query.
prestazioni
Il supporto GPU di Milvus è fornito dal team Nvidia RAPIDS. I tipi di indice GPU attualmente supportati da Milvus sono i seguenti.
GPU_CAGRA
GPU_CAGRA è un indice a grafo ottimizzato per le GPU. L'uso di GPU di livello inferenza per eseguire la versione GPU di Milvus può essere più conveniente rispetto all'uso di costose GPU di livello addestramento.
Parametri di costruzione dell'indice
Parametro Descrizione Valore predefinito intermediate_graph_degree
Influenza il richiamo e il tempo di costruzione determinando il grado del grafo prima della potatura. I valori consigliati sono 32
o64
.128
graph_degree
Influisce sulle prestazioni della ricerca e sul richiamo impostando il grado del grafo dopo la potatura. Una differenza maggiore tra questi due gradi comporta un tempo di costruzione più lungo. Il suo valore deve essere inferiore al valore di intermediate_graph_degree. 64
build_algo
Seleziona l'algoritmo di generazione del grafo prima della potatura. Valori possibili: IVF_PQ
: Offre una qualità superiore ma un tempo di costruzione più lento.NN_DESCENT
Fornisce una creazione più rapida con un richiamo potenzialmente inferiore.IVF_PQ
cache_dataset_on_device
Decide se memorizzare nella cache il set di dati originale nella memoria della GPU. Valori possibili: “true”
: Mette in cache il set di dati originale per migliorare il richiamo affinando i risultati della ricerca.“false”
Non memorizza nella cache il set di dati originale per risparmiare memoria della GPU.“false”
Parametri di ricerca
Parametro Descrizione Valore predefinito itopk_size
Determina la dimensione dei risultati intermedi conservati durante la ricerca. Un valore maggiore può migliorare il richiamo a scapito delle prestazioni della ricerca. Dovrebbe essere almeno uguale al valore finale top-k (limite) e di solito è una potenza di 2 (ad esempio, 16, 32, 64, 128). Vuoto search_width
Specifica il numero di punti di ingresso nel grafo CAGRA durante la ricerca. L'aumento di questo valore può migliorare il richiamo, ma può influire sulle prestazioni della ricerca (es. 1, 2, 4, 8, 16, 32). Vuoto min_iterations
/max_iterations
Controlla il processo di iterazione della ricerca. Per impostazione predefinita, sono impostati su 0
, e CAGRA determina automaticamente il numero di iterazioni in base aitopk_size
esearch_width
. La regolazione manuale di questi valori può aiutare a bilanciare prestazioni e precisione.0
team_size
Specifica il numero di thread CUDA utilizzati per il calcolo della distanza metrica sulla GPU. I valori più comuni sono una potenza di 2 fino a 32 (ad esempio, 2, 4, 8, 16, 32). Ha un impatto minimo sulle prestazioni della ricerca. Il valore predefinito è 0
, dove Milvus seleziona automaticamenteteam_size
in base alla dimensione del vettore.0
Limiti di ricerca
Parametro Intervallo limit
(top-K)<= 1024 limit
(top-K)<=max(( itopk_size
+ 31)// 32,search_width
) * 32
GPU_IVF_FLAT
Simile a IVF_FLAT, anche GPU_IVF_FLAT divide i dati vettoriali in unità 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 soli cluster più simili, riducendo drasticamente i tempi di interrogazione.
Regolando nprobe
, è possibile trovare un equilibrio ideale tra precisione e velocità per un determinato scenario. I risultati del test delle 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
).
GPU_IVF_FLAT è l'indice IVF più elementare e i dati codificati memorizzati in ogni unità sono coerenti con i dati originali.
Quando si effettuano le ricerche, è possibile impostare il top-K fino a 256 per qualsiasi ricerca su una raccolta indicizzata con GPU_IVF_FLAT.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo Valore predefinito nlist
Numero di unità cluster [1, 65536] 128
cache_dataset_on_device
Decide se memorizzare nella cache il set di dati originale nella memoria della GPU. Valori possibili: “true”
: Mette in cache il set di dati originale per migliorare il richiamo raffinando i risultati della ricerca.“false”
Non memorizza nella cache il set di dati originale per risparmiare memoria della GPU."true"
"flase"
"false"
Parametri di ricerca
Ricerca comune
Parametro Descrizione Intervallo Valore predefinito nprobe
Numero di unità da interrogare [1, nlist] 8
Limiti di ricerca
Parametro Intervallo limit
(top-K)<= 2048
GPU_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.
Quando si effettuano le ricerche, è possibile impostare il top-K fino a 8192 per qualsiasi ricerca su una collezione indicizzata GPU_IVF_FLAT.
Parametri di costruzione dell'indice
Parametro Descrizione Intervallo Valore predefinito nlist
Numero di unità cluster [1, 65536] 128
m
Numero di fattori di quantizzazione del prodotto, dim mod m or = 0
0
nbits
[Numero di bit in cui viene memorizzato ogni vettore a bassa dimensione. [1, 16] 8
cache_dataset_on_device
Decide se memorizzare nella cache il set di dati originale nella memoria della GPU. Valori possibili: “true”
: Mette in cache il set di dati originale per migliorare il richiamo affinando i risultati della ricerca.“false”
Non memorizza nella cache il set di dati originale per risparmiare memoria della GPU."true"
"false"
"false"
Parametri di ricerca
Ricerca comune
Parametro Descrizione Intervallo Valore predefinito nprobe
Numero di unità da interrogare [1, nlist] 8
Limiti di ricerca
Parametro Intervallo limit
(top-K)<= 1024
GPU_BRUTE_FORCE
GPU_BRUTE_FORCE è stato pensato per i casi in cui è fondamentale un richiamo estremamente elevato, garantendo un richiamo pari a 1 confrontando ogni query con tutti i vettori del set di dati. Richiede solo il tipo di metrica (metric_type
) e top-k (limit
) come parametri di costruzione e ricerca dell'indice.
Per GPU_BRUTE_FORCE non sono necessari altri parametri di costruzione dell'indice o di ricerca.
Conclusione
Attualmente, Milvus carica tutti gli indici nella memoria della GPU per rendere efficienti le operazioni di ricerca. La quantità di dati che può essere caricata dipende dalla dimensione della memoria della GPU:
- GPU_CAGRA: l'utilizzo della memoria è circa 1,8 volte quello dei dati vettoriali originali.
- GPU_IVF_FLAT e GPU_BRUTE_FORCE: Richiedono una memoria pari alla dimensione dei dati originali.
- GPU_IVF_PQ: utilizza un ingombro di memoria inferiore, che dipende dalle impostazioni dei parametri di compressione.