milvus-logo
LFAI
Home
  • Conceptos

Índice en memoria

Este tema enumera varios tipos de índices en memoria que Milvus soporta, los escenarios que mejor se adaptan a cada uno de ellos y los parámetros que los usuarios pueden configurar para lograr un mejor rendimiento de búsqueda. Para índices en disco, consulte Índice en disco.

La indexación es el proceso de organización eficiente de los datos, y desempeña un papel fundamental en la utilidad de la búsqueda de similitudes al acelerar drásticamente las consultas que consumen mucho tiempo en grandes conjuntos de datos.

Para mejorar el rendimiento de las consultas, puede especificar un tipo de índice para cada campo vectorial.

Actualmente, un campo vectorial sólo admite un tipo de índice. Milvus elimina automáticamente el índice antiguo al cambiar el tipo de índice.

Índices vectoriales ANNS

La mayoría de los tipos de índices vectoriales soportados por Milvus utilizan algoritmos de búsqueda aproximada de vecinos más cercanos (ANNS). En comparación con la recuperación exacta, que suele llevar mucho tiempo, la idea central de ANNS ya no se limita a devolver el resultado más exacto, sino que sólo busca los vecinos del objetivo. El ANNS mejora la eficiencia de la recuperación sacrificando la precisión dentro de un rango aceptable.

Según los métodos de implementación, el índice vectorial ANNS puede clasificarse en cuatro tipos: Basado en árbol, Basado en grafo, Basado en hash y Basado en cuantificación.

Índices admitidos en Milvus

Milvus admite varios tipos de índices, que se clasifican por el tipo de incrustaciones vectoriales que manejan: incrustaciones de coma flotante (también conocidas como vectores de coma flotante o vectores densos), incrustaciones binarias (también conocidas como vectores binarios) e incrustaciones dispersas (también conocidas como vectores dispersos).

Índices para incrustaciones de coma flotante

En el caso de las incrustaciones de coma flotante de 128 dimensiones (vectores), el almacenamiento que ocupan es de 128 * el tamaño de float = 512 bytes. Y las métricas de distancia utilizadas para las incrustaciones en coma flotante son la distancia euclidiana (L2) y el producto interior (IP).

Estos tipos de índices incluyen FLAT, IVF_FLAT, IVF_PQ, IVF_SQ8, HNSW, y SCANN para búsquedas RNA basadas en CPU.

Índices para incrustaciones binarias

Para las incrustaciones binarias de 128 dimensiones, el almacenamiento que ocupan es de 128 / 8 = 16 bytes. Y las métricas de distancia utilizadas para las incrustaciones binarias son JACCARD y HAMMING.

Este tipo de índices incluye BIN_FLAT y BIN_IVF_FLAT.

Índices para incrustaciones dispersas

La métrica de distancia admitida para las incrustaciones dispersas es únicamente IP.

Los tipos de índices incluyen SPARSE_INVERTED_INDEX y SPARSE_WAND.

Índice admitido Clasificación Escenario
PLANO N/A
  • Conjunto de datos relativamente pequeño
  • Requiere una tasa de recuperación del 100
IVF_FLAT Índice basado en la cuantificación
  • Consulta de alta velocidad
  • Requiere un índice de recuperación lo más alto posible
IVF_SQ8 Índice cuantitativo
  • Consulta de alta velocidad
  • Recursos de memoria limitados
  • Acepta un compromiso menor en la tasa de recuperación
IVF_PQ Índice basado en cuantificación
  • Consulta de muy alta velocidad
  • Recursos de memoria limitados
  • Acepta un compromiso sustancial en la tasa de recuperación
HNSW Índice basado en grafos
  • Consulta de muy alta velocidad
  • Requiere una tasa de recuperación lo más alta posible
  • Grandes recursos de memoria
SCANN Índice basado en la cuantificación
  • Consulta de muy alta velocidad
  • Requiere un índice de recuperación lo más alto posible
  • Grandes recursos de memoria
Índice compatible Clasificación Escenario
BIN_FLAT Índice basado en la cuantificación
  • Depende de conjuntos de datos relativamente pequeños.
  • Requiere una precisión perfecta.
  • No se aplica compresión.
  • Garantiza resultados de búsqueda exactos.
