1. index_file_size
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
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
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.
- 2. nlist e nprobe
- Resumo
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word