HNSW_SQ
HNSW_SQ는 계층적 탐색 가능한 작은 세계(HNSW) 그래프와 스칼라 양자화(SQ)를 결합하여 크기와 정확도 간의 균형을 제어할 수 있는 고급 벡터 인덱싱 방법을 생성합니다. 이 인덱스 유형은 표준 HNSW에 비해 쿼리 처리 속도가 빠른 반면 인덱스 구축 시간이 약간 증가합니다.
개요
HNSW_SQ는 두 가지 인덱싱 기술을 결합합니다: 빠른 그래프 기반 탐색을 위한 HNSW와 효율적인 벡터 압축을 위한 SQ입니다.
HNSW
HNSW는 각 노드가 데이터 세트의 벡터에 해당하는 다층 그래프를 구성합니다. 이 그래프에서 노드는 유사성에 따라 연결되므로 데이터 공간을 빠르게 탐색할 수 있습니다. 계층적 구조를 통해 검색 알고리즘이 후보 이웃을 좁힐 수 있으므로 고차원 공간에서 검색 프로세스를 크게 가속화할 수 있습니다.
자세한 내용은 HNSW를 참조하세요.
SQ
SQ는 벡터를 더 적은 비트로 표현하여 압축하는 방법입니다. 예를 들어:
SQ8은 8비트를 사용하여 값을 256레벨로 매핑합니다. 자세한 내용은 IVF_SQ8을 참조하세요.
SQ6은 6비트를 사용하여 각 부동소수점 값을 나타내므로 64개의 개별 레벨이 생성됩니다.
Hnsw Sq
이 정밀도 감소는 데이터의 필수 구조를 유지하면서 메모리 사용량을 크게 줄이고 계산 속도를 높입니다.
SQ4UCompatible with Milvus 2.6.8+
극한의 쿼리 속도와 최소한의 메모리 사용량이 요구되는 시나리오를 위해 Milvus는 4비트 균일 스칼라 양자화( SQ4U )를 도입했습니다. 이것은 각 차원의 부동 소수점 값을 4비트 부호 없는 정수로 압축하는 공격적인 형태의 스칼라 양자화입니다.
SQ4U의 "U"는 Uniform을 의미합니다. 일반적으로 각 차원에 대해 최소값과 최대값을 독립적으로 계산하는 비균일 스칼라 양자화(차원별 양자화)와 달리 SQ4U는 전역 균일 양자화 전략을 적용합니다:
글로벌 통계: 시스템은 벡터의 모든 차원 (또는 전체 벡터 세그먼트)에 적용되는 단일 최소값(
vmin)과 단일 값 범위(vdiff)를 계산합니다.균일 매핑: 전역 값 범위는 16개의 동일한 간격으로 나뉩니다. 벡터의 모든 부동 소수점 값은 어떤 차원에 속해 있는지에 관계없이 이러한 공유 매개 변수를 사용하여 4비트 정수(0-15)로 매핑됩니다.
성능 이점:
8배 압축률:
FP32대비 8배,SQ8대비 2배로 크기가 줄어들어 벡터 검색의 병목 현상인 메모리 대역폭 압박을 크게 낮춥니다.SIMD 최적화: 컴팩트한 구조로 최신 CPU(AVX2/AVX-512)가 사이클당 더 많은 차원을 처리할 수 있습니다. 결정적으로, 글로벌 파라미터를 사용하면 거리 계산 중에 다양한 스케일/오프셋 값을 로드할 필요가 없으므로 명령 파이프라인을 완전히 포화 상태로 유지할 수 있습니다.
캐시 효율성: 벡터 크기가 작을수록 CPU 캐시에 더 많은 데이터를 저장할 수 있어 메모리 액세스로 인한 지연 시간이 줄어듭니다.
글로벌 매개변수 공유로 인해 SQ4U는 정규화된 데이터 또는 차원 간에 일관된 값 분포를 가진 데이터 세트에서 가장 우수한 성능을 발휘합니다.
HNSW + SQ
HNSW_SQ는 HNSW와 SQ의 강점을 결합하여 효율적인 근사 최접 이웃 검색을 가능하게 합니다. 프로세스는 다음과 같이 작동합니다:
데이터 압축: SQ는
sq_type(예: SQ6 또는 SQ8)를 사용하여 벡터를 압축하여 메모리 사용량을 줄입니다. 이 압축은 정밀도를 낮출 수 있지만 시스템에서 더 큰 데이터 세트를 처리할 수 있게 해줍니다.그래프 구성: 압축된 벡터는 HNSW 그래프를 구축하는 데 사용됩니다. 데이터가 압축되기 때문에 결과 그래프의 크기가 작아지고 검색 속도가 빨라집니다.
후보 검색: 쿼리 벡터가 제공되면 알고리즘은 압축된 데이터를 사용하여 HNSW 그래프에서 후보 이웃 풀을 빠르게 식별합니다.
(선택 사항) 결과 구체화: 다음 매개변수를 기반으로 초기 후보 결과를 세분화하여 정확도를 높일 수 있습니다:
refine: 이 세분화 단계의 활성화 여부를 제어합니다.true로 설정하면 시스템은 더 정밀한 표현 또는 압축되지 않은 표현을 사용하여 거리를 다시 계산합니다.refine_type: 세분화 중에 사용되는 데이터의 정밀도 수준을 지정합니다(예: SQ6, SQ8, BF16).FP32와 같이 정밀도가 높을수록 더 정확한 결과를 얻을 수 있지만 더 많은 메모리가 필요합니다. 이는 원본 압축 데이터의 정밀도를sq_type.refine_k: 배율 인자로 작용합니다. 예를 들어 상위 k가 100이고refine_k이 2인 경우 시스템은 상위 200개 후보의 순위를 다시 매기고 가장 좋은 100개를 반환하여 전반적인 정확도를 높입니다.
전체 매개변수 목록과 유효한 값은 색인 매개변수를 참조하세요.
색인 만들기
Milvus의 벡터 필드에 HNSW_SQ 인덱스를 구축하려면 add_index() 방법을 사용하여 index_type, metric_type 및 인덱스에 대한 추가 매개 변수를 지정합니다.
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="HNSW_SQ", # 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={
"M": 64, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 100, # Number of candidate neighbors considered for connection during index construction
"sq_type": "SQ6", # Scalar quantizer type
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
이 구성에서는
index_type: 빌드할 인덱스 유형입니다. 이 예에서는 값을HNSW_SQ로 설정합니다.metric_type: 벡터 간의 거리를 계산하는 데 사용되는 메서드입니다. 지원되는 값은COSINE,L2,IP입니다. 자세한 내용은 메트릭 유형을 참조하세요.params: 인덱스 구축을 위한 추가 구성 옵션입니다. 자세한 내용은 인덱스 구축 파라미터를 참조하세요.
인덱스 파라미터가 구성되면 create_index() 메서드를 직접 사용하거나 create_collection 메서드에서 인덱스 파라미터를 전달하여 인덱스를 만들 수 있습니다. 자세한 내용은 컬렉션 만들기를 참조하세요.
인덱스에서 검색
인덱스가 구축되고 엔티티가 삽입되면 인덱스에서 유사도 검색을 수행할 수 있습니다.
search_params = {
"params": {
"ef": 10, # Parameter controlling query time/accuracy trade-off
"refine_k": 1 # The 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
)
이 구성에서는
params: 인덱스에서 검색을 위한 추가 구성 옵션입니다. 자세한 내용은 인덱스별 검색 매개변수를 참조하세요.
색인 매개변수
이 섹션에서는 인덱스를 만들고 인덱스에서 검색을 수행하는 데 사용되는 매개변수에 대한 개요를 제공합니다.
색인 작성 매개변수
다음 표에는 색인 작성 시 params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.
파라미터 |
설명 |
값 범위 |
조정 제안 |
|
|---|---|---|---|---|
HNSW |
|
나가는 에지와 들어오는 에지를 모두 포함하여 각 노드가 그래프에서 가질 수 있는 최대 연결(또는 에지) 수입니다. 이 매개변수는 인덱스 구성과 검색 모두에 직접적인 영향을 줍니다. |
유형: 정수 범위: [2, 2048] 기본값: |
차원이 높은 데이터 세트나 높은 리콜이 중요한 경우 메모리 사용량과 검색 속도가 주요 관심사인 경우 대부분의 경우, 이 범위 내에서 값을 설정하는 것이 좋습니다: [5, 100]. |
|
인덱스 구성 중에 연결을 위해 고려되는 후보 이웃의 수입니다. 새 요소마다 더 많은 후보 풀이 평가되지만 실제로 설정되는 최대 연결 수는 여전히 |
유형: 유형: 정수 범위: [1, int_max] 기본값입니다: |
특히 인덱싱 시간이 덜 중요한 시나리오에서는 정확도를 높이려면 리소스 제약이 우려되는 경우 인덱스 구축 속도를 높이려면 대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [50, 500]. |
|
SQ |
|
벡터 압축을 위한 스칼라 양자화 방법을 지정합니다. 각 옵션은 압축과 정확도 간에 서로 다른 균형을 제공합니다:
|
유형: 문자열 범위: [ 기본값입니다: |
|
|
검색 중에 구체화 단계를 적용할지 여부를 제어하는 부울 플래그입니다. 구체화에는 쿼리 벡터와 후보 간의 정확한 거리를 계산하여 초기 결과의 순위를 재조정하는 작업이 포함됩니다. |
Type: 부울 범위: [ 기본값입니다: |
높은 정확도가 필수적이고 검색 시간이 약간 느려지는 것을 용인할 수 있는 경우 |
|
|
세분화에 사용되는 데이터의 정밀도를 결정합니다. 이 정밀도는 압축된 벡터의 정밀도( |
유형: 문자열 범위:[ 기본값입니다: None |
더 높은 메모리 비용으로 정밀도를 극대화하려면 |
인덱스별 검색 매개변수
다음 표에는 색인에서 검색할 때 search_params.params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.
파라미터 |
설명 |
값 범위 |
조정 제안 |
|
|---|---|---|---|---|
HNSW |
|
가장 가까운 이웃을 검색하는 동안 검색 범위를 제어합니다. 얼마나 많은 노드를 방문하고 잠재적인 가장 가까운 이웃으로 평가할지 결정합니다. 이 매개변수는 검색 프로세스에만 영향을 미치며 그래프의 맨 아래 레이어에만 적용됩니다. |
유형: 정수 범위: [1, int_max] 기본값: limit (반환할 가장 가까운 이웃 TopK) |
높은 회상률을 달성하는 것이 중요하고 검색 속도는 크게 신경 쓰지 않는 경우 특히 약간의 정확도 감소를 감수할 수 있는 시나리오에서는 대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [K, 10K]. |
SQ |
|
요청된 상위 K 결과와 비교하여 정제 단계에서 얼마나 많은 추가 후보를 검토할지를 제어하는 배율 계수입니다. |
유형: 플로트 범위: [1, float_max) 기본값: 1 |
|