揭秘乘积量化:简化数据管理效率
Qdrant 1.1.0 引入了对 标量量化的支持,这是一种将通常由 float32
表示的值用 int8
表示,从而将内存占用减少多达四倍的技术。
向量搜索中的内存使用可以进一步减少!欢迎使用 乘积量化,这是 Qdrant 1.2.0 的全新功能!
什么是乘积量化?
与所有其他量化方法一样,乘积量化将浮点数转换为整数。然而,这个过程比 标量量化 稍微复杂,并且更具可定制性,因此您可以在内存使用和搜索精度之间找到最佳平衡点。本文介绍了执行乘积量化的所有步骤及其在 Qdrant 中的实现方式。
乘积量化如何工作?
假设我们有一些向量正在添加到集合中,并且我们的优化器决定开始创建一个新的段。
将向量切分成块
首先,我们的向量将被划分为块,也称为子向量。块的数量是可配置的,但根据经验法则——块的数量越少,压缩率越高。这也会降低搜索精度,但在某些情况下,您可能更希望将内存使用保持在最低水平。
Qdrant API 允许选择从 4 倍到 64 倍的压缩率。在我们的示例中,我们选择了 16 倍,因此每个子向量将包含 4 个浮点数(16 字节),最终将由一个字节表示。
聚类
我们的向量块随后被用作聚类算法的输入。Qdrant 使用 K-means 算法,其中 $ K = 256 $。这是预先选择的,因为这是一个字节能表示的最大值数量。因此,我们为每个块获得 256 个质心列表,并为每个质心分配一个唯一的 ID。聚类是针对每组块分别进行的。
现在,向量的每个块都可以映射到最近的质心。这是我们失去精度的地方,因为单个点只能代表整个子空间。我们可以存储最近质心的 ID,而不是使用子向量。如果我们对每个块重复此操作,我们可以将原始嵌入近似为质心 ID 的序列向量。创建的向量的维度等于块的数量,在我们的例子中是 2。
完整流程
所有这些步骤构建了以下的乘积量化流程
距离计算
向量搜索依赖于点之间的距离。启用乘积量化会稍微改变距离的计算方式。查询向量被分成块,然后我们将总距离计算为子向量与我们比较的向量的特定 ID 所对应的质心之间的距离总和。我们知道质心的坐标,所以这很容易。
Qdrant 实现
搜索操作需要计算与多个点之间的距离。由于我们计算的是与有限质心集合之间的距离,这些距离可以预先计算并重用。Qdrant 为每个查询创建一个查找表,以便随后只需将多个项相加即可测量查询与所有质心之间的距离。
质心 0 | 质心 1 | … | |
---|---|---|---|
块 0 | 0.14213 | 0.51242 | |
块 1 | 0.08421 | 0.00142 | |
… | … | … | … |
乘积量化基准测试
乘积量化是有代价的——需要执行一些额外的操作,这可能会降低性能。然而,内存使用量也可能大幅减少。像往常一样,我们做了一些基准测试,以便让您对可能的结果有一个初步了解。
同样,我们重用了与 我们发布的其他基准测试 相同的流程。我们选择了 Arxiv-titles-384-angular-no-filters 和 Glove-100 数据集来衡量乘积量化对精度和时间的影响。两次实验均在 $ EF = 128 $ 的条件下进行。结果总结在下表中
Glove-100
原始 | 1D 聚类 | 2D 聚类 | 3D 聚类 | |
---|---|---|---|---|
平均精度 | 0.7158 | 0.7143 | 0.6731 | 0.5854 |
平均搜索时间 | 2336 µs | 2750 µs | 2597 µs | 2534 µs |
压缩率 | x1 | x4 | x8 | x12 |
上传和索引时间 | 147 s | 339 s | 217 s | 178 s |
乘积量化会增加索引和搜索时间。压缩率越高,搜索精度越低。主要的好处无疑是减少了内存使用。
Arxiv-titles-384-angular-no-filters
原始 | 1D 聚类 | 2D 聚类 | 4D 聚类 | 8D 聚类 | |
---|---|---|---|---|---|
平均精度 | 0.9837 | 0.9677 | 0.9143 | 0.8068 | 0.6618 |
平均搜索时间 | 2719 µs | 4134 µs | 2947 µs | 2175 µs | 2053 µs |
压缩率 | x1 | x4 | x8 | x16 | x32 |
上传和索引时间 | 332 s | 921 s | 597 s | 481 s | 474 s |
事实证明,在某些情况下,乘积量化不仅可以减少内存使用,还可以缩短搜索时间。
乘积量化 vs 标量量化
与 标量量化相比,乘积量化提供了更高的压缩率。然而,这伴随着相当大的精度权衡,有时还会影响内存中的搜索速度。
乘积量化在某些特定场景下更受欢迎
- 在低内存环境部署,其中限制因素是磁盘读取次数而不是向量比较本身
- 原始向量维度足够高的情况
- 索引速度不是关键因素的情况
在不符合上述情况的环境中,应首选标量量化。
在 Qdrant 中使用乘积量化
如果您已经是 Qdrant 用户,我们提供了 乘积量化 文档,可帮助您为数据设置和配置新的量化方法,甚至实现高达 64 倍的内存减少。
准备好体验乘积量化的强大功能了吗?立即注册免费的 Qdrant 演示,立即优化您的数据管理!