AISAQCompatible with Milvus 2.6.4+
O AISAQ é um índice vetorial baseado em disco que alarga o DISKANN para lidar com conjuntos de dados à escala de milhares de milhões com uma pegada DRAM mínima.
Ao contrário do DISKANN, que mantém os vectores comprimidos na memória, o AISAQ foi concebido com uma "Arquitetura DRAM quase nula", o que significa manter todas as estruturas de dados em SSD.
O AISAQ permite executar bases de dados de escala ultraelevada utilizando servidores padrão, oferecendo modos de funcionamento para equilibrar o desempenho e os custos de armazenamento.
Como funciona o AISAQ
O diagrama acima compara as disposições de armazenamento do DISKANN, do AISAQ-Performance e do AISAQ-Scale, mostrando como os dados (vectores brutos, listas de arestas e códigos PQ) são distribuídos entre a RAM e o disco.
Aisaq Vs Diskann
Fundação: Recapitulação do DISKANN
No DISKANN, os vectores brutos e as listas de arestas são armazenados no disco, enquanto os vectores comprimidos PQ são mantidos na memória (DRAM).
Quando o DISKANN atravessa para um nó (por exemplo, vetor 0):
Carrega o vetor bruto(raw_vector_0) e a sua lista de arestas(edgelist_0) a partir do disco.
A lista de arestas indica quais vizinhos devem ser visitados em seguida (nós 2, 3 e 5 neste exemplo).
O vetor bruto é utilizado para calcular a distância exacta ao vetor de consulta para classificação.
Os dados PQ na memória são usados para filtragem de distância aproximada para guiar a próxima travessia.
Como os dados de PQ já estão armazenados em cache na DRAM, cada visita ao nó requer apenas uma E/S de disco, alcançando alta velocidade de consulta com uso moderado de memória.
Para uma explicação detalhada destes componentes e parâmetros, consulte DISKANN.
Modos de funcionamento do AISAQ
O AISAQ oferece dois modos de operação para atender a dois casos de uso distintos:
Modo de desempenho: optimizado para aplicações que requerem baixa latência e alta taxa de transferência em escala, como a pesquisa semântica online.
Modo de escala: optimizado para aplicações com restrições de latência mais relaxadas, tais como RAG e pesquisa semântica offline, ao mesmo tempo que permite a expansão rentável de conjuntos de dados para uma escala ultra-alta.
Modo de desempenho do AISAQ
O AISAQ-performance alcança uma "pegada DRAM quase nula", movendo os dados PQ da memória para o disco, mantendo baixos IOPS através da colocação e redundância de dados.
O vetor bruto de cada nó, a lista de arestas e os dados PQ dos seus vizinhos são armazenados em conjunto no disco.
Esse layout garante que visitar um nó (por exemplo, vetor 0) ainda requer apenas uma única E/S de disco.
Uma vez que os dados PQ são armazenados de forma redundante perto de vários nós, o tamanho do ficheiro de índice aumenta significativamente, consumindo mais espaço em disco.
Modo AISAQ-scale
O AISAQ-scale concentra-se na redução da utilização do espaço em disco, satisfazendo simultaneamente os requisitos de desempenho das suas aplicações alvo.
Neste modo:
Os dados PQ são armazenados separadamente no disco, sem redundância.
Este design minimiza o tamanho do índice, mas leva a mais operações de E/S durante a travessia do gráfico.
Para reduzir o excesso de IOPS, o AISAQ introduz duas optimizações:
Um algoritmo de reorganização que ordena os vectores PQ por prioridade para melhorar a localização dos dados.
Uma cache PQ na DRAM (pq_read_page_cache_size) que armazena em cache os dados PQ acedidos frequentemente.
Exemplo de configuração
# 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
Parâmetros do AISAQ
O AISAQ herda alguns parâmetros do DISKANN - max_degree, search_list_size, e pq_code_budget_gb_ratio.
Parâmetros de construção de índices
Estes parâmetros influenciam a forma como o índice AISAQ é construído. O seu ajuste pode afetar o tamanho do índice, o tempo de construção e a qualidade da pesquisa.
Parâmetro |
Descrição |
Valor Intervalo |
Sugestão de ajuste |
|---|---|---|---|
|
Controla o número máximo de ligações (arestas) que cada ponto de dados pode ter no gráfico Vamana. |
Tipo: Inteiro Intervalo: [1, 512] Valor padrão: |
Valores mais altos criam gráficos mais densos, potencialmente aumentando a recuperação (encontrando resultados mais relevantes), mas também aumentando o uso de memória e o tempo de construção. Na maioria dos casos, recomendamos que você defina um valor dentro deste intervalo: [10, 100]. |
|
Durante a construção do índice, este parâmetro define o tamanho do conjunto de candidatos usado na pesquisa dos vizinhos mais próximos de cada nó. Para cada nó que está sendo adicionado ao gráfico, o algoritmo mantém uma lista dos melhores candidatos encontrados até o momento. A procura de vizinhos pára quando esta lista já não pode ser melhorada. A partir deste conjunto final de candidatos, os nós com o grau máximo mais elevado são selecionados para formar as arestas finais. |
Tipo: Integer Range: [1, 512] Valor padrão: |
Um tamanho maior de search_list_size aumenta a probabilidade de encontrar os verdadeiros vizinhos mais próximos para cada nó, o que pode levar a um gráfico de maior qualidade e melhor desempenho de pesquisa (recall). No entanto, isto tem o custo de um tempo de construção do índice significativamente mais longo. Deve ser sempre definido para um valor maior ou igual a max_degree. |
|
Número de vectores PQ armazenados em linha por nó de índice (lidos quando o nó é acedido, para reduzir o IO) |
Tipo: Integer Intervalo: [0, max_degree] Valor predefinido: |
Valores mais altos de Defina Defina Defina
|
|
Reorganizar a estrutura de dados dos vectores PQ para melhorar a localidade dos dados e reduzir os acessos ao disco durante a pesquisa (ignorado no modo de desempenho). |
Tipo: Booleano Intervalo: [true, false] Valor predefinido: |
Quando verdadeiro, reduz os IOs durante a pesquisa com apenas um pequeno aumento na memória e no tempo de construção do índice. |
|
Número de pontos de entrada candidatos para otimizar a seleção do ponto de entrada da pesquisa. |
Tipo: Inteiro Intervalo: [0, 1000] Valor predefinido: |
Valores elevados podem reduzir o tempo de pesquisa, iniciando a pesquisa a partir de um ponto de entrada mais próximo. Defina valores mais elevados para segmentos grandes (por exemplo, para vectores de 10M e acima do valor de utilização de 1000). |
|
Controla o tamanho dos códigos PQ (representações comprimidas dos pontos de dados) em comparação com o tamanho dos dados não comprimidos. |
Tipo: Flutuante Intervalo: (0,0, 0,25] Valor predefinido: |
Um rácio mais elevado conduz a resultados de pesquisa mais precisos, armazenando efetivamente mais informações sobre os vectores originais, mas aumenta a complexidade computacional durante a pesquisa. Na maioria dos casos, recomendamos que defina um valor dentro deste intervalo: (0,0417, 0,25]. |
|
Controla o tamanho dos códigos PQ dos vectores de alta precisão armazenados no índice (utilizados para reclassificação), em comparação com o tamanho dos dados não comprimidos. |
Tipo: Float Intervalo: [0, 0.25] Valor predefinido: |
Com o valor predefinido de 0,25, os vectores serão quantizados para 25% do seu tamanho original (compressão 4×), reduzindo o espaço ocupado em disco com um impacto relativamente mínimo na precisão. Defina o valor de 0 para armazenar vectores de precisão total no índice do disco para nova classificação. Um valor maior oferece uma taxa de recuperação mais elevada, mas aumenta a utilização do disco. |
|
Tamanho da cache de vectores PQ em DRAM (bytes). A cache de vectores PQ é carregada durante o carregamento do índice e utilizada durante a pesquisa para reduzir as IOs (ignorada no modo de desempenho). |
Tipo: Integer Range: [0, 1073741824] Valor padrão: |
Uma cache maior melhora o desempenho da consulta, mas aumenta o uso de DRAM. |
|
Controla a quantidade de DRAM a ser utilizada para colocar em cache os nós de índice frequentemente acedidos Esta cache é carregada durante o carregamento do índice e utilizada durante a pesquisa para reduzir as IOs. |
Tipo: Float Range: [0.0, 0.3) Valor predefinido: |
Um valor mais alto aloca mais memória para cache, reduzindo IOs de disco, mas consumindo mais memória do sistema. Um valor mais baixo utiliza menos memória para cache, aumentando potencialmente a necessidade de acesso ao disco. |
Parâmetros de pesquisa de índices
Estes parâmetros influenciam a forma como o AISAQ efectua as pesquisas. Ajustá-los pode afetar a velocidade de pesquisa, a latência e a utilização de recursos.
Parâmetro |
Descrição |
Intervalo de valores |
Sugestão de ajuste |
|---|---|---|---|
|
Durante uma operação de pesquisa, esse parâmetro determina o tamanho do pool de candidatos que o algoritmo mantém à medida que percorre o gráfico. Um valor maior aumenta as hipóteses de encontrar os verdadeiros vizinhos mais próximos (maior recuperação), mas também aumenta a latência da pesquisa. |
Tipo: Inteiro Intervalo: [topk, int32_max] Valor predefinido: |
Para obter um bom equilíbrio entre desempenho e precisão, é recomendável definir este valor como sendo igual ou ligeiramente superior ao número de resultados que pretende obter (top_k). |
|
Controla o grau de paralelismo durante a pesquisa, determinando o número máximo de pedidos de E/S de disco paralelos para ler os nós de índice. |
Tipo: Integer Intervalo: [1, 16] Valor padrão: |
Valores mais altos aumentam o paralelismo, o que pode acelerar a pesquisa em sistemas com CPUs e SSDs potentes. No entanto, defini-lo como muito alto pode levar a uma contenção excessiva de recursos. Na maioria dos casos, recomendamos que você defina um valor de 2. |
|
Controla o grau de paralelismo durante a pesquisa, determinando o número máximo de pedidos de E/S de disco paralelos para ler grupos de vectores PQ vizinhos (ignorado no modo de desempenho). |
Tipo: Inteiro Intervalo: [1, 4] deve ser <= beamwidth Valor padrão: |
Valores mais altos aumentam o paralelismo, o que pode acelerar a pesquisa em sistemas com CPUs e SSDs potentes. No entanto, defini-lo muito alto pode levar a uma contenção excessiva de recursos, pois cada grupo de vetores PQ vizinhos pode conter até vetores max_degree. Na maioria dos casos, recomendamos que você defina um valor de 1. |
|
Tamanho do cache de leitura PQ em DRAM por thread de pesquisa (bytes). Armazena em cache as páginas de dados frequentemente acedidas que contêm vectores PQ (ignorados no modo de desempenho e aplicáveis apenas quando rearranjar é verdadeiro). A memória cache de leitura PQ é reutilizada em todos os segmentos AISAQ. |
Tipo: Inteiro Intervalo: [0, 33554432] Valor padrão: |
Um cache maior melhora o desempenho da consulta, mas aumenta o uso de DRAM. Os valores recomendados variam entre 2 MiB para segmentos pequenos (1 M de vectores), 5 MiB para segmentos médios (50 M de vectores) e 10 MiB para segmentos grandes (250 M de vectores). |