faiss 0.2.0 → 0.2.4

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +7 -7
  5. data/ext/faiss/extconf.rb +6 -3
  6. data/ext/faiss/numo.hpp +4 -4
  7. data/ext/faiss/utils.cpp +1 -1
  8. data/ext/faiss/utils.h +1 -1
  9. data/lib/faiss/version.rb +1 -1
  10. data/vendor/faiss/faiss/AutoTune.cpp +292 -291
  11. data/vendor/faiss/faiss/AutoTune.h +55 -56
  12. data/vendor/faiss/faiss/Clustering.cpp +365 -194
  13. data/vendor/faiss/faiss/Clustering.h +102 -35
  14. data/vendor/faiss/faiss/IVFlib.cpp +171 -195
  15. data/vendor/faiss/faiss/IVFlib.h +48 -51
  16. data/vendor/faiss/faiss/Index.cpp +85 -103
  17. data/vendor/faiss/faiss/Index.h +54 -48
  18. data/vendor/faiss/faiss/Index2Layer.cpp +126 -224
  19. data/vendor/faiss/faiss/Index2Layer.h +22 -36
  20. data/vendor/faiss/faiss/IndexAdditiveQuantizer.cpp +407 -0
  21. data/vendor/faiss/faiss/IndexAdditiveQuantizer.h +195 -0
  22. data/vendor/faiss/faiss/IndexBinary.cpp +45 -37
  23. data/vendor/faiss/faiss/IndexBinary.h +140 -132
  24. data/vendor/faiss/faiss/IndexBinaryFlat.cpp +73 -53
  25. data/vendor/faiss/faiss/IndexBinaryFlat.h +29 -24
  26. data/vendor/faiss/faiss/IndexBinaryFromFloat.cpp +46 -43
  27. data/vendor/faiss/faiss/IndexBinaryFromFloat.h +16 -15
  28. data/vendor/faiss/faiss/IndexBinaryHNSW.cpp +215 -232
  29. data/vendor/faiss/faiss/IndexBinaryHNSW.h +25 -24
  30. data/vendor/faiss/faiss/IndexBinaryHash.cpp +182 -177
  31. data/vendor/faiss/faiss/IndexBinaryHash.h +41 -34
  32. data/vendor/faiss/faiss/IndexBinaryIVF.cpp +489 -461
  33. data/vendor/faiss/faiss/IndexBinaryIVF.h +97 -68
  34. data/vendor/faiss/faiss/IndexFlat.cpp +115 -176
  35. data/vendor/faiss/faiss/IndexFlat.h +42 -59
  36. data/vendor/faiss/faiss/IndexFlatCodes.cpp +67 -0
  37. data/vendor/faiss/faiss/IndexFlatCodes.h +47 -0
  38. data/vendor/faiss/faiss/IndexHNSW.cpp +372 -348
  39. data/vendor/faiss/faiss/IndexHNSW.h +57 -41
  40. data/vendor/faiss/faiss/IndexIVF.cpp +545 -453
  41. data/vendor/faiss/faiss/IndexIVF.h +169 -118
  42. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.cpp +316 -0
  43. data/vendor/faiss/faiss/IndexIVFAdditiveQuantizer.h +121 -0
  44. data/vendor/faiss/faiss/IndexIVFFlat.cpp +247 -252
  45. data/vendor/faiss/faiss/IndexIVFFlat.h +48 -51
  46. data/vendor/faiss/faiss/IndexIVFPQ.cpp +459 -517
  47. data/vendor/faiss/faiss/IndexIVFPQ.h +75 -67
  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 +163 -150
  53. data/vendor/faiss/faiss/IndexIVFSpectralHash.h +38 -25
  54. data/vendor/faiss/faiss/IndexLSH.cpp +66 -113
  55. data/vendor/faiss/faiss/IndexLSH.h +20 -38
  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 +229 -0
  59. data/vendor/faiss/faiss/IndexNNDescent.h +72 -0
  60. data/vendor/faiss/faiss/IndexNSG.cpp +301 -0
  61. data/vendor/faiss/faiss/IndexNSG.h +85 -0
  62. data/vendor/faiss/faiss/IndexPQ.cpp +387 -495
  63. data/vendor/faiss/faiss/IndexPQ.h +64 -82
  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 +139 -127
  69. data/vendor/faiss/faiss/IndexRefine.h +32 -23
  70. data/vendor/faiss/faiss/IndexReplicas.cpp +147 -153
  71. data/vendor/faiss/faiss/IndexReplicas.h +62 -56
  72. data/vendor/faiss/faiss/IndexScalarQuantizer.cpp +111 -172
  73. data/vendor/faiss/faiss/IndexScalarQuantizer.h +41 -59
  74. data/vendor/faiss/faiss/IndexShards.cpp +256 -240
  75. data/vendor/faiss/faiss/IndexShards.h +85 -73
  76. data/vendor/faiss/faiss/MatrixStats.cpp +112 -97
  77. data/vendor/faiss/faiss/MatrixStats.h +7 -10
  78. data/vendor/faiss/faiss/MetaIndexes.cpp +135 -157
  79. data/vendor/faiss/faiss/MetaIndexes.h +40 -34
  80. data/vendor/faiss/faiss/MetricType.h +7 -7
  81. data/vendor/faiss/faiss/VectorTransform.cpp +654 -475
  82. data/vendor/faiss/faiss/VectorTransform.h +64 -89
  83. data/vendor/faiss/faiss/clone_index.cpp +78 -73
  84. data/vendor/faiss/faiss/clone_index.h +4 -9
  85. data/vendor/faiss/faiss/gpu/GpuAutoTune.cpp +33 -38
  86. data/vendor/faiss/faiss/gpu/GpuAutoTune.h +11 -9
  87. data/vendor/faiss/faiss/gpu/GpuCloner.cpp +198 -171
  88. data/vendor/faiss/faiss/gpu/GpuCloner.h +53 -35
  89. data/vendor/faiss/faiss/gpu/GpuClonerOptions.cpp +12 -14
  90. data/vendor/faiss/faiss/gpu/GpuClonerOptions.h +27 -25
  91. data/vendor/faiss/faiss/gpu/GpuDistance.h +116 -112
  92. data/vendor/faiss/faiss/gpu/GpuFaissAssert.h +1 -2
  93. data/vendor/faiss/faiss/gpu/GpuIcmEncoder.h +60 -0
  94. data/vendor/faiss/faiss/gpu/GpuIndex.h +134 -137
  95. data/vendor/faiss/faiss/gpu/GpuIndexBinaryFlat.h +76 -73
  96. data/vendor/faiss/faiss/gpu/GpuIndexFlat.h +173 -162
  97. data/vendor/faiss/faiss/gpu/GpuIndexIVF.h +67 -64
  98. data/vendor/faiss/faiss/gpu/GpuIndexIVFFlat.h +89 -86
  99. data/vendor/faiss/faiss/gpu/GpuIndexIVFPQ.h +150 -141
  100. data/vendor/faiss/faiss/gpu/GpuIndexIVFScalarQuantizer.h +101 -103
  101. data/vendor/faiss/faiss/gpu/GpuIndicesOptions.h +17 -16
  102. data/vendor/faiss/faiss/gpu/GpuResources.cpp +116 -128
  103. data/vendor/faiss/faiss/gpu/GpuResources.h +182 -186
  104. data/vendor/faiss/faiss/gpu/StandardGpuResources.cpp +433 -422
  105. data/vendor/faiss/faiss/gpu/StandardGpuResources.h +131 -130
  106. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.cpp +468 -456
  107. data/vendor/faiss/faiss/gpu/impl/InterleavedCodes.h +25 -19
  108. data/vendor/faiss/faiss/gpu/impl/RemapIndices.cpp +22 -20
  109. data/vendor/faiss/faiss/gpu/impl/RemapIndices.h +9 -8
  110. data/vendor/faiss/faiss/gpu/perf/IndexWrapper-inl.h +39 -44
  111. data/vendor/faiss/faiss/gpu/perf/IndexWrapper.h +16 -14
  112. data/vendor/faiss/faiss/gpu/perf/PerfClustering.cpp +77 -71
  113. data/vendor/faiss/faiss/gpu/perf/PerfIVFPQAdd.cpp +109 -88
  114. data/vendor/faiss/faiss/gpu/perf/WriteIndex.cpp +75 -64
  115. data/vendor/faiss/faiss/gpu/test/TestCodePacking.cpp +230 -215
  116. data/vendor/faiss/faiss/gpu/test/TestGpuIndexBinaryFlat.cpp +80 -86
  117. data/vendor/faiss/faiss/gpu/test/TestGpuIndexFlat.cpp +284 -277
  118. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFFlat.cpp +416 -416
  119. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFPQ.cpp +611 -517
  120. data/vendor/faiss/faiss/gpu/test/TestGpuIndexIVFScalarQuantizer.cpp +166 -164
  121. data/vendor/faiss/faiss/gpu/test/TestGpuMemoryException.cpp +61 -53
  122. data/vendor/faiss/faiss/gpu/test/TestUtils.cpp +274 -238
  123. data/vendor/faiss/faiss/gpu/test/TestUtils.h +73 -57
  124. data/vendor/faiss/faiss/gpu/test/demo_ivfpq_indexing_gpu.cpp +47 -50
  125. data/vendor/faiss/faiss/gpu/utils/DeviceUtils.h +79 -72
  126. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.cpp +140 -146
  127. data/vendor/faiss/faiss/gpu/utils/StackDeviceMemory.h +69 -71
  128. data/vendor/faiss/faiss/gpu/utils/StaticUtils.h +21 -16
  129. data/vendor/faiss/faiss/gpu/utils/Timer.cpp +25 -29
  130. data/vendor/faiss/faiss/gpu/utils/Timer.h +30 -29
  131. data/vendor/faiss/faiss/impl/AdditiveQuantizer.cpp +503 -0
  132. data/vendor/faiss/faiss/impl/AdditiveQuantizer.h +175 -0
  133. data/vendor/faiss/faiss/impl/AuxIndexStructures.cpp +90 -120
  134. data/vendor/faiss/faiss/impl/AuxIndexStructures.h +81 -65
  135. data/vendor/faiss/faiss/impl/FaissAssert.h +73 -58
  136. data/vendor/faiss/faiss/impl/FaissException.cpp +56 -48
  137. data/vendor/faiss/faiss/impl/FaissException.h +41 -29
  138. data/vendor/faiss/faiss/impl/HNSW.cpp +606 -617
  139. data/vendor/faiss/faiss/impl/HNSW.h +179 -200
  140. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.cpp +855 -0
  141. data/vendor/faiss/faiss/impl/LocalSearchQuantizer.h +244 -0
  142. data/vendor/faiss/faiss/impl/NNDescent.cpp +487 -0
  143. data/vendor/faiss/faiss/impl/NNDescent.h +154 -0
  144. data/vendor/faiss/faiss/impl/NSG.cpp +679 -0
  145. data/vendor/faiss/faiss/impl/NSG.h +199 -0
  146. data/vendor/faiss/faiss/impl/PolysemousTraining.cpp +484 -454
  147. data/vendor/faiss/faiss/impl/PolysemousTraining.h +52 -55
  148. data/vendor/faiss/faiss/impl/ProductQuantizer-inl.h +26 -47
  149. data/vendor/faiss/faiss/impl/ProductQuantizer.cpp +469 -459
  150. data/vendor/faiss/faiss/impl/ProductQuantizer.h +76 -87
  151. data/vendor/faiss/faiss/impl/ResidualQuantizer.cpp +758 -0
  152. data/vendor/faiss/faiss/impl/ResidualQuantizer.h +188 -0
  153. data/vendor/faiss/faiss/impl/ResultHandler.h +96 -132
  154. data/vendor/faiss/faiss/impl/ScalarQuantizer.cpp +647 -707
  155. data/vendor/faiss/faiss/impl/ScalarQuantizer.h +48 -46
  156. data/vendor/faiss/faiss/impl/ThreadedIndex-inl.h +129 -131
  157. data/vendor/faiss/faiss/impl/ThreadedIndex.h +61 -55
  158. data/vendor/faiss/faiss/impl/index_read.cpp +631 -480
  159. data/vendor/faiss/faiss/impl/index_write.cpp +547 -407
  160. data/vendor/faiss/faiss/impl/io.cpp +76 -95
  161. data/vendor/faiss/faiss/impl/io.h +31 -41
  162. data/vendor/faiss/faiss/impl/io_macros.h +60 -29
  163. data/vendor/faiss/faiss/impl/kmeans1d.cpp +301 -0
  164. data/vendor/faiss/faiss/impl/kmeans1d.h +48 -0
  165. data/vendor/faiss/faiss/impl/lattice_Zn.cpp +137 -186
  166. data/vendor/faiss/faiss/impl/lattice_Zn.h +40 -51
  167. data/vendor/faiss/faiss/impl/platform_macros.h +29 -8
  168. data/vendor/faiss/faiss/impl/pq4_fast_scan.cpp +77 -124
  169. data/vendor/faiss/faiss/impl/pq4_fast_scan.h +39 -48
  170. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_1.cpp +41 -52
  171. data/vendor/faiss/faiss/impl/pq4_fast_scan_search_qbs.cpp +80 -117
  172. data/vendor/faiss/faiss/impl/simd_result_handlers.h +109 -137
  173. data/vendor/faiss/faiss/index_factory.cpp +619 -397
  174. data/vendor/faiss/faiss/index_factory.h +8 -6
  175. data/vendor/faiss/faiss/index_io.h +23 -26
  176. data/vendor/faiss/faiss/invlists/BlockInvertedLists.cpp +67 -75
  177. data/vendor/faiss/faiss/invlists/BlockInvertedLists.h +22 -24
  178. data/vendor/faiss/faiss/invlists/DirectMap.cpp +96 -112
  179. data/vendor/faiss/faiss/invlists/DirectMap.h +29 -33
  180. data/vendor/faiss/faiss/invlists/InvertedLists.cpp +307 -364
  181. data/vendor/faiss/faiss/invlists/InvertedLists.h +151 -151
  182. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.cpp +29 -34
  183. data/vendor/faiss/faiss/invlists/InvertedListsIOHook.h +17 -18
  184. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.cpp +257 -293
  185. data/vendor/faiss/faiss/invlists/OnDiskInvertedLists.h +50 -45
  186. data/vendor/faiss/faiss/python/python_callbacks.cpp +23 -26
  187. data/vendor/faiss/faiss/python/python_callbacks.h +9 -16
  188. data/vendor/faiss/faiss/utils/AlignedTable.h +79 -44
  189. data/vendor/faiss/faiss/utils/Heap.cpp +40 -48
  190. data/vendor/faiss/faiss/utils/Heap.h +186 -209
  191. data/vendor/faiss/faiss/utils/WorkerThread.cpp +67 -76
  192. data/vendor/faiss/faiss/utils/WorkerThread.h +32 -33
  193. data/vendor/faiss/faiss/utils/distances.cpp +305 -312
  194. data/vendor/faiss/faiss/utils/distances.h +170 -122
  195. data/vendor/faiss/faiss/utils/distances_simd.cpp +498 -508
  196. data/vendor/faiss/faiss/utils/extra_distances-inl.h +117 -0
  197. data/vendor/faiss/faiss/utils/extra_distances.cpp +113 -232
  198. data/vendor/faiss/faiss/utils/extra_distances.h +30 -29
  199. data/vendor/faiss/faiss/utils/hamming-inl.h +260 -209
  200. data/vendor/faiss/faiss/utils/hamming.cpp +375 -469
  201. data/vendor/faiss/faiss/utils/hamming.h +62 -85
  202. data/vendor/faiss/faiss/utils/ordered_key_value.h +16 -18
  203. data/vendor/faiss/faiss/utils/partitioning.cpp +393 -318
  204. data/vendor/faiss/faiss/utils/partitioning.h +26 -21
  205. data/vendor/faiss/faiss/utils/quantize_lut.cpp +78 -66
  206. data/vendor/faiss/faiss/utils/quantize_lut.h +22 -20
  207. data/vendor/faiss/faiss/utils/random.cpp +39 -63
  208. data/vendor/faiss/faiss/utils/random.h +13 -16
  209. data/vendor/faiss/faiss/utils/simdlib.h +4 -2
  210. data/vendor/faiss/faiss/utils/simdlib_avx2.h +88 -85
  211. data/vendor/faiss/faiss/utils/simdlib_emulated.h +226 -165
  212. data/vendor/faiss/faiss/utils/simdlib_neon.h +832 -0
  213. data/vendor/faiss/faiss/utils/utils.cpp +304 -287
  214. data/vendor/faiss/faiss/utils/utils.h +54 -49
  215. metadata +29 -4
@@ -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
  }