Índice no disco
Este artigo apresenta um algoritmo de indexação em disco chamado DiskANN. Com base nos gráficos Vamana, o DiskANN permite pesquisas eficientes em grandes conjuntos de dados.
Para melhorar o desempenho da consulta, é possível especificar um tipo de índice para cada campo de vetor.
Pré-requisitos
Para usar o DiskANN, observe que
- DiskANN está desativado por padrão. Se preferir um índice na memória em vez de um índice no disco, é aconselhável desativar esta funcionalidade para obter um melhor desempenho.
- Para a desativar, pode alterar
queryNode.enableDisk
parafalse
no seu ficheiro de configuração milvus. - Para a ativar novamente, pode definir
queryNode.enableDisk
paratrue
.
- Para a desativar, pode alterar
- A instância do Milvus é executada no Ubuntu 18.04.6 ou numa versão posterior.
- O caminho de dados do Milvus deve ser montado em um SSD NVMe para obter desempenho total:
- Para uma instância Milvus Standalone, o caminho de dados deve ser /var/lib/milvus/data no contentor onde a instância é executada.
- Para uma instância de Milvus Cluster, o caminho de dados deve ser /var/lib/milvus/data nos contentores onde são executados os QueryNodes e os IndexNodes.
Limites
Para utilizar o DiskANN, certifique-se de que
- Utilize apenas vectores de flutuação com pelo menos 1 dimensão nos seus dados.
- Utilize apenas a Distância Euclidiana (L2), o Produto Interno (IP) ou COSINE para medir a distância entre vectores.
Configurações de índice e pesquisa
Parâmetros de criação de índices
Ao construir um índice DiskANN, utilize
DISKANN
como o tipo de índice. Não são necessários parâmetros de índice.Parâmetros de pesquisa
Parâmetro Descrição Intervalo Valor por defeito search_list
Tamanho da lista de candidatos, um tamanho maior oferece uma taxa de recuperação mais elevada com desempenho degradado. [topk, int32_max] 16
Configurações de Milvus relacionadas com DiskANN
A DiskANN pode ser afinada. Pode modificar os parâmetros relacionados com a DiskANN em ${MILVUS_ROOT_PATH}/configs/milvus.yaml
para melhorar o seu desempenho.
...
DiskIndex:
MaxDegree: 56
SearchListSize: 100
PQCodeBugetGBRatio: 0.125
SearchCacheBudgetGBRatio: 0.125
BeamWidthRatio: 4.0
...
Parâmetro | Descrição | Intervalo de valores | Valor predefinido |
---|---|---|---|
MaxDegree | Grau máximo do gráfico Vamana. Um valor mais elevado oferece uma taxa de recuperação mais elevada, mas aumenta o tamanho e o tempo de criação do índice. | [1, 512] | 56 |
SearchListSize | Tamanho da lista de candidatos. Um valor maior aumenta o tempo despendido na construção do índice, mas oferece uma taxa de recuperação mais elevada. Defina-o para um valor inferior a MaxDegree a menos que precise de reduzir o tempo de construção do índice. | [1, int32_max] | 100 |
PQCodeBugetGBRatio | Limite de tamanho do código PQ. Um valor maior oferece uma taxa de recuperação mais elevada, mas aumenta a utilização de memória. | (0.0, 0.25] | 0.125 |
SearchCacheBudgetGBRatio | Rácio de números de nós em cache para dados em bruto. Um valor maior melhora o desempenho da construção de índices com maior utilização de memória. | [0.0, 0.3) | 0.10 |
BeamWidthRatio | Rácio entre o número máximo de pedidos IO por iteração de pesquisa e o número de CPU. | [1, max(128 / número da CPU, 16)] | 4.0 |
Resolução de problemas
Como lidar com o erro
io_setup() failed; returned -11, errno=11:Resource temporarily unavailable
?O kernel Linux fornece o recurso AIO (Asynchronous non-blocking I/O) que permite que um processo inicie várias operações de E/S simultaneamente sem ter que esperar que qualquer uma delas seja concluída. Isso ajuda a melhorar o desempenho de aplicativos que podem sobrepor processamento e E/S.
O desempenho pode ser ajustado usando o arquivo virtual
/proc/sys/fs/aio-max-nr
no sistema de arquivos proc. O parâmetroaio-max-nr
determina o número máximo de pedidos simultâneos permitidos.O parâmetro
aio-max-nr
é predefinido para65535
, pode ser configurado para10485760
.