BIN_IVF_FLAT Índice basado en la cuantificación
  • Consulta de alta velocidad
  • Requiere un índice de recuperación lo más alto posible
Índice compatible Clasificación Escenario
ÍNDICE_ESPARCIDO_INVERTIDO Índice invertido
  • Depende de conjuntos de datos relativamente pequeños.
  • Requiere una tasa de recuperación del 100%.
VARA_ESPARAZ Índice invertido
  • Algoritmodébil-AND acelerado
  • Puede conseguir una mejora significativa de la velocidad sacrificando sólo una pequeña cantidad de recuperación.

FLAT

Para aplicaciones de búsqueda de similitud vectorial que requieren una precisión perfecta y dependen de conjuntos de datos relativamente pequeños (a escala de millones), el índice FLAT es una buena elección. FLAT no comprime los vectores y es el único índice que puede garantizar resultados de búsqueda exactos. Los resultados de FLAT también pueden utilizarse como punto de comparación para los resultados producidos por otros índices que tienen menos del 100% de recuperación.

FLAT es preciso porque adopta un enfoque exhaustivo de la búsqueda, lo que significa que, para cada consulta, la entrada objetivo se compara con todos los conjuntos de vectores de un conjunto de datos. Esto hace que FLAT sea el índice más lento de nuestra lista y poco adecuado para consultar datos vectoriales masivos. No se requieren parámetros para el índice FLAT en Milvus, y su uso no requiere entrenamiento de datos.

  • Parámetros de búsqueda

    ParámetroDescripciónRango
    metric_type[Opcional] La métrica de distancia elegida.Véase Métricas admitidas.

IVF_FLAT

IVF_FLAT divide los datos vectoriales en unidades de clúster nlist y, a continuación, compara las distancias entre el vector de entrada objetivo y el centro de cada clúster. Dependiendo del número de clusters que el sistema esté configurado para consultar (nprobe), los resultados de la búsqueda de similitud se devuelven basados en comparaciones entre la entrada objetivo y los vectores en el cluster(s) más similar(es) solamente - reduciendo drásticamente el tiempo de consulta.

Ajustando nprobe, se puede encontrar un equilibrio ideal entre precisión y velocidad para un escenario determinado. Los resultados de la prueba de rendimiento de IVF_FLAT demuestran que el tiempo de consulta aumenta bruscamente a medida que aumentan tanto el número de vectores de entrada objetivo (nq), como el número de clusters a buscar (nprobe).

IVF_FLAT es el índice IVF más básico, y los datos codificados almacenados en cada unidad son coherentes con los datos originales.

  • Parámetros de construcción del índice

    ParámetroDescripciónRangoValor por defecto
    nlistNúmero de unidades de clúster[1, 65536]128
  • Parámetros de búsqueda

    • Búsqueda común

      ParámetroDescripciónRangoValor por defecto
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Rango de búsqueda

      ParámetroDescripciónGamaValor por defecto
      max_empty_result_bucketsNúmero máximo de buckets que no devuelven ningún resultado de búsqueda.
      Este es un parámetro de búsqueda por rango y termina el proceso de búsqueda cuando el número de buckets vacíos consecutivos alcanza el valor especificado.
      Aumentar este valor puede mejorar la tasa de recuperación a costa de aumentar el tiempo de búsqueda.
      [1, 65535]2

IVF_SQ8

IVF_FLAT no realiza ninguna compresión, por lo que los archivos de índice que produce tienen aproximadamente el mismo tamaño que los datos vectoriales originales sin indexar. Por ejemplo, si el conjunto de datos SIFT 1B original tiene 476 GB, sus archivos de índice IVF_FLAT serán ligeramente más pequeños (~470 GB). Cargar todos los archivos de índice en memoria consumirá 470 GB de almacenamiento.

