AISAQCompatible with Milvus 2.6.4+
AISAQ è un indice vettoriale basato su disco che estende DISKANN per gestire insiemi di dati su scala miliardaria con un ingombro DRAM minimo.
A differenza di DISKANN, che mantiene i vettori compressi in memoria, AISAQ è progettato con una "Architettura DRAM quasi zero", il che significa mantenere tutte le strutture di dati su SSD.
AISAQ consente di eseguire database su scala ultraelevata utilizzando server standard, offrendo al contempo modalità operative per bilanciare prestazioni e costi di archiviazione.
Come funziona AISAQ
Il diagramma qui sopra confronta i layout di archiviazione di DISKANN, AISAQ-Performance e AISAQ-Scale, mostrando come i dati (vettori grezzi, elenchi di bordi e codici PQ) sono distribuiti tra RAM e disco.
Aisaq Vs Diskann
Fondazione: Riepilogo DISKANN
In DISKANN, i vettori grezzi e gli elenchi di bordi sono memorizzati su disco, mentre i vettori compressi PQ sono conservati in memoria (DRAM).
Quando DISKANN passa a un nodo (ad esempio, il vettore 0):
Carica il vettore grezzo(raw_vector_0) e il suo elenco di bordi(edgelist_0) dal disco.
L'elenco dei bordi indica i vicini da visitare successivamente (i nodi 2, 3 e 5 in questo esempio).
Il vettore grezzo viene utilizzato per calcolare la distanza esatta dal vettore di query per la classificazione.
I dati PQ in memoria vengono utilizzati per il filtraggio approssimativo della distanza per guidare l'attraversamento successivo.
Poiché i dati PQ sono già memorizzati nella DRAM, ogni visita al nodo richiede solo un I/O su disco, ottenendo un'elevata velocità di interrogazione con un uso moderato della memoria.
Per una spiegazione dettagliata di questi componenti e parametri, consultare DISKANN.
Modalità di funzionamento di AISAQ
AISAQ offre due modalità di funzionamento per rispondere a due casi d'uso distinti:
Modalità Performance: ottimizzata per applicazioni che richiedono una bassa latenza e un elevato throughput su scala, come la ricerca semantica online.
Modalità Scale: ottimizzata per applicazioni con vincoli di latenza più rilassati, come la ricerca semantica RAG e offline, consentendo al contempo un'espansione economica dei set di dati su scala ultraelevata.
Modalità AISAQ-performance
AISAQ-performance consente di ottenere un "ingombro DRAM vicino allo zero" spostando i dati PQ dalla memoria al disco e mantenendo un basso IOPS grazie alla colocazione e alla ridondanza dei dati.
Il vettore grezzo di ogni nodo, l'elenco dei bordi e i dati PQ dei suoi vicini sono memorizzati insieme su disco.
Questa disposizione garantisce che la visita di un nodo (ad esempio, il vettore 0) richieda un solo I/O su disco.
Poiché i dati PQ sono memorizzati in modo ridondante vicino a più nodi, la dimensione del file indice aumenta in modo significativo, consumando più spazio su disco.
Modalità AISAQ-scale
AISAQ-scale si concentra sulla riduzione dell'utilizzo dello spazio su disco, soddisfacendo al contempo i requisiti di prestazione delle applicazioni di destinazione.
In questa modalità:
I dati PQ sono memorizzati separatamente su disco, senza ridondanza.
Questo design riduce al minimo le dimensioni dell'indice, ma comporta un maggior numero di operazioni di I/O durante l'attraversamento del grafo.
Per ridurre il sovraccarico di IOPS, AISAQ introduce due ottimizzazioni:
Un algoritmo di riordino che ordina i vettori PQ in base alla priorità per migliorare la localizzazione dei dati.
Una cache PQ nella DRAM (pq_read_page_cache_size) che memorizza i dati PQ di accesso frequente.
Esempio di configurazione
# milvus.yaml
knowhere:
AISAQ:
build:
max_degree: 56 # Controls the maximum number of connections (edges) each data point can have in the Vamana graph
search_list_size: 100 # During index construction, this parameter defines the size of the candidate pool used when searching for the nearest neighbors for each node. For every node being added to the graph, the algorithm maintains a list of the search_list_size best candidates found so far. The search for neighbors stops when this list can no longer be improved. From this final candidate pool, the top max_degree nodes are selected to form the final edges
inline_pq: -1 # Number of PQ vectors stored inline per Index node (read when node is accessed, to reduce IO)
rearrange: true # Re-arrange the PQ vectors data structure to improve data locality and reduce disk accesses during search (ignored in performance mode)
num_entry_points: 100 # Number of candidate entry points to optimize search entry-point selection
pq_code_budget_gb_ratio: 0.125 # Controls the size of the PQ codes (compressed representations of data points) compared to the size of the uncompressed data
disk_pq_code_budget_gb_ratio: 0.25 # Controls the size of the PQ codes of the high precision vectors stored in the index (used for re-ranking), compared to the size of the uncompressed data
pq_cache_size: 0 # PQ vectors cache size in DRAM (bytes). The PQ vectors cache is loaded during Index load and used during search to reduce IOs (ignored in performance mode)
search_cache_budget_gb_ratio: 0 # Controls the amount of DRAM to be used for caching frequently accessed index nodes. This cache is loaded during index load and used during search to reduce IOs
search:
search_list: 16 # During a search operation, this parameter determines the size of the candidate pool that the algorithm maintains as it traverses the graph. A larger value increases the chances of finding the true nearest neighbors (higher recall) but also increases search latency
beamwidth: 8 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read the index nodes
vectors_beamwidth: 1 # Controls the degree of parallelism during search by determining the maximum number of parallel disk I/O requests to read groups of neighboring PQ vectors (ignored in performance mode)
pq_read_page_cache_size: 5242880 (5MiB) # PQ read cache size in DRAM per search thread (bytes). It caches frequently accessed data pages containing PQ vectors (ignored in performance mode and applicable only when rearrange is true). The PQ read cache memory is reused across all AISAQ segments
Parametri di AISAQ
AISAQ eredita alcuni parametri da DISKANN: max_degree, search_list_size e pq_code_budget_gb_ratio.
Parametri di costruzione dell'indice
Questi parametri influenzano il modo in cui viene costruito l'indice di AISAQ. La loro regolazione può influenzare le dimensioni dell'indice, il tempo di costruzione e la qualità della ricerca.
Parametro |
Descrizione |
Valore Intervallo |
Suggerimento per la regolazione |
|---|---|---|---|
|
Controlla il numero massimo di connessioni (bordi) che ogni punto di dati può avere nel grafico Vamana. |
Tipo: Intero Intervallo: [1, 512] Valore predefinito: |
Valori più alti creano grafici più densi, aumentando potenzialmente il richiamo (trovando risultati più rilevanti) ma anche l'utilizzo della memoria e il tempo di costruzione. Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [10, 100]. |
|
Durante la costruzione dell'indice, questo parametro definisce la dimensione del pool di candidati utilizzato per la ricerca dei vicini più prossimi per ogni nodo. Per ogni nodo aggiunto al grafo, l'algoritmo mantiene un elenco dei migliori candidati trovati fino a quel momento. La ricerca dei vicini si ferma quando questo elenco non può più essere migliorato. Da questa lista finale di candidati, i nodi con il grado massimo più alto vengono selezionati per formare i bordi finali. |
Tipo: Intero Intervallo: [1, 512] Valore predefinito: |
Una dimensione maggiore di search_list_size aumenta la probabilità di trovare i veri vicini per ogni nodo, il che può portare a un grafo di qualità superiore e a migliori prestazioni di ricerca (recall). Tuttavia, ciò ha il costo di un tempo di creazione dell'indice significativamente più lungo. Dovrebbe essere sempre impostato su un valore maggiore o uguale a max_degree. |
|
Numero di vettori PQ memorizzati in linea per ogni nodo dell'indice (letti quando si accede al nodo, per ridurre l'IO) |
Tipo: Intero Intervallo: [0, max_degree] Valore predefinito: |
Valori più alti di Impostare Impostare Impostare
|
|
Riorganizzare la struttura dei dati dei vettori PQ per migliorare la localizzazione dei dati e ridurre gli accessi al disco durante la ricerca (ignorato in modalità prestazioni). |
Tipo: Booleano Intervallo: [true, false] Valore predefinito: |
Se true, riduce gli IO durante la ricerca con un aumento minimo della memoria e del tempo di creazione dell'indice. |
|
Numero di punti di ingresso candidati per ottimizzare la selezione dei punti di ingresso della ricerca. |
Tipo: Intero Intervallo: [0, 1000] Valore predefinito: |
Valori elevati possono ridurre il tempo di ricerca iniziando la ricerca da un punto di ingresso più vicino. Impostare valori più alti per segmenti di grandi dimensioni (ad esempio, per vettori da 10 M e oltre utilizzare il valore 1000). |
|
Controlla la dimensione dei codici PQ (rappresentazioni compresse dei punti dati) rispetto alla dimensione dei dati non compressi. |
Tipo: Variabile Intervallo: (0.0, 0.25] Valore predefinito: |
Un rapporto più alto porta a risultati di ricerca più accurati, memorizzando effettivamente più informazioni sui vettori originali, ma aumenta la complessità computazionale durante la ricerca. Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: (0,0417, 0,25]. |
|
Controlla la dimensione dei codici PQ dei vettori ad alta precisione memorizzati nell'indice (usati per il riordino), rispetto alla dimensione dei dati non compressi. |
Tipo: Variabile Intervallo: [0, 0.25] Valore predefinito: |
Con il valore predefinito di 0,25, i vettori saranno quantizzati al 25% della loro dimensione originale (compressione 4×), riducendo l'ingombro su disco con un impatto relativamente minimo sulla precisione. Impostare il valore 0 per memorizzare i vettori a precisione completa nell'indice del disco per la ri-classificazione. Un valore maggiore offre un tasso di richiamo più elevato, ma aumenta l'utilizzo del disco. |
|
Dimensione della cache dei vettori PQ in DRAM (byte). La cache dei vettori PQ viene caricata durante il caricamento dell'indice e utilizzata durante la ricerca per ridurre gli IO (ignorata in modalità prestazioni). |
Tipo: Intero Intervallo: [0, 1073741824] Valore predefinito: |
Una cache più grande migliora le prestazioni delle query, ma aumenta l'utilizzo della DRAM. |
|
Controlla la quantità di DRAM da usare per la cache dei nodi dell'indice a cui si accede di frequente. Questa cache viene caricata durante il caricamento dell'indice e utilizzata durante la ricerca per ridurre gli IO. |
Tipo: A virgola mobile Intervallo: [0.0, 0.3) Valore predefinito: |
Un valore più alto alloca più memoria per la cache, riducendo gli IO del disco ma consumando più memoria di sistema. Un valore inferiore utilizza meno memoria per la cache, aumentando potenzialmente la necessità di accesso al disco. |
Parametri di ricerca degli indici
Questi parametri influenzano il modo in cui AISAQ esegue le ricerche. La loro regolazione può influire sulla velocità di ricerca, sulla latenza e sull'utilizzo delle risorse.
Parametro |
Descrizione |
Intervallo di valori |
Suggerimento per la regolazione |
|---|---|---|---|
|
Durante un'operazione di ricerca, questo parametro determina la dimensione del pool di candidati che l'algoritmo mantiene mentre attraversa il grafo. Un valore maggiore aumenta le possibilità di trovare i veri vicini (richiamo più elevato), ma aumenta anche la latenza della ricerca. |
Tipo: Intero Intervallo: [topk, int32_max] Valore predefinito: |
Per un buon equilibrio tra prestazioni e precisione, si consiglia di impostare questo valore in modo che sia uguale o leggermente superiore al numero di risultati che si desidera recuperare (top_k). |
|
Controlla il grado di parallelismo durante la ricerca, determinando il numero massimo di richieste di I/O su disco in parallelo per leggere i nodi dell'indice. |
Tipo: Intero Intervallo: [1, 16] Valore predefinito: |
Valori più alti aumentano il parallelismo, accelerando la ricerca su sistemi con CPU e SSD potenti. Tuttavia, un valore troppo alto potrebbe causare un'eccessiva contestazione delle risorse. Nella maggior parte dei casi, si consiglia di impostare un valore pari a 2. |
|
Controlla il grado di parallelismo durante la ricerca determinando il numero massimo di richieste di I/O su disco in parallelo per leggere gruppi di vettori PQ vicini (ignorato in modalità prestazioni). |
Tipo: Intero Intervallo: [1, 4] deve essere <= larghezza di fascio Valore predefinito: |
Valori più alti aumentano il parallelismo, accelerando la ricerca su sistemi con CPU e SSD potenti. Tuttavia, un valore troppo alto potrebbe causare un'eccessiva contesa delle risorse, poiché ogni gruppo di vettori PQ vicini può contenere fino a vettori di max_grado. Nella maggior parte dei casi, si consiglia di impostare un valore pari a 1. |
|
Dimensione della cache di lettura PQ in DRAM per thread di ricerca (byte). Mette in cache le pagine di dati ad accesso frequente contenenti vettori PQ (ignorata in modalità performance e applicabile solo quando rearrange è true). La memoria cache di lettura PQ viene riutilizzata in tutti i segmenti AISAQ. |
Tipo: Intero Intervallo: [0, 33554432] Valore predefinito: |
Una cache più grande migliora le prestazioni delle query, ma aumenta l'utilizzo della DRAM. I valori consigliati vanno da 2 MiB per i segmenti piccoli (1 M di vettori), 5 MiB per i segmenti medi (50 M di vettori) e 10 MiB per i segmenti grandi (250 M di vettori). |