Í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.
Í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 |
|
IVF_FLAT | Índice basado en la cuantificación |
|
IVF_SQ8 | Índice cuantitativo |
|
IVF_PQ | Índice basado en cuantificación |
|
HNSW | Índice basado en grafos |
|
SCANN | Índice basado en la cuantificación |
|
Índice compatible | Clasificación | Escenario |
---|---|---|
BIN_FLAT | Índice basado en la cuantificación |
|
BIN_IVF_FLAT | Índice basado en la cuantificación |
|
Índice compatible | Clasificación | Escenario |
---|---|---|
ÍNDICE_ESPARCIDO_INVERTIDO | Índice invertido |
|
VARA_ESPARAZ | Índice invertido |
|
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ámetro Descripción Rango 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ámetro Descripción Rango Valor por defecto nlist
Número de unidades de clúster [1, 65536] 128 Parámetros de búsqueda
Búsqueda común
Parámetro Descripción Rango Valor por defecto nprobe
Número de unidades a consultar [1, nlist] 8 Rango de búsqueda
Parámetro Descripción Gama Valor por defecto max_empty_result_buckets
Nú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ámetro Descripción Rango nlist
Número de unidades de clúster [1, 65536] Parámetros de búsqueda
Búsqueda común
Parámetro Descripción Rango Valor por defecto nprobe
Número de unidades a consultar [1, nlist] 8 Rango de búsqueda
Parámetro Descripción Gama Valor por defecto max_empty_result_buckets
Nú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ámetro Descripción Rango nlist
Número de unidades de cluster [1, 65536] m
Número de factores de cuantificación del producto dim 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ámetro Descripción Rango Valor por defecto nprobe
Número de unidades a consultar [1, nlist] 8 Rango de búsqueda
Parámetro Descripción Gama Valor por defecto max_empty_result_buckets
Nú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ámetro Descripción Rango nlist
Número de unidades de clúster [1, 65536] with_raw_data
Si se incluyen los datos brutos en el índice True
oFalse
. Por defectoTrue
.A diferencia de IVF_PQ, los valores por defecto se aplican a
m
ynbits
para optimizar el rendimiento.Parámetros de búsqueda
Búsqueda común
Parámetro Descripción Rango Valor por defecto nprobe
Número de unidades a consultar [1, nlist] reorder_k
Número de unidades candidatas a consultar [ top_k
, ∞]top_k
Búsqueda por rangos
Parámetro Descripción Gama Valor por defecto max_empty_result_buckets
Nú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ámetro Descripción Rango M
M 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] efConstruction
ef_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ámetro Descripción Rango ef
Pará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ámetro Descripción Rango 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ámetro Descripción Rango nlist
Número de unidades de clúster [1, 65536] Parámetros de búsqueda
Búsqueda común
Parámetro Descripción Rango Valor por defecto nprobe
Número de unidades a consultar [1, nlist] 8 Rango de búsqueda
Parámetro Descripción Gama Valor por defecto max_empty_result_buckets
Nú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ámetro Descripción Rango drop_ratio_build
Proporció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ámetro Descripción Rango drop_ratio_search
Proporció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ámetro Descripción Rango drop_ratio_build
Proporció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ámetro Descripción Rango drop_ratio_search
Proporció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
- Obtenga más información sobre las métricas de similitud admitidas en Milvus.