AISAQCompatible with Milvus 2.6.4+

AISAQ는 디스크 기반 벡터 인덱스로, 최소한의 DRAM 공간으로 수십억 규모의 데이터 세트를 처리할 수 있도록 DISKANN을 확장한 것입니다.

압축된 벡터를 메모리에 보관하는 DISKANN과 달리, AISAQ는 모든 데이터 구조를 SSD에 보관하는 '제로에 가까운 DRAM 아키텍처'로 설계되었습니다.

AISAQ는 성능과 스토리지 비용의 균형을 맞추는 운영 모드를 제공하면서 표준 서버를 사용해 초대형 데이터베이스를 실행할 수 있습니다.

AISAQ 작동 방식

위의 다이어그램은 디스크앤, AISAQ-성능, AISAQ-규모의 스토리지 레이아웃을 비교하여 데이터(원시 벡터, 에지 목록, PQ 코드)가 RAM과 디스크 간에 어떻게 분산되는지 보여줍니다.

Aisaq Vs Diskann Aisaq 대 Diskann

기초: DISKANN 요약

DISKANN에서 원시 벡터와 에지 목록은 디스크에 저장되고, PQ 압축 벡터는 메모리(DRAM)에 보관됩니다.

DISKANN이 노드(예: 벡터 0)로 이동하는 경우:

  • 디스크에서 원시 벡터(raw_vector_0)와 그 에지 목록(edgelist_0)을 로드합니다.

  • 에지 목록은 다음에 방문할 이웃을 나타냅니다(이 예에서는 노드 2, 3, 5).

  • 원시 벡터는 순위를 매기기 위한 쿼리 벡터와의 정확한 거리를 계산하는 데 사용됩니다.

  • 메모리의 PQ 데이터는 대략적인 거리 필터링에 사용되어 다음 탐색을 안내합니다.

PQ 데이터는 이미 DRAM에 캐시되어 있기 때문에 각 노드 방문에는 하나의 디스크 I/O만 필요하므로 적당한 메모리 사용량으로 빠른 쿼리 속도를 달성할 수 있습니다.

이러한 구성 요소와 매개변수에 대한 자세한 설명은 DISKANN을 참조하세요.

AISAQ 작동 모드

AISAQ는 두 가지 사용 사례를 해결하기 위해 두 가지 작동 모드를 제공합니다:

성능 모드: 온라인 시맨틱 검색과 같이 낮은 지연 시간과 대규모의 높은 처리량이 필요한 애플리케이션에 최적화되어 있습니다.

확장 모드: RAG 및 오프라인 시맨틱 검색과 같이 보다 완화된 지연 시간 제약이 있는 애플리케이션에 최적화되어 있으며, 데이터 세트를 비용 효율적으로 초대형 규모로 확장할 수 있습니다.

AISAQ 성능 모드

AISAQ-성능은 데이터 코로케이션과 리던던시를 통해 낮은 IOPS를 유지하면서 PQ 데이터를 메모리에서 디스크로 이동하여 '제로에 가까운 DRAM 풋프린트'를 달성합니다.

  • 각 노드의 원시 벡터, 엣지 목록, 이웃 노드의 PQ 데이터는 디스크에 함께 저장됩니다.

  • 이 레이아웃은 노드(예: 벡터 0)를 방문해도 여전히 단일 디스크 I/O만 필요하도록 보장합니다.

  • PQ 데이터가 여러 노드 근처에 중복 저장되므로 인덱스 파일 크기가 크게 증가하여 디스크 공간이 더 많이 소모됩니다.

AISAQ 규모 모드

AISAQ-스케일은 대상 애플리케이션의 성능 요구 사항을 충족하면서 디스크 공간 사용량을 줄이는 데 중점을 둡니다.

이 모드에서는

  • PQ 데이터는 중복 없이 디스크에 별도로 저장됩니다.

  • 이 설계는 인덱스 크기를 최소화하지만 그래프 탐색 중에 더 많은 I/O 작업을 유발합니다.

  • IOPS 오버헤드를 완화하기 위해 AISAQ는 두 가지 최적화를 도입합니다:

    • 데이터 로컬리티를 개선하기 위해 우선순위에 따라 PQ 벡터를 정렬하는 재배열 알고리즘.

    • 자주 액세스하는 PQ 데이터를 캐시하는 DRAM의 PQ 캐시(pq_read_page_cache_size).

구성 예시

# 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

AISAQ 매개변수

