IVF_RABITQCompatible with Milvus 2.6.x
El índice IVF_RABITQ es un algoritmo de indexación basado en la cuantización binaria que cuantiza vectores FP32 en representaciones binarias. Este índice ofrece una eficiencia de almacenamiento excepcional con una relación de compresión de 1 a 32, al tiempo que mantiene unos índices de recuperación relativamente buenos. Admite el refinamiento opcional para lograr una mayor recuperación a costa de almacenamiento adicional, lo que lo convierte en un sustituto versátil de IVF_SQ8 e IVF_FLAT en escenarios con limitaciones de memoria.
Resumen
IVF_RABITQ son las siglas de Inverted File with RaBitQ quantization (Archivo invertido con cuantificación RaBitQ), que combina dos potentes técnicas para la búsqueda y el almacenamiento eficientes de vectores.
IVF
ElArchivo Invertido ( IVF) organiza el espacio vectorial en regiones manejables utilizando la agrupación k-means. Cada clúster está representado por un centroide, que sirve como punto de referencia para los vectores dentro de ese clúster. Este enfoque de agrupación reduce el espacio de búsqueda al permitir que el algoritmo se centre sólo en los clusters más relevantes durante el procesamiento de la consulta.
Para obtener más información sobre los detalles técnicos de IVF, consulte IVF_FLAT.
RaBitQ
RaBitQ es un método de cuantificación binaria de última generación con garantías teóricas, presentado en el artículo de investigación "RaBitQ: Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search" por Jianyang Gao y Cheng Long.
RaBitQ introduce varios conceptos innovadores:
Codificación de información angular: A diferencia de la codificación espacial tradicional, RaBitQ codifica la información angular mediante la normalización de vectores. En IVF_RABITQ, los vectores de datos se normalizan con respecto a su centroide IVF más cercano, lo que mejora la precisión del proceso de cuantización.
Fundamento teórico: La fórmula de aproximación de distancia central es:
Donde
- o es un vector de datos del conjunto de datos
- q es un vector de consulta
- c es el vector centroide FIV más cercano para o
- ), ) y C , ) son constantes precalculadas
- o q representa la operación punto-producto.
Eficiencia computacional: La naturaleza binaria de AVX-512 VPOPCNTDQ en procesadores Intel Ice Lake+ o AMD Zen 4+.
Mejoras algorítmicas: RaBitQ se integra eficazmente con técnicas establecidas como el enfoqueFastScan y las rotaciones aleatorias para mejorar el rendimiento.
IVF + RaBitQ
El índice IVF_RABITQ combina la agrupación eficiente de IVF con la cuantificación binaria avanzada de RaBitQ:
Filtrado grueso: IVF particiona el espacio vectorial en clusters, reduciendo significativamente el ámbito de búsqueda al centrarse en las regiones de clusters más relevantes.
Cuantificación binaria: Dentro de cada clúster, RaBitQ comprime los vectores en representaciones binarias preservando las relaciones de distancia esenciales mediante garantías teóricas.
Refinamiento opcional: Cuando está activado, el índice almacena datos refinados adicionales utilizando formatos de mayor precisión (SQ6, SQ8, FP16, BF16 o FP32) para mejorar las tasas de recuperación a costa de un mayor almacenamiento.
Milvus implementa IVF_RABITQ utilizando las siguientes cadenas de fábrica FAISS:
- Con refinamiento:
"RR({dim}),IVF{nlist},RaBitQ,Refine({refine_index})" - Sin refinamiento:
"RR({dim}),IVF{nlist},RaBitQ"
Construir índice
Para construir un índice IVF_RABITQ sobre un campo vectorial en Milvus, utilice el método add_index(), especificando los parámetros index_type, metric_type, y adicionales para el índice.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_RABITQ", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 1024, # Number of clusters for the index
"refine": True, # Enable refinement for higher recall
"refine_type": "SQ8" # Refinement data format
} # Index building params
)
En esta configuración:
index_type: El tipo de índice a construir. En este ejemplo, establezca el valorIVF_RABITQ.metric_type: El método utilizado para calcular la distancia entre vectores. Los valores soportados incluyenCOSINE,L2, yIP. Para más detalles, consulte Tipos de métricas.params: Opciones de configuración adicionales para construir el índice. Para más información, consulte Parámetros de creación de índices.
Una vez configurados los parámetros del índice, puede crear el índice utilizando directamente el método create_index() o pasando los parámetros del índice en el método create_collection. Para más detalles, consulte Crear colección.
Búsqueda en el índice
Una vez creado el índice e insertadas las entidades, puede realizar búsquedas de similitud en el índice.
search_params = {
"params": {
"nprobe": 128, # Number of clusters to search
"rbq_query_bits": 0, # Query vector quantization bits
"refine_k": 1 # Refinement magnification factor
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
En esta configuración:
params: Opciones de configuración adicionales para la búsqueda en el índice. Para más detalles, consulte Parámetros de búsqueda específicos del índice.
El índice IVF_RABITQ depende en gran medida de la instrucción de hardware popcount para obtener un rendimiento óptimo. Las arquitecturas de CPU modernas como Intel IceLake+ o AMD Zen 4+ con conjuntos de instrucciones AVX512VPOPCNTDQ proporcionan mejoras de rendimiento significativas para las operaciones RaBitQ.
Parámetros de índice
Esta sección proporciona una visión general de los parámetros utilizados para construir un índice y realizar búsquedas en el índice.
Parámetros de creación de índices
La siguiente tabla enumera los parámetros que se pueden configurar en params cuando se construye un índice.
Parámetro |
Descripción |
Rango de valores |
Sugerencia de ajuste |
|
|---|---|---|---|---|
IVF |
|
El número de clusters a crear usando el algoritmo k-means durante la construcción del índice. Cada cluster, representado por un centroide, almacena una lista de vectores. Aumentar este parámetro reduce el número de vectores en cada cluster, creando particiones más pequeñas y centradas. |
Tipo: Entero |
Los valores mayores de |
RaBitQ |
|
Activa el proceso de refinado y almacena los datos refinados. |
Tipo: Booleano |
Se establece en |
|
Define la representación de datos utilizada para el refinamiento cuando |
Tipo: Cadena |
Los valores de la lista se presentan en orden de aumento de la tasa de recuperación, disminución de QPS y aumento del tamaño de almacenamiento. Se recomienda |
Parámetros de búsqueda específicos del índice
En la tabla siguiente se enumeran los parámetros que pueden configurarse en search_params.params cuando se realizan búsquedas en el índice.
Parámetro |
Descripción |
Rango de valores |
Sugerencia de ajuste |
|
|---|---|---|---|---|
IVF |
|
Número de conglomerados en los que se buscan candidatos. Los valores más altos permiten buscar en más conglomerados, lo que mejora la recuperación al ampliar el alcance de la búsqueda, pero a costa de aumentar la latencia de la consulta. |
Tipo: Entero |
Aumentar este valor mejora la recuperación pero puede ralentizar la búsqueda. Establezca |
RaBitQ |
|
Establece si se aplica una cuantización escalar adicional a un vector de consulta. Si se establece en |
Tipo Entero |
El valor por defecto |
|
El proceso de refinado utiliza una cuantización de mayor calidad para seleccionar el número necesario de vecinos más próximos de un conjunto de candidatos |
Tipo: Float |
Los valores más altos de |