当集合超出内存时

当集合超出内存时

💡 原文英文,约1900词,阅读约需7分钟。
📝

内容提要

本文介绍Qdrant向量数据库在集合超出内存时的优化方法。通过量化压缩向量(如TurboQuant bits4)并固定压缩副本在RAM中,原始向量移至磁盘,可减少内存占用。重打分(rescore)虽增加磁盘读取,但能恢复精度,尤其对低比特量化(如bits1)效果显著。建议从bits4开始,根据测试调整参数,并验证召回率与延迟。

🔎

延伸解读

量化与数据类型:两种不同的内存优化路径

文章指出,量化(如TurboQuant)是在原始向量旁添加压缩副本,而改变数据类型(如float16)是直接替换原始向量。这一区别决定了是否有全精度向量可用于重打分。理解这一点有助于根据是否需要高精度重打分来选择优化方式。

重打分:精度恢复与磁盘读取的权衡

重打分通过读取磁盘上的原始向量来恢复精度,但代价是额外的磁盘I/O。在内存充足时,重打分几乎无成本;内存受限时,可能显著增加延迟(如从4ms增至43ms)。建议根据实际部署环境测试重打分和oversampling参数,以平衡精度与性能。

低比特量化的重打分效果显著

对于bits1等低比特量化,重打分是使其可用的关键。单次重打分可将Recall@10从0.605提升至0.951,但增加oversampling带来的收益有限。因此,在低比特量化下,应优先启用重打分,并谨慎设置oversampling以避免不必要的磁盘读取。

验证与调优:基于自身数据测试

文章强调,量化配置的效果需在自身数据集上验证。建议先测量float32的基线,再对比不同量化参数下的Recall@k和nDCG@k。对于混合搜索,需在完整查询和部署环境下测试,因为稀疏向量索引也会占用内存。

Q&A

当Qdrant集合超出内存时,有哪些优化方法?

当集合超出内存时,Qdrant通过量化压缩向量来减少内存占用。具体做法是:使用量化方法(如TurboQuant)将每个稠密向量的压缩副本固定在RAM中,而将原始全精度向量移至磁盘。同时,可以通过调整量化位深(如bits4)、设置内存放置(pinned/cold)以及启用重打分(rescore)来平衡内存和性能。

如何估算Qdrant中float32稠密向量所需的内存?

估算公式为:RAM = 向量数量 × 向量维度 × 4字节 × 1.5。额外的50%用于覆盖元数据、索引、点版本和优化期间创建的临时段。这只是一个起始估算,不是容器限制。更完整的估算可使用Qdrant Sizing Calculator。

Qdrant中内存放置(memory placement)有哪些选项?它们有什么区别?

自v1.19起,Qdrant使用memory参数设置内存放置,取代了旧的on_disk和always_ram标志。选项包括:cold(懒加载,首次访问时从磁盘读取)、cached(加载时进入页缓存,内核可能驱逐)、pinned(常驻RAM,必须能容纳)。只有量化副本可以pinned,原始向量通过内存映射读取,只能cold或cached。

重打分(rescore)在Qdrant中是如何工作的?它有什么代价?

重打分是在密集预取后,从磁盘读取原始向量,并按全精度分数重新排序前候选。它通过oversampling参数控制预选候选数,例如oversampling 2且limit为10时,预取20个候选,重打分后返回最佳10个。代价是增加磁盘读取,当原始向量不在缓存时,重打分可能成为查询的瓶颈。

在Qdrant中,如何设置量化配置和内存放置?

使用update_collection方法,在quantization_config中指定TurboQuantization,设置bits(如BITS1)和memory(如PINNED),并在vectors_config中为稠密向量设置memory为COLD。例如:client.update_collection(collection_name="products", quantization_config=models.TurboQuantization(turbo=models.TurboQuantQuantizationConfig(bits=models.TurboQuantBitSize.BITS1, memory=models.Memory.PINNED)), vectors_config={"dense": models.VectorParamsDiff(memory=models.Memory.COLD)})。

为什么建议从bits4开始使用TurboQuant?

bits4是TurboQuant的默认推荐位深,因为它提供了8倍压缩,在许多工作负载下是良好的默认选择。它能在内存节省和精度之间取得平衡,而更低的位深(如bits1)虽然压缩率更高,但精度损失更大,需要重打分来恢复。

在Qdrant中,如何验证量化配置的效果?

首先,对代表性查询样本计算精确的密集top k(如k=10)。然后,使用不同的rescore和oversampling设置运行现有的密集预取,并计算Recall@k与精确结果的对比。如果有标签,还可以计算nDCG@k。对于混合搜索,需在最终结果上比较nDCG@k。

Qdrant支持哪些量化方法?它们各自的特点是什么?

Qdrant支持TurboQuant、Scalar、Binary和Product Quantization。Scalar Quantization将向量分量转换为int8,适合中等压缩;Binary Quantization适用于高维且分量分布居中的嵌入,速度快;Product Quantization优先考虑更小的内存占用,但精度和搜索速度的权衡更大。

🏷️

标签

➡️

继续阅读