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:

orqr2orco2+qrco22C(or,co)o~,qrco+C1(or,co)\lVert \mathbf{o_r} - \mathbf{q_r} \rVert^2 \approx \lVert \mathbf{o_r} - \mathbf{c_o} \rVert^2 + \lVert \mathbf{q_r} - \mathbf{c_o} \rVert^2 - 2 \cdot C(\mathbf{o_r}, \mathbf{c_o}) \cdot \langle \tilde{\mathbf{o}}, \mathbf{q_r} - \mathbf{c_o} \rangle + C_1(\mathbf{o_r}, \mathbf{c_o})

Donde

  • o\mathbf{o_r} o es un vector de datos del conjunto de datos
  • qr\mathbf{q_r} q es un vector de consulta
  • co\mathbf{c_o} c es el vector centroide FIV más cercano para or\mathbf{o_r} o
  • C (or,co)C(\mathbf{o_r}, \mathbf{c_o} ), ) y C1(or,co)C_1(\mathbf{o_r}, \mathbf{c_o}) C , ) son constantes precalculadas
  • o~\tilde{\mathbf{o}}
  • ⟨o~,qr-co⟩\langle\tilde{\mathbf{o}}, \mathbf{q_r} - \mathbf{c_o} \rangle o q representa la operación punto-producto.

Eficiencia computacional: La naturaleza binaria de o~\tilde{\mathbf{o}} 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:

  1. 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.

  2. 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.

  3. 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 valor IVF_RABITQ.

  • metric_type: El método utilizado para calcular la distancia entre vectores. Los valores soportados incluyen COSINE, L2, y IP. 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:

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

nlist

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
Rango: [1, 65536]
Valor por defecto: 128

Los valores mayores de nlist mejoran la recuperación al crear clusters más refinados, pero aumentan el tiempo de creación del índice. Optimice en función del tamaño del conjunto de datos y de los recursos disponibles. En la mayoría de los casos, se recomienda establecer un valor dentro de este intervalo: [32, 4096].

RaBitQ

refine

Activa el proceso de refinado y almacena los datos refinados.

Tipo: Booleano
Rango: [true, false]
Valor por defecto: false

Se establece en true si se necesita un índice de recuperación superior a 0,9. La activación del refinamiento mejora la precisión, pero aumenta los requisitos de almacenamiento y el tiempo de creación del índice.

refine_type

Define la representación de datos utilizada para el refinamiento cuando refine está activado.

Tipo: Cadena
Rango: [SQ6, SQ8, FP16, BF16, FP32]
Valor por defecto: Ninguno

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 SQ8 como punto de partida, ya que ofrece un buen equilibrio entre precisión y uso de recursos.

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

nprobe

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
Rango: [1, nlist]
Valor por defecto: 8

Aumentar este valor mejora la recuperación pero puede ralentizar la búsqueda. Establezca nprobe proporcionalmente a nlist para equilibrar velocidad y precisión. En la mayoría de los casos, se recomienda establecer un valor dentro de este intervalo: [1, nlist].

RaBitQ

rbq_query_bits

Establece si se aplica una cuantización escalar adicional a un vector de consulta. Si se establece en 0, la consulta se utiliza sin cuantización. Si se establece en [1, 8], la consulta se preprocesa utilizando una cuantización escalar de n bits.

Tipo Entero
Rango: [0, 8]
Valor por defecto: 0

El valor por defecto 0 proporciona la máxima tasa de recuperación pero el rendimiento más lento. Se recomienda probar los valores 0, 8, y 6, ya que proporcionan índices de recuperación similares, siendo 6 el más rápido. Utilice valores más pequeños para requisitos de recuperación más elevados.

refine_k

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 refine_k veces mayor elegido mediante IVF_RABITQ.

Tipo: Float
Rango: [1, float_max)
Valor por defecto: 1

Los valores más altos de refine_k reducen el QPS pero aumentan la tasa de recuperación. Comience con 1 y pruebe los valores 2, 3, 4, y 5 para encontrar el equilibrio óptimo entre QPS y recuperación para su conjunto de datos.

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?