AISAQ는 DISKANN( max_degree, search_list_size, pq_code_budget_gb_ratio)에서 일부 파라미터를 상속합니다.

인덱스 구축 매개변수

이러한 매개변수는 AISAQ 인덱스가 구성되는 방식에 영향을 줍니다. 이를 조정하면 인덱스 크기, 구축 시간 및 검색 품질에 영향을 줄 수 있습니다.

파라미터

설명

값 범위

조정 제안

max_degree

Vamana 그래프에서 각 데이터 포인트가 가질 수 있는 최대 연결 수(에지)를 제어합니다.

유형: 정수

범위: [1, 512]

기본값입니다: 56

값이 클수록 그래프가 더 조밀해져 리콜(관련성 높은 결과 찾기) 가능성이 높아지지만 메모리 사용량과 빌드 시간도 늘어납니다. 대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [10, 100].

search_list_size

인덱스 구성 중에 이 파라미터는 각 노드에 대해 가장 가까운 이웃을 검색할 때 사용되는 후보 풀의 크기를 정의합니다. 그래프에 추가되는 모든 노드에 대해 알고리즘은 지금까지 발견된 search_list_size의 최적 후보 목록을 유지합니다. 이 목록을 더 이상 개선할 수 없는 경우 이웃 검색이 중지됩니다. 이 최종 후보 풀에서 최상위 max_degree 노드가 선택되어 최종 에지를 형성합니다.

유형: 정수

범위: [1, 512]

기본값입니다: 100

search_list_size가 클수록 각 노드에 대해 실제 가장 가까운 이웃을 찾을 가능성이 높아져 그래프 품질이 높아지고 검색 성능(리콜)이 향상될 수 있습니다. 하지만 인덱스 빌드 시간이 상당히 길어지는 대가가 따릅니다. 이 값은 항상 max_degree보다 크거나 같은 값으로 설정해야 합니다.

inline_pq

인덱스 노드당 인라인으로 저장되는 PQ 벡터의 수(노드 액세스 시 읽음, IO 감소)

유형: 정수

범위: [0, max_degree]

기본값입니다: -1

inline_pq 값이 클수록 성능이 향상되지만 디스크 공간이 증가합니다.

스케일 모드에서 AISAQ의 경우 inline_pq=0으로 설정합니다.

inline_pq=-1로 설정하면 인덱스의 사용되지 않는 공간을 PQ 벡터로 자동으로 채워 스케일 모드에서 AISAQ를 더욱 최적화할 수 있습니다.

성능 모드에서 AISAQ에 대해 inline_pq=max_degree를 설정합니다.

inline_pq 0~최대_도 사이로 설정하면 성능과 디스크 공간 소비 사이의 균형을 조정할 수 있습니다.

rearrange

PQ 벡터 데이터 구조를 재정렬하여 데이터 로컬리티를 개선하고 검색 중 디스크 액세스를 줄입니다(성능 모드에서는 무시됨).

유형: 부울

범위: [참, 거짓]

기본값입니다: true

true이면 검색 중 메모리와 인덱스 빌드 시간이 약간만 증가하면서 IO를 줄입니다.

num_entry_points

검색 진입점 선택을 최적화하기 위한 후보 진입점 수입니다.

유형: 정수

범위: [0, 1000]

기본값입니다: 100

값이 크면 더 가까운 진입점에서 검색을 시작하여 검색 시간이 단축될 수 있습니다.

세그먼트가 큰 경우 더 높은 값을 설정합니다(예: 10M 벡터 이상에서는 1000 값 사용).

pq_code_budget_gb_ratio

압축되지 않은 데이터의 크기와 비교하여 PQ 코드(데이터 포인트의 압축된 표현)의 크기를 제어합니다.

유형: Float

범위: (0.0, 0.25]]

기본값입니다: 0.125

비율이 높을수록 검색 결과가 더 정확해져 원본 벡터에 대한 더 많은 정보를 효과적으로 저장할 수 있지만 검색 시 계산 복잡성이 증가합니다.

대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: (0.0417, 0.25].

disk_pq_code_budget_gb_ratio

압축되지 않은 데이터의 크기와 비교하여 인덱스에 저장된 고정밀 벡터(재랭크에 사용)의 PQ 코드 크기를 제어합니다.

유형: Float

범위: [0, 0.25]

기본값입니다: 0.25

기본값 0.25를 사용하면 벡터가 원래 크기의 25%(4배 압축)로 정량화되어 정확도에 미치는 영향을 상대적으로 최소화하면서 디스크 공간을 줄일 수 있습니다.

