faiss 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +1 -1
  5. data/ext/faiss/extconf.rb +9 -2
  6. data/ext/faiss/index.cpp +1 -1
  7. data/ext/faiss/index_binary.cpp +2 -2
  8. data/ext/faiss/product_quantizer.cpp +1 -1
  9. data/lib/faiss/version.rb +1 -1
  10. data/vendor/faiss/faiss/AutoTune.cpp +7 -7
  11. data/vendor/faiss/faiss/AutoTune.h +0 -1
  12. data/vendor/faiss/faiss/Clustering.cpp +4 -18
  13. data/vendor/faiss/faiss/Clustering.h +31 -21
  14. data/vendor/faiss/faiss/IVFlib.cpp +22 -11
  15. data/vendor/faiss/faiss/Index.cpp +1 -1
  16. data/vendor/faiss/faiss/Index.h +20 -5
  17. data/vendor/faiss/faiss/Index2Layer.cpp +7 -7
  18. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +176 -166
  19. data/vendor/faiss/faiss/IndexAdditiveQuantizerFastScan.cpp +15 -15
  20. data/vendor/faiss/faiss/IndexBinary.cpp +9 -4
  21. data/vendor/faiss/faiss/IndexBinary.h +8 -19
  22. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +2 -1
  23. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +24 -31
  24. data/vendor/faiss/faiss/IndexBinaryHash.cpp +25 -50
  25. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +106 -187
  26. data/vendor/faiss/faiss/IndexFastScan.cpp +90 -159
  27. data/vendor/faiss/faiss/IndexFastScan.h +9 -8
  28. data/vendor/faiss/faiss/IndexFlat.cpp +195 -3
  29. data/vendor/faiss/faiss/IndexFlat.h +20 -1
  30. data/vendor/faiss/faiss/IndexFlatCodes.cpp +11 -0
  31. data/vendor/faiss/faiss/IndexFlatCodes.h +3 -1
  32. data/vendor/faiss/faiss/IndexHNSW.cpp +112 -316
  33. data/vendor/faiss/faiss/IndexHNSW.h +12 -48
  34. data/vendor/faiss/faiss/IndexIDMap.cpp +69 -28
  35. data/vendor/faiss/faiss/IndexIDMap.h +24 -2
  36. data/vendor/faiss/faiss/IndexIVF.cpp +159 -53
  37. data/vendor/faiss/faiss/IndexIVF.h +37 -5
  38. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +18 -26
  39. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +3 -2
  40. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.cpp +19 -46
  41. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizerFastScan.h +4 -3
  42. data/vendor/faiss/faiss/IndexIVFFastScan.cpp +433 -405
  43. data/vendor/faiss/faiss/IndexIVFFastScan.h +56 -26
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +15 -5
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +3 -2
  46. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.cpp +172 -0
  47. data/vendor/faiss/faiss/IndexIVFIndependentQuantizer.h +56 -0
  48. data/vendor/faiss/faiss/IndexIVFPQ.cpp +78 -122
  49. data/vendor/faiss/faiss/IndexIVFPQ.h +6 -7
  50. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +18 -50
  51. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +4 -3
  52. data/vendor/faiss/faiss/IndexIVFPQR.cpp +45 -29
  53. data/vendor/faiss/faiss/IndexIVFPQR.h +5 -2
  54. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +25 -27
  55. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +6 -6
  56. data/vendor/faiss/faiss/IndexLSH.cpp +14 -16
  57. data/vendor/faiss/faiss/IndexNNDescent.cpp +3 -4
  58. data/vendor/faiss/faiss/IndexNSG.cpp +11 -27
  59. data/vendor/faiss/faiss/IndexNSG.h +10 -10
  60. data/vendor/faiss/faiss/IndexPQ.cpp +72 -88
  61. data/vendor/faiss/faiss/IndexPQ.h +1 -4
  62. data/vendor/faiss/faiss/IndexPQFastScan.cpp +1 -1
  63. data/vendor/faiss/faiss/IndexPreTransform.cpp +25 -31
  64. data/vendor/faiss/faiss/IndexRefine.cpp +49 -19
  65. data/vendor/faiss/faiss/IndexRefine.h +7 -0
  66. data/vendor/faiss/faiss/IndexReplicas.cpp +23 -26
  67. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +22 -16
  68. data/vendor/faiss/faiss/IndexScalarQuantizer.h +6 -4
  69. data/vendor/faiss/faiss/IndexShards.cpp +21 -29
  70. data/vendor/faiss/faiss/IndexShardsIVF.cpp +1 -2
  71. data/vendor/faiss/faiss/MatrixStats.cpp +17 -32
  72. data/vendor/faiss/faiss/MatrixStats.h +21 -9
  73. data/vendor/faiss/faiss/MetaIndexes.cpp +35 -35
  74. data/vendor/faiss/faiss/VectorTransform.cpp +13 -26
  75. data/vendor/faiss/faiss/VectorTransform.h +7 -7
  76. data/vendor/faiss/faiss/clone_index.cpp +15 -10
  77. data/vendor/faiss/faiss/clone_index.h +3 -0
  78. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +87 -4
  79. data/vendor/faiss/faiss/gpu/GpuCloner.h +22 -0
  80. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +7 -0
  81. data/vendor/faiss/faiss/gpu/GpuDistance.h +46 -38
  82. data/vendor/faiss/faiss/gpu/GpuIndex.h +28 -4
  83. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +4 -4
  84. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +8 -9
  85. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +18 -3
  86. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +22 -11
  87. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +1 -3
  88. data/vendor/faiss/faiss/gpu/GpuResources.cpp +24 -3
  89. data/vendor/faiss/faiss/gpu/GpuResources.h +39 -11
  90. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +117 -17
  91. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +57 -3
  92. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +1 -1
  93. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +25 -0
  94. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +129 -9
  95. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +267 -40
  96. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +299 -208
  97. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +1 -0
  98. data/vendor/faiss/faiss/gpu/utils/RaftUtils.h +75 -0
  99. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +3 -1
  100. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +5 -5
  101. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +1 -1
  102. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +1 -2
  103. data/vendor/faiss/faiss/impl/DistanceComputer.h +24 -1
  104. data/vendor/faiss/faiss/impl/FaissException.h +13 -34
  105. data/vendor/faiss/faiss/impl/HNSW.cpp +321 -70
  106. data/vendor/faiss/faiss/impl/HNSW.h +9 -8
  107. data/vendor/faiss/faiss/impl/IDSelector.h +4 -4
  108. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +3 -1
  109. data/vendor/faiss/faiss/impl/NNDescent.cpp +29 -19
  110. data/vendor/faiss/faiss/impl/NSG.h +1 -1
  111. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +14 -12
  112. data/vendor/faiss/faiss/impl/ProductAdditiveQuantizer.h +1 -1
  113. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +24 -22
  114. data/vendor/faiss/faiss/impl/ProductQuantizer.h +1 -1
  115. data/vendor/faiss/faiss/impl/Quantizer.h +1 -1
  116. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +27 -1015
  117. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +5 -63
  118. data/vendor/faiss/faiss/impl/ResultHandler.h +232 -176
  119. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +444 -104
  120. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +0 -8
  121. data/vendor/faiss/faiss/impl/code_distance/code_distance-avx2.h +280 -42
  122. data/vendor/faiss/faiss/impl/code_distance/code_distance-generic.h +21 -14
  123. data/vendor/faiss/faiss/impl/code_distance/code_distance.h +22 -12
  124. data/vendor/faiss/faiss/impl/index_read.cpp +45 -19
  125. data/vendor/faiss/faiss/impl/index_write.cpp +60 -41
  126. data/vendor/faiss/faiss/impl/io.cpp +10 -10
  127. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +1 -1
  128. data/vendor/faiss/faiss/impl/platform_macros.h +18 -1
  129. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +3 -0
  130. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +7 -6
  131. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +52 -38
  132. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +40 -49
  133. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.cpp +960 -0
  134. data/vendor/faiss/faiss/impl/residual_quantizer_encode_steps.h +176 -0
  135. data/vendor/faiss/faiss/impl/simd_result_handlers.h +374 -202
  136. data/vendor/faiss/faiss/index_factory.cpp +10 -7
  137. data/vendor/faiss/faiss/invlists/DirectMap.cpp +1 -1
  138. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +27 -9
  139. data/vendor/faiss/faiss/invlists/InvertedLists.h +12 -3
  140. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +3 -3
  141. data/vendor/faiss/faiss/python/python_callbacks.cpp +1 -1
  142. data/vendor/faiss/faiss/utils/Heap.cpp +3 -1
  143. data/vendor/faiss/faiss/utils/WorkerThread.h +1 -0
  144. data/vendor/faiss/faiss/utils/distances.cpp +128 -74
  145. data/vendor/faiss/faiss/utils/distances.h +81 -4
  146. data/vendor/faiss/faiss/utils/distances_fused/avx512.cpp +5 -5
  147. data/vendor/faiss/faiss/utils/distances_fused/avx512.h +2 -2
  148. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.cpp +2 -2
  149. data/vendor/faiss/faiss/utils/distances_fused/distances_fused.h +1 -1
  150. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.cpp +5 -5
  151. data/vendor/faiss/faiss/utils/distances_fused/simdlib_based.h +1 -1
  152. data/vendor/faiss/faiss/utils/distances_simd.cpp +428 -70
  153. data/vendor/faiss/faiss/utils/fp16-arm.h +29 -0
  154. data/vendor/faiss/faiss/utils/fp16.h +2 -0
  155. data/vendor/faiss/faiss/utils/hamming.cpp +162 -110
  156. data/vendor/faiss/faiss/utils/hamming.h +58 -0
  157. data/vendor/faiss/faiss/utils/hamming_distance/avx2-inl.h +16 -89
  158. data/vendor/faiss/faiss/utils/hamming_distance/common.h +1 -0
  159. data/vendor/faiss/faiss/utils/hamming_distance/generic-inl.h +15 -87
  160. data/vendor/faiss/faiss/utils/hamming_distance/hamdis-inl.h +57 -0
  161. data/vendor/faiss/faiss/utils/hamming_distance/neon-inl.h +14 -104
  162. data/vendor/faiss/faiss/utils/partitioning.cpp +3 -4
  163. data/vendor/faiss/faiss/utils/prefetch.h +77 -0
  164. data/vendor/faiss/faiss/utils/quantize_lut.cpp +0 -14
  165. data/vendor/faiss/faiss/utils/simdlib_avx2.h +0 -6
  166. data/vendor/faiss/faiss/utils/simdlib_neon.h +72 -77
  167. data/vendor/faiss/faiss/utils/sorting.cpp +140 -5
  168. data/vendor/faiss/faiss/utils/sorting.h +27 -0
  169. data/vendor/faiss/faiss/utils/utils.cpp +112 -6
  170. data/vendor/faiss/faiss/utils/utils.h +57 -20
  171. metadata +10 -3
