Indice con GPU
Questa guida illustra i passaggi per la creazione di un indice con supporto GPU in Milvus, che può migliorare significativamente le prestazioni di ricerca in scenari ad alta produttività e ad alto richiamo. Per i dettagli sui tipi di indici GPU supportati da Milvus, consultare Indice GPU.
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 (compresa la versione 2.4.1), Milvus utilizzava un pool di memoria GPU unificato. Per le versioni precedenti alla 2.4.1 (compresa la versione 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 della 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.
Creare un indice
I seguenti esempi mostrano come costruire indici GPU di diverso tipo.
Preparare i parametri dell'indice
Quando si impostano i parametri dell'indice GPU, definire index_type, metric_type e params:
index_type(stringa): Il tipo di indice utilizzato per accelerare la ricerca vettoriale. Le opzioni valide sono GPU_CAGRA, GPU_IVF_FLAT, GPU_IVF_PQ e GPU_BRUTE_FORCE.
metric_type(stringa): Il tipo di metrica usata per misurare la somiglianza dei vettori. Le opzioni valide sono IP e L2.
params(dict): I parametri di costruzione specifici dell'indice. Le opzioni valide per questo parametro dipendono dal tipo di indice.
Ecco alcuni esempi di configurazioni per diversi tipi di indice:
IndiceGPU_CAGRA
index_params = { "metric_type": "L2", "index_type": "GPU_CAGRA", "params": { 'intermediate_graph_degree': 64, 'graph_degree': 32 } }
Le opzioni possibili per i params includono:
grado_grafo_intermedio(int): Influenza il richiamo e il tempo di costruzione determinando il grado del grafo prima della potatura. I valori consigliati sono 32 o 64.
grado_grafo(int): Influisce sulle prestazioni della ricerca e sul richiamo impostando il grado del grafo dopo la potatura. In genere, è la metà del grado_grafo_intermedio. Una differenza maggiore tra questi due gradi comporta un tempo di costruzione più lungo. Il suo valore deve essere inferiore al valore di grado_grafo_intermedio.
build_algo(stringa): Seleziona l'algoritmo di generazione del grafo prima della potatura. Opzioni possibili:
IVF_PQ: Offre una qualità superiore ma un tempo di costruzione più lento.
NN_DESCENT: Fornisce una costruzione più rapida con un richiamo potenzialmente inferiore.
cache_dataset_on_device(stringa, "true" | "false"): Decide se mettere in cache il dataset originale nella memoria della GPU. Impostando "true" si migliora il richiamo affinando i risultati della ricerca, mentre impostando "false" si conserva la memoria della GPU.
IndiceGPU_IVF_FLAT o GPU_IVF_PQ
index_params = { "metric_type": "L2", "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ "params": { "nlist": 1024 } }
Le opzioni params sono identiche a quelle utilizzate in IVF_FLAT e IVF_PQ.
IndiceGPU_BRUTE_FORCE
index_params = { 'index_type': 'GPU_BRUTE_FORCE', 'metric_type': 'L2', 'params': {} }
Non sono richieste configurazioni aggiuntive di params.
Costruire l'indice
Dopo aver configurato i parametri dell'indice in index_params, chiamare il metodo create_index()
per costruire l'indice.
# Get an existing collection
collection = Collection("YOUR_COLLECTION_NAME")
collection.create_index(
field_name="vector", # Name of the vector field on which an index is built
index_params=index_params
)
Ricerca
Una volta costruito l'indice della GPU, il passo successivo è preparare i parametri di ricerca prima di effettuare una ricerca.
Preparare i parametri di ricerca
Di seguito sono riportati esempi di configurazioni per diversi tipi di indice:
IndiceGPU_BRUTE_FORCE
search_params = { "metric_type": "L2", "params": {} }
Non sono necessarie configurazioni di parametri aggiuntivi.
IndiceGPU_CAGRA
search_params = { "metric_type": "L2", "params": { "itopk_size": 128, "search_width": 4, "min_iterations": 0, "max_iterations": 0, "team_size": 0 } }
I parametri di ricerca principali includono:
itopk_size: Determina la dimensione dei risultati intermedi conservati durante la ricerca. Un valore maggiore può migliorare la ricerca a scapito delle prestazioni. Deve essere almeno uguale al valore finale top-k(limite) ed è tipicamente una potenza di 2 (ad esempio, 16, 32, 64, 128).
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.
min_iterations / max_iterations: Questi parametri controllano il processo di iterazione della ricerca. Per impostazione predefinita, sono impostati su 0 e CAGRA determina automaticamente il numero di iterazioni in base a itopk_size e search_width. La regolazione manuale di questi valori può aiutare a bilanciare prestazioni e precisione.
team_size: Specifica il numero di thread CUDA utilizzati per calcolare la distanza metrica sulla GPU. I valori 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 automaticamente il team_size in base alla dimensione del vettore.
IndiceGPU_IVF_FLAT o GPU_IVF_PQ
search_params = { "metric_type": "L2", "params": {"nprobe": 10} }
I parametri di ricerca per questi due tipi di indice sono simili a quelli utilizzati per IVF_FLAT e IVF_PQ. Per ulteriori informazioni, consultare Conduzione di una ricerca di similarità vettoriale.
Eseguire una ricerca
Utilizzare il metodo search()
per eseguire una ricerca di similarità vettoriale sull'indice GPU.
# Load data into memory
collection.load()
collection.search(
data=[[query_vector]], # Your query vector
anns_field="vector", # Name of the vector field
param=search_params,
limit=100 # Number of the results to return
)
Limiti
Quando si usano gli indici GPU, occorre tenere conto di alcuni vincoli:
Per GPU_IVF_FLAT, il valore massimo per il limite è 1024.
Per GPU_IVF_PQ e GPU_CAGRA, il valore massimo di limit è 1024.
Sebbene non sia stato fissato un limite per GPU_BRUTE_FORCE, si consiglia di non superare i 4096 per evitare potenziali problemi di prestazioni.
Attualmente, gli indici GPU non supportano la distanza COSINE. Se è necessaria la distanza COSINE, 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.
DOMANDE FREQUENTI
Quando è opportuno utilizzare un indice GPU?
Un indice GPU è particolarmente vantaggioso in situazioni che richiedono un throughput elevato o un richiamo elevato. Ad esempio, quando si tratta di batch di grandi dimensioni, il throughput dell'indicizzazione su GPU può superare di 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 CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT e GPU_BRUTE_FORCE?
Gli indici CAGRA 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'indice GPU_IVF_PQ può contribuire a ridurre al minimo i requisiti di memorizzazione, anche se comporta una maggiore perdita di precisione. L'indice GPU_IVF_FLAT è un'opzione equilibrata, che offre un compromesso tra prestazioni e utilizzo della memoria. Infine, l'indice GPU_BRUTE_FORCE è progettato per le operazioni di ricerca esaustiva e garantisce un tasso di richiamo pari a 1 eseguendo ricerche trasversali.