Indice su disco
Questo articolo presenta DiskANN, un algoritmo di indicizzazione su disco per ricerche vettoriali ottimizzate su disco. Basato sui grafi Vamana, DiskANN consente di effettuare ricerche vettoriali efficienti su disco all'interno di grandi insiemi di dati.
Per migliorare le prestazioni delle query, è possibile specificare un tipo di indice per ogni campo vettoriale.
Prerequisiti
Per utilizzare DiskANN in Milvus, è necessario che
- L'istanza di Milvus gira su Ubuntu 18.04.6 o su una versione successiva.
- Il percorso dati di Milvus deve essere montato su un'unità SSD NVMe per ottenere prestazioni ottimali:
- Per un'istanza Milvus Standalone, il percorso dei dati deve essere /var/lib/milvus/data nel contenitore in cui viene eseguita l'istanza.
- Per un'istanza Milvus Cluster, il percorso dei dati dovrebbe essere /var/lib/milvus/data nei container in cui girano i QueryNode e gli IndexNode.
Limiti
Per utilizzare DiskANN, assicurarsi che
- Usare solo vettori float con almeno 1 dimensione nei dati.
- Utilizzare solo la distanza euclidea (L2), il prodotto interno (IP) o COSINE per misurare la distanza tra i vettori.
Impostazioni dell'indice e della ricerca
Parametri di costruzione dell'indice
Quando si costruisce un indice DiskANN, utilizzare
DISKANNcome tipo di indice. Non sono necessari parametri di indice.Parametri di ricerca
Parametro Descrizione Intervallo Valore predefinito search_listDimensione dell'elenco dei candidati; una dimensione maggiore offre un tasso di richiamo più elevato con prestazioni inferiori. [topk, int32_max] 16
Configurazioni di Milvus relative a DiskANN
DiskANN è sintonizzabile. È possibile modificare i parametri relativi a DiskANN in ${MILVUS_ROOT_PATH}/configs/milvus.yaml per migliorarne le prestazioni.
...
DiskIndex:
MaxDegree: 56
SearchListSize: 100
PQCodeBudgetGBRatio: 0.125
SearchCacheBudgetGBRatio: 0.125
BeamWidthRatio: 4.0
...
| Parametro | Descrizione | Intervallo di valori | Valore predefinito |
|---|---|---|---|
MaxDegree | Grado massimo del grafo Vamana. Un valore maggiore offre un tasso di richiamo più elevato, ma aumenta le dimensioni e il tempo di costruzione dell'indice. | [1, 512] | 56 |
SearchListSize | Dimensione dell'elenco dei candidati. Un valore maggiore aumenta il tempo impiegato per costruire l'indice, ma offre un tasso di richiamo più elevato. Impostare un valore inferiore a MaxDegree a meno che non sia necessario ridurre il tempo di costruzione dell'indice. | [1, int32_max] | 100 |
PQCodeBudgetGBRatio | Limite di dimensione del codice PQ. Un valore maggiore offre un tasso di richiamo più elevato, ma aumenta l'utilizzo della memoria. | (0.0, 0.25] | 0.125 |
SearchCacheBudgetGBRatio | Rapporto tra i numeri dei nodi in cache e i dati grezzi. Un valore maggiore migliora le prestazioni di costruzione dell'indice, ma aumenta l'uso della memoria. | [0.0, 0.3) | 0.10 |
BeamWidthRatio | Rapporto tra il numero massimo di richieste IO per iterazione di ricerca e il numero di CPU. | [1, max(128/numero di CPU, 16)]. | 4.0 |
Risoluzione dei problemi
Come risolvere l'errore
io_setup() failed; returned -11, errno=11:Resource temporarily unavailable?Il kernel Linux offre la funzione Asynchronous non-blocking I/O (AIO) che consente a un processo di avviare più operazioni di I/O simultaneamente senza dover attendere il completamento di nessuna di esse. Ciò contribuisce ad aumentare le prestazioni delle applicazioni che possono sovrapporre elaborazione e I/O.
Le prestazioni possono essere regolate utilizzando il file virtuale
/proc/sys/fs/aio-max-nrnel file system proc. Il parametroaio-max-nrdetermina il numero massimo di richieste contemporanee consentite.Il valore predefinito di
aio-max-nrè65535, ma è possibile impostarlo su10485760.