facebookresearch/faiss

HNSWFlat Index with METRIC_BrayCurtis brings different results sometime when using CPU and GPU

qwevdb opened this issue · 1 comments

Summary

Using HNSWFlat Index with METRIC_BrayCurtis to search brings different results sometime when running on CPU and GPU.

Platform

OS: Ubuntu 24.04 LTS

Faiss version: faiss-gpu 1.8.0

Installed from: Anaconda

Faiss compilation options:

Running on:

  • [✔] CPU
  • [✔] GPU

Interface:

  • C++
  • [✔] Python

Reproduction instructions

  1. Run the Python script.
  2. Search results are different sometime when using CPU and GPU in the Python script, although the configuration parameters are the same including index and metric type.
import faiss
import numpy as np
import json
DATA_INT_MAX = 1000

numpy_random = np.random.default_rng(0)

dim = 374
M = 5619
metric = faiss.METRIC_BrayCurtis
index1 = faiss.IndexHNSWFlat(dim, M, metric)
index2 = faiss.IndexHNSWFlat(dim, M, metric)

insert_data = numpy_random.uniform(-DATA_INT_MAX, DATA_INT_MAX, (2357, dim))
index1.train(insert_data)
index1.add(insert_data)
index2.train(insert_data)
index2.add(insert_data)

query_vector = numpy_random.uniform(-DATA_INT_MAX, DATA_INT_MAX, (1, dim))
k = 9
D1, I1 = index1.search(query_vector, k)
print("CPU id:")
print(I1)
print("CPU distance:")
print(D1)

res = faiss.StandardGpuResources()
gpu_index = faiss.index_cpu_to_gpu(res, 0, index2)
D2, I2 = gpu_index.search(query_vector, k)
print("GPU id:")
print(I2)
print("GPU distance:")
print(D2)

When trying to run the script twice continuously, the first time result is different.

CPU id:
[[2161 1007  990  514  529  366 1274 1123 1080]]
CPU distance:
[[0.80810606 0.8117319  0.8200436  0.82289296 0.8239249  0.82859623
  0.8353435  0.8384627  0.84120756]]
GPU id:
[[2161 1007  990  529  366 1274 1123 1080 1505]]
GPU distance:
[[0.80810606 0.8117319  0.8200436  0.8239249  0.82859623 0.8353435
  0.8384627  0.84120756 0.8450721 ]]
CPU id:
[[2161 1007  990  514  529  366 1274 1123 1080]]
CPU distance:
[[0.80810606 0.8117319  0.8200436  0.82289296 0.8239249  0.82859623
  0.8353435  0.8384627  0.84120756]]
GPU id:
[[2161 1007  990  514  529  366 1274 1123 1080]]
GPU distance:
[[0.80810606 0.8117319  0.8200436  0.82289296 0.8239249  0.82859623
  0.8353435  0.8384627  0.84120756]]

HNSW is not implemented on GPU.