• Informazioni su Milvus
  • Iniziare
  • Concetti
  • Guida per l'utente
  • Importazione dei dati
  • Strumenti AI
  • Guida all'amministrazione
  • Strumenti
  • Integrazioni
  • Tutorial
  • Domande frequenti
  • API Reference

IVF_RABITQCompatible with Milvus 2.6.x

L'indice IVF_RABITQ è un algoritmo di indicizzazione basato sulla quantizzazione binaria che quantizza i vettori FP32 in rappresentazioni binarie. Questo indice offre un'eccezionale efficienza di memorizzazione con un rapporto di compressione di 1 a 32, pur mantenendo tassi di richiamo relativamente buoni. Supporta il raffinamento opzionale per ottenere un richiamo più elevato al costo di una memoria aggiuntiva, rendendolo un sostituto versatile di IVF_SQ8 e IVF_FLAT in scenari con limitazioni di memoria.

Panoramica

IVF_RABITQ è l'acronimo di Inverted File with RaBitQ quantization (File invertito con quantizzazione RaBitQ), che combina due potenti tecniche di ricerca e memorizzazione vettoriale efficiente.

IVF

Inverted File (IVF) organizza lo spazio vettoriale in regioni gestibili utilizzando il clustering k-means. Ogni cluster è rappresentato da un centroide, che serve come punto di riferimento per i vettori all'interno del cluster. Questo approccio di clustering riduce lo spazio di ricerca, consentendo all'algoritmo di concentrarsi solo sui cluster più rilevanti durante l'elaborazione delle query.

Per saperne di più sui dettagli tecnici di IVF, consultare IVF_FLAT.

RaBitQ

RaBitQ è un metodo di quantizzazione binaria all'avanguardia con garanzie teoriche, introdotto nel documento di ricerca "RaBitQ: Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search" di Jianyang Gao e Cheng Long.

RaBitQ introduce diversi concetti innovativi:

Codifica dell'informazione angolare: A differenza della tradizionale codifica spaziale, RaBitQ codifica le informazioni angolari attraverso la normalizzazione del vettore. In IVF_RABITQ, i vettori di dati sono normalizzati rispetto al centroide IVF più vicino, migliorando la precisione del processo di quantizzazione.

Basi teoriche: La formula di base per l'approssimazione della distanza è

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})

Dove:

  • o\mathbf{o_r} o è un vettore di dati dal dataset
  • qr\mathbf{q_r} q è un vettore di interrogazione
  • co\mathbf{c_o} c è il vettore centroide FIV più vicino per or\mathbf{o_r} o
  • C(o,co)C(\mathbf{o_r}, \mathbf{c_o}) C, ) e C1(o,co)C_1(\mathbf{o_r}, \mathbf{c_o}) C , ) sono costanti precalcolate
  • o~tilde{\mathbf{o}}
  • ⟨o~,qr-co⟩angolo\tilde{\mathbf{o}}, \mathbf{q_r} - \mathbf{c_o} \rangolo o q rappresenta l'operazione del prodotto di punti

Efficienza di calcolo: La natura binaria di o~tilde{\mathbf{o}} AVX-512 VPOPCNTDQ sui processori Intel Ice Lake+ o AMD Zen 4+.

Miglioramenti algoritmici: RaBitQ si integra efficacemente con tecniche consolidate come l'approccioFastScan e le rotazioni casuali per migliorare le prestazioni.

FIV + RaBitQ

L'indice IVF_RABITQ combina l'efficiente clustering di IVF con la quantizzazione binaria avanzata di RaBitQ:

  1. Filtraggio grossolano: IVF suddivide lo spazio vettoriale in cluster, riducendo in modo significativo la portata della ricerca e concentrandosi sulle regioni dei cluster più rilevanti.

  2. Quantizzazione binaria: All'interno di ciascun cluster, RaBitQ comprime i vettori in rappresentazioni binarie, preservando le relazioni di distanza essenziali attraverso garanzie teoriche.

  3. Raffinamento opzionale: Se abilitato, l'indice memorizza dati raffinati aggiuntivi utilizzando formati di precisione più elevati (SQ6, SQ8, FP16, BF16 o FP32) per migliorare i tassi di richiamo al costo di una maggiore memorizzazione.

Milvus implementa IVF_RABITQ utilizzando le seguenti stringhe di fabbrica FAISS:

  • Con raffinamento: "RR({dim}),IVF{nlist},RaBitQ,Refine({refine_index})"
  • Senza raffinamento: "RR({dim}),IVF{nlist},RaBitQ"

Costruire l'indice

Per costruire un indice IVF_RABITQ su un campo vettoriale in Milvus, utilizzare il metodo add_index(), specificando i parametri index_type, metric_type, e ulteriori parametri per l'indice.

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
)

