Link Search Menu Expand Document Documentation Menu

Faiss 乘积量化

产品量化 (PQ) 是一种用于使用可配置位数表示向量的技术。通常,与字节或标量量化相比,它可用于实现更高水平的压缩。PQ 的工作原理是将向量分成 *m* 个子向量,并用 *code_size* 位对每个子向量进行编码。因此,向量的总内存量为 m*code_size 位,外加开销。有关参数的详细信息,请参阅 PQ 参数。PQ 仅支持 *Faiss* 引擎,并且可以与 *HNSW* 或 *IVF* 近似最近邻 (ANN) 算法一起使用。

使用 Faiss 产品量化

为了最大限度地减少精度损失,PQ 需要一个*训练*步骤,该步骤根据将要搜索的数据分布构建模型。

产品量化器通过对每个子向量空间的一组训练向量运行 k-means 聚类来训练,并提取用于编码的质心。训练向量可以是待摄取向量的一个子集,也可以是与待摄取向量具有相同分布和维度的向量。

在 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。

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)) 字节。

例如,假设您有 100 万个维度为 256 的向量,hnsw_m 为 16,pq_m 为 32,pq_code_size 为 8,以及 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)) 字节。

例如,假设您有 100 万个维度为 256 的向量,ivf_nlist 为 512,pq_m 为 32,pq_code_size 为 8,以及 100 个段。内存需求可以估算如下

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

后续步骤

剩余 350 字符

有问题?

想做贡献?