Cuando los recursos de disco, CPU o memoria GPU son limitados, IVF_SQ8 es una mejor opción que IVF_FLAT. Este tipo de índice puede convertir cada FLOAT (4 bytes) a UINT8 (1 byte) realizando una Cuantización Escalar (SQ). Esto reduce el consumo de memoria de disco, CPU y GPU en un 70-75%. Para el conjunto de datos SIFT 1B, los archivos de índice IVF_SQ8 requieren sólo 140 GB de almacenamiento.

  • Parámetros de creación de índices

    ParámetroDescripciónRango
    nlistNúmero de unidades de clúster[1, 65536]
  • Parámetros de búsqueda

    • Búsqueda común

      ParámetroDescripciónRangoValor por defecto
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Rango de búsqueda

      ParámetroDescripciónGamaValor por defecto
      max_empty_result_bucketsNúmero máximo de cubos que no devuelven ningún resultado de búsqueda.
      Este es un parámetro de búsqueda por rango y termina el proceso de búsqueda cuando el número de cubos vacíos consecutivos alcanza el valor especificado.
      Aumentar este valor puede mejorar la tasa de recuperación a costa de aumentar el tiempo de búsqueda.
      [1, 65535]2

IVF_PQ

PQ (Product Quantization) descompone uniformemente el espacio vectorial original de alta dimensión en productos cartesianos de m espacios vectoriales de baja dimensión y, a continuación, cuantiza los espacios vectoriales de baja dimensión descompuestos. En lugar de calcular las distancias entre el vector objetivo y el centro de todas las unidades, la cuantización de productos permite calcular las distancias entre el vector objetivo y el centro de agrupación de cada espacio de baja dimensión y reduce en gran medida la complejidad temporal y espacial del algoritmo.

IVF_PQ realiza la agrupación de índices IVF antes de cuantificar el producto de vectores. Su archivo de índices es incluso más pequeño que IVF_SQ8, pero también provoca una pérdida de precisión durante la búsqueda de vectores.

Los parámetros de construcción del índice y los parámetros de búsqueda varían según la distribución Milvus. Seleccione primero su distribución de Milvus.

  • Parámetros de creación de índices

    ParámetroDescripciónRango
    nlistNúmero de unidades de cluster[1, 65536]
    mNúmero de factores de cuantificación del productodim mod m == 0
    nbits[Opcional] Número de bits en los que se almacena cada vector de baja dimensión.[1, 64] (8 por defecto)
  • Parámetros de búsqueda

    • Búsqueda común

      ParámetroDescripciónRangoValor por defecto
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Rango de búsqueda

      ParámetroDescripciónGamaValor por defecto
      max_empty_result_bucketsNúmero máximo de buckets que no devuelven ningún resultado de búsqueda.
      Este es un parámetro de búsqueda por rango y termina el proceso de búsqueda cuando el número de buckets vacíos consecutivos alcanza el valor especificado.
      Aumentar este valor puede mejorar la tasa de recuperación a costa de aumentar el tiempo de búsqueda.
      [1, 65535]2

SCANN

ScaNN (Scalable Nearest Neighbors) es similar a IVF_PQ en términos de agrupación de vectores y cuantificación de productos. Lo que los diferencia radica en los detalles de implementación de la cuantificación del producto y el uso de SIMD (Single-Instruction / Multi-data) para un cálculo eficiente.

  • Parámetros de creación de índices

    ParámetroDescripciónRango
    nlistNúmero de unidades de clúster[1, 65536]
    with_raw_dataSi se incluyen los datos brutos en el índiceTrue o False. Por defecto True.

    A diferencia de IVF_PQ, los valores por defecto se aplican a m y nbits para optimizar el rendimiento.

  • Parámetros de búsqueda

    • Búsqueda común

      ParámetroDescripciónRangoValor por defecto
      nprobeNúmero de unidades a consultar[1, nlist]
      reorder_kNúmero de unidades candidatas a consultar[top_k, ∞]top_k
    • Búsqueda por rangos

      ParámetroDescripciónGamaValor por defecto
      max_empty_result_bucketsNúmero máximo de cubos que no devuelven ningún resultado de búsqueda.
      Este es un parámetro de búsqueda por rango y termina el proceso de búsqueda cuando el número de cubos vacíos consecutivos alcanza el valor especificado.
      Aumentar este valor puede mejorar la tasa de recuperación a costa de aumentar el tiempo de búsqueda.
      [1, 65535]2

HNSW

