Panoramica dell'indice GPU
La creazione di un indice con il supporto delle GPU in Milvus può migliorare significativamente le prestazioni di ricerca in scenari ad alto throughput e ad alto richiamo.
La figura seguente confronta il throughput delle query (query al secondo) tra le configurazioni dell'indice, le configurazioni hardware, i dataset vettoriali (Cohere e OpenAI) e le dimensioni dei batch di ricerca, dimostrando che GPU_CAGRA supera costantemente gli altri metodi.
Prestazioni dell'indice Gpu
Configurazione del pool di memoria della GPU per Milvus
Milvus supporta un pool di memoria GPU globale e fornisce due parametri di configurazione, initMemSize e maxMemSize, nel file di configurazione di Milvus.
gpu:
initMemSize: 0 # set the initial memory pool size.
maxMemSize: 0 # sets the maximum memory usage limit. When the memory usage exceeds initMemSize, Milvus will attempt to expand the memory pool.
Il valore predefinito di initMemSize è solitamente la metà della memoria della GPU all'avvio di Milvus, mentre quello di maxMemSize è l'intera memoria della GPU. La dimensione del pool di memoria della GPU è inizialmente impostata su initMemSize e si espanderà automaticamente a maxMemSize quando necessario.
Quando viene specificato un indice abilitato alla GPU, Milvus carica i dati della raccolta di destinazione nella memoria della GPU prima di effettuare le ricerche, quindi maxMemSize deve essere almeno la dimensione dei dati.
Limiti
Per
GPU_IVF_FLAT, il valore massimo perlimitè 1.024.Per
GPU_IVF_PQeGPU_CAGRA, il valore massimo perlimitè 1.024.Sebbene non vi sia un valore impostato per
limitperGPU_BRUTE_FORCE, si consiglia di non superare i 4.096 per evitare potenziali problemi di prestazioni.Attualmente, gli indici della GPU non supportano la distanza
COSINE. Se è necessaria la distanzaCOSINE, i dati devono essere prima normalizzati e poi si può usare la distanza del prodotto interno (IP) come sostituto.Il caricamento della protezione OOM per gli indici GPU non è pienamente supportato, una quantità eccessiva di dati potrebbe causare l'arresto anomalo del QueryNode.
Gli indici GPU non supportano funzioni di ricerca come la ricerca per intervallo e la ricerca per raggruppamento.
Tipi di indice GPU supportati
La seguente tabella elenca i tipi di indice GPU supportati da Milvus.
Tipo di indice |
Descrizione |
Uso della memoria |
|---|---|---|
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. |
L'utilizzo della memoria è circa 1,8 volte quello dei dati vettoriali originali. |
|
GPU_IVF_FLAT è l'indice IVF più semplice e i dati codificati memorizzati in ogni unità sono coerenti con i dati originali. Quando si effettuano ricerche, è possibile impostare il top-k ( |
Richiede una memoria pari alla dimensione dei dati originali. |
|
GPU_IVF_PQ esegue il raggruppamento degli indici IVF prima di quantizzare il prodotto dei vettori. Quando si effettuano le ricerche, è possibile impostare il top-k ( |
Utilizza un ingombro di memoria minore, che dipende dalle impostazioni dei parametri di compressione. |
|
GPU_BRUTE_FORCE è stato pensato per i casi in cui è fondamentale un richiamo estremamente elevato, garantendo un richiamo di 1 confrontando ogni query con tutti i vettori del set di dati. Richiede solo il tipo di metrica ( |
Richiede una memoria pari alla dimensione dei dati originali. |
Configurare le impostazioni di Milvus per il controllo della memoria della GPU
Milvus utilizza un pool di memoria grafica globale per allocare la memoria della GPU. Supporta due parametri initMemSize e maxMemSize nel file di configurazione di Milvus. La dimensione del pool è inizialmente impostata su initMemSize e verrà automaticamente espansa a maxMemSize dopo aver superato questo limite.
Il valore predefinito di initMemSize è pari a 1/2 della memoria della GPU disponibile all'avvio di Milvus, mentre il valore predefinito di maxMemSize è pari a tutta la memoria della GPU disponibile.
Fino a Milvus 2.4.1, Milvus utilizza un pool di memoria GPU unificato. Per le versioni precedenti alla 2.4.1, si raccomandava di impostare entrambi i valori a 0.
gpu:
initMemSize: 0 #set the initial memory pool size.
maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
A partire da Milvus 2.4.1, il pool di memoria GPU viene utilizzato solo per i dati temporanei della GPU durante le ricerche. Pertanto, si consiglia di impostare i valori 2048 e 4096.
gpu:
initMemSize: 2048 #set the initial memory pool size.
maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool.
Per sapere come costruire un indice GPU, consultare la guida specifica per ogni tipo di indice.
DOMANDE FREQUENTI
Quando è opportuno utilizzare un indice GPU?
Un indice GPU è particolarmente vantaggioso in situazioni che richiedono un'elevata velocità di elaborazione o di richiamo. Ad esempio, quando si tratta di batch di grandi dimensioni, il throughput dell'indicizzazione su GPU può superare di ben 100 volte quello dell'indicizzazione su CPU. In scenari con batch più piccoli, gli indici su GPU superano comunque in modo significativo gli indici su CPU in termini di prestazioni. Inoltre, se è richiesto un inserimento rapido dei dati, l'integrazione di una GPU può accelerare notevolmente il processo di creazione degli indici.
In quali scenari sono più adatti gli indici su GPU come GPU_CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT e GPU_BRUTE_FORCE?
GPU_CAGRAGli indici GPU sono ideali per gli scenari che richiedono prestazioni migliori, anche se a costo di consumare più memoria. Per gli ambienti in cui la conservazione della memoria è una priorità, l'indiceGPU_IVF_PQpuò aiutare a minimizzare i requisiti di memorizzazione, anche se comporta una maggiore perdita di precisione. L'indiceGPU_IVF_FLATè un'opzione equilibrata, che offre un compromesso tra prestazioni e utilizzo della memoria. Infine, l'indiceGPU_BRUTE_FORCEè progettato per operazioni di ricerca esaustive, garantendo un tasso di richiamo pari a 1 mediante l'esecuzione di ricerche trasversali.