faiss 0.1.7 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +7 -7
  4. data/ext/faiss/ext.cpp +1 -1
  5. data/ext/faiss/extconf.rb +8 -2
  6. data/ext/faiss/index.cpp +102 -69
  7. data/ext/faiss/index_binary.cpp +24 -30
  8. data/ext/faiss/kmeans.cpp +20 -16
  9. data/ext/faiss/numo.hpp +867 -0
  10. data/ext/faiss/pca_matrix.cpp +13 -14
  11. data/ext/faiss/product_quantizer.cpp +23 -24
  12. data/ext/faiss/utils.cpp +10 -37
  13. data/ext/faiss/utils.h +2 -13
  14. data/lib/faiss/version.rb +1 -1
  15. data/lib/faiss.rb +0 -5
  16. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  17. data/vendor/faiss/faiss/AutoTune.h +55 -56
  18. data/vendor/faiss/faiss/Clustering.cpp +334 -195
  19. data/vendor/faiss/faiss/Clustering.h +88 -35
  20. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  21. data/vendor/faiss/faiss/IVFlib.h +48 -51
  22. data/vendor/faiss/faiss/Index.cpp +85 -103
  23. data/vendor/faiss/faiss/Index.h +54 -48
  24. data/vendor/faiss/faiss/Index2Layer.cpp +139 -164
  25. data/vendor/faiss/faiss/Index2Layer.h +22 -22
  26. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  27. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  28. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  29. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  30. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  31. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  32. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  33. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  34. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  35. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  36. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  37. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  38. data/vendor/faiss/faiss/IndexFlat.cpp +116 -147
  39. data/vendor/faiss/faiss/IndexFlat.h +35 -46
  40. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  41. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  42. data/vendor/faiss/faiss/IndexIVF.cpp +474 -454
  43. data/vendor/faiss/faiss/IndexIVF.h +146 -113
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +248 -250
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +457 -516
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +74 -66
  48. data/vendor/faiss/faiss/IndexIVFPQFastScan.cpp +406 -372
  49. data/vendor/faiss/faiss/IndexIVFPQFastScan.h +82 -57
  50. data/vendor/faiss/faiss/IndexIVFPQR.cpp +104 -102
  51. data/vendor/faiss/faiss/IndexIVFPQR.h +33 -28
  52. data/vendor/faiss/faiss/IndexIVFSpectralHash.cpp +125 -133
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +19 -21
  54. data/vendor/faiss/faiss/IndexLSH.cpp +75 -96
  55. data/vendor/faiss/faiss/IndexLSH.h +21 -26
  56. data/vendor/faiss/faiss/IndexLattice.cpp +42 -56
  57. data/vendor/faiss/faiss/IndexLattice.h +11 -16
  58. data/vendor/faiss/faiss/IndexNNDescent.cpp +231 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +303 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +405 -464
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -67
  64. data/vendor/faiss/faiss/IndexPQFastScan.cpp +143 -170
  65. data/vendor/faiss/faiss/IndexPQFastScan.h +46 -32
  66. data/vendor/faiss/faiss/IndexPreTransform.cpp +120 -150
  67. data/vendor/faiss/faiss/IndexPreTransform.h +33 -36
  68. data/vendor/faiss/faiss/IndexRefine.cpp +115 -131
  69. data/vendor/faiss/faiss/IndexRefine.h +22 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexResidual.cpp +291 -0
  73. data/vendor/faiss/faiss/IndexResidual.h +152 -0
  74. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +120 -155
  75. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -45
  76. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  77. data/vendor/faiss/faiss/IndexShards.h +85 -73
  78. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  79. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  80. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  81. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  82. data/vendor/faiss/faiss/MetricType.h +7 -7
  83. data/vendor/faiss/faiss/VectorTransform.cpp +652 -474
  84. data/vendor/faiss/faiss/VectorTransform.h +61 -89
  85. data/vendor/faiss/faiss/clone_index.cpp +77 -73
  86. data/vendor/faiss/faiss/clone_index.h +4 -9
  87. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  88. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  89. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +197 -170
  90. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  91. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  92. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  93. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  94. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  95. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  96. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  97. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  101. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  102. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  103. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  104. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  106. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  108. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  110. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  112. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  113. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  114. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  115. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  116. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  121. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  122. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  124. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  125. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  126. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  128. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  129. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  130. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  131. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +270 -0
  133. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +115 -0
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  135. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  136. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  137. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  138. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  139. data/vendor/faiss/faiss/impl/HNSW.cpp +595 -611
  140. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +672 -0
  142. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +172 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  144. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  145. data/vendor/faiss/faiss/impl/NSG.cpp +682 -0
  146. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  148. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  149. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  151. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +448 -0
  153. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +130 -0
  154. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +648 -701
  156. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  157. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  158. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  159. data/vendor/faiss/faiss/impl/index_read.cpp +547 -479
  160. data/vendor/faiss/faiss/impl/index_write.cpp +497 -407
  161. data/vendor/faiss/faiss/impl/io.cpp +75 -94
  162. data/vendor/faiss/faiss/impl/io.h +31 -41
  163. data/vendor/faiss/faiss/impl/io_macros.h +40 -29
  164. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  165. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  166. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  167. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  171. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  172. data/vendor/faiss/faiss/index_factory.cpp +269 -218
  173. data/vendor/faiss/faiss/index_factory.h +6 -7
  174. data/vendor/faiss/faiss/index_io.h +23 -26
  175. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  177. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  178. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  179. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  180. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  181. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  183. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  185. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  186. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  187. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  188. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  189. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  190. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  191. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  192. data/vendor/faiss/faiss/utils/distances.cpp +301 -310
  193. data/vendor/faiss/faiss/utils/distances.h +133 -118
  194. data/vendor/faiss/faiss/utils/distances_simd.cpp +456 -516
  195. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  196. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  197. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  198. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  199. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  200. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  201. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  202. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  203. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  204. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  205. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  206. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  207. data/vendor/faiss/faiss/utils/random.h +13 -16
  208. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  209. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  210. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  211. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  212. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  213. data/vendor/faiss/faiss/utils/utils.h +53 -48
  214. metadata +26 -12
  215. data/lib/faiss/index.rb +0 -20
  216. data/lib/faiss/index_binary.rb +0 -20
  217. data/lib/faiss/kmeans.rb +0 -15
  218. data/lib/faiss/pca_matrix.rb +0 -15
  219. data/lib/faiss/product_quantizer.rb +0 -22