@@ -35,6 +35,22 @@ void pickEncoding(int& codes, int& dim) {
35
35
  }
36
36
  }
37
37
 
38
+ void pickRaftEncoding(int& codes, int& dim, int bitsPerCode) {
39
+ // Above 32 doesn't work with no precomputed codes
40
+ std::vector<int> dimSizes{4, 8, 10, 12, 16, 20, 24, 28, 32};
41
+
42
+ while (true) {
43
+ codes = faiss::gpu::randVal(0, 96);
44
+ dim = codes * dimSizes[faiss::gpu::randVal(0, dimSizes.size() - 1)];
45
+
46
+ // for such a small test, super-low or high dim is more likely to
47
+ // generate comparison errors
48
+ if (dim < 256 && dim >= 64 && (codes * bitsPerCode) % 8 == 0) {
49
+ return;
50
+ }
51
+ }
52
+ }
53
+
38
54
  struct Options {
39
55
  Options() {
40
56
  numAdd = faiss::gpu::randVal(2000, 5000);
@@ -43,9 +59,10 @@ struct Options {
43
59
 
44
60
  pickEncoding(codes, dim);
45
61
 
46
- // TODO: Change back to `faiss::gpu::randVal(3, 7)` when we officially
47
- // support non-multiple of 8 subcodes for IVFPQ.
62
+ // TODO: Change back to `faiss::gpu::randVal(3, 7)` when we
63
+ // officially support non-multiple of 8 subcodes for IVFPQ.
48
64
  bitsPerCode = 8;
65
+
49
66
  nprobe = std::min(faiss::gpu::randVal(40, 1000), numCentroids);
50
67
  numQuery = faiss::gpu::randVal(4, 8);
51
68
 
@@ -66,6 +83,9 @@ struct Options {
66
83
  }
67
84
 
68
85
  device = faiss::gpu::randVal(0, faiss::gpu::getNumDevices() - 1);
86
+
87
+ interleavedLayout = false;
88
+ useRaft = false;
69
89
  }
70
90
 
71
91
  std::string toString() const {
@@ -105,50 +125,66 @@ struct Options {
105
125
  faiss::gpu::IndicesOptions indicesOpt;
106
126
  bool useFloat16;
107
127
  int device;
128
+ bool interleavedLayout;
129
+ bool useRaft;
108
130
  };
109
131
 
110
- TEST(TestGpuIndexIVFPQ, Query_L2) {
111
- for (int tries = 0; tries < 2; ++tries) {
112
- Options opt;
132
+ void queryTest(Options opt, faiss::MetricType metricType) {
133
+ std::vector<float> trainVecs = faiss::gpu::randVecs(opt.numTrain, opt.dim);
134
+ std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
113
135
 
114
- std::vector<float> trainVecs =
115
- faiss::gpu::randVecs(opt.numTrain, opt.dim);
116
- std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
136
+ faiss::IndexFlatL2 coarseQuantizerL2(opt.dim);
137
+ faiss::IndexFlatIP coarseQuantizerIP(opt.dim);
138
+ faiss::Index* quantizer = metricType == faiss::METRIC_L2
139
+ ? (faiss::Index*)&coarseQuantizerL2
140
+ : (faiss::Index*)&coarseQuantizerIP;
117
141
 
118
- faiss::IndexFlatL2 coarseQuantizer(opt.dim);
119
- faiss::IndexIVFPQ cpuIndex(
120
- &coarseQuantizer,
121
- opt.dim,
122
- opt.numCentroids,
123
- opt.codes,
124
- opt.bitsPerCode);
125
- cpuIndex.nprobe = opt.nprobe;
126
- cpuIndex.train(opt.numTrain, trainVecs.data());
127
- cpuIndex.add(opt.numAdd, addVecs.data());
142
+ faiss::IndexIVFPQ cpuIndex(
143
+ quantizer, opt.dim, opt.numCentroids, opt.codes, opt.bitsPerCode);
144
+ cpuIndex.metric_type = metricType;
145
+ cpuIndex.nprobe = opt.nprobe;
146
+ cpuIndex.train(opt.numTrain, trainVecs.data());
147
+ cpuIndex.add(opt.numAdd, addVecs.data());
128
148
 
129
- // Use the default temporary memory management to test the memory
130
- // manager
131
- faiss::gpu::StandardGpuResources res;
149
+ // Use the default temporary memory management to test the memory
150
+ // manager
151
+ faiss::gpu::StandardGpuResources res;
132
152
 
133
- faiss::gpu::GpuIndexIVFPQConfig config;
134
- config.device = opt.device;
135
- config.usePrecomputedTables = (tries % 2 == 0);
136
- config.indicesOptions = opt.indicesOpt;
137
- config.useFloat16LookupTables = opt.useFloat16;
153
+ faiss::gpu::GpuIndexIVFPQConfig config;
154
+ config.device = opt.device;
155
+ config.usePrecomputedTables = opt.usePrecomputed;
156
+ config.indicesOptions = opt.indicesOpt;
157
+ config.useFloat16LookupTables = opt.useFloat16;
158
+ config.interleavedLayout = opt.interleavedLayout;
159
+ config.use_raft = opt.useRaft;
138
160
 
139
- faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
140
- gpuIndex.nprobe = opt.nprobe;
161
+ faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
162
+ gpuIndex.nprobe = opt.nprobe;
141
163
 
142
- faiss::gpu::compareIndices(
143
- cpuIndex,
144
- gpuIndex,
145
- opt.numQuery,
146
- opt.dim,
147
- opt.k,
148
- opt.toString(),
149
- opt.getCompareEpsilon(),
150
- opt.getPctMaxDiff1(),
151
- opt.getPctMaxDiffN());
164
+ faiss::gpu::compareIndices(
165
+ cpuIndex,
166
+ gpuIndex,
167
+ opt.numQuery,
168
+ opt.dim,
169
+ opt.k,
170
+ opt.toString(),
171
+ opt.getCompareEpsilon(),
172
+ opt.getPctMaxDiff1(),
173
+ opt.getPctMaxDiffN());
174
+ }
175
+
176
+ TEST(TestGpuIndexIVFPQ, Query_L2) {
177
+ for (int tries = 0; tries < 2; ++tries) {
178
+ Options opt;
179
+ opt.usePrecomputed = (tries % 2 == 0);
180
+ queryTest(opt, faiss::MetricType::METRIC_L2);
181
+ }
182
+ }
183
+
184
+ TEST(TestGpuIndexIVFPQ, Query_IP) {
185
+ for (int tries = 0; tries < 2; ++tries) {
186
+ Options opt;
187
+ queryTest(opt, faiss::MetricType::METRIC_INNER_PRODUCT);
152
188
  }
153
189
  }
154
190
 
@@ -161,45 +197,10 @@ TEST(TestGpuIndexIVFPQ, LargeBatch) {
161
197
  opt.dim = 4;
162
198
  opt.numQuery = 100000;
163
199
  opt.codes = 2;
200
+ opt.usePrecomputed = usePrecomputed;
201
+ opt.useFloat16 = false;
164
202
 
165
- std::vector<float> trainVecs =
166
- faiss::gpu::randVecs(opt.numTrain, opt.dim);
167
- std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
168
-
169
- faiss::IndexFlatL2 coarseQuantizer(opt.dim);
170
- faiss::IndexIVFPQ cpuIndex(
171
- &coarseQuantizer,
172
- opt.dim,
173
- opt.numCentroids,
174
- opt.codes,
175
- opt.bitsPerCode);
176
- cpuIndex.nprobe = opt.nprobe;
177
- cpuIndex.train(opt.numTrain, trainVecs.data());
178
- cpuIndex.add(opt.numAdd, addVecs.data());
179
-
180
- // Use the default temporary memory management to test the memory
181
- // manager
182
- faiss::gpu::StandardGpuResources res;
183
-
184
- faiss::gpu::GpuIndexIVFPQConfig config;
185
- config.device = opt.device;
186
- config.usePrecomputedTables = usePrecomputed;
187
- config.indicesOptions = opt.indicesOpt;
188
- config.useFloat16LookupTables = false;
189
-
190
- faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
191
- gpuIndex.nprobe = opt.nprobe;
192
-
193
- faiss::gpu::compareIndices(
194
- cpuIndex,
195
- gpuIndex,
196
- opt.numQuery,
197
- opt.dim,
198
- opt.k,
199
- opt.toString(),
200
- opt.getCompareEpsilon(),
201
- opt.getPctMaxDiff1(),
202
- opt.getPctMaxDiffN());
203
+ queryTest(opt, faiss::MetricType::METRIC_L2);
203
204
  }
204
205
  }
205
206
 
@@ -234,6 +235,7 @@ void testMMCodeDistance(faiss::MetricType mt) {
234
235
  config.usePrecomputedTables = false;
235
236
  config.useMMCodeDistance = true;
236
237
  config.indicesOptions = opt.indicesOpt;
238
+ config.use_raft = false;
237
239
 
238
240
  // Make sure that the float16 version works as well
239
241
  config.useFloat16LookupTables = (tries % 2 == 0);
@@ -284,6 +286,7 @@ void testMMCodeDistance(faiss::MetricType mt) {
284
286
  config.device = opt.device;
285
287
  config.usePrecomputedTables = false;
286
288
  config.indicesOptions = opt.indicesOpt;
289
+ config.use_raft = false;
287
290
 
288
291
  // Make sure that the float16 version works as well
289
292
  config.useFloat16LookupTables = (dimPerSubQ == 7);
@@ -312,53 +315,6 @@ TEST(TestGpuIndexIVFPQ, Query_IP_MMCodeDistance) {
312
315
  testMMCodeDistance(faiss::MetricType::METRIC_INNER_PRODUCT);
313
316
  }
314
317
 
315
- TEST(TestGpuIndexIVFPQ, Query_IP) {
316
- for (int tries = 0; tries < 2; ++tries) {
317
- Options opt;
318
-
319
- std::vector<float> trainVecs =
320
- faiss::gpu::randVecs(opt.numTrain, opt.dim);
321
- std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
322
-
323
- faiss::IndexFlatIP coarseQuantizer(opt.dim);
324
- faiss::IndexIVFPQ cpuIndex(
325
- &coarseQuantizer,
326
- opt.dim,
327
- opt.numCentroids,
328
- opt.codes,
329
- opt.bitsPerCode);
330
- cpuIndex.metric_type = faiss::MetricType::METRIC_INNER_PRODUCT;
331
-
332
- cpuIndex.nprobe = opt.nprobe;
333
- cpuIndex.train(opt.numTrain, trainVecs.data());
334
- cpuIndex.add(opt.numAdd, addVecs.data());
335
-
336
- // Use the default temporary memory management to test the memory
337
- // manager
338
- faiss::gpu::StandardGpuResources res;
339
-
340
- faiss::gpu::GpuIndexIVFPQConfig config;
341
- config.device = opt.device;
342
- config.usePrecomputedTables = false; // not supported/required for IP
343
- config.indicesOptions = opt.indicesOpt;
344
- config.useFloat16LookupTables = opt.useFloat16;
345
-
346
- faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
347
- gpuIndex.nprobe = opt.nprobe;
348
-
349
- faiss::gpu::compareIndices(
350
- cpuIndex,
351
- gpuIndex,
352
- opt.numQuery,
353
- opt.dim,
354
- opt.k,
355
- opt.toString(),
356
- opt.getCompareEpsilon(),
357
- opt.getPctMaxDiff1(),
358
- opt.getPctMaxDiffN());
359
- }
360
- }
361
-
362
318
  TEST(TestGpuIndexIVFPQ, Float16Coarse) {
363
319
  Options opt;
364
320
 
@@ -384,6 +340,7 @@ TEST(TestGpuIndexIVFPQ, Float16Coarse) {
384
340
  config.usePrecomputedTables = opt.usePrecomputed;
385
341
  config.indicesOptions = opt.indicesOpt;
386
342
  config.useFloat16LookupTables = opt.useFloat16;
343
+ config.use_raft = false;
387
344
 
388
345
  faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
389
346
  gpuIndex.nprobe = opt.nprobe;
@@ -403,104 +360,68 @@ TEST(TestGpuIndexIVFPQ, Float16Coarse) {
403
360
  opt.getPctMaxDiffN());
404
361
  }
405
362
 
406
- TEST(TestGpuIndexIVFPQ, Add_L2) {
407
- for (int tries = 0; tries < 2; ++tries) {
408
- Options opt;
363
+ void addTest(Options opt, faiss::MetricType metricType) {
364
+ std::vector<float> trainVecs = faiss::gpu::randVecs(opt.numTrain, opt.dim);
365
+ std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
409
366
 
410
- std::vector<float> trainVecs =
411
- faiss::gpu::randVecs(opt.numTrain, opt.dim);
412
- std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
367
+ faiss::IndexFlatL2 coarseQuantizerL2(opt.dim);
368
+ faiss::IndexFlatIP coarseQuantizerIP(opt.dim);
369
+ faiss::Index* quantizer = metricType == faiss::METRIC_L2
370
+ ? (faiss::Index*)&coarseQuantizerL2
371
+ : (faiss::Index*)&coarseQuantizerIP;
413
372
 
414
- faiss::IndexFlatL2 coarseQuantizer(opt.dim);
415
- faiss::IndexIVFPQ cpuIndex(
416
- &coarseQuantizer,
417
- opt.dim,
418
- opt.numCentroids,
419
- opt.codes,
420
- opt.bitsPerCode);
421
- cpuIndex.nprobe = opt.nprobe;
422
- cpuIndex.train(opt.numTrain, trainVecs.data());
373
+ faiss::IndexIVFPQ cpuIndex(
374
+ quantizer, opt.dim, opt.numCentroids, opt.codes, opt.bitsPerCode);
375
+ cpuIndex.nprobe = opt.nprobe;
376
+ cpuIndex.metric_type = metricType;
377
+ cpuIndex.train(opt.numTrain, trainVecs.data());
423
378
 
424
- // Use the default temporary memory management to test the memory
425
- // manager
426
- faiss::gpu::StandardGpuResources res;
379
+ // Use the default temporary memory management to test the memory
380
+ // manager
381
+ faiss::gpu::StandardGpuResources res;
427
382
 
428
- faiss::gpu::GpuIndexIVFPQConfig config;
429
- config.device = opt.device;
430
- config.usePrecomputedTables = opt.usePrecomputed;
431
- config.indicesOptions = opt.indicesOpt;
432
- config.useFloat16LookupTables = opt.useFloat16;
383
+ faiss::gpu::GpuIndexIVFPQConfig config;
384
+ config.device = opt.device;
385
+ config.usePrecomputedTables = opt.usePrecomputed;
386
+ config.indicesOptions = opt.indicesOpt;
387
+ config.useFloat16LookupTables = opt.useFloat16;
388
+ config.interleavedLayout = opt.interleavedLayout;
389
+ config.use_raft = opt.useRaft;
433
390
 
434
- faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
435
- gpuIndex.nprobe = opt.nprobe;
391
+ faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
392
+ gpuIndex.nprobe = opt.nprobe;
436
393
 
437
- gpuIndex.add(opt.numAdd, addVecs.data());
438
- cpuIndex.add(opt.numAdd, addVecs.data());
394
+ gpuIndex.add(opt.numAdd, addVecs.data());
395
+ cpuIndex.add(opt.numAdd, addVecs.data());
439
396
 
440
- faiss::gpu::compareIndices(
441
- cpuIndex,
442
- gpuIndex,
443
- opt.numQuery,
444
- opt.dim,
445
- opt.k,
446
- opt.toString(),
447
- opt.getCompareEpsilon(),
448
- opt.getPctMaxDiff1(),
449
- opt.getPctMaxDiffN());
397
+ faiss::gpu::compareIndices(
398
+ cpuIndex,
399
+ gpuIndex,
400
+ opt.numQuery,
401
+ opt.dim,
402
+ opt.k,
403
+ opt.toString(),
404
+ opt.getCompareEpsilon(),
405
+ opt.getPctMaxDiff1(),
406
+ opt.getPctMaxDiffN());
407
+ }
408
+
409
+ TEST(TestGpuIndexIVFPQ, Add_L2) {
410
+ for (int tries = 0; tries < 2; ++tries) {
411
+ Options opt;
412
+ addTest(opt, faiss::METRIC_L2);
450
413
  }
451
414
  }
452
415
 
453
416
  TEST(TestGpuIndexIVFPQ, Add_IP) {
454
417
  for (int tries = 0; tries < 2; ++tries) {
455
418
  Options opt;
456
-
457
- std::vector<float> trainVecs =
458
- faiss::gpu::randVecs(opt.numTrain, opt.dim);
459
- std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
460
-
461
- faiss::IndexFlatIP coarseQuantizer(opt.dim);
462
- faiss::IndexIVFPQ cpuIndex(
463
- &coarseQuantizer,
464
- opt.dim,
465
- opt.numCentroids,
466
- opt.codes,
467
- opt.bitsPerCode);
468
- cpuIndex.metric_type = faiss::MetricType::METRIC_INNER_PRODUCT;
469
- cpuIndex.nprobe = opt.nprobe;
470
- cpuIndex.train(opt.numTrain, trainVecs.data());
471
-
472
- // Use the default temporary memory management to test the memory
473
- // manager
474
- faiss::gpu::StandardGpuResources res;
475
-
476
- faiss::gpu::GpuIndexIVFPQConfig config;
477
- config.device = opt.device;
478
- config.usePrecomputedTables = opt.usePrecomputed;
479
- config.indicesOptions = opt.indicesOpt;
480
- config.useFloat16LookupTables = opt.useFloat16;
481
-
482
- faiss::gpu::GpuIndexIVFPQ gpuIndex(&res, &cpuIndex, config);
483
- gpuIndex.nprobe = opt.nprobe;
484
-
485
- gpuIndex.add(opt.numAdd, addVecs.data());
486
- cpuIndex.add(opt.numAdd, addVecs.data());
487
-
488
- faiss::gpu::compareIndices(
489
- cpuIndex,
490
- gpuIndex,
491
- opt.numQuery,
492
- opt.dim,
493
- opt.k,
494
- opt.toString(),
495
- opt.getCompareEpsilon(),
496
- opt.getPctMaxDiff1(),
497
- opt.getPctMaxDiffN());
419
+ addTest(opt, faiss::METRIC_INNER_PRODUCT);
498
420
  }
499
421
  }
500
422
 
501
- TEST(TestGpuIndexIVFPQ, CopyTo) {
423
+ void copyToTest(Options opt) {
502
424
  for (int tries = 0; tries < 2; ++tries) {
503
- Options opt;
504
425
  std::vector<float> trainVecs =
505
426
  faiss::gpu::randVecs(opt.numTrain, opt.dim);
506
427
  std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
@@ -511,9 +432,11 @@ TEST(TestGpuIndexIVFPQ, CopyTo) {
511
432
 
512
433
  faiss::gpu::GpuIndexIVFPQConfig config;
513
434
  config.device = opt.device;
514
- config.usePrecomputedTables = (tries % 2 == 0);
435
+ config.usePrecomputedTables = false;
515
436
  config.indicesOptions = opt.indicesOpt;
516
437
  config.useFloat16LookupTables = opt.useFloat16;
438
+ config.interleavedLayout = opt.interleavedLayout;
439
+ config.use_raft = opt.useRaft;
517
440
 
518
441
  faiss::gpu::GpuIndexIVFPQ gpuIndex(
519
442
  &res,
@@ -561,8 +484,12 @@ TEST(TestGpuIndexIVFPQ, CopyTo) {
561
484
  }
562
485
  }
563
486
 
564
- TEST(TestGpuIndexIVFPQ, CopyFrom) {
487
+ TEST(TestGpuIndexIVFPQ, CopyTo) {
565
488
  Options opt;
489
+ copyToTest(opt);
490
+ }
491
+
492
+ void copyFromTest(Options opt) {
566
493
  std::vector<float> trainVecs = faiss::gpu::randVecs(opt.numTrain, opt.dim);
567
494
  std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
568
495
 
@@ -585,6 +512,8 @@ TEST(TestGpuIndexIVFPQ, CopyFrom) {
585
512
  config.usePrecomputedTables = opt.usePrecomputed;
586
513
  config.indicesOptions = opt.indicesOpt;
587
514
  config.useFloat16LookupTables = opt.useFloat16;
515
+ config.interleavedLayout = opt.interleavedLayout;
516
+ config.use_raft = opt.useRaft;
588
517
 
589
518
  // Use garbage values to see if we overwrite them
590
519
  faiss::gpu::GpuIndexIVFPQ gpuIndex(
@@ -621,9 +550,12 @@ TEST(TestGpuIndexIVFPQ, CopyFrom) {
621
550
  opt.getPctMaxDiffN());
622
551
  }
623
552
 
624
- TEST(TestGpuIndexIVFPQ, QueryNaN) {
553
+ TEST(TestGpuIndexIVFPQ, CopyFrom) {
625
554
  Options opt;
555
+ copyFromTest(opt);
556
+ }
626
557
 
558
+ void queryNaNTest(Options opt) {
627
559
  std::vector<float> trainVecs = faiss::gpu::randVecs(opt.numTrain, opt.dim);
628
560
  std::vector<float> addVecs = faiss::gpu::randVecs(opt.numAdd, opt.dim);
629
561
 
@@ -635,6 +567,8 @@ TEST(TestGpuIndexIVFPQ, QueryNaN) {
635
567
  config.usePrecomputedTables = opt.usePrecomputed;
636
568
  config.indicesOptions = opt.indicesOpt;
637
569
  config.useFloat16LookupTables = opt.useFloat16;
570
+ config.use_raft = opt.useRaft;
571
+ config.interleavedLayout = opt.useRaft ? true : opt.interleavedLayout;
638
572
 
639
573
  faiss::gpu::GpuIndexIVFPQ gpuIndex(
640
574
  &res,
@@ -670,9 +604,13 @@ TEST(TestGpuIndexIVFPQ, QueryNaN) {
670
604
  }
671
605
  }
672
606
 
673
- TEST(TestGpuIndexIVFPQ, AddNaN) {
607
+ TEST(TestGpuIndexIVFPQ, QueryNaN) {
674
608
  Options opt;
609
+ opt.useRaft = false;
610
+ queryNaNTest(opt);
611
+ }
675
612
 
613
+ void addNaNTest(Options opt) {
676
614
  // Use the default temporary memory management to test the memory manager
677
615
  faiss::gpu::StandardGpuResources res;
678
616
 
@@ -681,6 +619,8 @@ TEST(TestGpuIndexIVFPQ, AddNaN) {
681
619
  config.usePrecomputedTables = opt.usePrecomputed;
682
620
  config.indicesOptions = opt.indicesOpt;
683
621
  config.useFloat16LookupTables = opt.useFloat16;
622
+ config.interleavedLayout = opt.interleavedLayout;
623
+ config.use_raft = opt.useRaft;
684
624
 
685
625
  faiss::gpu::GpuIndexIVFPQ gpuIndex(
686
626
  &res,
@@ -722,6 +662,128 @@ TEST(TestGpuIndexIVFPQ, AddNaN) {
722
662
  indices.data());
723
663
  }
724
664
 
665
+ TEST(TestGpuIndexIVFPQ, AddNaN) {
666
+ Options opt;
667
+ opt.useRaft = false;
668
+ addNaNTest(opt);
669
+ }
670
+
671
+ #if defined USE_NVIDIA_RAFT
672
+ TEST(TestGpuIndexIVFPQ, Query_L2_Raft) {
673
+ for (int tries = 0; tries < 2; ++tries) {
674
+ Options opt;
675
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
676
+ opt.useRaft = true;
677
+ opt.interleavedLayout = true;
678
+ opt.usePrecomputed = false;
679
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
680
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
681
+ queryTest(opt, faiss::MetricType::METRIC_L2);
682
+ }
683
+ }
684
+
685
+ TEST(TestGpuIndexIVFPQ, Query_IP_Raft) {
686
+ for (int tries = 0; tries < 2; ++tries) {
687
+ Options opt;
688
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
689
+ opt.useRaft = true;
690
+ opt.interleavedLayout = true;
691
+ opt.usePrecomputed = false;
692
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
693
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
694
+ queryTest(opt, faiss::MetricType::METRIC_INNER_PRODUCT);
695
+ }
696
+ }
697
+
698
+ // Large batch sizes (>= 65536) should also work
699
+ TEST(TestGpuIndexIVFPQ, LargeBatch_Raft) {
700
+ Options opt;
701
+
702
+ // override for large sizes
703
+ opt.dim = 4;
704
+ opt.numQuery = 100000;
705
+ opt.codes = 2;
706
+ opt.useRaft = true;
707
+ opt.interleavedLayout = true;
708
+ opt.usePrecomputed = false;
709
+ opt.useFloat16 = false;
710
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
711
+ opt.bitsPerCode = 8;
712
+
713
+ queryTest(opt, faiss::MetricType::METRIC_L2);
714
+ }
715
+
716
+ TEST(TestGpuIndexIVFPQ, CopyFrom_Raft) {
717
+ Options opt;
718
+ opt.useRaft = true;
719
+ opt.interleavedLayout = true;
720
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
721
+ opt.usePrecomputed = false;
722
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
723
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
724
+ copyFromTest(opt);
725
+ }
726
+
727
+ TEST(TestGpuIndexIVFPQ, Add_L2_Raft) {
728
+ for (int tries = 0; tries < 2; ++tries) {
729
+ Options opt;
730
+ opt.useRaft = true;
731
+ opt.interleavedLayout = true;
732
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
733
+ opt.usePrecomputed = false;
734
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
735
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
736
+ addTest(opt, faiss::METRIC_L2);
737
+ }
738
+ }
739
+
740
+ TEST(TestGpuIndexIVFPQ, Add_IP_Raft) {
741
+ for (int tries = 0; tries < 2; ++tries) {
742
+ Options opt;
743
+ opt.useRaft = true;
744
+ opt.interleavedLayout = true;
745
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
746
+ opt.usePrecomputed = false;
747
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
748
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
749
+ addTest(opt, faiss::METRIC_INNER_PRODUCT);
750
+ }
751
+ }
752
+
753
+ TEST(TestGpuIndexIVFPQ, QueryNaN_Raft) {
754
+ Options opt;
755
+ opt.useRaft = true;
756
+ opt.interleavedLayout = true;
757
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
758
+ opt.usePrecomputed = false;
759
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
760
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
761
+ queryNaNTest(opt);
762
+ }
763
+
764
+ TEST(TestGpuIndexIVFPQ, AddNaN_Raft) {
765
+ Options opt;
766
+ opt.useRaft = true;
767
+ opt.interleavedLayout = true;
768
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
769
+ opt.usePrecomputed = false;
770
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
771
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
772
+ addNaNTest(opt);
773
+ }
774
+
775
+ TEST(TestGpuIndexIVFPQ, CopyTo_Raft) {
776
+ Options opt;
777
+ opt.useRaft = true;
778
+ opt.interleavedLayout = true;
779
+ opt.bitsPerCode = faiss::gpu::randVal(4, 8);
780
+ opt.usePrecomputed = false;
781
+ opt.indicesOpt = faiss::gpu::INDICES_64_BIT;
782
+ pickRaftEncoding(opt.codes, opt.dim, opt.bitsPerCode);
783
+ copyToTest(opt);
784
+ }
785
+ #endif
786
+
725
787
  TEST(TestGpuIndexIVFPQ, UnifiedMemory) {
726
788
  // Construct on a random device to test multi-device, if we have
727
789
  // multiple devices
@@ -762,6 +824,7 @@ TEST(TestGpuIndexIVFPQ, UnifiedMemory) {
762
824
  faiss::gpu::GpuIndexIVFPQConfig config;
763
825
  config.device = device;
764
826
  config.memorySpace = faiss::gpu::MemorySpace::Unified;
827
+ config.use_raft = false;
765
828
 
766
829
  faiss::gpu::GpuIndexIVFPQ gpuIndex(
767
830
  &res,
@@ -784,6 +847,34 @@ TEST(TestGpuIndexIVFPQ, UnifiedMemory) {
784
847
  0.015f,
785
848
  0.1f,
786
849
  0.015f);
850
+
851
+ #if defined USE_NVIDIA_RAFT
852
+ config.interleavedLayout = true;
853
+ config.use_raft = true;
854
+ config.indicesOptions = faiss::gpu::INDICES_64_BIT;
855
+
856
+ faiss::gpu::GpuIndexIVFPQ raftGpuIndex(
857
+ &res,
858
+ dim,
859
+ numCentroids,
860
+ codes,
861
+ bitsPerCode,
862
+ faiss::METRIC_L2,
863
+ config);
864
+ raftGpuIndex.copyFrom(&cpuIndex);
865
+ raftGpuIndex.nprobe = nprobe;
866
+
867
+ faiss::gpu::compareIndices(
868
+ cpuIndex,
869
+ raftGpuIndex,
870
+ numQuery,
871
+ dim,
872
+ k,
873
+ "Unified Memory",
874
+ 0.015f,
875
+ 0.1f,
876
+ 0.015f);
877
+ #endif
787
878
  }
788
879
 
789
880
  int main(int argc, char** argv) {
@@ -31,6 +31,7 @@ TEST(TestGpuMemoryException, AddException) {
31
31
 
32
32
  faiss::gpu::GpuIndexFlatConfig config;
33
33
  config.device = faiss::gpu::randVal(0, faiss::gpu::getNumDevices() - 1);
34
+ config.use_raft = false;
34
35
 
35
36
  faiss::gpu::GpuIndexFlatL2 gpuIndexL2Broken(
36
37
  &res, (int)brokenAddDims, config);