1.速度与精度指标参数
1.选择索引家族
2.选择索引参数
通过 faiss.index_factory()
调用实例化索引是很常见的。但这种实例化方式将索引参数设置为安全值,同时存在许多与速度相关的参数。许多 Faiss 组件可以利用:
- 编码时使用的迭代算法;迭代次数越多,召回率就越高
- HNSW:
efConstruction
- ResidualQuantizer:
niter_codebook_refine
- LocalSearchQuantizer:
encode_ils_iters
,icm_iters
,train_iters
,encode_ils_iters
(for vector codecs)
- HNSW:
- 启发式方法限制训练或搜索过程中考虑的可能候选者的数量,例如 束搜索。评估的候选越多,召回率就越高。
- IndexBinaryIVF:
nprobe
,max_codes
- IndexIVF:
nprobe
,max_codes
- ResidualQuantizer:
max_beam_size
- HNSW:
efSearch
- IndexBinaryIVF:
- 其他可选版本,例如基于 LUT 的近似值;他们允许以速度换取准确性
- IndexIVFPQ:
do_polysemous_training
,polysemous_ht
,use_precomputed_table
- IndexIVFPQFastScan:
use_precomputed_table
- IndexPQ:
do_polysemous_training
,polysemous_ht
,search_type
- ResidualQuantizer:
use_beam_LUT
,approx_topk_mode
,train_type
- LocalSearchQuantizer:
update_codebooks_with_double
- IndexIVFPQ:
- 针对特定情况优化的计算,例如大批量 IVF 搜索。
- 用于处理块输入数据的各种内部缓冲区;见下文。
- 随机数生成器;这些用于确保结果可以重现。
在大多数情况下,默认索引参数应该工作得相当好。但强烈建议研究可用参数,以便在您的特定速度与精度与 RAM 情况下找到最佳点。
秘诀:研究所选 index 及其 subindexes 的可用参数。
3.K-均值聚类
K-means 聚类是 Faiss 内部经常使用的工具。默认情况下,faiss/Clustering.h 中的 k-means 实现使用 25 次迭代(niter
参数)和每个集群所需的输入数据集中最多 256 个样本(max_points_per_centroid
参数)。样本是随机选择的。
例如,默认的 PQx12
训练比 PQx10
训练慢约 4 倍,比 PQx8
训练慢约 16 倍,因为输入数据集中使用的样本数量比例较高。
基于 IVF 的索引默认使用 10 次 k 均值迭代(faiss/IndexIVF.h、faiss/IndexBinaryIVF.h、faiss/gpu/GpuIndexIVF.cu)。
秘诀:使用 k 均值聚类 niter
和 max_points_per_centroid
参数。
4.查询批次
Faiss 针对批量样本的处理进行了优化,而不是逐个处理样本。
在内部,Faiss 以比调用者执行并行化更有效的方式对批处理元素进行并行化。
秘诀:如果合适的话,尝试分批处理样本
5.PQ训练的train_shared
训练模式
考虑对 PQ 使用 Train_shared
训练模式,该模式用于为所有子量化器训练单个码本,而不是为每个子量化器训练单独的码本。
这显着减少了 10 位或 12 位 PQ 的训练时间,但代价是准确性。