Índice na memória
Este tópico lista os vários tipos de índices em memória que o Milvus suporta, os cenários que cada um deles melhor se adequa e os parâmetros que os utilizadores podem configurar para obter um melhor desempenho de pesquisa. Para índices no disco, veja Índice no disco.
A indexação é o processo de organização eficiente dos dados e desempenha um papel importante na utilidade da pesquisa por similaridade, acelerando drasticamente as consultas demoradas em grandes conjuntos de dados.
Para melhorar o desempenho da consulta, é possível especificar um tipo de índice para cada campo de vetor.
Índices vectoriais ANNS
A maioria dos tipos de índices vectoriais suportados pelo Milvus utiliza algoritmos de pesquisa de vizinhos mais próximos aproximados (ANNS). Em comparação com a recuperação exacta, que normalmente consome muito tempo, a ideia central do ANNS já não se limita a devolver o resultado mais exato, mas apenas a procurar os vizinhos do alvo. A ANNS melhora a eficiência da recuperação, sacrificando a exatidão dentro de um intervalo aceitável.
De acordo com os métodos de implementação, o índice vetorial ANNS pode ser classificado em quatro tipos: Baseado em árvore, baseado em gráfico, baseado em hash e baseado em quantização.
Índices suportados no Milvus
O Milvus suporta vários tipos de índices, que são categorizados pelo tipo de incorporação de vectores que tratam: incorporação de vírgula flutuante (também conhecida como vectores de vírgula flutuante ou vectores densos), incorporação binária (também conhecida como vectores binários) e incorporação esparsa (também conhecida como vectores esparsos).
Índices para incorporações de vírgula flutuante
Para as incorporações de vírgula flutuante de 128 dimensões (vectores), o armazenamento que ocupam é 128 * o tamanho da vírgula flutuante = 512 bytes. E as métricas de distância utilizadas para as incorporações de vírgula flutuante são a distância euclidiana (L2
) e o produto interno (IP
).
Estes tipos de índices incluem FLAT
, IVF_FLAT
, IVF_PQ
, IVF_SQ8
, HNSW
, e SCANN
para pesquisas ANN baseadas em CPU.
Índices para incrustações binárias
Para as incorporações binárias de 128 dimensões, o armazenamento que ocupam é de 128 / 8 = 16 bytes. E as métricas de distância utilizadas para as incrustações binárias são JACCARD
e HAMMING
.
Este tipo de índices inclui BIN_FLAT
e BIN_IVF_FLAT
.
Índices para embeddings esparsos
A métrica de distância suportada para as incorporações esparsas é apenas IP
.
Os tipos de índices incluem SPARSE_INVERTED_INDEX
e SPARSE_WAND
.
Índice suportado | Classificação | Cenário |
---|---|---|
FLAT | N/A |
|
IVF_FLAT | Índice baseado na quantização |
|
IVF_SQ8 | Índice baseado na quantificação |
|
IVF_PQ | Índice baseado na quantificação |
|
HNSW | Índice baseado em gráficos |
|
SCANN | Índice baseado na quantização |
|
Índice suportado | Classificação | Cenário |
---|---|---|
BIN_FLAT | Índice baseado na quantização |
|
BIN_IVF_FLAT | Índice baseado na quantização |
|
Índice suportado | Classificação | Cenário |
---|---|---|
ÍNDICE_INVERTIDO_ESPARSO | Índice invertido |
|
SPARSE_WAND | Índice invertido |
|
FLAT
Para aplicações de pesquisa de semelhança de vectores que requerem uma precisão perfeita e dependem de conjuntos de dados relativamente pequenos (à escala de um milhão), o índice FLAT é uma boa escolha. O FLAT não comprime os vectores e é o único índice que pode garantir resultados de pesquisa exactos. Os resultados do FLAT também podem ser usados como um ponto de comparação para resultados produzidos por outros índices que têm menos de 100% de recuperação.
O FLAT é exato porque adopta uma abordagem exaustiva à pesquisa, o que significa que, para cada consulta, a entrada de destino é comparada com todos os conjuntos de vectores de um conjunto de dados. Isso torna o FLAT o índice mais lento da nossa lista e pouco adequado para consultar dados vetoriais maciços. Não são necessários parâmetros para o índice FLAT no Milvus, e a sua utilização não necessita de formação de dados.
Parâmetros de pesquisa
Parâmetro Descrição Distância metric_type
[Opcional] A métrica de distância escolhida. Ver Métricas suportadas.
IVF_FLAT
O IVF_FLAT divide os dados vectoriais em nlist
unidades de clusters e, em seguida, compara as distâncias entre o vetor de entrada alvo e o centro de cada cluster. Dependendo do número de clusters que o sistema está definido para consultar (nprobe
), os resultados da pesquisa de semelhança são devolvidos com base em comparações entre a entrada de destino e os vectores apenas no(s) cluster(s) mais semelhante(s) - reduzindo drasticamente o tempo de consulta.
Ao ajustar nprobe
, é possível encontrar um equilíbrio ideal entre precisão e velocidade para um determinado cenário. Os resultados do teste de desempenho do IVF_FLAT demonstram que o tempo de consulta aumenta drasticamente à medida que o número de vectores de entrada alvo (nq
) e o número de clusters a pesquisar (nprobe
) aumentam.
O IVF_FLAT é o índice IVF mais básico, e os dados codificados armazenados em cada unidade são consistentes com os dados originais.
Parâmetros de construção do índice
Parâmetro Descrição Intervalo Valor por defeito nlist
Número de unidades de cluster [1, 65536] 128 Parâmetros de pesquisa
Pesquisa comum
Parâmetro Descrição do parâmetro Gama Valor por defeito nprobe
Número de unidades a consultar [1, nlist] 8 Pesquisa de intervalo
Parâmetro Descrição do parâmetro Intervalo Valor por defeito max_empty_result_buckets
Número máximo de contentores que não apresentam quaisquer resultados de pesquisa.
Este é um parâmetro de pesquisa de intervalo e termina o processo de pesquisa quando o número de contentores vazios consecutivos atinge o valor especificado.
O aumento deste valor pode melhorar a taxa de recuperação à custa de um aumento do tempo de pesquisa.[1, 65535] 2
IVF_SQ8
O IVF_FLAT não executa qualquer compressão, pelo que os ficheiros de índice que produz têm aproximadamente o mesmo tamanho que os dados vectoriais originais, brutos e não indexados. Por exemplo, se o conjunto de dados 1B SIFT original tiver 476 GB, os seus ficheiros de índice IVF_FLAT serão ligeiramente mais pequenos (~470 GB). Carregar todos os ficheiros de índice na memória consumirá 470 GB de armazenamento.
Quando os recursos de memória do disco, CPU ou GPU são limitados, o IVF_SQ8 é uma opção melhor do que o IVF_FLAT. Este tipo de índice pode converter cada FLOAT (4 bytes) em UINT8 (1 byte) efectuando a Quantização Escalar (SQ). Isto reduz o consumo de memória do disco, CPU e GPU em 70-75%. Para o conjunto de dados 1B SIFT, os ficheiros de índice IVF_SQ8 requerem apenas 140 GB de armazenamento.
Parâmetros de construção de índices
Parâmetro Descrição Intervalo nlist
Número de unidades de cluster [1, 65536] Parâmetros de pesquisa
Pesquisa comum
Parâmetro Descrição do parâmetro Intervalo Valor por defeito nprobe
Número de unidades a consultar [1, nlist] 8 Pesquisa de intervalo
Parâmetro Descrição do parâmetro Intervalo Valor por defeito max_empty_result_buckets
Número máximo de contentores que não apresentam quaisquer resultados de pesquisa.
Este é um parâmetro de pesquisa de intervalo e termina o processo de pesquisa quando o número de contentores vazios consecutivos atinge o valor especificado.
O aumento deste valor pode melhorar a taxa de recuperação à custa de um aumento do tempo de pesquisa.[1, 65535] 2
IVF_PQ
PQ
(Product Quantization) decompõe uniformemente o espaço vetorial de alta dimensão original em produtos cartesianos de m
espaços vectoriais de baixa dimensão e quantifica depois os espaços vectoriais de baixa dimensão decompostos. Em vez de calcular as distâncias entre o vetor-alvo e o centro de todas as unidades, a quantização do produto permite o cálculo das distâncias entre o vetor-alvo e o centro de agrupamento de cada espaço de baixa dimensão e reduz consideravelmente a complexidade temporal e espacial do algoritmo.
O IVF_PQ efectua o agrupamento de índices IVF antes de quantificar o produto de vectores. O seu ficheiro de índice é ainda mais pequeno do que o IVF_SQ8, mas também causa uma perda de precisão durante a pesquisa de vectores.
Os parâmetros de construção do índice e os parâmetros de pesquisa variam consoante a distribuição Milvus. Selecione primeiro a sua distribuição Milvus.
Parâmetros de construção do índice
Parâmetro Descrição Intervalo nlist
Número de unidades de agrupamento [1, 65536] m
Número de factores de quantização do produto dim mod m == 0
nbits
[Opcional] Número de bits em que cada vetor de baixa dimensão é armazenado. [1, 64] (8 por defeito) Parâmetros de pesquisa
Pesquisa comum
Parâmetro Descrição Intervalo Valor por defeito nprobe
Número de unidades a consultar [1, nlist] 8 Pesquisa de intervalo
Parâmetro Descrição do parâmetro Intervalo Valor por defeito max_empty_result_buckets
Número máximo de contentores que não apresentam quaisquer resultados de pesquisa.
Este é um parâmetro de pesquisa de intervalo e termina o processo de pesquisa quando o número de contentores vazios consecutivos atinge o valor especificado.
O aumento deste valor pode melhorar a taxa de recuperação à custa de um aumento do tempo de pesquisa.[1, 65535] 2
SCANN
O ScaNN (Scalable Nearest Neighbors) é semelhante ao IVF_PQ em termos de agrupamento de vectores e quantização de produtos. A sua diferença reside nos pormenores de implementação da quantização do produto e na utilização de SIMD (Single-Instruction / Multi-data) para um cálculo eficiente.
Parâmetros de construção do índice
Parâmetro Descrição Intervalo nlist
Número de unidades de cluster [1, 65536] with_raw_data
Se os dados brutos devem ser incluídos no índice True
ouFalse
. A predefinição éTrue
.Ao contrário do IVF_PQ, os valores predefinidos aplicam-se a
m
enbits
para um desempenho optimizado.Parâmetros de pesquisa
Pesquisa comum
Parâmetro Descrição Intervalo Valor por defeito nprobe
Número de unidades a consultar [1, nlist] reorder_k
Número de unidades candidatas a consultar [ top_k
, ∞]top_k
Pesquisa de intervalos
Parâmetro Descrição Intervalo Valor predefinido max_empty_result_buckets
Número máximo de contentores que não apresentam quaisquer resultados de pesquisa.
Este é um parâmetro de pesquisa de intervalo e termina o processo de pesquisa quando o número de contentores vazios consecutivos atinge o valor especificado.
O aumento deste valor pode melhorar a taxa de recuperação à custa de um aumento do tempo de pesquisa.[1, 65535] 2
HNSW
O HNSW (Hierarchical Navigable Small World Graph) é um algoritmo de indexação baseado em grafos. Constrói uma estrutura de navegação multicamada para uma imagem de acordo com determinadas regras. Nesta estrutura, as camadas superiores são mais esparsas e as distâncias entre os nós são maiores; as camadas inferiores são mais densas e as distâncias entre os nós são menores. A pesquisa começa na camada superior, encontra o nó mais próximo do alvo nessa camada e, em seguida, entra na camada seguinte para iniciar outra pesquisa. Após várias iterações, pode aproximar-se rapidamente da posição do alvo.
Para melhorar o desempenho, o HNSW limita o grau máximo dos nós em cada camada do gráfico a M
. Além disso, pode utilizar efConstruction
(ao construir o índice) ou ef
(ao pesquisar alvos) para especificar um intervalo de pesquisa.
Parâmetros de construção de índices
Parâmetro Descrição Intervalo M
M define o número máximo de ligações de saída no gráfico. Um M mais elevado leva a uma maior precisão/tempo de execução com ef/efConstruction fixos. [2, 2048] efConstruction
ef_construction controla o compromisso entre a velocidade de pesquisa do índice e a velocidade de construção. Aumentar o parâmetro efConstruction pode melhorar a qualidade do índice, mas também tende a aumentar o tempo de indexação. [1, int_max] Parâmetros de pesquisa
Parâmetro Descrição Intervalo ef
Parâmetro que controla o compromisso tempo/precisão da consulta. Um valor mais elevado em ef
conduz a uma pesquisa mais exacta mas mais lenta.[ top_k
, int_max]
BIN_FLAT
Este índice é exatamente o mesmo que FLAT, exceto que só pode ser utilizado para incorporações binárias.
Para aplicações de pesquisa de semelhança de vectores que requerem uma precisão perfeita e dependem de conjuntos de dados relativamente pequenos (à escala de um milhão), o índice BIN_FLAT é uma boa escolha. O BIN_FLAT não comprime os vectores e é o único índice que pode garantir resultados de pesquisa exactos. Os resultados do BIN_FLAT também podem ser usados como um ponto de comparação para resultados produzidos por outros índices que têm menos de 100% de recuperação.
O BIN_FLAT é exato porque adopta uma abordagem exaustiva à pesquisa, o que significa que, para cada consulta, a entrada de destino é comparada com vectores num conjunto de dados. Isso torna o BIN_FLAT o índice mais lento da nossa lista e pouco adequado para consultar dados vetoriais maciços. Não há parâmetros para o índice BIN_FLAT no Milvus, e usá-lo não requer treinamento de dados ou armazenamento adicional.
Parâmetros de pesquisa
Parâmetro Descrição do parâmetro Distância metric_type
[Opcional] A métrica de distância escolhida. Ver Métricas suportadas.
BIN_IVF_FLAT
Este índice é exatamente o mesmo que IVF_FLAT, exceto que só pode ser utilizado para embeddings binários.
BIN_IVF_FLAT divide os dados do vetor em nlist
unidades de cluster e, em seguida, compara as distâncias entre o vetor de entrada alvo e o centro de cada cluster. Dependendo do número de clusters que o sistema está definido para consultar (nprobe
), os resultados da pesquisa de semelhança são devolvidos com base em comparações entre a entrada de destino e os vectores apenas no(s) cluster(s) mais semelhante(s) - reduzindo drasticamente o tempo de consulta.
Ajustando nprobe
, pode ser encontrado um equilíbrio ideal entre precisão e velocidade para um determinado cenário. O tempo de consulta aumenta drasticamente à medida que o número de vectores de entrada alvo (nq
) e o número de clusters a pesquisar (nprobe
) aumentam.
BIN_IVF_FLAT é o índice BIN_IVF mais básico, e os dados codificados armazenados em cada unidade são consistentes com os dados originais.
Parâmetros de construção do índice
Parâmetro Descrição Intervalo nlist
Número de unidades de agrupamento [1, 65536] Parâmetros de pesquisa
Pesquisa comum
Parâmetro Descrição do parâmetro Intervalo Valor por defeito nprobe
Número de unidades a consultar [1, nlist] 8 Pesquisa de intervalo
Parâmetro Descrição do parâmetro Intervalo Valor por defeito max_empty_result_buckets
Número máximo de contentores que não apresentam quaisquer resultados de pesquisa.
Este é um parâmetro de pesquisa de intervalo e termina o processo de pesquisa quando o número de contentores vazios consecutivos atinge o valor especificado.
O aumento deste valor pode melhorar a taxa de recuperação à custa de um aumento do tempo de pesquisa.[1, 65535] 2
ÍNDICE_INVERTIDO_ESPARSO
Cada dimensão mantém uma lista de vectores que têm um valor diferente de zero nessa dimensão. Durante a pesquisa, Milvus itera através de cada dimensão do vetor de consulta e calcula as pontuações dos vectores que têm valores diferentes de zero nessas dimensões.
Parâmetros de construção de índices
Parâmetro Descrição Intervalo drop_ratio_build
A proporção de valores de vectores pequenos que são excluídos durante o processo de indexação. Esta opção permite um ajuste fino do processo de indexação, fazendo um compromisso entre eficiência e exatidão ao ignorar valores pequenos ao construir o índice. [0, 1] Parâmetros de pesquisa
Parâmetro Descrição Intervalo drop_ratio_search
A proporção de valores vectoriais pequenos que são excluídos durante o processo de pesquisa. Esta opção permite o ajuste fino do processo de pesquisa, especificando a proporção dos valores mais pequenos no vetor de consulta a ignorar. Ela ajuda a equilibrar a precisão e o desempenho da pesquisa. Quanto mais pequeno for o valor definido para drop_ratio_search
, menos estes valores pequenos contribuem para a pontuação final. Ao ignorar alguns valores pequenos, o desempenho da pesquisa pode ser melhorado com um impacto mínimo na precisão.[0, 1]
VARINHA_ESPECÍFICA
Este índice partilha semelhanças com SPARSE_INVERTED_INDEX
, embora utilize o algoritmo Weak-AND para reduzir ainda mais o número de avaliações da distância IP completa durante o processo de pesquisa.
Com base nos nossos testes, SPARSE_WAND
supera geralmente os outros métodos em termos de velocidade. No entanto, o seu desempenho pode deteriorar-se rapidamente à medida que a densidade dos vectores aumenta. Para resolver este problema, a introdução de um drop_ratio_search
diferente de zero pode melhorar significativamente o desempenho, incorrendo apenas numa perda mínima de precisão. Para mais informações, consulte Vetor esparso.
Parâmetros de construção de índices
Parâmetro Descrição Intervalo drop_ratio_build
A proporção de valores de vetor pequenos que são excluídos durante o processo de indexação. Esta opção permite um ajuste fino do processo de indexação, fazendo um compromisso entre eficiência e exatidão ao ignorar valores pequenos ao construir o índice. [0, 1] Parâmetros de pesquisa
Parâmetro Descrição Intervalo drop_ratio_search
A proporção de valores vectoriais pequenos que são excluídos durante o processo de pesquisa. Esta opção permite o ajuste fino do processo de pesquisa, especificando a proporção dos valores mais pequenos no vetor de consulta a ignorar. Ela ajuda a equilibrar a precisão e o desempenho da pesquisa. Quanto mais pequeno for o valor definido para drop_ratio_search
, menos estes valores pequenos contribuem para a pontuação final. Ao ignorar alguns valores pequenos, o desempenho da pesquisa pode ser melhorado com um impacto mínimo na precisão.[0, 1]
FAQ
Qual é a diferença entre o índice FLAT e o índice IVF_FLAT?
O índice IVF_FLAT divide um espaço vetorial em nlist
clusters. Se mantiver o valor predefinido de nlist
como 16384, o Milvus compara as distâncias entre o vetor alvo e os centros de todos os 16384 clusters para obter nprobe
os clusters mais próximos. Em seguida, o Milvus compara as distâncias entre o vetor alvo e os vectores nos clusters selecionados para obter os vectores mais próximos. Ao contrário do IVF_FLAT, o FLAT compara diretamente as distâncias entre o vetor alvo e cada um dos vectores.
Por conseguinte, quando o número total de vectores é aproximadamente igual a nlist
, o IVF_FLAT e o FLAT têm pouca diferença na forma de cálculo necessária e no desempenho da pesquisa. Mas à medida que o número de vectores aumenta para duas, três ou n vezes nlist
, o índice IVF_FLAT começa a apresentar vantagens cada vez maiores.
Para mais informações, consulte Como escolher um índice no Milvus.
O que vem a seguir
- Saiba mais sobre as métricas de similaridade suportadas no Milvus.