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

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

max_degree

Controlla il numero massimo di connessioni (bordi) che ogni punto di dati può avere nel grafico Vamana.

Tipo: Intero

Intervallo: [1, 512]

Valore predefinito: 56

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

search_list_size

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: 100

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.

inline_pq

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

Valori più alti di inline_pq migliorano le prestazioni ma aumentano lo spazio su disco.

Impostare inline_pq=0 per AISAQ in modalità scala.

Impostare inline_pq=-1 per riempire automaticamente qualsiasi spazio inutilizzato nell'indice con vettori PQ per un'ulteriore ottimizzazione di AISAQ in modalità scalare.

Impostare inline_pq=max_degree per AISAQ in modalità performance.

inline_pq Le impostazioni comprese tra 0 e max_degree consentono un equilibrio regolabile tra prestazioni e consumo di spazio su disco.

rearrange

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: true

Se true, riduce gli IO durante la ricerca con un aumento minimo della memoria e del tempo di creazione dell'indice.

num_entry_points

Numero di punti di ingresso candidati per ottimizzare la selezione dei punti di ingresso della ricerca.

Tipo: Intero

Intervallo: [0, 1000]

Valore predefinito: 100

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

pq_code_budget_gb_ratio

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: 0.125

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

disk_pq_code_budget_gb_ratio

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: 0.25

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.

pq_cache_size

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: 0

Una cache più grande migliora le prestazioni delle query, ma aumenta l'utilizzo della DRAM.

search_cache_budget_gb_ratio

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: 0

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

search_list

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: 16

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

beamwidth

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: 8

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.

vectors_beamwidth

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

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.

pq_read_page_cache_size

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: 5242880 (5MiB)

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