faiss-ivf-pq删除item

最近在做faiss的向量索引,发现当用GPU之后,无法实时的删除数据。

最后发现,这个删除和所用的索引无关,而和所用的资源(CPU/GPU)有关,因此修改了索引代码,如下:


import faiss
import numpy as np
rs = np.random.RandomState(1234)
X = rs.randn(4096, 16).astype(np.float32)
idx = np.array(list(range(4096)), np.int64)
remove_set = np.array([10, 30], dtype=np.int64)
nlist = 4
print('nlist size is {}'.format(nlist))
m = 8
d = 16
factory_description = "IVF{},PQ{}".format(nlist, m)
co = faiss.GpuMultipleClonerOptions()
co.useFloat16 = True
co.verbose = True
co.shard = True
# co.reserveVecs = True
index = faiss.index_factory(d, factory_description, faiss.METRIC_INNER_PRODUCT)
index = faiss.index_cpu_to_all_gpus(index, co, ngpu=2)
index.train(X)
# index = faiss.IndexIDMap2(index)
index = faiss.index_gpu_to_cpu(index)
print('train done!')
index.add_with_ids(X[:5, :], idx[:5])
print('add done!')
index.remove_ids(remove_set)
index.add_with_ids(X[5:, :], idx[5:])

其中比较重要的是哪个在训练完index之后将数据从GPU搬到CPU的过程,虽然这样比较麻烦,但是现在看也只有这么一个比较好的解决方法了。

注意:这样做当然也有两个问题:

1)训练完毕并且add完毕的数据通常都非常大,如何实时和高效地删除?

2)删除操作和插入操作是否会造成死锁?


最后其实我们发现,faiss适合那种一次构建,永久索引的场景。对于高并发、实时性强的应用支持的还不是特别好(特别是ivf,pq)这种实时性很强的操作。





留下您的评论

回复列表:

    匿名发表于 March 14, 2024, 4:02 p.m.

您好,想向您请教一下,我现在在做的工作的索引构建方法需要高并发、实时性强,但不需要太高的召回率,请问您有什么好的方法或库推荐吗,最好是可以在GPU 上实现的。

    匿名发表于 March 14, 2024, 4:02 p.m.

您好,想向您请教一下,我现在在做的工作的索引构建方法需要高并发、实时性强,但不需要太高的召回率,请问您有什么好的方法或库推荐吗,最好是可以在GPU 上实现的。

    匿名发表于 March 14, 2024, 4:02 p.m.

您好,想向您请教一下,我现在在做的工作的索引构建方法需要高并发、实时性强,但不需要太高的召回率,请问您有什么好的方法或库推荐吗,最好是可以在GPU 上实现的。

    匿名发表于 March 14, 2024, 4:02 p.m.

您好,想向您请教一下,我现在在做的工作的索引构建方法需要高并发、实时性强,但不需要太高的召回率,请问您有什么好的方法或库推荐吗,最好是可以在GPU 上实现的。

    匿名发表于 March 14, 2024, 4:02 p.m.

您好,想向您请教一下,我现在在做的工作的索引构建方法需要高并发、实时性强,但不需要太高的召回率,请问您有什么好的方法或库推荐吗,最好是可以在GPU 上实现的。

    匿名发表于 March 14, 2024, 4:02 p.m.

您好,想向您请教一下,我现在在做的工作的索引构建方法需要高并发、实时性强,但不需要太高的召回率,请问您有什么好的方法或库推荐吗,最好是可以在GPU 上实现的。

By王炳宁 on April 3, 2022 | 类别 Python

关于本站