IVF_SQ8
IVF_SQ8 인덱스는 대규모 유사도 검색 문제를 해결하기 위해 고안된 양자화 기반 인덱싱 알고리즘입니다. 이 인덱스 유형은 전수 검색 방식에 비해 훨씬 적은 메모리 사용량으로 더 빠른 검색을 달성합니다.
개요
IVF_SQ8 인덱스는 두 가지 주요 구성 요소를 기반으로 합니다:
반전 파일(IVF): 데이터를 클러스터로 구성하여 검색 알고리즘이 가장 관련성이 높은 벡터의 하위 집합에만 집중할 수 있도록 합니다.
스칼라 양자화(SQ8): 벡터를 보다 컴팩트한 형태로 압축하여 메모리 사용량을 대폭 줄이면서도 빠른 유사도 계산을 위한 충분한 정밀도를 유지합니다.
IVF
IVF는 책에서 색인을 만드는 것과 같습니다. 모든 페이지(이 경우에는 모든 벡터)를 스캔하는 대신 색인에서 특정 키워드(클러스터)를 조회하여 관련 페이지(벡터)를 빠르게 찾습니다. 이 시나리오에서는 벡터가 클러스터로 그룹화되고 알고리즘이 쿼리 벡터에 가까운 몇 개의 클러스터 내에서 검색합니다.
작동 방식은 다음과 같습니다:
클러스터링: 벡터 데이터 세트는 k-평균과 같은 클러스터링 알고리즘을 사용하여 지정된 수의 클러스터로 나뉩니다. 각 클러스터에는 중심(클러스터의 대표 벡터)이 있습니다.
할당: 각 벡터는 중심이 가장 가까운 클러스터에 할당됩니다.
반전 인덱스: 각 클러스터 중심을 해당 클러스터에 할당된 벡터 목록에 매핑하는 인덱스가 생성됩니다.
검색: 가장 가까운 이웃을 검색할 때 검색 알고리즘은 쿼리 벡터와 클러스터 중심을 비교하여 가장 가능성이 높은 클러스터를 선택합니다. 그런 다음 선택한 클러스터 내의 벡터로 검색 범위가 좁혀집니다.
기술적 세부 사항에 대해 자세히 알아보려면 IVF_FLAT을 참조하세요.
SQ8
스칼라 양자화(SQ)는 고차원 벡터의 값을 더 작고 간결한 표현으로 대체하여 크기를 줄이는 데 사용되는 기술입니다. SQ8 변형은 벡터의 각 차원 값을 저장할 때 일반적인 32비트 부동 소수점 숫자 대신 8비트 정수를 사용합니다. 따라서 데이터를 저장하는 데 필요한 메모리 양이 크게 줄어듭니다.
SQ8의 작동 방식은 다음과 같습니다:
범위 식별: 먼저 벡터 내의 최소값과 최대값을 식별합니다. 이 범위는 양자화의 범위를 정의합니다.
정규화: 정규화: 공식을 사용하여 벡터 값을 0과 1 사이의 범위로 정규화합니다:
이렇게 하면 모든 값이 표준화된 범위 내에서 비례적으로 매핑되어 압축을 준비할 수 있습니다.
8비트 압축: 정규화된 값에 255(8비트 정수의 최대값)를 곱하고 결과를 가장 가까운 정수로 반올림합니다. 이렇게 하면 각 값이 8비트 표현으로 효과적으로 압축됩니다.
차원 값이 1.2이고 최소값이 -1.7, 최대값이 2.3이라고 가정합니다. 다음 그림은 SQ8을 적용하여 float32 값을 int8 정수로 변환하는 방법을 보여줍니다.
IVF Sq8
IVF + SQ8
IVF_SQ8 인덱스는 IVF와 SQ8을 결합하여 유사도 검색을 효율적으로 수행합니다:
IVF는 검색 범위를 좁힙니다: 데이터 세트는 클러스터로 나뉘며, 쿼리가 실행되면 IVF는 먼저 쿼리를 클러스터 중심과 비교하여 가장 관련성이 높은 클러스터를 선택합니다.
SQ8은 거리 계산 속도를 높입니다: 선택한 클러스터 내에서 SQ8은 벡터를 8비트 정수로 압축하여 메모리 사용량을 줄이고 거리 계산을 가속화합니다.
IVF를 사용해 검색에 집중하고 SQ8을 사용해 계산 속도를 높임으로써 IVF_SQ8은 빠른 검색 시간과 메모리 효율성을 모두 달성합니다.
색인 구축
Milvus의 벡터 필드에 IVF_SQ8 인덱스를 구축하려면 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="IVF_SQ8", # 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={
"nlist": 64, # Number of clusters to create using the k-means algorithm during index building
} # Index building params
)
이 구성에서는
index_type: 빌드할 인덱스 유형입니다. 이 예에서는 값을IVF_SQ8로 설정합니다.metric_type: 벡터 간의 거리를 계산하는 데 사용되는 메서드입니다. 지원되는 값은COSINE,L2,IP입니다. 자세한 내용은 메트릭 유형을 참조하세요.params: 인덱스 구축을 위한 추가 구성 옵션입니다.nlist: 인덱스 구축 중에 k-평균 알고리즘을 사용하여 생성할 클러스터 수입니다.
IVF_SQ8인덱스에 사용할 수 있는 구축 파라미터에 대해 자세히 알아보려면 인덱스 구축 파라미터를 참조하세요.
인덱스 파라미터가 구성되면 create_index() 메서드를 직접 사용하거나 create_collection 메서드에서 인덱스 파라미터를 전달하여 인덱스를 생성할 수 있습니다. 자세한 내용은 컬렉션 만들기를 참조하세요.
인덱스에서 검색
인덱스가 구축되고 엔티티가 삽입되면 인덱스에서 유사도 검색을 수행할 수 있습니다.
search_params = {
"params": {
"nprobe": 8, # Number of clusters to search for candidates
}
}
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=10, # TopK results to return
search_params=search_params
)
이 구성에서는
params: 색인에서 검색을 위한 추가 구성 옵션.nprobe: 후보를 검색할 클러스터 수입니다.
IVF_SQ8인덱스에 사용할 수 있는 검색 매개변수에 대해 자세히 알아보려면 인덱스별 검색 매개변수를 참조하세요.
인덱스 매개변수
이 섹션에서는 인덱스를 구축하고 인덱스에서 검색을 수행하는 데 사용되는 매개변수에 대한 개요를 제공합니다.
인덱스 구축 매개변수
다음 표에는 색인 작성 시 params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.
파라미터 |
설명 |
값 범위 |
조정 제안 |
|
|---|---|---|---|---|
IVF |
|
인덱스 구축 중에 k-평균 알고리즘을 사용하여 생성할 클러스터의 수입니다. |
유형: 정수 범위: [1, 65536] 기본값입니다: |
|
인덱스별 검색 매개변수
다음 표에는 인덱스에서 검색할 때 search_params.params 에서 구성할 수 있는 매개변수가 나열되어 있습니다.
파라미터 |
설명 |
값 범위 |
조정 제안 |
|
|---|---|---|---|---|
IVF |
|
후보를 검색할 클러스터 수입니다. |
유형: 정수 범위: [1, nlist] 기본값입니다: |
값이 클수록 더 많은 클러스터를 검색할 수 있으므로 검색 범위가 확장되어 검색 회수율이 향상되지만 쿼리 대기 시간이 늘어납니다. 속도와 정확도의 균형을 맞추려면 대부분의 경우 이 범위 내에서 값을 설정하는 것이 좋습니다: [1, nlist]. |