1. 说明
在研究Faiss库一段时间之后,做了一个简单的demo程序。这个程序在CPU环境下进行训练,GPU内进行搜索。使用IndexIVFPQ索引。
由于没有实际的图片库,这里使用numpy生成多维随机数组的方式来模拟数据检索的过程。
1.1 开发环境
1.2 程序总体流程
Faiss总体使用过程可以分为三步:
-
构建训练数据和查询数据,原始数据集以二维矩阵形式表达,矩阵每一行代表数据库中的一个数据,每一列代表数据库中所有数据的某个特征,每个数据为高维浮点矢量如64维,当数据库中数据量较大时,训练集规模远小于数据库。查询数据与训练数据类型和格式相同。这一步骤是离线进行,更新频率很低。
-
挑选合适配置参数建立Index(Faiss的核心部件),从数据库中选取训练数据训练并得到聚类中心向量,数据库数据通过add操作建立Index索引。这部分也是离线,更新频率高于上一步。
-
Search搜索,距离计算+比较得到最后结果。在线进行,目标是低延迟,高吞吐量。
2. 程序设计
1. 设置参数配置
nb = nb # dataset numbers
nq = nq # query numbers
nlist = nlist
nprobe = nprobe
topk = topk
d = 64 # dimension
m = 64 # sub quantizer
nbits = 8 # bits of per code
learning_ratio = lr # 学习率
程序使用固定为64的维度, 其中nb表示database,本文以1M数据量为例进行说明。
2. 准备测试样本集和训练集
# prep nq test samples
def CreateDataSet(nb, nq, d):
# dataset
np.set_printoptions(threshold = np.inf)
np.random.seed(1234)
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / int(nb)
# query
xq = np.</

本文介绍使用Faiss库构建IVFPQ索引的全过程,包括参数配置、数据集生成、索引创建、训练、添加向量、GPU迁移及搜索。通过对比暴力搜索结果评估索引精确度。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



