Indice su disco
Questo articolo presenta un algoritmo di indicizzazione su disco chiamato DiskANN. Basato sui grafi Vamana, DiskANN consente di effettuare ricerche efficienti 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, tenere presente che
- DiskANN è disattivato per impostazione predefinita. Se si preferisce un indice in-memory a uno su disco, si consiglia di disabilitare questa funzione per ottenere prestazioni migliori.
- Per disabilitarla, si può cambiare
queryNode.enableDisk
infalse
nel file di configurazione di milvus. - Per abilitarla di nuovo, si può impostare
queryNode.enableDisk
sutrue
.
- Per disabilitarla, si può cambiare
- L'istanza di Milvus funziona su Ubuntu 18.04.6 o su una versione successiva.
- Il percorso dei 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
DISKANN
come tipo di indice. Non sono necessari parametri di indice.Parametri di ricerca
Parametro Descrizione Intervallo Valore predefinito search_list
Dimensione 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
PQCodeBugetGBRatio: 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 |
PQCodeBugetGBRatio | 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-nr
nel file system proc. Il parametroaio-max-nr
determina il numero massimo di richieste contemporanee consentite.Il valore predefinito di
aio-max-nr
è65535
, ma è possibile impostarlo su10485760
.