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
@@ -9,73 +9,91 @@
9
9
 
10
10
  #include <vector>
11
11
 
12
+ #include <faiss/Clustering.h>
12
13
  #include <faiss/Index.h>
13
14
  #include <faiss/clone_index.h>
14
15
  #include <faiss/gpu/GpuClonerOptions.h>
15
16
  #include <faiss/gpu/GpuIndex.h>
16
17
  #include <faiss/gpu/GpuIndicesOptions.h>
17
-
18
- namespace faiss { namespace gpu {
18
+ namespace faiss {
19
+ namespace gpu {
19
20
 
20
21
  class GpuResourcesProvider;
21
22
 
22
23
  /// Cloner specialized for GPU -> CPU
23
- struct ToCPUCloner: faiss::Cloner {
24
- void merge_index(Index *dst, Index *src, bool successive_ids);
25
- Index *clone_Index(const Index *index) override;
24
+ struct ToCPUCloner : faiss::Cloner {
25
+ void merge_index(Index* dst, Index* src, bool successive_ids);
26
+ Index* clone_Index(const Index* index) override;
26
27
  };
27
28
 
28
-
29
29
  /// Cloner specialized for CPU -> 1 GPU
30
- struct ToGpuCloner: faiss::Cloner, GpuClonerOptions {
31
- GpuResourcesProvider *provider;
30
+ struct ToGpuCloner : faiss::Cloner, GpuClonerOptions {
31
+ GpuResourcesProvider* provider;
32
32
  int device;
33
33
 
34
- ToGpuCloner(GpuResourcesProvider *prov, int device,
35
- const GpuClonerOptions &options);
36
-
37
- Index *clone_Index(const Index *index) override;
34
+ ToGpuCloner(
35
+ GpuResourcesProvider* prov,
36
+ int device,
37
+ const GpuClonerOptions& options);
38
38
 
39
+ Index* clone_Index(const Index* index) override;
39
40
  };
40
41
 
41
42
  /// Cloner specialized for CPU -> multiple GPUs
42
- struct ToGpuClonerMultiple: faiss::Cloner, GpuMultipleClonerOptions {
43
+ struct ToGpuClonerMultiple : faiss::Cloner, GpuMultipleClonerOptions {
43
44
  std::vector<ToGpuCloner> sub_cloners;
44
45
 
45
- ToGpuClonerMultiple(std::vector<GpuResourcesProvider *> & provider,
46
- std::vector<int>& devices,
47
- const GpuMultipleClonerOptions &options);
46
+ ToGpuClonerMultiple(
47
+ std::vector<GpuResourcesProvider*>& provider,
48
+ std::vector<int>& devices,
49
+ const GpuMultipleClonerOptions& options);
48
50
 
49
- ToGpuClonerMultiple(const std::vector<ToGpuCloner> & sub_cloners,
50
- const GpuMultipleClonerOptions &options);
51
+ ToGpuClonerMultiple(
52
+ const std::vector<ToGpuCloner>& sub_cloners,
53
+ const GpuMultipleClonerOptions& options);
51
54
 
52
- void copy_ivf_shard (const IndexIVF *index_ivf, IndexIVF *idx2,
53
- long n, long i);
55
+ void copy_ivf_shard(
56
+ const IndexIVF* index_ivf,
57
+ IndexIVF* idx2,
58
+ long n,
59
+ long i);
54
60
 
55
- Index * clone_Index_to_shards (const Index *index);
61
+ Index* clone_Index_to_shards(const Index* index);
56
62
 
57
63
  /// main function
58
- Index *clone_Index(const Index *index) override;
64
+ Index* clone_Index(const Index* index) override;
59
65
  };
60
66
 
67
+ /// converts any GPU index inside gpu_index to a CPU index
68
+ faiss::Index* index_gpu_to_cpu(const faiss::Index* gpu_index);
61
69
 
70
+ /// converts any CPU index that can be converted to GPU
71
+ faiss::Index* index_cpu_to_gpu(
72
+ GpuResourcesProvider* provider,
73
+ int device,
74
+ const faiss::Index* index,
75
+ const GpuClonerOptions* options = nullptr);
62
76
 
77
+ faiss::Index* index_cpu_to_gpu_multiple(
78
+ std::vector<GpuResourcesProvider*>& provider,
79
+ std::vector<int>& devices,
80
+ const faiss::Index* index,
81
+ const GpuMultipleClonerOptions* options = nullptr);
63
82
 
64
- /// converts any GPU index inside gpu_index to a CPU index
65
- faiss::Index * index_gpu_to_cpu(const faiss::Index *gpu_index);
83
+ /// index factory for the ProgressiveDimClustering object
66
84
 
67
- /// converts any CPU index that can be converted to GPU
68
- faiss::Index * index_cpu_to_gpu(
69
- GpuResourcesProvider* provider, int device,
70
- const faiss::Index *index,
71
- const GpuClonerOptions *options = nullptr);
85
+ struct GpuProgressiveDimIndexFactory : ProgressiveDimIndexFactory {
86
+ GpuMultipleClonerOptions options;
87
+ std::vector<GpuResourcesProvider*> vres;
88
+ std::vector<int> devices;
89
+ int ncall;
72
90
 
73
- faiss::Index * index_cpu_to_gpu_multiple(
74
- std::vector<GpuResourcesProvider*> & provider,
75
- std::vector<int> &devices,
76
- const faiss::Index *index,
77
- const GpuMultipleClonerOptions *options = nullptr);
91
+ explicit GpuProgressiveDimIndexFactory(int ngpu);
78
92
 
93
+ Index* operator()(int dim) override;
79
94
 
95
+ virtual ~GpuProgressiveDimIndexFactory() override;
96
+ };
80
97
 
81
- } } // namespace
98
+ } // namespace gpu
99
+ } // namespace faiss
@@ -7,22 +7,20 @@
7
7
 
8
8
  #include <faiss/gpu/GpuClonerOptions.h>
9
9
 
10
- namespace faiss { namespace gpu {
10
+ namespace faiss {
11
+ namespace gpu {
11
12
 
12
13
  GpuClonerOptions::GpuClonerOptions()
13
- : indicesOptions(INDICES_64_BIT),
14
- useFloat16CoarseQuantizer(false),
15
- useFloat16(false),
16
- usePrecomputed(false),
17
- reserveVecs(0),
18
- storeTransposed(false),
19
- verbose(false) {
20
- }
14
+ : indicesOptions(INDICES_64_BIT),
15
+ useFloat16CoarseQuantizer(false),
16
+ useFloat16(false),
17
+ usePrecomputed(false),
18
+ reserveVecs(0),
19
+ storeTransposed(false),
20
+ verbose(false) {}
21
21
 
22
22
  GpuMultipleClonerOptions::GpuMultipleClonerOptions()
23
- : shard(false),
24
- shard_type(1)
25
- {
26
- }
23
+ : shard(false), shard_type(1) {}
27
24
 
28
- } } // namespace
25
+ } // namespace gpu
26
+ } // namespace faiss
@@ -9,45 +9,47 @@
9
9
 
10
10
  #include <faiss/gpu/GpuIndicesOptions.h>
11
11
 
12
- namespace faiss { namespace gpu {
12
+ namespace faiss {
13
+ namespace gpu {
13
14
 
14
15
  /// set some options on how to copy to GPU
15
16
  struct GpuClonerOptions {
16
- GpuClonerOptions();
17
+ GpuClonerOptions();
17
18
 
18
- /// how should indices be stored on index types that support indices
19
- /// (anything but GpuIndexFlat*)?
20
- IndicesOptions indicesOptions;
19
+ /// how should indices be stored on index types that support indices
20
+ /// (anything but GpuIndexFlat*)?
21
+ IndicesOptions indicesOptions;
21
22
 
22
- /// is the coarse quantizer in float16?
23
- bool useFloat16CoarseQuantizer;
23
+ /// is the coarse quantizer in float16?
24
+ bool useFloat16CoarseQuantizer;
24
25
 
25
- /// for GpuIndexIVFFlat, is storage in float16?
26
- /// for GpuIndexIVFPQ, are intermediate calculations in float16?
27
- bool useFloat16;
26
+ /// for GpuIndexIVFFlat, is storage in float16?
27
+ /// for GpuIndexIVFPQ, are intermediate calculations in float16?
28
+ bool useFloat16;
28
29
 
29
- /// use precomputed tables?
30
- bool usePrecomputed;
30
+ /// use precomputed tables?
31
+ bool usePrecomputed;
31
32
 
32
- /// reserve vectors in the invfiles?
33
- long reserveVecs;
33
+ /// reserve vectors in the invfiles?
34
+ long reserveVecs;
34
35
 
35
- /// For GpuIndexFlat, store data in transposed layout?
36
- bool storeTransposed;
36
+ /// For GpuIndexFlat, store data in transposed layout?
37
+ bool storeTransposed;
37
38
 
38
- /// Set verbose options on the index
39
- bool verbose;
39
+ /// Set verbose options on the index
40
+ bool verbose;
40
41
  };
41
42
 
42
43
  struct GpuMultipleClonerOptions : public GpuClonerOptions {
43
- GpuMultipleClonerOptions ();
44
+ GpuMultipleClonerOptions();
44
45
 
45
- /// Whether to shard the index across GPUs, versus replication
46
- /// across GPUs
47
- bool shard;
46
+ /// Whether to shard the index across GPUs, versus replication
47
+ /// across GPUs
48
+ bool shard;
48
49
 
49
- /// IndexIVF::copy_subset_to subset type
50
- int shard_type;
50
+ /// IndexIVF::copy_subset_to subset type
51
+ int shard_type;
51
52
  };
52
53
 
53
- } } // namespace
54
+ } // namespace gpu
55
+ } // namespace faiss
@@ -5,111 +5,113 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
9
8
  #pragma once
10
9
 
11
10
  #include <faiss/Index.h>
12
11
 
13
- namespace faiss { namespace gpu {
12
+ namespace faiss {
13
+ namespace gpu {
14
14
 
15
15
  class GpuResourcesProvider;
16
16
 
17
17
  // Scalar type of the vector data
18
18
  enum class DistanceDataType {
19
- F32 = 1,
20
- F16,
19
+ F32 = 1,
20
+ F16,
21
21
  };
22
22
 
23
23
  // Scalar type of the indices data
24
24
  enum class IndicesDataType {
25
- I64 = 1,
26
- I32,
25
+ I64 = 1,
26
+ I32,
27
27
  };
28
28
 
29
29
  /// Arguments to brute-force GPU k-nearest neighbor searching
30
30
  struct GpuDistanceParams {
31
- GpuDistanceParams()
32
- : metric(faiss::MetricType::METRIC_L2),
33
- metricArg(0),
34
- k(0),
35
- dims(0),
36
- vectors(nullptr),
37
- vectorType(DistanceDataType::F32),
38
- vectorsRowMajor(true),
39
- numVectors(0),
40
- vectorNorms(nullptr),
41
- queries(nullptr),
42
- queryType(DistanceDataType::F32),
43
- queriesRowMajor(true),
44
- numQueries(0),
45
- outDistances(nullptr),
46
- ignoreOutDistances(false),
47
- outIndicesType(IndicesDataType::I64),
48
- outIndices(nullptr) {
49
- }
50
-
51
- //
52
- // Search parameters
53
- //
54
-
55
- // Search parameter: distance metric
56
- faiss::MetricType metric;
57
-
58
- // Search parameter: distance metric argument (if applicable)
59
- // For metric == METRIC_Lp, this is the p-value
60
- float metricArg;
61
-
62
- // Search parameter: return k nearest neighbors
63
- int k;
64
-
65
- // Vector dimensionality
66
- int dims;
67
-
68
- //
69
- // Vectors being queried
70
- //
71
-
72
- // If vectorsRowMajor is true, this is
73
- // numVectors x dims, with dims innermost; otherwise,
74
- // dims x numVectors, with numVectors innermost
75
- const void* vectors;
76
- DistanceDataType vectorType;
77
- bool vectorsRowMajor;
78
- int numVectors;
79
-
80
- // Precomputed L2 norms for each vector in `vectors`, which can be optionally
81
- // provided in advance to speed computation for METRIC_L2
82
- const float* vectorNorms;
83
-
84
- //
85
- // The query vectors (i.e., find k-nearest neighbors in `vectors` for each of
86
- // the `queries`
87
- //
88
-
89
- // If queriesRowMajor is true, this is
90
- // numQueries x dims, with dims innermost; otherwise,
91
- // dims x numQueries, with numQueries innermost
92
- const void* queries;
93
- DistanceDataType queryType;
94
- bool queriesRowMajor;
95
- int numQueries;
96
-
97
- //
98
- // Output results
99
- //
100
-
101
- // A region of memory size numQueries x k, with k
102
- // innermost (row major)
103
- float* outDistances;
104
-
105
- // Do we only care abouty the indices reported, rather than the output
106
- // distances?
107
- bool ignoreOutDistances;
108
-
109
- // A region of memory size numQueries x k, with k
110
- // innermost (row major)
111
- IndicesDataType outIndicesType;
112
- void* outIndices;
31
+ GpuDistanceParams()
32
+ : metric(faiss::MetricType::METRIC_L2),
33
+ metricArg(0),
34
+ k(0),
35
+ dims(0),
36
+ vectors(nullptr),
37
+ vectorType(DistanceDataType::F32),
38
+ vectorsRowMajor(true),
39
+ numVectors(0),
40
+ vectorNorms(nullptr),
41
+ queries(nullptr),
42
+ queryType(DistanceDataType::F32),
43
+ queriesRowMajor(true),
44
+ numQueries(0),
45
+ outDistances(nullptr),
46
+ ignoreOutDistances(false),
47
+ outIndicesType(IndicesDataType::I64),
48
+ outIndices(nullptr) {}
49
+
50
+ //
51
+ // Search parameters
52
+ //
53
+
54
+ /// Search parameter: distance metric
55
+ faiss::MetricType metric;
56
+
57
+ /// Search parameter: distance metric argument (if applicable)
58
+ /// For metric == METRIC_Lp, this is the p-value
59
+ float metricArg;
60
+
61
+ /// Search parameter: return k nearest neighbors
62
+ /// If the value provided is -1, then we report all pairwise distances
63
+ /// without top-k filtering
64
+ int k;
65
+
66
+ /// Vector dimensionality
67
+ int dims;
68
+
69
+ //
70
+ // Vectors being queried
71
+ //
72
+
73
+ /// If vectorsRowMajor is true, this is
74
+ /// numVectors x dims, with dims innermost; otherwise,
75
+ /// dims x numVectors, with numVectors innermost
76
+ const void* vectors;
77
+ DistanceDataType vectorType;
78
+ bool vectorsRowMajor;
79
+ int numVectors;
80
+
81
+ /// Precomputed L2 norms for each vector in `vectors`, which can be
82
+ /// optionally provided in advance to speed computation for METRIC_L2
83
+ const float* vectorNorms;
84
+
85
+ //
86
+ // The query vectors (i.e., find k-nearest neighbors in `vectors` for each
87
+ // of the `queries`
88
+ //
89
+
90
+ /// If queriesRowMajor is true, this is
91
+ /// numQueries x dims, with dims innermost; otherwise,
92
+ /// dims x numQueries, with numQueries innermost
93
+ const void* queries;
94
+ DistanceDataType queryType;
95
+ bool queriesRowMajor;
96
+ int numQueries;
97
+
98
+ //
99
+ // Output results
100
+ //
101
+
102
+ /// A region of memory size numQueries x k, with k
103
+ /// innermost (row major) if k > 0, or if k == -1, a region of memory of
104
+ /// size numQueries x numVectors
105
+ float* outDistances;
106
+
107
+ /// Do we only care about the indices reported, rather than the output
108
+ /// distances? Not used if k == -1 (all pairwise distances)
109
+ bool ignoreOutDistances;
110
+
111
+ /// A region of memory size numQueries x k, with k
112
+ /// innermost (row major). Not used if k == -1 (all pairwise distances)
113
+ IndicesDataType outIndicesType;
114
+ void* outIndices;
113
115
  };
114
116
 
115
117
  /// A wrapper for gpu/impl/Distance.cuh to expose direct brute-force k-nearest
@@ -127,27 +129,29 @@ struct GpuDistanceParams {
127
129
  void bfKnn(GpuResourcesProvider* resources, const GpuDistanceParams& args);
128
130
 
129
131
  /// Deprecated legacy implementation
130
- void bruteForceKnn(GpuResourcesProvider* resources,
131
- faiss::MetricType metric,
132
- // If vectorsRowMajor is true, this is
133
- // numVectors x dims, with dims innermost; otherwise,
134
- // dims x numVectors, with numVectors innermost
135
- const float* vectors,
136
- bool vectorsRowMajor,
137
- int numVectors,
138
- // If queriesRowMajor is true, this is
139
- // numQueries x dims, with dims innermost; otherwise,
140
- // dims x numQueries, with numQueries innermost
141
- const float* queries,
142
- bool queriesRowMajor,
143
- int numQueries,
144
- int dims,
145
- int k,
146
- // A region of memory size numQueries x k, with k
147
- // innermost (row major)
148
- float* outDistances,
149
- // A region of memory size numQueries x k, with k
150
- // innermost (row major)
151
- Index::idx_t* outIndices);
152
-
153
- } } // namespace
132
+ void bruteForceKnn(
133
+ GpuResourcesProvider* resources,
134
+ faiss::MetricType metric,
135
+ // If vectorsRowMajor is true, this is
136
+ // numVectors x dims, with dims innermost; otherwise,
137
+ // dims x numVectors, with numVectors innermost
138
+ const float* vectors,
139
+ bool vectorsRowMajor,
140
+ int numVectors,
141
+ // If queriesRowMajor is true, this is
142
+ // numQueries x dims, with dims innermost; otherwise,
143
+ // dims x numQueries, with numQueries innermost
144
+ const float* queries,
145
+ bool queriesRowMajor,
146
+ int numQueries,
147
+ int dims,
148
+ int k,
149
+ // A region of memory size numQueries x k, with k
150
+ // innermost (row major)
151
+ float* outDistances,
152
+ // A region of memory size numQueries x k, with k
153
+ // innermost (row major)
154
+ Index::idx_t* outIndices);
155
+
156
+ } // namespace gpu
157
+ } // namespace faiss
@@ -5,12 +5,11 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
-
9
8
  #ifndef GPU_FAISS_ASSERT_INCLUDED
10
9
  #define GPU_FAISS_ASSERT_INCLUDED
11
10
 
12
- #include <faiss/impl/FaissAssert.h>
13
11
  #include <cuda.h>
12
+ #include <faiss/impl/FaissAssert.h>
14
13
 
15
14
  ///
16
15
  /// Assertions
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include <faiss/impl/LocalSearchQuantizer.h>
11
+
12
+ #include <memory>
13
+
14
+ namespace faiss {
15
+ namespace gpu {
16
+
17
+ class GpuResourcesProvider;
18
+ struct IcmEncoderShards;
19
+
20
+ /** Perform LSQ encoding on GPU.
21
+ *
22
+ * Split input vectors to different devices and call IcmEncoderImpl::encode
23
+ * to encode them
24
+ */
25
+ class GpuIcmEncoder : public lsq::IcmEncoder {
26
+ public:
27
+ GpuIcmEncoder(
28
+ const LocalSearchQuantizer* lsq,
29
+ const std::vector<GpuResourcesProvider*>& provs,
30
+ const std::vector<int>& devices);
31
+
32
+ ~GpuIcmEncoder();
33
+
34
+ GpuIcmEncoder(const GpuIcmEncoder&) = delete;
35
+ GpuIcmEncoder& operator=(const GpuIcmEncoder&) = delete;
36
+
37
+ void set_binary_term() override;
38
+
39
+ void encode(
40
+ int32_t* codes,
41
+ const float* x,
42
+ std::mt19937& gen,
43
+ size_t n,
44
+ size_t ils_iters) const override;
45
+
46
+ private:
47
+ std::unique_ptr<IcmEncoderShards> shards;
48
+ };
49
+
50
+ struct GpuIcmEncoderFactory : public lsq::IcmEncoderFactory {
51
+ explicit GpuIcmEncoderFactory(int ngpus = 1);
52
+
53
+ lsq::IcmEncoder* get(const LocalSearchQuantizer* lsq) override;
54
+
55
+ std::vector<GpuResourcesProvider*> provs;
56
+ std::vector<int> devices;
57
+ };
58
+
59
+ } // namespace gpu
60
+ } // namespace faiss