값을 0으로 설정하면 전체 정밀도 벡터를 디스크 인덱스에 저장하여 다시 순위를 매깁니다. 값이 클수록 재검색률이 높아지지만 디스크 사용량이 증가합니다.

pq_cache_size

PQ 벡터 캐시 크기(바이트). PQ 벡터 캐시는 인덱스를 로드하는 동안 로드되고 검색 중에 사용되어 IO를 줄입니다(성능 모드에서는 무시됨).

유형: 정수

범위: [0, 1073741824]

기본값입니다: 0

캐시가 클수록 쿼리 성능은 향상되지만 DRAM 사용량이 증가합니다.

search_cache_budget_gb_ratio

자주 액세스하는 인덱스 노드를 캐싱하는 데 사용할 DRAM의 양을 제어합니다.

이 캐시는 인덱스로드 중에 로드되고 검색 중에 사용되어 IO를 줄입니다.

유형: Float

범위: [0.0, 0.3)

기본값입니다: 0

값이 클수록 캐싱에 더 많은 메모리를 할당하여 디스크 IO를 줄이지만 시스템 메모리를 더 많이 사용합니다. 값이 낮을수록 캐싱에 더 적은 메모리를 사용하므로 디스크 액세스 필요성이 증가할 수 있습니다.

인덱스 검색 매개변수

이러한 매개변수는 AISAQ가 검색을 수행하는 방식에 영향을 줍니다. 이를 조정하면 검색 속도, 지연 시간 및 리소스 사용량에 영향을 줄 수 있습니다.

매개변수

설명

값 범위

조정 제안

search_list

검색 작업 중에 이 매개변수는 알고리즘이 그래프를 탐색할 때 유지하는 후보 풀의 크기를 결정합니다. 값이 클수록 실제 가장 가까운 이웃을 찾을 확률이 높아지지만(리콜률이 높아짐) 검색 지연 시간도 증가합니다.

유형: 유형: 정수

범위: [TOPK, INT32_MAX]

기본값입니다: 16

성능과 정확도 사이의 적절한 균형을 위해 이 값을 검색하려는 결과 수(top_k)와 같거나 약간 더 크게 설정하는 것이 좋습니다.

beamwidth

인덱스 노드를 읽기 위한 최대 병렬 디스크 I/O 요청 수를 결정하여 검색 중 병렬 처리 정도를 제어합니다.

유형: 정수

범위: [1, 16]

기본값입니다: 8

값이 클수록 병렬 처리가 증가하여 강력한 CPU 및 SSD를 사용하는 시스템에서 검색 속도가 빨라질 수 있습니다. 그러나 너무 높게 설정하면 과도한 리소스 경합이 발생할 수 있습니다.

대부분의 경우 2로 설정하는 것이 좋습니다.

vectors_beamwidth

인접한 PQ 벡터 그룹을 읽기 위한 병렬 디스크 I/O 요청의 최대 수를 결정하여 검색 중 병렬 처리 정도를 제어합니다(성능 모드에서는 무시됨).

유형: 정수

범위: [1, 4]는 <= 빔폭이어야 합니다.

기본값입니다: 1

값이 클수록 병렬 처리가 증가하여 강력한 CPU 및 SSD를 사용하는 시스템에서 검색 속도가 빨라질 수 있습니다. 그러나 너무 높게 설정하면 인접한 각 PQ 벡터 그룹에 최대 최대_도 벡터가 포함될 수 있으므로 과도한 리소스 경합이 발생할 수 있습니다.

대부분의 경우 1로 설정하는 것이 좋습니다.

pq_read_page_cache_size

검색 스레드당 DRAM의 PQ 읽기 캐시 크기(바이트). PQ 벡터가 포함된 자주 액세스하는 데이터 페이지를 캐시합니다(성능 모드에서는 무시되며 재정렬이 true인 경우에만 적용 가능).

PQ 읽기 캐시 메모리는 모든 AISAQ 세그먼트에서 재사용됩니다.

유형: 정수

범위: [0, 33554432]

기본값입니다: 5242880 (5MiB)

캐시가 클수록 쿼리 성능이 향상되지만 DRAM 사용량이 증가합니다.

권장 값은 소형 세그먼트(1M 벡터)의 경우 2MiB, 중형 세그먼트(50M 벡터)의 경우 5MiB, 대형 세그먼트(250M 벡터)의 경우 10MiB입니다.

Try Managed Milvus for Free

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

Get Started
피드백

이 페이지가 도움이 되었나요?