Visión general del índice GPU

La creación de un índice compatible con la GPU en Milvus puede mejorar significativamente el rendimiento de la búsqueda en escenarios de alto rendimiento y alta recuperación.

La siguiente figura compara el rendimiento de las consultas (consultas por segundo) en distintas configuraciones de índices, configuraciones de hardware, conjuntos de datos vectoriales (Cohere y OpenAI) y tamaños de lotes de búsqueda, lo que demuestra que GPU_CAGRA supera sistemáticamente a otros métodos.

Gpu Index Performance Rendimiento de los índices en la GPU

Configuración de la reserva de memoria de la GPU para Milvus

Milvus soporta un pool de memoria GPU global y proporciona dos parámetros de configuración, initMemSize y maxMemSize, en el archivo de configuración de Milvus.

gpu:
  initMemSize: 0 # set the initial memory pool size.
  maxMemSize: 0 # sets the maximum memory usage limit. When the memory usage exceeds initMemSize, Milvus will attempt to expand the memory pool.

El valor predeterminado initMemSize suele ser la mitad de la memoria de la GPU cuando se inicia Milvus, y maxMemSize por defecto es toda la memoria de la GPU. El tamaño de la reserva de memoria de la GPU se establece inicialmente en initMemSize y se ampliará automáticamente a maxMemSize cuando sea necesario.

Cuando se especifica un índice habilitado para GPU, Milvus carga los datos de la colección de destino en la memoria de la GPU antes de las búsquedas, por lo que maxMemSize debe ser al menos el tamaño de los datos.

Límites

  • Para GPU_IVF_FLAT, el valor máximo para limit es 1.024.

  • Para GPU_IVF_PQ y GPU_CAGRA, el valor máximo para limit es 1.024.

  • limit Aunque no hay ningún valor establecido para GPU_BRUTE_FORCE, se recomienda no superar los 4.096 para evitar posibles problemas de rendimiento.

  • Actualmente, los índices GPU no admiten la distancia COSINE. Si se necesita la distancia COSINE, los datos deben normalizarse primero y, a continuación, puede utilizarse la distancia de producto interno (IP) como sustituto.

  • La carga de la protección OOM para los índices de la GPU no está totalmente soportada, demasiados datos podrían provocar fallos en el QueryNode.

  • Los índices GPU no soportan funciones de búsqueda como la búsqueda por rango y la búsqueda por agrupación.

Tipos de índices GPU soportados

La siguiente tabla enumera los tipos de índice GPU soportados por Milvus.

Tipo de índice

Descripción

Uso de memoria

GPU_CAGRA

GPU_CAGRA es un índice basado en grafos optimizado para GPUs. El uso de GPUs de grado de inferencia para ejecutar la versión Milvus GPU puede ser más rentable en comparación con el uso de GPUs caras de grado de entrenamiento.

El uso de memoria es aproximadamente 1,8 veces superior al de los datos vectoriales originales.

GPU_IVF_FLAT

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 (limit) hasta 256 para cualquier búsqueda contra una colección indexada en GPU_IVF_FLAT.

Requiere una memoria igual al tamaño de los datos originales.

GPU_IVF_PQ

GPU_IVF_PQ realiza la agrupación de índices IVF antes de cuantificar el producto de vectores. Al realizar búsquedas, tenga en cuenta que puede establecer el top-k (limit) hasta 8.192 para cualquier búsqueda contra una colección indexada GPU_IVF_FLAT.

Utiliza una menor huella de memoria, que depende de la configuración de los parámetros de compresión.

GPU_BRUTE_FORCE

GPU_BRUTE_FORCE está diseñado para casos en los que es crucial obtener 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.

Requiere una memoria igual al tamaño de los datos originales.

Configurar los ajustes de Milvus para el control de la memoria de la GPU

Milvus utiliza un pool de memoria gráfica global para asignar memoria a la GPU. Admite dos parámetros initMemSize y maxMemSize en el archivo de configuración de Milvus. El tamaño del pool se establece inicialmente en initMemSize, y se ampliará automáticamente a maxMemSize una vez superado este límite.

El valor por defecto initMemSize es 1/2 de la memoria GPU disponible cuando Milvus se inicia, y el valor por defecto maxMemSize es igual a toda la memoria GPU disponible.

Hasta Milvus 2.4.1, Milvus utiliza un pool de memoria GPU unificado. Para versiones anteriores a la 2.4.1, se recomendaba poner ambos valores a 0.

gpu:
  initMemSize: 0 #set the initial memory pool size.
  maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 

A partir de Milvus 2.4.1, el pool de memoria de la GPU sólo se utiliza para datos temporales de la GPU durante las búsquedas. Por lo tanto, se recomienda establecerla en 2048 y 4096.

gpu:
  initMemSize: 2048 #set the initial memory pool size.
  maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 

Para saber cómo construir un índice GPU, consulte la guía específica para cada tipo de índice.

PREGUNTAS FRECUENTES

  • ¿Cuándo es apropiado utilizar un índice GPU?

    Un índice de GPU es especialmente beneficioso en situaciones que exigen un alto rendimiento o una alta recuperación. Por ejemplo, cuando se trata de grandes lotes, el rendimiento de la indexación en la GPU puede superar hasta 100 veces el de la indexación en la CPU. En situaciones con lotes más pequeños, los índices de la GPU siguen superando significativamente a los de la CPU en términos de rendimiento. Además, si se requiere una rápida inserción de datos, la incorporación de una GPU puede acelerar sustancialmente el proceso de creación de índices.

  • ¿En qué escenarios son más adecuados los índices para GPU como GPU_CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT y GPU_BRUTE_FORCE?

    GPU_CAGRA Los índices GPU_CAGRA son ideales para escenarios que exigen un mayor rendimiento, aunque a costa de consumir más memoria. Para entornos en los que la conservación de la memoria es una prioridad, el índice GPU_IVF_PQ puede ayudar a minimizar los requisitos de almacenamiento, aunque esto conlleva una mayor pérdida de precisión. El índice GPU_IVF_FLAT sirve como opción equilibrada, ofreciendo un compromiso entre rendimiento y consumo de memoria. Por último, el índice GPU_BRUTE_FORCE está diseñado para operaciones de búsqueda exhaustiva, garantizando una tasa de recuperación de 1 mediante la realización de búsquedas transversales.