콘텐츠로 이동

Quantization

Quantization은 vector를 압축 code로 저장해 후보 distance를 계산합니다. Scalar quantization (SQ)은 coordinate마다 code를 저장하고, product quantization (PQ)은 subvector마다 code를 저장합니다. Quantized HNSW와 Vamana는 선택된 후보의 원본 vector distance를 다시 계산할 수 있습니다.

Quantization은 AkasicDB Enterprise Edition에서만 사용할 수 있으며 Community Edition에서는 지원하지 않습니다.

AkasicDB는 SQ 방식 scalar, Vamana 전용 SQ 방식 minmax와 projected_minmax8, PQ 방식 product를 지원합니다.

지원 범위

Index SQ PQ
Flat scalar product
IVF scalar product
HNSW scalar product
Vamana L2 scalar, minmax, projected_minmax8 product
DiskANN static search - search_pq_chunks 기반 PQ

Flat, IVF와 HNSW의 scalar와 product는 dense vector와 vecf16에 적용할 수 있습니다. Vamana는 L2 distance만 지원합니다. Vamana의 projected_minmax8은 161–65,535 dimensions의 vector에만 적용할 수 있습니다.

DiskANN static search는 indexing.diskann.search_pq_chunks로 PQ chunk 수를 지정합니다. DiskANN primary index의 종류와 quantization 제한은 DiskANN을 참조하십시오.

Quantization 방식

방식 구분 Encoding 지원 index 설정 및 제한
scalar SQ 학습 vector에서 coordinate별 범위를 구하고 각 coordinate를 고정 폭 code로 변환 Flat, IVF, HNSW, Vamana dense vector 또는 vecf16; bits=1, 2, 4, 8
minmax SQ vector별 최솟값과 최댓값을 범위로 사용해 원본 coordinate를 4-bit code로 변환 Vamana L2 vector 또는 vecf16; bits=4
projected_minmax8 SQ principal component analysis (PCA)로 160 dimensions로 projection한 뒤 vector별 범위를 사용해 각 projected coordinate를 8-bit code로 변환 Vamana L2 vector 전용; 161–65,535 dimensions; 별도 option 없음
product PQ vector를 ratio dimensions 단위의 subvector로 나누고 각 subvector를 centroid code로 변환 Flat, IVF, HNSW, Vamana dense vector 또는 vecf16; bits=1, 2, 4, 8; ratio=1–64

scalar, minmax, product에는 별도 차원 하한이 없으며 dense vector type의 일반 범위인 1–65,535 dimensions가 적용됩니다.

권장 profile

Quantization을 지정하지 않으면 Plain index를 생성합니다. 지원되는 vector type과 dimensions에서 HNSW와 Vamana의 권장 profile은 다음과 같습니다.

Index SQ profile PQ profile
HNSW scalar, SQ4 product, PQ8, ratio=4
Vamana L2 projected_minmax8 product, PQ8, ratio=6

Vamana SQ 권장 profile은 161–65,535 dimensions의 vector에 적용됩니다.

Quantization 방식은 해당 subtable로 명시적으로 선택합니다. Vamana SQ에서 projected_minmax8을 사용하려면 동명의 subtable을 지정해야 합니다. Vamana의 scalar와 minmax는 projected_minmax8로 자동 변경되지 않습니다. 지원되는 bits 또는 ratio를 지정하면 index별 기본값보다 우선합니다.

Scalar quantization

scalar는 dimension마다 1, 2, 4 또는 8 bits를 사용합니다. bits를 생략하면 HNSW는 4 bits, Flat·IVF·Vamana는 8 bits를 사용합니다.

CREATE INDEX items_embedding_hnsw_sq_idx
  ON items
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.hnsw]
    m = 12
    ef_construction = 300

    [indexing.hnsw.quantization.scalar]
  $$);

위 HNSW index는 기본값인 SQ4를 사용합니다. 다른 bit width가 필요하면 bits를 명시합니다.

Vamana SQ

Vamana L2는 두 가지 vector별 SQ 방식도 지원합니다. minmax는 원본 vector에서 범위를 계산하고, projected_minmax8은 PCA projection 결과에서 범위를 계산합니다.

두 방식은 저장 형식과 검색 경로가 다릅니다. 방식을 변경하려면 index를 다시 생성해야 합니다.

MinMax SQ

minmax는 각 vector의 최솟값과 최댓값으로 quantization 범위를 정하며 4 bits만 지원합니다.

CREATE INDEX items_embedding_vamana_minmax_idx
  ON items
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.vamana]

    [indexing.vamana.quantization.minmax]
    bits = 4
  $$);

ProjectedMinMax8 SQ

projected_minmax8은 PCA projection과 vector별 8-bit MinMax quantization을 결합한 Vamana SQ 방식입니다. Index를 만들 때 sample vector로 PCA model을 학습하고 vector를 160 dimensions로 projection합니다. 검색할 때에는 query를 같은 model로 projection하고 압축된 code로 후보를 찾습니다. 기본 설정은 선택된 후보의 원본 32-bit floating-point (FP32) distance를 다시 계산합니다.

projected_minmax8에는 별도의 tuning option이 없습니다.

CREATE TABLE image_features (
  id bigserial PRIMARY KEY,
  embedding vector(960) NOT NULL
);

CREATE INDEX image_features_vamana_projected_idx
  ON image_features
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.vamana]

    [indexing.vamana.quantization.projected_minmax8]
  $$);

Product quantization

Product quantization은 vector를 ratio dimensions 단위의 subvector로 나눕니다. 마지막 subvector는 ratio보다 작을 수 있습니다.

Index ratio 기본값 bits 기본값
Flat, IVF 1 8
HNSW 4 8
Vamana 6 8

ratio의 범위는 1–64이고 bits는 1, 2, 4 또는 8입니다. 명시한 값은 index별 기본값보다 우선합니다.

CREATE INDEX items_embedding_hnsw_pq_idx
  ON items
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.hnsw]
    m = 12
    ef_construction = 300

    [indexing.hnsw.quantization.product]
  $$);

위 HNSW index는 기본값인 PQ8 ratio=4를 사용합니다.

Quantized search 설정

아래 parameter는 index별 single instruction, multiple data (SIMD) quantized distance 계산을 제어합니다.

Index Parameter Default
Flat vectoron.flat_quantized_simd off
IVF vectoron.ivf_quantized_simd off
HNSW vectoron.hnsw_quantized_simd on
Vamana vectoron.vamana_quantized_simd on

Parameter가 on이면 지원되는 CPU와 vector dimensions에서 SIMD를 사용합니다. 지원되지 않는 경우에는 non-SIMD 연산으로 전환되며 index를 다시 만들 필요가 없습니다.

SQ encoding은 packed word를 채우지 않는 tail dimensions를 처리합니다. PQ는 ratio로 나누어떨어지지 않는 마지막 subvector를 처리합니다. 선택한 dimension 또는 PQ ratio에 specialized SIMD kernel이 없으면 generic scorer를 사용합니다.

Quantized HNSW와 Vamana는 exact refine를 기본으로 사용합니다.

Parameter Default 설명
vectoron.hnsw_refine on HNSW bottom-layer queue에서 pop한 후보의 원본 distance를 계산합니다.
vectoron.vamana_refine on Vamana가 유지한 후보의 원본 distance를 계산합니다.
vectoron.hnsw_early_filtering off 현재 result bound를 사용해 HNSW bottom layer의 후보를 조기에 제외하는 실험적 설정입니다.

Refine을 끄면 압축된 distance가 최종 결과에 사용됩니다.