milvus-logo
LFAI
Home
  • Conceitos

Í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.

Atualmente, um campo vetorial apenas suporta um tipo de índice. O Milvus elimina automaticamente o índice antigo quando muda o tipo de índice.

Í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
  • Conjunto de dados relativamente pequeno
  • Requer uma taxa de recuperação de 100
IVF_FLAT Índice baseado na quantização
  • Consulta de alta velocidade
  • Requer uma taxa de recuperação tão elevada quanto possível
IVF_SQ8 Índice baseado na quantificação
  • Consulta de alta velocidade
  • Recursos de memória limitados
  • Aceita um pequeno compromisso na taxa de recuperação
IVF_PQ Índice baseado na quantificação
  • Consulta a muito alta velocidade
  • Recursos de memória limitados
  • Aceita um compromisso substancial na taxa de recuperação
HNSW Índice baseado em gráficos
  • Consulta de muito alta velocidade
  • Requer uma taxa de recuperação tão elevada quanto possível
  • Grandes recursos de memória
SCANN Índice baseado na quantização
  • Consulta a muito alta velocidade
  • Requer uma taxa de recuperação tão elevada quanto possível
  • Grandes recursos de memória
Índice suportado Classificação Cenário
BIN_FLAT Índice baseado na quantização
  • Depende de conjuntos de dados relativamente pequenos.
  • Requer uma precisão perfeita.
  • Não se aplica compressão.
  • Garante resultados de pesquisa exactos.
BIN_IVF_FLAT Índice baseado na quantização
  • Consulta de alta velocidade
  • Requer uma taxa de recuperação tão elevada quanto possível
Índice suportado Classificação Cenário
ÍNDICE_INVERTIDO_ESPARSO Índice invertido
  • Depende de conjuntos de dados relativamente pequenos.
  • Requer uma taxa de recuperação de 100%.
SPARSE_WAND Índice invertido
  • AlgoritmoWeak-AND acelerado
  • Pode obter uma melhoria significativa da velocidade, sacrificando apenas uma pequena quantidade de recuperação.

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âmetroDescriçãoDistâ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âmetroDescriçãoIntervaloValor por defeito
    nlistNúmero de unidades de cluster[1, 65536]128
  • Parâmetros de pesquisa

    • Pesquisa comum

      ParâmetroDescrição do parâmetroGamaValor por defeito
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Pesquisa de intervalo

      ParâmetroDescrição do parâmetroIntervaloValor por defeito
      max_empty_result_bucketsNú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âmetroDescriçãoIntervalo
    nlistNúmero de unidades de cluster[1, 65536]
  • Parâmetros de pesquisa

    • Pesquisa comum

      ParâmetroDescrição do parâmetroIntervaloValor por defeito
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Pesquisa de intervalo

      ParâmetroDescrição do parâmetroIntervaloValor por defeito
      max_empty_result_bucketsNú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âmetroDescriçãoIntervalo
    nlistNúmero de unidades de agrupamento[1, 65536]
    mNúmero de factores de quantização do produtodim 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âmetroDescriçãoIntervaloValor por defeito
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Pesquisa de intervalo

      ParâmetroDescrição do parâmetroIntervaloValor por defeito
      max_empty_result_bucketsNú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âmetroDescriçãoIntervalo
    nlistNúmero de unidades de cluster[1, 65536]
    with_raw_dataSe os dados brutos devem ser incluídos no índiceTrue ou False. A predefinição é True.

    Ao contrário do IVF_PQ, os valores predefinidos aplicam-se a m e nbits para um desempenho optimizado.

  • Parâmetros de pesquisa

    • Pesquisa comum

      ParâmetroDescriçãoIntervaloValor por defeito
      nprobeNúmero de unidades a consultar[1, nlist]
      reorder_kNúmero de unidades candidatas a consultar[top_k, ∞]top_k
    • Pesquisa de intervalos

      ParâmetroDescriçãoIntervaloValor predefinido
      max_empty_result_bucketsNú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âmetroDescriçãoIntervalo
    MM 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]
    efConstructionef_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âmetroDescriçãoIntervalo
    efParâ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âmetroDescrição do parâmetroDistâ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âmetroDescriçãoIntervalo
    nlistNúmero de unidades de agrupamento[1, 65536]
  • Parâmetros de pesquisa

    • Pesquisa comum

      ParâmetroDescrição do parâmetroIntervaloValor por defeito
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Pesquisa de intervalo

      ParâmetroDescrição do parâmetroIntervaloValor por defeito
      max_empty_result_bucketsNú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âmetroDescriçãoIntervalo
    drop_ratio_buildA 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âmetroDescriçãoIntervalo
    drop_ratio_searchA 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âmetroDescriçãoIntervalo
    drop_ratio_buildA 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âmetroDescriçãoIntervalo
    drop_ratio_searchA 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

Traduzido porDeepLogo

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?