🚀 Prova Zilliz Cloud, la versione completamente gestita di Milvus, gratuitamente—sperimenta prestazioni 10 volte più veloci! Prova Ora>>

milvus-logo
LFAI

1. index_file_size

  • Engineering
February 26, 2020
milvus

In Best Practices for Milvus Configuration sono state introdotte alcune best practices per la configurazione di Milvus 0.6.0. In questo articolo verranno introdotte anche alcune best practice per l'impostazione di parametri chiave nei client Milvus per operazioni quali la creazione di una tabella, la creazione di indici e la ricerca. Questi parametri possono influenzare le prestazioni della ricerca.

1. index_file_size

Quando si crea una tabella, il parametro index_file_size viene utilizzato per specificare la dimensione, in MB, di un singolo file per la memorizzazione dei dati. Il valore predefinito è 1024. Quando si importano dati vettoriali, Milvus combina i dati in modo incrementale in file. Quando la dimensione del file raggiunge la dimensione del file_indice, questo file non accetta nuovi dati e Milvus salva i nuovi dati in un altro file. Questi sono tutti file di dati grezzi. Quando viene creato un indice, Milvus genera un file indice per ogni file di dati grezzi. Per il tipo di indice IVFLAT, la dimensione del file di indice è approssimativamente uguale alla dimensione del file di dati grezzi corrispondente. Per l'indice SQ8, la dimensione di un file di indice è pari a circa il 30% del file di dati grezzi corrispondente.

Durante la ricerca, Milvus cerca ogni file di indice uno per uno. Secondo la nostra esperienza, quando index_file_size passa da 1024 a 2048, le prestazioni della ricerca migliorano del 30-50%. Tuttavia, se il valore è troppo grande, è possibile che i file di grandi dimensioni non vengano caricati nella memoria della GPU (o anche nella memoria della CPU). Ad esempio, se la memoria della GPU è di 2 GB e index_file_size è di 3 GB, il file di indice non può essere caricato nella memoria della GPU. Di solito si imposta index_file_size a 1024 MB o 2048 MB.

La tabella seguente mostra un test con sift50m per index_file_size. Il tipo di indice è SQ8.

1-sift50m-test-results-milvus.png 1-sift50m-risultati-del-test-milvus.png

Si può notare che in modalità CPU e GPU, quando index_file_size è 2048 MB invece di 1024 MB, le prestazioni di ricerca migliorano significativamente.

2. nlist e nprobe

Il parametro nlist viene utilizzato per la creazione dell'indice e il parametro nprobe per la ricerca. IVFLAT e SQ8 utilizzano entrambi algoritmi di raggruppamento per dividere un gran numero di vettori in cluster, o bucket. nlist è il numero di bucket durante il raggruppamento.

Quando si effettua una ricerca con indici, il primo passo consiste nel trovare un certo numero di bucket più vicini al vettore di destinazione e il secondo passo consiste nel trovare i k vettori più simili dai bucket in base alla distanza vettoriale. nprobe è il numero di bucket nel primo passo.

In generale, l'aumento di nlist porta a un maggior numero di bucket e a un minor numero di vettori in un bucket durante il clustering. Di conseguenza, il carico di calcolo diminuisce e le prestazioni di ricerca migliorano. Tuttavia, con un numero inferiore di vettori per il confronto di similarità, il risultato corretto potrebbe sfuggire.

L'aumento di nprobe comporta un maggior numero di bucket da ricercare. Di conseguenza, il carico di calcolo aumenta e le prestazioni di ricerca peggiorano, ma la precisione della ricerca migliora. La situazione può variare per set di dati con distribuzioni diverse. Quando si impostano nlist e nprobe si deve considerare anche la dimensione del set di dati. In generale, si raccomanda che nlist possa essere 4 * sqrt(n), dove n è il numero totale di vettori. Per quanto riguarda nprobe, è necessario trovare un compromesso tra precisione ed efficienza e il modo migliore è determinare il valore attraverso prove ed errori.

La tabella seguente mostra un test con sift50m per nlist e nprobe. Il tipo di indice è SQ8.

sq8-index-test-sift50m.png sq8-index-test-sift50m.png

La tabella confronta le prestazioni e la precisione della ricerca utilizzando diversi valori di nlist/nprobe. Vengono visualizzati solo i risultati della GPU perché i test della CPU e della GPU hanno risultati simili. In questo test, all'aumentare della stessa percentuale dei valori di nlist/nprobe, aumenta anche la precisione della ricerca. Quando nlist = 4096 e nprobe è 128, Milvus ha le migliori prestazioni di ricerca. In conclusione, quando si determinano i valori di nlist e nprobe, è necessario trovare un compromesso tra prestazioni e precisione, tenendo conto dei diversi set di dati e dei diversi requisiti.

Sintesi

index_file_size: Quando la dimensione dei dati è superiore a index_file_size, maggiore è il valore di index_file_size, migliori sono le prestazioni di ricerca.nlist e nprobe: È necessario effettuare un compromesso tra prestazioni e precisione.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

Continua a Leggere