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가 최종 결과에 사용됩니다.