HNSW (Hierarchical Navigable Small World Graph) es un algoritmo de indexación basado en grafos. Construye una estructura de navegación multicapa para una imagen de acuerdo con ciertas reglas. En esta estructura, las capas superiores son más dispersas y las distancias entre nodos son más lejanas; las capas inferiores son más densas y las distancias entre nodos son más cercanas. La búsqueda parte de la capa superior, encuentra el nodo más cercano al objetivo en esta capa y, a continuación, entra en la capa siguiente para iniciar otra búsqueda. Tras varias iteraciones, puede acercarse rápidamente a la posición del objetivo.

Para mejorar el rendimiento, HNSW limita el grado máximo de los nodos en cada capa del gráfico a M. Además, puede utilizar efConstruction (al construir el índice) o ef (al buscar objetivos) para especificar un rango de búsqueda.

  • Parámetros de creación de índices

    ParámetroDescripciónRango
    MM define el número máximo de conexiones salientes en el gráfico. A mayor M, mayor precisión/tiempo de ejecución a ef/efConstrucción fija.[2, 2048]
    efConstructionef_construction controla el equilibrio entre velocidad de búsqueda y velocidad de construcción del índice. Aumentar el parámetro efConstruction puede mejorar la calidad del índice, pero también tiende a alargar el tiempo de indexación.[1, int_max]
  • Parámetros de búsqueda

    ParámetroDescripciónRango
    efParámetro que controla la relación entre tiempo de búsqueda y precisión. Cuanto mayor sea ef, más precisa será la búsqueda, pero más lenta.[top_k, int_max]

BIN_FLAT

Este índice es exactamente igual que FLAT, salvo que sólo puede utilizarse para incrustaciones binarias.

Para aplicaciones de búsqueda de similitud vectorial que requieran una precisión perfecta y dependan de conjuntos de datos relativamente pequeños (a escala de millones), el índice BIN_FLAT es una buena elección. BIN_FLAT no comprime los vectores y es el único índice que puede garantizar resultados de búsqueda exactos. Los resultados de BIN_FLAT también pueden utilizarse como punto de comparación para los resultados producidos por otros índices que tienen menos del 100% de recuperación.

BIN_FLAT es preciso porque adopta un enfoque exhaustivo de la búsqueda, lo que significa que para cada consulta la entrada objetivo se compara con vectores de un conjunto de datos. Esto hace que BIN_FLAT sea el índice más lento de nuestra lista y poco adecuado para consultar datos vectoriales masivos. No hay parámetros para el índice BIN_FLAT en Milvus y su uso no requiere entrenamiento de datos ni almacenamiento adicional.

  • Parámetros de búsqueda

    ParámetroDescripciónRango
    metric_type[Opcional] La métrica de distancia elegida.Véase Métricas admitidas.

BIN_IVF_FLAT

Este índice es exactamente igual que IVF_FLAT, salvo que sólo puede utilizarse para incrustaciones binarias.

BIN_IVF_FLAT divide los datos vectoriales en unidades de clúster nlist y, a continuación, compara las distancias entre el vector de entrada objetivo y el centro de cada clúster. Dependiendo del número de clústeres que el sistema consulte (nprobe), los resultados de la búsqueda de similitud se basan en comparaciones entre la entrada de destino y los vectores del clúster o clústeres más similares, lo que reduce drásticamente el tiempo de consulta.

Ajustando nprobe, se puede encontrar un equilibrio ideal entre precisión y velocidad para un escenario determinado. El tiempo de consulta aumenta bruscamente a medida que aumentan tanto el número de vectores de entrada objetivo (nq), como el número de clusters a buscar (nprobe).

BIN_IVF_FLAT es el índice BIN_IVF más básico, y los datos codificados almacenados en cada unidad son coherentes con los datos originales.

  • Parámetros de construcción del índice

    ParámetroDescripciónRango
    nlistNúmero de unidades de clúster[1, 65536]
  • Parámetros de búsqueda

    • Búsqueda común

      ParámetroDescripciónRangoValor por defecto
      nprobeNúmero de unidades a consultar[1, nlist]8
    • Rango de búsqueda

      ParámetroDescripciónGamaValor por defecto
      max_empty_result_bucketsNúmero máximo de buckets que no devuelven ningún resultado de búsqueda.
      Este es un parámetro de búsqueda por rango y termina el proceso de búsqueda cuando el número de buckets vacíos consecutivos alcanza el valor especificado.
      Aumentar este valor puede mejorar la tasa de recuperación a costa de aumentar el tiempo de búsqueda.
      [1, 65535]2

