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

이 정밀도 감소는 데이터의 필수 구조를 유지하면서 메모리 사용량을 크게 줄이고 계산 속도를 높입니다.

SQ4UCompatible with Milvus 2.6.8+

극한의 쿼리 속도와 최소한의 메모리 사용량이 요구되는 시나리오를 위해 Milvus는 4비트 균일 스칼라 양자화( SQ4U )를 도입했습니다. 이것은 각 차원의 부동 소수점 값을 4비트 부호 없는 정수로 압축하는 공격적인 형태의 스칼라 양자화입니다.

SQ4U의 "U"는 Uniform을 의미합니다. 일반적으로 각 차원에 대해 최소값과 최대값을 독립적으로 계산하는 비균일 스칼라 양자화(차원별 양자화)와 달리 SQ4U는 전역 균일 양자화 전략을 적용합니다:

  1. 글로벌 통계: 시스템은 벡터의 모든 차원 (또는 전체 벡터 세그먼트)에 적용되는 단일 최소값( vmin )과 단일 값 범위( vdiff )를 계산합니다.

  2. 균일 매핑: 전역 값 범위는 16개의 동일한 간격으로 나뉩니다. 벡터의 모든 부동 소수점 값은 어떤 차원에 속해 있는지에 관계없이 이러한 공유 매개 변수를 사용하여 4비트 정수(0-15)로 매핑됩니다.

성능 이점:

  • 8배 압축률: FP32 대비 8배, SQ8 대비 2배로 크기가 줄어들어 벡터 검색의 병목 현상인 메모리 대역폭 압박을 크게 낮춥니다.

  • SIMD 최적화: 컴팩트한 구조로 최신 CPU(AVX2/AVX-512)가 사이클당 더 많은 차원을 처리할 수 있습니다. 결정적으로, 글로벌 파라미터를 사용하면 거리 계산 중에 다양한 스케일/오프셋 값을 로드할 필요가 없으므로 명령 파이프라인을 완전히 포화 상태로 유지할 수 있습니다.

  • 캐시 효율성: 벡터 크기가 작을수록 CPU 캐시에 더 많은 데이터를 저장할 수 있어 메모리 액세스로 인한 지연 시간이 줄어듭니다.

글로벌 매개변수 공유로 인해 SQ4U는 정규화된 데이터 또는 차원 간에 일관된 값 분포를 가진 데이터 세트에서 가장 우수한 성능을 발휘합니다.

HNSW + SQ

HNSW_SQ는 HNSW와 SQ의 강점을 결합하여 효율적인 근사 최접 이웃 검색을 가능하게 합니다. 프로세스는 다음과 같이 작동합니다:

  1. 데이터 압축: SQ는 sq_type (예: SQ6 또는 SQ8)를 사용하여 벡터를 압축하여 메모리 사용량을 줄입니다. 이 압축은 정밀도를 낮출 수 있지만 시스템에서 더 큰 데이터 세트를 처리할 수 있게 해줍니다.

  2. 그래프 구성: 압축된 벡터는 HNSW 그래프를 구축하는 데 사용됩니다. 데이터가 압축되기 때문에 결과 그래프의 크기가 작아지고 검색 속도가 빨라집니다.

  3. 후보 검색: 쿼리 벡터가 제공되면 알고리즘은 압축된 데이터를 사용하여 HNSW 그래프에서 후보 이웃 풀을 빠르게 식별합니다.

  4. (선택 사항) 결과 구체화: 다음 매개변수를 기반으로 초기 후보 결과를 세분화하여 정확도를 높일 수 있습니다:

    • 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 에서 구성할 수 있는 매개변수가 나열되어 있습니다.

파라미터

설명

값 범위

조정 제안

HNSW

M

나가는 에지와 들어오는 에지를 모두 포함하여 각 노드가 그래프에서 가질 수 있는 최대 연결(또는 에지) 수입니다.

이 매개변수는 인덱스 구성과 검색 모두에 직접적인 영향을 줍니다.

유형: 정수

범위: [2, 2048]

기본값: 30 (노드당 최대 30개의 나가는 에지와 30개의 들어오는 에지)

M 값이 클수록 일반적으로 정확도는 높아지지만 메모리 오버헤드가 증가하고 인덱스 구축과 검색 속도가 느려집니다.

차원이 높은 데이터 세트나 높은 리콜이 중요한 경우 M 값을 늘리는 것을 고려하세요.

메모리 사용량과 검색 속도가 주요 관심사인 경우 M 을 낮추는 것이 좋습니다.

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

efConstruction

인덱스 구성 중에 연결을 위해 고려되는 후보 이웃의 수입니다.

새 요소마다 더 많은 후보 풀이 평가되지만 실제로 설정되는 최대 연결 수는 여전히 M 으로 제한됩니다.

