본문 바로가기
WIKI 기술 지식 베이스

Faiss product quantization

원문 보기 위키 갱신

출처: 문서

본문

Faiss 제품 양자화

제품 양자화(PQ)는 구성 가능한 비트 수를 사용하여 벡터를 표현하는 기술이에요. 일반적으로 바이트 또는 스칼라 양자화에 비해 더 높은 압축 수준을 달성하는 데 사용할 수 있어요. PQ는 벡터를 _m_개의 하위 벡터로 분리하고 각 하위 벡터를 code_size 비트로 인코딩하여 작동해요. 따라서 벡터의 총 메모리 양은 m*code_size 비트에 오버헤드를 더한 값이에요. 매개변수에 대한 자세한 내용은 PQ 매개변수를 참조하세요. PQ는 Faiss 엔진에서만 지원되며 HNSW 또는 IVF 근사 최근접 이웃(ANN) 알고리즘과 함께 사용할 수 있어요.

Faiss 제품 양자화 사용하기

정확도 손실을 최소화하려면 PQ는 검색될 데이터의 분포를 기반으로 모델을 구축하는 훈련 단계가 필요해요.

제품 양자화기는 각 하위 벡터 공간에 대해 훈련 벡터 세트에서 k-평균 클러스터링을 실행하고 인코딩에 사용할 중심점을 추출하여 훈련돼요. 훈련 벡터는 수집될 벡터의 하위 집합이거나 수집될 벡터와 동일한 분포 및 차원을 가진 벡터일 수 있어요.

OpenSearch에서 훈련 벡터는 인덱스에 존재해야 해요. 일반적으로 훈련 데이터의 양은 사용되는 ANN 알고리즘과 인덱스에 저장될 데이터의 양에 따라 달라져요. IVF 기반 인덱스의 경우 권장 훈련 벡터 수는 max(1000*nlist, 2^code_size * 1000)이에요. HNSW 기반 인덱스의 경우 권장 수는 2^code_size*1000이에요. 이 수치를 계산하는 데 사용된 방법론에 대한 자세한 내용은 Faiss 문서를 참조하세요.

PQ의 경우 _m_과 _code_size_를 모두 선택해야 해요. _m_은 벡터를 별도로 인코딩하기 위해 분할할 하위 벡터의 수를 결정해요. 따라서 _차원_은 _m_으로 나누어 떨어져야 해요. _code_size_는 각 하위 벡터를 인코딩하는 데 사용되는 비트 수를 결정해요. 일반적으로 code_size = 8로 설정하고 _m_을 조정하여 메모리 사용량과 재현율 사이의 원하는 균형을 맞추는 것을 권장해요.

PQ로 인덱스를 설정하는 예는 모델에서 벡터 인덱스 구축 튜토리얼을 참조하세요.

메모리 추정

PQ는 개별 벡터를 m*code_size 비트로 표현하기 위한 것이지만, 실제로는 인덱스가 더 많은 공간을 소비해요. 이는 주로 특정 코드 테이블과 보조 데이터 구조를 저장하는 오버헤드 때문이에요.

일부 메모리 공식은 존재하는 세그먼트 수에 따라 달라져요. 이는 일반적으로 미리 알 수 없지만 권장 기본값은 300이에요. {: .note}

HNSW 메모리 추정

PQ를 사용한 HNSW에 필요한 메모리는 1.1*(((pq_code_size / 8) * pq_m + 24 + 8 * hnsw_m) * num_vectors + num_segments * (2^pq_code_size * 4 * d)) 바이트로 추정돼요.

예를 들어, 차원이 256이고 hnsw_m이 16, pq_m이 32, pq_code_size가 8, 세그먼트가 100개인 100만 개의 벡터가 있다고 가정해요. 메모리 요구 사항은 다음과 같이 추정할 수 있어요:

1.1 * ((8 / 8 * 32 + 24 + 8 * 16) * 1000000 + 100 * (2^8 * 4 * 256)) ~= 0.215 GB

IVF 메모리 추정

PQ를 사용한 IVF에 필요한 메모리는 1.1*(((pq_code_size / 8) * pq_m + 24) * num_vectors + num_segments * (2^code_size * 4 * d + 4 * ivf_nlist * d)) 바이트로 추정돼요.

예를 들어, 차원이 256이고 ivf_nlist가 512, pq_m이 32, pq_code_size가 8, 세그먼트가 100개인 100만 개의 벡터가 있다고 가정해요. 메모리 요구 사항은 다음과 같이 추정할 수 있어요:

1.1 * ((8 / 8 * 64 + 24) * 1000000  + 100 * (2^8 * 4 * 256 + 4 * 512 * 256))  ~= 0.171 GB

다음 단계

더 알아보기 (Learn more)