In questa configurazione:

  • index_type: Il tipo di indice da costruire. In questo esempio, impostare il valore su IVF_RABITQ.

  • metric_type: Il metodo utilizzato per calcolare la distanza tra i vettori. I valori supportati sono COSINE, L2 e IP. Per maggiori dettagli, consultare Tipi di metriche.

  • params: Opzioni di configurazione aggiuntive per la costruzione dell'indice. Per i dettagli, fare riferimento a Parametri di costruzione dell'indice.

Una volta configurati i parametri dell'indice, si può creare l'indice usando direttamente il metodo create_index() o passando i parametri dell'indice nel metodo create_collection. Per i dettagli, fare riferimento a Creare una raccolta.

Ricerca nell'indice

Una volta costruito l'indice e inserite le entità, è possibile eseguire ricerche di similarità sull'indice.

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
)

In questa configurazione:

L'indice IVF_RABITQ si basa molto sull'istruzione hardware popcount per ottenere prestazioni ottimali. Le moderne architetture di CPU, come Intel IceLake+ o AMD Zen 4+, con set di istruzioni AVX512VPOPCNTDQ, migliorano notevolmente le prestazioni delle operazioni RaBitQ.

Parametri dell'indice

Questa sezione fornisce una panoramica dei parametri utilizzati per la creazione di un indice e per l'esecuzione di ricerche sull'indice.

Parametri di costruzione dell'indice

La tabella seguente elenca i parametri che possono essere configurati in params quando si costruisce un indice.

Parametro

Descrizione

Valore Intervallo

Suggerimento per la messa a punto

FIV

nlist

Numero di cluster da creare con l'algoritmo k-means durante la creazione dell'indice. Ogni cluster, rappresentato da un centroide, memorizza un elenco di vettori. Aumentando questo parametro si riduce il numero di vettori in ogni cluster, creando partizioni più piccole e mirate.

Tipo: Intero
Intervallo: [1, 65536]
Valore predefinito: 128

Valori maggiori di nlist migliorano il richiamo creando cluster più raffinati, ma aumentano il tempo di costruzione dell'indice. Ottimizzare in base alle dimensioni del set di dati e alle risorse disponibili. Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [32, 4096].

RaBitQ

refine

Attiva il processo di raffinazione e memorizza i dati raffinati.

Tipo: Booleano
Intervallo: [true, false]
Valore predefinito: false

Impostare su true se è necessario un tasso di richiamo di 0,9+. L'abilitazione del raffinamento migliora l'accuratezza, ma aumenta i requisiti di memorizzazione e il tempo di costruzione dell'indice.

refine_type

Definisce la rappresentazione dei dati utilizzata per il raffinamento quando è abilitato refine.

Tipo: Stringa
Intervallo: [SQ6, SQ8, FP16, BF16, FP32]
Valore predefinito: Nessuno

I valori elencati sono presentati in ordine crescente di tasso di richiamo, diminuzione del QPS e aumento della dimensione di archiviazione. SQ8 è consigliato come punto di partenza, in quanto offre un buon equilibrio tra accuratezza e utilizzo delle risorse.

Parametri di ricerca specifici per l'indice

La tabella seguente elenca i parametri che possono essere configurati in search_params.params per la ricerca sull'indice.

Parametro

Descrizione

Valore Intervallo

Suggerimento per la messa a punto

FIV

nprobe

Numero di cluster in cui cercare i candidati. Valori più alti consentono di cercare più cluster, migliorando il richiamo grazie all'espansione dell'ambito di ricerca, ma al costo di una maggiore latenza della query.

Tipo: Intero
Intervallo: [1, nlist]
Valore predefinito: 8

L'aumento di questo valore migliora il richiamo, ma può rallentare la ricerca. Impostare nprobe in modo proporzionale a nlist per bilanciare velocità e precisione. Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [1, nlist].

RaBitQ

rbq_query_bits

Imposta se applicare una quantizzazione scalare aggiuntiva a un vettore di query. Se impostato su 0, la query viene utilizzata senza quantizzazione. Se impostato su un valore compreso tra [1, 8], la query viene preelaborata utilizzando una quantizzazione scalare a n bit.

Tipo: Intero
Intervallo: [0, 8]
Valore predefinito: 0

Il valore predefinito 0 fornisce la massima velocità di richiamo ma le prestazioni più lente. Si consiglia di testare i valori 0, 8, e 6, poiché forniscono tassi di richiamo simili, con 6 che è il più veloce. Utilizzare valori inferiori per requisiti di richiamo più elevati.

refine_k

Il processo di raffinazione utilizza una quantizzazione di qualità superiore per scegliere il numero necessario di vicini da un pool refine_k più grande di candidati scelti con IVF_RABITQ.

Tipo: Variabile
Intervallo: [1, float_max)
Valore predefinito: 1

I valori più alti di refine_k diminuiscono il QPS ma aumentano il tasso di richiamo. Iniziare con 1 e testare i valori 2, 3, 4 e 5 per trovare il compromesso ottimale tra QPS e richiamo per il proprio set di dati.

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?