유형: 유형: 정수

범위: [1, int_max]

기본값입니다: 360

efConstruction 이 높을수록 일반적으로 더 많은 잠재적 연결이 탐색되므로 더 정확한 인덱스가 생성됩니다. 그러나 이 경우 인덱싱 시간이 길어지고 구성 중에 메모리 사용량이 증가합니다.

특히 인덱싱 시간이 덜 중요한 시나리오에서는 정확도를 높이려면 efConstruction 을 늘리는 것이 좋습니다.

리소스 제약이 우려되는 경우 인덱스 구축 속도를 높이려면 efConstruction 을 줄이는 것을 고려하세요.

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

SQ

sq_type

벡터 압축을 위한 스칼라 양자화 방법을 지정합니다. 각 옵션은 압축과 정확도 간에 서로 다른 균형을 제공합니다:

  • SQ4U: 4비트 균일 양자화를 사용하여 벡터를 인코딩합니다. 이 모드는 가장 빠른 속도와 압축을 제공합니다.

  • SQ6: 6비트 정수를 사용하여 벡터를 인코딩합니다.

  • SQ8: 8비트 정수를 사용하여 벡터를 인코딩합니다.

  • BF16: Bfloat16 형식을 사용합니다.

  • FP16: 표준 16비트 부동 소수점 형식을 사용합니다.

유형: 문자열

범위: [ SQ4U, SQ6, SQ8, BF16, FP16 ]입니다.

기본값입니다: SQ8

sq_type 선택은 특정 애플리케이션의 요구 사항에 따라 달라집니다. 속도와 메모리 효율성을 극대화하려면 SQ4U, 균형 잡힌 성능을 위해서는 SQ6 또는 SQ8 이 적합할 수 있습니다. 반면 정확성이 가장 중요한 경우 BF16 또는 FP16 을 선호할 수 있습니다.

refine

검색 중에 구체화 단계를 적용할지 여부를 제어하는 부울 플래그입니다. 구체화에는 쿼리 벡터와 후보 간의 정확한 거리를 계산하여 초기 결과의 순위를 재조정하는 작업이 포함됩니다.

Type: 부울

범위: [true, false]

기본값입니다: false

높은 정확도가 필수적이고 검색 시간이 약간 느려지는 것을 용인할 수 있는 경우 true 로 설정합니다. 속도가 우선이고 약간의 정확도 저하를 감수할 수 있는 경우 false 을 사용합니다.

refine_type

세분화에 사용되는 데이터의 정밀도를 결정합니다.

이 정밀도는 압축된 벡터의 정밀도( sq_type)보다 높아야 하며, 재랭크된 벡터의 정확도와 메모리 사용량에 영향을 미칩니다.

유형: 문자열

범위:[ SQ6, SQ8, BF16, FP16, FP32 ]입니다.

기본값입니다: None

더 높은 메모리 비용으로 정밀도를 극대화하려면 FP32, 더 나은 압축을 위해서는 SQ6/SQ8 을 사용하세요. BF16FP16 은 균형 잡힌 대안을 제공합니다.

인덱스별 검색 매개변수

다음 표에는 색인에서 검색할search_params.params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.

파라미터

설명

값 범위

조정 제안

HNSW

ef

가장 가까운 이웃을 검색하는 동안 검색 범위를 제어합니다. 얼마나 많은 노드를 방문하고 잠재적인 가장 가까운 이웃으로 평가할지 결정합니다.

이 매개변수는 검색 프로세스에만 영향을 미치며 그래프의 맨 아래 레이어에만 적용됩니다.

유형: 정수

범위: [1, int_max]

기본값: limit (반환할 가장 가까운 이웃 TopK)

ef 이 클수록 일반적으로 더 많은 잠재적 이웃을 고려하므로 검색 정확도가 높아 집니다. 그러나 검색 시간도 늘어납니다.

높은 회상률을 달성하는 것이 중요하고 검색 속도는 크게 신경 쓰지 않는 경우 ef 을 늘리는 것을 고려하세요.

특히 약간의 정확도 감소를 감수할 수 있는 시나리오에서는 ef 을 줄여 검색 속도를 우선시하는 것이 좋습니다.

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

SQ

refine_k

요청된 상위 K 결과와 비교하여 정제 단계에서 얼마나 많은 추가 후보를 검토할지를 제어하는 배율 계수입니다.

유형: 플로트

범위: [1, float_max)

기본값: 1

refine_k 값이 클수록 검색 회수율과 정확도가 향상되지만 검색 시간과 리소스 사용량도 증가합니다. 값이 1이면 구체화 프로세스에서 초기 상위 K 결과만 고려합니다.

Try Managed Milvus for Free

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

Get Started
피드백

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