@@ -5,8 +5,6 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
9
-
10
8
  #include <cuda_profiler_api.h>
11
9
  #include <faiss/IndexFlat.h>
12
10
  #include <faiss/IndexIVFPQ.h>
@@ -32,108 +30,131 @@ DEFINE_bool(per_batch_time, false, "print per-batch times");
32
30
  DEFINE_bool(reserve_memory, false, "whether or not to pre-reserve memory");
33
31
 
34
32
  int main(int argc, char** argv) {
35
- gflags::ParseCommandLineFlags(&argc, &argv, true);
36
-
37
- cudaProfilerStop();
38
-
39
- int dim = FLAGS_dim;
40
- int numCentroids = FLAGS_centroids;
41
- int bytesPerVec = FLAGS_bytes_per_vec;
42
- int bitsPerCode = FLAGS_bits_per_code;
33
+ gflags::ParseCommandLineFlags(&argc, &argv, true);
43
34
 
44
- faiss::gpu::StandardGpuResources res;
35
+ cudaProfilerStop();
45
36
 
46
- // IndexIVFPQ will complain, but just give us enough to get through this
47
- int numTrain = 4 * numCentroids;
48
- std::vector<float> trainVecs = faiss::gpu::randVecs(numTrain, dim);
37
+ int dim = FLAGS_dim;
38
+ int numCentroids = FLAGS_centroids;
39
+ int bytesPerVec = FLAGS_bytes_per_vec;
40
+ int bitsPerCode = FLAGS_bits_per_code;
49
41
 
50
- faiss::IndexFlatL2 coarseQuantizer(dim);
51
- faiss::IndexIVFPQ cpuIndex(&coarseQuantizer, dim, numCentroids,
52
- bytesPerVec, bitsPerCode);
53
- if (FLAGS_time_cpu) {
54
- cpuIndex.train(numTrain, trainVecs.data());
55
- }
42
+ faiss::gpu::StandardGpuResources res;
56
43
 
57
- faiss::gpu::GpuIndexIVFPQConfig config;
58
- config.device = 0;
59
- config.indicesOptions = (faiss::gpu::IndicesOptions) FLAGS_index;
44
+ // IndexIVFPQ will complain, but just give us enough to get through this
45
+ int numTrain = 4 * numCentroids;
46
+ std::vector<float> trainVecs = faiss::gpu::randVecs(numTrain, dim);
60
47
 
61
- faiss::gpu::GpuIndexIVFPQ gpuIndex(
62
- &res, dim, numCentroids, bytesPerVec, bitsPerCode,
63
- faiss::METRIC_L2, config);
64
-
65
- if (FLAGS_time_gpu) {
66
- gpuIndex.train(numTrain, trainVecs.data());
67
- if (FLAGS_reserve_memory) {
68
- size_t numVecs = (size_t) FLAGS_batches * (size_t) FLAGS_batch_size;
69
- gpuIndex.reserveMemory(numVecs);
48
+ faiss::IndexFlatL2 coarseQuantizer(dim);
49
+ faiss::IndexIVFPQ cpuIndex(
50
+ &coarseQuantizer, dim, numCentroids, bytesPerVec, bitsPerCode);
51
+ if (FLAGS_time_cpu) {
52
+ cpuIndex.train(numTrain, trainVecs.data());
70
53
  }
71
- }
72
54
 
73
- cudaDeviceSynchronize();
74
- CUDA_VERIFY(cudaProfilerStart());
55
+ faiss::gpu::GpuIndexIVFPQConfig config;
56
+ config.device = 0;
57
+ config.indicesOptions = (faiss::gpu::IndicesOptions)FLAGS_index;
75
58
 
76
- float totalGpuTime = 0.0f;
77
- float totalCpuTime = 0.0f;
59
+ faiss::gpu::GpuIndexIVFPQ gpuIndex(
60
+ &res,
61
+ dim,
62
+ numCentroids,
63
+ bytesPerVec,
64
+ bitsPerCode,
65
+ faiss::METRIC_L2,
66
+ config);
78
67
 
79
- for (int i = 0; i < FLAGS_batches; ++i) {
80
- if (!FLAGS_per_batch_time) {
81
- if (i % 10 == 0) {
82
- printf("Adding batch %d\n", i + 1);
83
- }
68
+ if (FLAGS_time_gpu) {
69
+ gpuIndex.train(numTrain, trainVecs.data());
70
+ if (FLAGS_reserve_memory) {
71
+ size_t numVecs = (size_t)FLAGS_batches * (size_t)FLAGS_batch_size;
72
+ gpuIndex.reserveMemory(numVecs);
73
+ }
84
74
  }
85
75
 
86
- auto addVecs = faiss::gpu::randVecs(FLAGS_batch_size, dim);
76
+ cudaDeviceSynchronize();
77
+ CUDA_VERIFY(cudaProfilerStart());
78
+
79
+ float totalGpuTime = 0.0f;
80
+ float totalCpuTime = 0.0f;
81
+
82
+ for (int i = 0; i < FLAGS_batches; ++i) {
83
+ if (!FLAGS_per_batch_time) {
84
+ if (i % 10 == 0) {
85
+ printf("Adding batch %d\n", i + 1);
86
+ }
87
+ }
88
+
89
+ auto addVecs = faiss::gpu::randVecs(FLAGS_batch_size, dim);
90
+
91
+ if (FLAGS_time_gpu) {
92
+ faiss::gpu::CpuTimer timer;
93
+ gpuIndex.add(FLAGS_batch_size, addVecs.data());
94
+ CUDA_VERIFY(cudaDeviceSynchronize());
95
+ auto time = timer.elapsedMilliseconds();
96
+
97
+ totalGpuTime += time;
98
+
99
+ if (FLAGS_per_batch_time) {
100
+ printf("Batch %d | GPU time to add %d vecs: %.3f ms (%.5f ms per)\n",
101
+ i + 1,
102
+ FLAGS_batch_size,
103
+ time,
104
+ time / (float)FLAGS_batch_size);
105
+ }
106
+ }
107
+
108
+ if (FLAGS_time_cpu) {
109
+ faiss::gpu::CpuTimer timer;
110
+ cpuIndex.add(FLAGS_batch_size, addVecs.data());
111
+ auto time = timer.elapsedMilliseconds();
112
+
113
+ totalCpuTime += time;
114
+
115
+ if (FLAGS_per_batch_time) {
116
+ printf("Batch %d | CPU time to add %d vecs: %.3f ms (%.5f ms per)\n",
117
+ i + 1,
118
+ FLAGS_batch_size,
119
+ time,
120
+ time / (float)FLAGS_batch_size);
121
+ }
122
+ }
123
+ }
87
124
 
88
- if (FLAGS_time_gpu) {
89
- faiss::gpu::CpuTimer timer;
90
- gpuIndex.add(FLAGS_batch_size, addVecs.data());
91
- CUDA_VERIFY(cudaDeviceSynchronize());
92
- auto time = timer.elapsedMilliseconds();
125
+ CUDA_VERIFY(cudaProfilerStop());
93
126
 
94
- totalGpuTime += time;
127
+ int total = FLAGS_batch_size * FLAGS_batches;
95
128
 
96
- if (FLAGS_per_batch_time) {
97
- printf("Batch %d | GPU time to add %d vecs: %.3f ms (%.5f ms per)\n",
98
- i + 1, FLAGS_batch_size, time, time / (float) FLAGS_batch_size);
99
- }
129
+ if (FLAGS_time_gpu) {
130
+ printf("%d dim, %d centroids, %d x %d encoding\n"
131
+ "GPU time to add %d vectors (%d batches, %d per batch): "
132
+ "%.3f ms (%.3f us per)\n",
133
+ dim,
134
+ numCentroids,
135
+ bytesPerVec,
136
+ bitsPerCode,
137
+ total,
138
+ FLAGS_batches,
139
+ FLAGS_batch_size,
140
+ totalGpuTime,
141
+ totalGpuTime * 1000.0f / (float)total);
100
142
  }
101
143
 
102
144
  if (FLAGS_time_cpu) {
103
- faiss::gpu::CpuTimer timer;
104
- cpuIndex.add(FLAGS_batch_size, addVecs.data());
105
- auto time = timer.elapsedMilliseconds();
106
-
107
- totalCpuTime += time;
108
-
109
- if (FLAGS_per_batch_time) {
110
- printf("Batch %d | CPU time to add %d vecs: %.3f ms (%.5f ms per)\n",
111
- i + 1, FLAGS_batch_size, time, time / (float) FLAGS_batch_size);
112
- }
145
+ printf("%d dim, %d centroids, %d x %d encoding\n"
146
+ "CPU time to add %d vectors (%d batches, %d per batch): "
147
+ "%.3f ms (%.3f us per)\n",
148
+ dim,
149
+ numCentroids,
150
+ bytesPerVec,
151
+ bitsPerCode,
152
+ total,
153
+ FLAGS_batches,
154
+ FLAGS_batch_size,
155
+ totalCpuTime,
156
+ totalCpuTime * 1000.0f / (float)total);
113
157
  }
114
- }
115
-
116
- CUDA_VERIFY(cudaProfilerStop());
117
-
118
- int total = FLAGS_batch_size * FLAGS_batches;
119
-
120
- if (FLAGS_time_gpu) {
121
- printf("%d dim, %d centroids, %d x %d encoding\n"
122
- "GPU time to add %d vectors (%d batches, %d per batch): "
123
- "%.3f ms (%.3f us per)\n",
124
- dim, numCentroids, bytesPerVec, bitsPerCode,
125
- total, FLAGS_batches, FLAGS_batch_size,
126
- totalGpuTime, totalGpuTime * 1000.0f / (float) total);
127
- }
128
-
129
- if (FLAGS_time_cpu) {
130
- printf("%d dim, %d centroids, %d x %d encoding\n"
131
- "CPU time to add %d vectors (%d batches, %d per batch): "
132
- "%.3f ms (%.3f us per)\n",
133
- dim, numCentroids, bytesPerVec, bitsPerCode,
134
- total, FLAGS_batches, FLAGS_batch_size,
135
- totalCpuTime, totalCpuTime * 1000.0f / (float) total);
136
- }
137
-
138
- return 0;
158
+
159
+ return 0;
139
160
  }
@@ -5,14 +5,13 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
8
+ #include <faiss/IndexFlat.h>
9
9
  #include <faiss/IndexIVFFlat.h>
10
10
  #include <faiss/IndexIVFPQ.h>
11
- #include <faiss/IndexFlat.h>
12
- #include <faiss/index_io.h>
13
11
  #include <faiss/gpu/test/TestUtils.h>
14
- #include <vector>
12
+ #include <faiss/index_io.h>
15
13
  #include <gflags/gflags.h>
14
+ #include <vector>
16
15
 
17
16
  // For IVFPQ:
18
17
  DEFINE_bool(ivfpq, false, "use IVFPQ encoding");
@@ -32,71 +31,83 @@ DEFINE_int32(num_train, -1, "number of database vecs to train on");
32
31
 
33
32
  template <typename T>
34
33
  void fillAndSave(T& index, int numTrain, int num, int dim) {
35
- auto trainVecs = faiss::gpu::randVecs(numTrain, dim);
36
- index.train(numTrain, trainVecs.data());
34
+ auto trainVecs = faiss::gpu::randVecs(numTrain, dim);
35
+ index.train(numTrain, trainVecs.data());
37
36
 
38
- constexpr int kAddChunk = 1000000;
37
+ constexpr int kAddChunk = 1000000;
39
38
 
40
- for (int i = 0; i < num; i += kAddChunk) {
41
- int numRemaining = (num - i) < kAddChunk ? (num - i) : kAddChunk;
42
- auto vecs = faiss::gpu::randVecs(numRemaining, dim);
39
+ for (int i = 0; i < num; i += kAddChunk) {
40
+ int numRemaining = (num - i) < kAddChunk ? (num - i) : kAddChunk;
41
+ auto vecs = faiss::gpu::randVecs(numRemaining, dim);
43
42
 
44
- printf("adding at %d: %d\n", i, numRemaining);
45
- index.add(numRemaining, vecs.data());
46
- }
43
+ printf("adding at %d: %d\n", i, numRemaining);
44
+ index.add(numRemaining, vecs.data());
45
+ }
47
46
 
48
- faiss::write_index(&index, FLAGS_out.c_str());
47
+ faiss::write_index(&index, FLAGS_out.c_str());
49
48
  }
50
49
 
51
50
  int main(int argc, char** argv) {
52
- gflags::ParseCommandLineFlags(&argc, &argv, true);
53
-
54
- // Either ivfpq or ivfflat must be set
55
- if ((FLAGS_ivfpq && FLAGS_ivfflat) ||
56
- (!FLAGS_ivfpq && !FLAGS_ivfflat)) {
57
- printf("must specify either ivfpq or ivfflat\n");
58
- return 1;
59
- }
60
-
61
- auto dim = FLAGS_dim;
62
- auto numCentroids = FLAGS_num_coarse;
63
- auto num = FLAGS_num;
64
- auto numTrain = FLAGS_num_train;
65
- numTrain = numTrain == -1 ? std::max((num / 4), 1) : numTrain;
66
- numTrain = std::min(num, numTrain);
67
-
68
- if (FLAGS_ivfpq) {
69
- faiss::IndexFlatL2 quantizer(dim);
70
- faiss::IndexIVFPQ index(&quantizer, dim, numCentroids,
71
- FLAGS_codes, FLAGS_bits_per_code);
72
- index.verbose = true;
73
-
74
- printf("IVFPQ: codes %d bits per code %d\n",
75
- FLAGS_codes, FLAGS_bits_per_code);
76
- printf("Lists: %d\n", numCentroids);
77
- printf("Database: dim %d num vecs %d trained on %d\n", dim, num, numTrain);
78
- printf("output file: %s\n", FLAGS_out.c_str());
79
-
80
- fillAndSave(index, numTrain, num, dim);
81
- } else if (FLAGS_ivfflat) {
82
- faiss::IndexFlatL2 quantizerL2(dim);
83
- faiss::IndexFlatIP quantizerIP(dim);
84
-
85
- faiss::IndexFlat* quantizer = FLAGS_l2 ?
86
- (faiss::IndexFlat*) &quantizerL2 :
87
- (faiss::IndexFlat*) &quantizerIP;
88
-
89
- faiss::IndexIVFFlat index(quantizer, dim, numCentroids,
90
- FLAGS_l2 ? faiss::METRIC_L2 :
91
- faiss::METRIC_INNER_PRODUCT);
92
-
93
- printf("IVFFlat: metric %s\n", FLAGS_l2 ? "L2" : "IP");
94
- printf("Lists: %d\n", numCentroids);
95
- printf("Database: dim %d num vecs %d trained on %d\n", dim, num, numTrain);
96
- printf("output file: %s\n", FLAGS_out.c_str());
97
-
98
- fillAndSave(index, numTrain, num, dim);
99
- }
100
-
101
- return 0;
51
+ gflags::ParseCommandLineFlags(&argc, &argv, true);
52
+
53
+ // Either ivfpq or ivfflat must be set
54
+ if ((FLAGS_ivfpq && FLAGS_ivfflat) || (!FLAGS_ivfpq && !FLAGS_ivfflat)) {
55
+ printf("must specify either ivfpq or ivfflat\n");
56
+ return 1;
57
+ }
58
+
59
+ auto dim = FLAGS_dim;
60
+ auto numCentroids = FLAGS_num_coarse;
61
+ auto num = FLAGS_num;
62
+ auto numTrain = FLAGS_num_train;
63
+ numTrain = numTrain == -1 ? std::max((num / 4), 1) : numTrain;
64
+ numTrain = std::min(num, numTrain);
65
+
66
+ if (FLAGS_ivfpq) {
67
+ faiss::IndexFlatL2 quantizer(dim);
68
+ faiss::IndexIVFPQ index(
69
+ &quantizer,
70
+ dim,
71
+ numCentroids,
72
+ FLAGS_codes,
73
+ FLAGS_bits_per_code);
74
+ index.verbose = true;
75
+
76
+ printf("IVFPQ: codes %d bits per code %d\n",
77
+ FLAGS_codes,
78
+ FLAGS_bits_per_code);
79
+ printf("Lists: %d\n", numCentroids);
80
+ printf("Database: dim %d num vecs %d trained on %d\n",
81
+ dim,
82
+ num,
83
+ numTrain);
84
+ printf("output file: %s\n", FLAGS_out.c_str());
85
+
86
+ fillAndSave(index, numTrain, num, dim);
87
+ } else if (FLAGS_ivfflat) {
88
+ faiss::IndexFlatL2 quantizerL2(dim);
89
+ faiss::IndexFlatIP quantizerIP(dim);
90
+
91
+ faiss::IndexFlat* quantizer = FLAGS_l2
92
+ ? (faiss::IndexFlat*)&quantizerL2
93
+ : (faiss::IndexFlat*)&quantizerIP;
94
+
95
+ faiss::IndexIVFFlat index(
96
+ quantizer,
97
+ dim,
98
+ numCentroids,
99
+ FLAGS_l2 ? faiss::METRIC_L2 : faiss::METRIC_INNER_PRODUCT);
100
+
101
+ printf("IVFFlat: metric %s\n", FLAGS_l2 ? "L2" : "IP");
102
+ printf("Lists: %d\n", numCentroids);
103
+ printf("Database: dim %d num vecs %d trained on %d\n",
104
+ dim,
105
+ num,
106
+ numTrain);
107
+ printf("output file: %s\n", FLAGS_out.c_str());
108
+
109
+ fillAndSave(index, numTrain, num, dim);
110
+ }
111
+
112
+ return 0;
102
113
  }