Índice GPU
Milvus admite varios tipos de índice de GPU para acelerar el rendimiento y la eficiencia de la búsqueda, especialmente en escenarios de alto rendimiento y alta recuperación. Este tema proporciona una visión general de los tipos de índice GPU soportados por Milvus, sus casos de uso adecuados y sus características de rendimiento. Para obtener información sobre la creación de índices con GPU, consulte Índice con GPU.
Es importante tener en cuenta que el uso de un índice GPU no necesariamente reduce la latencia en comparación con el uso de un índice CPU. Si quieres maximizar al máximo el rendimiento, necesitarás una presión de petición extremadamente alta o un gran número de vectores de consulta.
rendimiento
La compatibilidad de Milvus con la GPU la aporta el equipo Nvidia RAPIDS. Los siguientes son los tipos de índice GPU actualmente soportados por Milvus.
GPU_CAGRA
GPU_CAGRA es un índice basado en grafos optimizado para GPUs. El uso de GPUs de grado inferencia para ejecutar la versión Milvus GPU puede ser más rentable en comparación con el uso de costosas GPUs de grado entrenamiento.
Parámetros de construcción del índice
Parámetro Descripción Valor predeterminado intermediate_graph_degree
Afecta a la recuperación y al tiempo de construcción al determinar el grado del gráfico antes de la poda. Los valores recomendados son 32
o64
.128
graph_degree
Afecta al rendimiento de la búsqueda y a la recuperación estableciendo el grado del gráfico después de la poda. Una mayor diferencia entre estos dos grados se traduce en un mayor tiempo de construcción. Su valor debe ser menor que el valor de intermediate_graph_degree. 64
build_algo
Selecciona el algoritmo de generación del grafo antes de la poda. Valores posibles: IVF_PQ
: Ofrece mayor calidad pero menor tiempo de construcción.NN_DESCENT
Ofrece una construcción más rápida con una recuperación potencialmente menor.IVF_PQ
cache_dataset_on_device
Decide si almacenar en caché el conjunto de datos original en la memoria de la GPU. Valores posibles: “true”
: Almacena en caché el conjunto de datos original para mejorar la recuperación refinando los resultados de la búsqueda.“false”
No almacena en caché el conjunto de datos original para ahorrar memoria en la GPU.“false”
adapt_for_cpu
Decide si se utiliza la GPU para la creación de índices y la CPU para la búsqueda.
La configuración de este parámetro entrue
requiere la presencia del parámetroef
en las solicitudes de búsqueda.“false”
Parámetros de búsqueda
Parámetro Descripción Valor por defecto itopk_size
Determina el tamaño de los resultados intermedios conservados durante la búsqueda. Un valor mayor puede mejorar la recuperación a expensas del rendimiento de la búsqueda. Debe ser al menos igual al valor final top-k (límite) y suele ser una potencia de 2 (por ejemplo, 16, 32, 64, 128). Vacío search_width
Especifica el número de puntos de entrada en el gráfico CAGRA durante la búsqueda. Aumentar este valor puede mejorar la recuperación, pero puede afectar al rendimiento de la búsqueda (por ejemplo, 1, 2, 4, 8, 16, 32). Vacío min_iterations
/max_iterations
Controla el proceso de iteración de la búsqueda. Por defecto, se establecen en 0
, y CAGRA determina automáticamente el número de iteraciones basándose enitopk_size
ysearch_width
. Ajustar estos valores manualmente puede ayudar a equilibrar el rendimiento y la precisión.0
team_size
Especifica el número de subprocesos CUDA utilizados para calcular la distancia métrica en la GPU. Los valores habituales son una potencia de 2 hasta 32 (por ejemplo, 2, 4, 8, 16, 32). Tiene un impacto menor en el rendimiento de la búsqueda. El valor por defecto es 0
, donde Milvus selecciona automáticamenteteam_size
basándose en la dimensión del vector.0
ef
Especifica el compromiso entre tiempo de búsqueda y precisión. Un valor más alto de ef
conduce a una búsqueda más precisa pero más lenta.
Este parámetro es obligatorio si se estableceadapt_for_cpu
entrue
al crear el índice.[top_k, int_max]
Límites de búsqueda
Parámetro Rango limit
(top-K)<= 1024 limit
(top-K)<=max(( itopk_size
+ 31)// 32,search_width
) * 32
GPU_IVF_FLAT
De forma similar a IVF_FLAT, GPU_IVF_FLAT también 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 consulte (nprobe
), los resultados de la búsqueda de similitud se basan en comparaciones entre el vector de entrada objetivo y los vectores del cluster o clusters 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. 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
).
GPU_IVF_FLAT es el índice IVF más básico, y los datos codificados almacenados en cada unidad son coherentes con los datos originales.
Al realizar búsquedas, tenga en cuenta que puede establecer el top-K hasta 256 para cualquier búsqueda contra una colección indexada en GPU_IVF_FLAT.
Parámetros de creación de índices
Parámetro Descripción Rango Valor predeterminado nlist
Número de unidades de clúster [1, 65536] 128
cache_dataset_on_device
Decide si se almacena en caché el conjunto de datos original en la memoria de la GPU. Valores posibles: “true”
: Almacena en caché el conjunto de datos original para mejorar la recuperación refinando los resultados de búsqueda.“false”
No almacena en caché el conjunto de datos original para ahorrar memoria de la GPU."true"
"flase"
"false"
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
Límites de la búsqueda
Parámetro Rango limit
(top-K)<= 2048
GPU_IVF_PQ
PQ
(Cuantización de producto) 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 Milvus.
Cuando realice búsquedas, tenga en cuenta que puede establecer el top-K hasta 8192 para cualquier búsqueda contra una colección indexada GPU_IVF_FLAT.
Parámetros de creación de índices
Parámetro Descripción Rango Valor predeterminado nlist
Número de unidades de clúster [1, 65536] 128
m
Número de factores de cuantificación del producto, dim mod m or = 0
0
nbits
[Opcional] Número de bits en los que se almacena cada vector de baja dimensión. [1, 16] 8
cache_dataset_on_device
Decide si se almacena en caché el conjunto de datos original en la memoria de la GPU. Valores posibles: “true”
: Almacena en caché el conjunto de datos original para mejorar la recuperación refinando los resultados de búsqueda.“false”
No almacena en caché el conjunto de datos original para ahorrar memoria de la GPU."true"
"false"
"false"
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
Límites de la búsqueda
Parámetro Rango limit
(top-K)<= 1024
GPU_BRUTE_FORCE
GPU_BRUTE_FORCE está diseñado para casos en los que es crucial una recuperación extremadamente alta, garantizando una recuperación de 1 al comparar cada consulta con todos los vectores del conjunto de datos. Sólo requiere el tipo de métrica (metric_type
) y top-k (limit
) como parámetros de creación y búsqueda de índices.
Para GPU_BRUTE_FORCE, no se requieren parámetros adicionales de creación de índices ni de búsqueda.
Conclusión
Actualmente, Milvus carga todos los índices en la memoria de la GPU para realizar operaciones de búsqueda eficientes. La cantidad de datos que pueden cargarse depende del tamaño de la memoria de la GPU:
- GPU_CAGRA: el uso de memoria es aproximadamente 1,8 veces el de los datos vectoriales originales.
- GPU_IVF_FLAT y GPU_BRUTE_FORCE: Requiere una memoria igual al tamaño de los datos originales.
- GPU_IVF_PQ: Utiliza un espacio de memoria menor, que depende de la configuración de los parámetros de compresión.