最近在做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 上实现的。