🚀 Experimente o Zilliz Cloud, o Milvus totalmente gerenciado, gratuitamente—experimente um desempenho 10x mais rápido! Experimente Agora>>

milvus-logo
LFAI

1. index_file_size

  • Engineering
February 26, 2020
milvus

Em Best Practices for Milvus Configuration, foram introduzidas algumas das melhores práticas para a configuração do Milvus 0.6.0. Neste artigo, também apresentaremos algumas práticas recomendadas para definir parâmetros-chave nos clientes Milvus para operações que incluem a criação de uma tabela, a criação de índices e a pesquisa. Estes parâmetros podem afetar o desempenho da pesquisa.

1. index_file_size

Ao criar uma tabela, o parâmetro index_file_size é utilizado para especificar o tamanho, em MB, de um único ficheiro para armazenamento de dados. A predefinição é 1024. Quando os dados vectoriais estão a ser importados, o Milvus combina os dados em ficheiros de forma incremental. Quando o tamanho do ficheiro atinge o tamanho_do_ficheiro_de_índice, este ficheiro não aceita novos dados e o Milvus guarda os novos dados noutro ficheiro. Estes são todos ficheiros de dados em bruto. Quando um índice é criado, o Milvus gera um ficheiro de índice para cada ficheiro de dados brutos. Para o tipo de índice IVFLAT, o tamanho do ficheiro de índice é aproximadamente igual ao tamanho do ficheiro de dados brutos correspondente. Para o índice SQ8, o tamanho de um ficheiro de índice é aproximadamente 30 por cento do ficheiro de dados em bruto correspondente.

Durante uma pesquisa, o Milvus pesquisa cada ficheiro de índice um a um. De acordo com a nossa experiência, quando index_file_size muda de 1024 para 2048, o desempenho da pesquisa melhora em 30 a 50 por cento. No entanto, se o valor for muito grande, os arquivos grandes podem não ser carregados na memória da GPU (ou mesmo na memória da CPU). Por exemplo, se a memória da GPU for de 2 GB e index_file_size for de 3 GB, o arquivo de índice não poderá ser carregado na memória da GPU. Normalmente, definimos index_file_size para 1024 MB ou 2048 MB.

A tabela a seguir mostra um teste usando sift50m para index_file_size. O tipo de índice é SQ8.

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

Podemos ver que no modo CPU e no modo GPU, quando index_file_size é 2048 MB em vez de 1024 MB, o desempenho da pesquisa melhora significativamente.

2. nlist e nprobe

O parâmetro nlist é utilizado para a criação do índice e o parâmetro nprobe é utilizado para a pesquisa. O IVFLAT e o SQ8 utilizam algoritmos de agrupamento para dividir um grande número de vectores em agrupamentos, ou "buckets". nlist é o número de "buckets" durante o agrupamento.

Quando a pesquisa utiliza índices, o primeiro passo é encontrar um determinado número de compartimentos mais próximos do vetor alvo e o segundo passo é encontrar os k vectores mais semelhantes dos compartimentos através da distância vetorial. nprobe é o número de compartimentos no primeiro passo.

De um modo geral, o aumento de nlist leva a um maior número de compartimentos e a um menor número de vectores num compartimento durante o agrupamento. Como resultado, a carga de cálculo diminui e o desempenho da pesquisa melhora. No entanto, com menos vectores para comparação de semelhanças, o resultado correto pode ser perdido.

O aumento de nprobe leva a um maior número de compartimentos para pesquisa. Como resultado, a carga de cálculo aumenta e o desempenho da pesquisa deteriora-se, mas a precisão da pesquisa melhora. A situação pode variar consoante os conjuntos de dados com diferentes distribuições. Também deve considerar o tamanho do conjunto de dados ao definir nlist e nprobe. Geralmente, recomenda-se que nlist possa ser 4 * sqrt(n), em que n é o número total de vectores. Quanto a nprobe, é necessário fazer um compromisso entre precisão e eficiência e a melhor forma de determinar o valor é por tentativa e erro.

A tabela seguinte mostra um teste utilizando sift50m para nlist e nprobe. O tipo de índice é SQ8.

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

A tabela compara o desempenho e a precisão da pesquisa usando valores diferentes de nlist/nprobe. Somente os resultados da GPU são exibidos porque os testes de CPU e GPU têm resultados semelhantes. Neste teste, à medida que os valores de nlist/nprobe aumentam na mesma porcentagem, a precisão da pesquisa também aumenta. Quando nlist = 4096 e nprobe é 128, o Milvus tem o melhor desempenho de pesquisa. Concluindo, ao determinar os valores para nlist e nprobe, é necessário fazer uma troca entre desempenho e precisão, levando em consideração diferentes conjuntos de dados e requisitos.

Resumo

index_file_size: Quando o tamanho dos dados é superior a index_file_size, quanto maior for o valor de index_file_size, melhor será o desempenho da pesquisa.nlist e nprobe:Deve fazer um compromisso entre desempenho e precisão.

Try Managed Milvus for Free

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

Get Started

Like the article? Spread the word

Continue Lendo