diff --git a/contrib/exhaustive_search.py b/contrib/exhaustive_search.py index 808453e6c1..257427777d 100644 --- a/contrib/exhaustive_search.py +++ b/contrib/exhaustive_search.py @@ -11,7 +11,7 @@ LOG = logging.getLogger(__name__) -def knn_ground_truth(xq, db_iterator, k, metric_type=faiss.METRIC_L2): +def knn_ground_truth(xq, db_iterator, k, metric_type=faiss.METRIC_L2, shard=False, ngpu=-1): """Computes the exact KNN search results for a dataset that possibly does not fit in RAM but for which we have an iterator that returns it block by block. @@ -23,9 +23,14 @@ def knn_ground_truth(xq, db_iterator, k, metric_type=faiss.METRIC_L2): rh = faiss.ResultHeap(nq, k, keep_max=keep_max) index = faiss.IndexFlat(d, metric_type) - if faiss.get_num_gpus(): - LOG.info('running on %d GPUs' % faiss.get_num_gpus()) - index = faiss.index_cpu_to_all_gpus(index) + if ngpu == -1: + ngpu = faiss.get_num_gpus() + + if ngpu: + LOG.info('running on %d GPUs' % ngpu) + co = faiss.GpuMultipleClonerOptions() + co.shard = shard + index = faiss.index_cpu_to_all_gpus(index, co=co, ngpu=ngpu) # compute ground-truth by blocks, and add to heaps i0 = 0 diff --git a/tests/test_contrib.py b/tests/test_contrib.py index ba185f92b2..ca5d2bcca7 100644 --- a/tests/test_contrib.py +++ b/tests/test_contrib.py @@ -35,7 +35,7 @@ class TestComputeGT(unittest.TestCase): - def do_test_compute_GT(self, metric=faiss.METRIC_L2): + def do_test_compute_GT(self, metric=faiss.METRIC_L2, ngpu=0): d = 64 xt, xb, xq = get_dataset_2(d, 0, 10000, 100) @@ -50,7 +50,7 @@ def matrix_iterator(xb, bs): yield xb[i0:i0 + bs] Dnew, Inew = knn_ground_truth( - xq, matrix_iterator(xb, 1000), 10, metric) + xq, matrix_iterator(xb, 1000), 10, metric, ngpu=ngpu) np.testing.assert_array_equal(Iref, Inew) # decimal = 4 required when run on GPU @@ -62,6 +62,12 @@ def test_compute_GT(self): def test_compute_GT_ip(self): self.do_test_compute_GT(faiss.METRIC_INNER_PRODUCT) + def test_compute_GT_gpu(self): + self.do_test_compute_GT(ngpu=-1) + + def test_compute_GT_ip_gpu(self): + self.do_test_compute_GT(faiss.METRIC_INNER_PRODUCT, ngpu=-1) + class TestDatasets(unittest.TestCase): """here we test only the synthetic dataset. Datasets that require