SPARSE_INVERTED_INDEX

Cada dimensión mantiene una lista de vectores que tienen un valor distinto de cero en esa dimensión. Durante la búsqueda, Milvus itera por cada dimensión del vector de consulta y calcula las puntuaciones de los vectores que tienen valores distintos de cero en esas dimensiones.

  • Parámetros de creación de índices

    ParámetroDescripciónRango
    drop_ratio_buildProporción de valores pequeños del vector que se excluyen durante el proceso de indexación. Esta opción permite ajustar con precisión el proceso de indexación, estableciendo un equilibrio entre eficiencia y precisión al no tener en cuenta los valores pequeños cuando se construye el índice.[0, 1]
  • Parámetros de búsqueda

    ParámetroDescripciónRango
    drop_ratio_searchProporción de valores pequeños del vector que se excluyen durante el proceso de búsqueda. Esta opción permite afinar el proceso de búsqueda especificando la proporción de los valores más pequeños del vector de consulta que deben ignorarse. Ayuda a equilibrar la precisión y el rendimiento de la búsqueda. Cuanto menor sea el valor establecido para drop_ratio_search, menos contribuirán estos valores pequeños a la puntuación final. Al ignorar algunos valores pequeños, se puede mejorar el rendimiento de la búsqueda con un impacto mínimo en la precisión.[0, 1]

VARA_ESPOSA

Este índice comparte similitudes con SPARSE_INVERTED_INDEX, aunque utiliza el algoritmo Weak-AND para reducir aún más el número de evaluaciones de distancia IP completa durante el proceso de búsqueda.

Según nuestras pruebas, SPARSE_WAND suele superar a otros métodos en términos de velocidad. Sin embargo, su rendimiento puede deteriorarse rápidamente a medida que aumenta la densidad de los vectores. Para solucionar este problema, la introducción de un valor distinto de cero en drop_ratio_search puede mejorar significativamente el rendimiento con una pérdida mínima de precisión. Para más información, consulte Vector disperso.

  • Parámetros de creación de índices

    ParámetroDescripciónRango
    drop_ratio_buildProporción de valores pequeños del vector que se excluyen durante el proceso de indexación. Esta opción permite ajustar con precisión el proceso de indexación, estableciendo un equilibrio entre eficiencia y precisión al no tener en cuenta los valores pequeños cuando se construye el índice.[0, 1]
  • Parámetros de búsqueda

    ParámetroDescripciónRango
    drop_ratio_searchProporción de valores pequeños del vector que se excluyen durante el proceso de búsqueda. Esta opción permite afinar el proceso de búsqueda especificando la proporción de los valores más pequeños del vector de consulta que deben ignorarse. Ayuda a equilibrar la precisión y el rendimiento de la búsqueda. Cuanto menor sea el valor establecido para drop_ratio_search, menos contribuirán estos valores pequeños a la puntuación final. Al ignorar algunos valores pequeños, se puede mejorar el rendimiento de la búsqueda con un impacto mínimo en la precisión.[0, 1]

FAQ

¿Cuál es la diferencia entre el índice FLAT y el índice IVF_FLAT?

El índice IVF_FLAT divide un espacio vectorial en nlist clusters. Si mantiene el valor por defecto de nlist como 16384, Milvus compara las distancias entre el vector objetivo y los centros de todos los 16384 clusters para obtener nprobe clusters más cercanos. Luego Milvus compara las distancias entre el vector objetivo y los vectores en los clusters seleccionados para obtener los vectores más cercanos. A diferencia de IVF_FLAT, FLAT compara directamente las distancias entre el vector objetivo y todos y cada uno de los vectores.

Por lo tanto, cuando el número total de vectores es aproximadamente igual a nlist, IVF_FLAT y FLAT tienen poca diferencia en la forma de cálculo requerida y en el rendimiento de la búsqueda. Pero a medida que el número de vectores crece hasta dos veces, tres veces o n veces nlist, el índice IVF_FLAT empieza a mostrar ventajas cada vez mayores.

Consulte Cómo elegir un índice en Milvus para obtener más información.

Lo que sigue

Traducido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?