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,108 +5,111 @@
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/gpu/GpuIndexIVF.h>
12
11
  #include <memory>
13
12
 
14
- namespace faiss { struct IndexIVFFlat; }
13
+ namespace faiss {
14
+ struct IndexIVFFlat;
15
+ }
15
16
 
16
- namespace faiss { namespace gpu {
17
+ namespace faiss {
18
+ namespace gpu {
17
19
 
18
20
  class IVFFlat;
19
21
  class GpuIndexFlat;
20
22
 
21
23
  struct GpuIndexIVFFlatConfig : public GpuIndexIVFConfig {
22
- inline GpuIndexIVFFlatConfig()
23
- : interleavedLayout(true) {
24
- }
24
+ inline GpuIndexIVFFlatConfig() : interleavedLayout(true) {}
25
25
 
26
- /// Use the alternative memory layout for the IVF lists
27
- /// (currently the default)
28
- bool interleavedLayout;
26
+ /// Use the alternative memory layout for the IVF lists
27
+ /// (currently the default)
28
+ bool interleavedLayout;
29
29
  };
30
30
 
31
31
  /// Wrapper around the GPU implementation that looks like
32
32
  /// faiss::IndexIVFFlat
33
33
  class GpuIndexIVFFlat : public GpuIndexIVF {
34
- public:
35
- /// Construct from a pre-existing faiss::IndexIVFFlat instance, copying
36
- /// data over to the given GPU, if the input index is trained.
37
- GpuIndexIVFFlat(GpuResourcesProvider* provider,
38
- const faiss::IndexIVFFlat* index,
39
- GpuIndexIVFFlatConfig config = GpuIndexIVFFlatConfig());
40
-
41
- /// Constructs a new instance with an empty flat quantizer; the user
42
- /// provides the number of lists desired.
43
- GpuIndexIVFFlat(GpuResourcesProvider* provider,
44
- int dims,
45
- int nlist,
46
- faiss::MetricType metric,
47
- GpuIndexIVFFlatConfig config = GpuIndexIVFFlatConfig());
48
-
49
- ~GpuIndexIVFFlat() override;
50
-
51
- /// Reserve GPU memory in our inverted lists for this number of vectors
52
- void reserveMemory(size_t numVecs);
53
-
54
- /// Initialize ourselves from the given CPU index; will overwrite
55
- /// all data in ourselves
56
- void copyFrom(const faiss::IndexIVFFlat* index);
57
-
58
- /// Copy ourselves to the given CPU index; will overwrite all data
59
- /// in the index instance
60
- void copyTo(faiss::IndexIVFFlat* index) const;
61
-
62
- /// After adding vectors, one can call this to reclaim device memory
63
- /// to exactly the amount needed. Returns space reclaimed in bytes
64
- size_t reclaimMemory();
65
-
66
- /// Clears out all inverted lists, but retains the coarse centroid information
67
- void reset() override;
68
-
69
- /// Trains the coarse quantizer based on the given vector data
70
- void train(Index::idx_t n, const float* x) override;
71
-
72
- /// Returns the number of vectors present in a particular inverted list
73
- int getListLength(int listId) const override;
74
-
75
- /// Return the encoded vector data contained in a particular inverted list,
76
- /// for debugging purposes.
77
- /// If gpuFormat is true, the data is returned as it is encoded in the
78
- /// GPU-side representation.
79
- /// Otherwise, it is converted to the CPU format.
80
- /// compliant format, while the native GPU format may differ.
81
- std::vector<uint8_t>
82
- getListVectorData(int listId, bool gpuFormat = false) const override;
83
-
84
- /// Return the vector indices contained in a particular inverted list, for
85
- /// debugging purposes.
86
- std::vector<Index::idx_t> getListIndices(int listId) const override;
87
-
88
- protected:
89
- /// Called from GpuIndex for add/add_with_ids
90
- void addImpl_(int n,
91
- const float* x,
92
- const Index::idx_t* ids) override;
93
-
94
- /// Called from GpuIndex for search
95
- void searchImpl_(int n,
96
- const float* x,
97
- int k,
98
- float* distances,
99
- Index::idx_t* labels) const override;
100
-
101
- protected:
102
- /// Our configuration options
103
- const GpuIndexIVFFlatConfig ivfFlatConfig_;
104
-
105
- /// Desired inverted list memory reservation
106
- size_t reserveMemoryVecs_;
107
-
108
- /// Instance that we own; contains the inverted list
109
- std::unique_ptr<IVFFlat> index_;
34
+ public:
35
+ /// Construct from a pre-existing faiss::IndexIVFFlat instance, copying
36
+ /// data over to the given GPU, if the input index is trained.
37
+ GpuIndexIVFFlat(
38
+ GpuResourcesProvider* provider,
39
+ const faiss::IndexIVFFlat* index,
40
+ GpuIndexIVFFlatConfig config = GpuIndexIVFFlatConfig());
41
+
42
+ /// Constructs a new instance with an empty flat quantizer; the user
43
+ /// provides the number of lists desired.
44
+ GpuIndexIVFFlat(
45
+ GpuResourcesProvider* provider,
46
+ int dims,
47
+ int nlist,
48
+ faiss::MetricType metric,
49
+ GpuIndexIVFFlatConfig config = GpuIndexIVFFlatConfig());
50
+
51
+ ~GpuIndexIVFFlat() override;
52
+
53
+ /// Reserve GPU memory in our inverted lists for this number of vectors
54
+ void reserveMemory(size_t numVecs);
55
+
56
+ /// Initialize ourselves from the given CPU index; will overwrite
57
+ /// all data in ourselves
58
+ void copyFrom(const faiss::IndexIVFFlat* index);
59
+
60
+ /// Copy ourselves to the given CPU index; will overwrite all data
61
+ /// in the index instance
62
+ void copyTo(faiss::IndexIVFFlat* index) const;
63
+
64
+ /// After adding vectors, one can call this to reclaim device memory
65
+ /// to exactly the amount needed. Returns space reclaimed in bytes
66
+ size_t reclaimMemory();
67
+
68
+ /// Clears out all inverted lists, but retains the coarse centroid
69
+ /// information
70
+ void reset() override;
71
+
72
+ /// Trains the coarse quantizer based on the given vector data
73
+ void train(Index::idx_t n, const float* x) override;
74
+
75
+ /// Returns the number of vectors present in a particular inverted list
76
+ int getListLength(int listId) const override;
77
+
78
+ /// Return the encoded vector data contained in a particular inverted list,
79
+ /// for debugging purposes.
80
+ /// If gpuFormat is true, the data is returned as it is encoded in the
81
+ /// GPU-side representation.
82
+ /// Otherwise, it is converted to the CPU format.
83
+ /// compliant format, while the native GPU format may differ.
84
+ std::vector<uint8_t> getListVectorData(int listId, bool gpuFormat = false)
85
+ const override;
86
+
87
+ /// Return the vector indices contained in a particular inverted list, for
88
+ /// debugging purposes.
89
+ std::vector<Index::idx_t> getListIndices(int listId) const override;
90
+
91
+ protected:
92
+ /// Called from GpuIndex for add/add_with_ids
93
+ void addImpl_(int n, const float* x, const Index::idx_t* ids) override;
94
+
95
+ /// Called from GpuIndex for search
96
+ void searchImpl_(
97
+ int n,
98
+ const float* x,
99
+ int k,
100
+ float* distances,
101
+ Index::idx_t* labels) const override;
102
+
103
+ protected:
104
+ /// Our configuration options
105
+ const GpuIndexIVFFlatConfig ivfFlatConfig_;
106
+
107
+ /// Desired inverted list memory reservation
108
+ size_t reserveMemoryVecs_;
109
+
110
+ /// Instance that we own; contains the inverted list
111
+ std::unique_ptr<IVFFlat> index_;
110
112
  };
111
113
 
112
- } } // namespace
114
+ } // namespace gpu
115
+ } // namespace faiss
@@ -5,166 +5,175 @@
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/gpu/GpuIndexIVF.h>
11
+ #include <faiss/impl/ProductQuantizer.h>
12
12
  #include <memory>
13
13
  #include <vector>
14
14
 
15
- namespace faiss { struct IndexIVFPQ; }
15
+ namespace faiss {
16
+ struct IndexIVFPQ;
17
+ }
16
18
 
17
- namespace faiss { namespace gpu {
19
+ namespace faiss {
20
+ namespace gpu {
18
21
 
19
22
  class GpuIndexFlat;
20
23
  class IVFPQ;
21
24
 
22
25
  struct GpuIndexIVFPQConfig : public GpuIndexIVFConfig {
23
- inline GpuIndexIVFPQConfig()
24
- : useFloat16LookupTables(false),
25
- usePrecomputedTables(false),
26
- interleavedLayout(false),
27
- useMMCodeDistance(false) {
28
- }
29
-
30
- /// Whether or not float16 residual distance tables are used in the
31
- /// list scanning kernels. When subQuantizers * 2^bitsPerCode >
32
- /// 16384, this is required.
33
- bool useFloat16LookupTables;
34
-
35
- /// Whether or not we enable the precomputed table option for
36
- /// search, which can substantially increase the memory requirement.
37
- bool usePrecomputedTables;
38
-
39
- /// Use the alternative memory layout for the IVF lists
40
- /// WARNING: this is a feature under development, do not use!
41
- bool interleavedLayout;
42
-
43
- /// Use GEMM-backed computation of PQ code distances for the no precomputed
44
- /// table version of IVFPQ.
45
- /// This is for debugging purposes, it should not substantially affect the
46
- /// results one way for another.
47
- ///
48
- /// Note that MM code distance is enabled automatically if one uses a number
49
- /// of dimensions per sub-quantizer that is not natively specialized (an odd
50
- /// number like 7 or so).
51
- bool useMMCodeDistance;
26
+ inline GpuIndexIVFPQConfig()
27
+ : useFloat16LookupTables(false),
28
+ usePrecomputedTables(false),
29
+ interleavedLayout(false),
30
+ useMMCodeDistance(false) {}
31
+
32
+ /// Whether or not float16 residual distance tables are used in the
33
+ /// list scanning kernels. When subQuantizers * 2^bitsPerCode >
34
+ /// 16384, this is required.
35
+ bool useFloat16LookupTables;
36
+
37
+ /// Whether or not we enable the precomputed table option for
38
+ /// search, which can substantially increase the memory requirement.
39
+ bool usePrecomputedTables;
40
+
41
+ /// Use the alternative memory layout for the IVF lists
42
+ /// WARNING: this is a feature under development, do not use!
43
+ bool interleavedLayout;
44
+
45
+ /// Use GEMM-backed computation of PQ code distances for the no precomputed
46
+ /// table version of IVFPQ.
47
+ /// This is for debugging purposes, it should not substantially affect the
48
+ /// results one way for another.
49
+ ///
50
+ /// Note that MM code distance is enabled automatically if one uses a number
51
+ /// of dimensions per sub-quantizer that is not natively specialized (an odd
52
+ /// number like 7 or so).
53
+ bool useMMCodeDistance;
52
54
  };
53
55
 
54
56
  /// IVFPQ index for the GPU
55
57
  class GpuIndexIVFPQ : public GpuIndexIVF {
56
- public:
57
- /// Construct from a pre-existing faiss::IndexIVFPQ instance, copying
58
- /// data over to the given GPU, if the input index is trained.
59
- GpuIndexIVFPQ(GpuResourcesProvider* provider,
60
- const faiss::IndexIVFPQ* index,
61
- GpuIndexIVFPQConfig config = GpuIndexIVFPQConfig());
58
+ public:
59
+ /// Construct from a pre-existing faiss::IndexIVFPQ instance, copying
60
+ /// data over to the given GPU, if the input index is trained.
61
+ GpuIndexIVFPQ(
62
+ GpuResourcesProvider* provider,
63
+ const faiss::IndexIVFPQ* index,
64
+ GpuIndexIVFPQConfig config = GpuIndexIVFPQConfig());
65
+
66
+ /// Construct an empty index
67
+ GpuIndexIVFPQ(
68
+ GpuResourcesProvider* provider,
69
+ int dims,
70
+ int nlist,
71
+ int subQuantizers,
72
+ int bitsPerCode,
73
+ faiss::MetricType metric,
74
+ GpuIndexIVFPQConfig config = GpuIndexIVFPQConfig());
75
+
76
+ ~GpuIndexIVFPQ() override;
77
+
78
+ /// Reserve space on the GPU for the inverted lists for `num`
79
+ /// vectors, assumed equally distributed among
80
+
81
+ /// Initialize ourselves from the given CPU index; will overwrite
82
+ /// all data in ourselves
83
+ void copyFrom(const faiss::IndexIVFPQ* index);
84
+
85
+ /// Copy ourselves to the given CPU index; will overwrite all data
86
+ /// in the index instance
87
+ void copyTo(faiss::IndexIVFPQ* index) const;
88
+
89
+ /// Reserve GPU memory in our inverted lists for this number of vectors
90
+ void reserveMemory(size_t numVecs);
91
+
92
+ /// Enable or disable pre-computed codes
93
+ void setPrecomputedCodes(bool enable);
94
+
95
+ /// Are pre-computed codes enabled?
96
+ bool getPrecomputedCodes() const;
97
+
98
+ /// Return the number of sub-quantizers we are using
99
+ int getNumSubQuantizers() const;
100
+
101
+ /// Return the number of bits per PQ code
102
+ int getBitsPerCode() const;
103
+
104
+ /// Return the number of centroids per PQ code (2^bits per code)
105
+ int getCentroidsPerSubQuantizer() const;
106
+
107
+ /// After adding vectors, one can call this to reclaim device memory
108
+ /// to exactly the amount needed. Returns space reclaimed in bytes
109
+ size_t reclaimMemory();
110
+
111
+ /// Clears out all inverted lists, but retains the coarse and
112
+ /// product centroid information
113
+ void reset() override;
114
+
115
+ /// Trains the coarse and product quantizer based on the given vector data
116
+ void train(Index::idx_t n, const float* x) override;
117
+
118
+ /// Returns the number of vectors present in a particular inverted list
119
+ int getListLength(int listId) const override;
120
+
121
+ /// Return the encoded vector data contained in a particular inverted list,
122
+ /// for debugging purposes.
123
+ /// If gpuFormat is true, the data is returned as it is encoded in the
124
+ /// GPU-side representation.
125
+ /// Otherwise, it is converted to the CPU format.
126
+ /// compliant format, while the native GPU format may differ.
127
+ std::vector<uint8_t> getListVectorData(int listId, bool gpuFormat = false)
128
+ const override;
129
+
130
+ /// Return the vector indices contained in a particular inverted list, for
131
+ /// debugging purposes.
132
+ std::vector<Index::idx_t> getListIndices(int listId) const override;
133
+
134
+ public:
135
+ /// Like the CPU version, we expose a publically-visible ProductQuantizer
136
+ /// for manipulation
137
+ ProductQuantizer pq;
138
+
139
+ protected:
140
+ /// Called from GpuIndex for add/add_with_ids
141
+ void addImpl_(int n, const float* x, const Index::idx_t* ids) override;
142
+
143
+ /// Called from GpuIndex for search
144
+ void searchImpl_(
145
+ int n,
146
+ const float* x,
147
+ int k,
148
+ float* distances,
149
+ Index::idx_t* labels) const override;
150
+
151
+ /// Throws errors if configuration settings are improper
152
+ void verifySettings_() const;
153
+
154
+ /// Trains the PQ quantizer based on the given vector data
155
+ void trainResidualQuantizer_(Index::idx_t n, const float* x);
156
+
157
+ protected:
158
+ /// Our configuration options that we were initialized with
159
+ const GpuIndexIVFPQConfig ivfpqConfig_;
160
+
161
+ /// Runtime override: whether or not we use precomputed tables
162
+ bool usePrecomputedTables_;
62
163
 
63
- /// Construct an empty index
64
- GpuIndexIVFPQ(GpuResourcesProvider* provider,
65
- int dims,
66
- int nlist,
67
- int subQuantizers,
68
- int bitsPerCode,
69
- faiss::MetricType metric,
70
- GpuIndexIVFPQConfig config = GpuIndexIVFPQConfig());
71
-
72
- ~GpuIndexIVFPQ() override;
73
-
74
- /// Reserve space on the GPU for the inverted lists for `num`
75
- /// vectors, assumed equally distributed among
76
-
77
- /// Initialize ourselves from the given CPU index; will overwrite
78
- /// all data in ourselves
79
- void copyFrom(const faiss::IndexIVFPQ* index);
80
-
81
- /// Copy ourselves to the given CPU index; will overwrite all data
82
- /// in the index instance
83
- void copyTo(faiss::IndexIVFPQ* index) const;
84
-
85
- /// Reserve GPU memory in our inverted lists for this number of vectors
86
- void reserveMemory(size_t numVecs);
87
-
88
- /// Enable or disable pre-computed codes
89
- void setPrecomputedCodes(bool enable);
90
-
91
- /// Are pre-computed codes enabled?
92
- bool getPrecomputedCodes() const;
93
-
94
- /// Return the number of sub-quantizers we are using
95
- int getNumSubQuantizers() const;
96
-
97
- /// Return the number of bits per PQ code
98
- int getBitsPerCode() const;
99
-
100
- /// Return the number of centroids per PQ code (2^bits per code)
101
- int getCentroidsPerSubQuantizer() const;
102
-
103
- /// After adding vectors, one can call this to reclaim device memory
104
- /// to exactly the amount needed. Returns space reclaimed in bytes
105
- size_t reclaimMemory();
106
-
107
- /// Clears out all inverted lists, but retains the coarse and
108
- /// product centroid information
109
- void reset() override;
110
-
111
- /// Trains the coarse and product quantizer based on the given vector data
112
- void train(Index::idx_t n, const float* x) override;
113
-
114
- /// Returns the number of vectors present in a particular inverted list
115
- int getListLength(int listId) const override;
116
-
117
- /// Return the encoded vector data contained in a particular inverted list,
118
- /// for debugging purposes.
119
- /// If gpuFormat is true, the data is returned as it is encoded in the
120
- /// GPU-side representation.
121
- /// Otherwise, it is converted to the CPU format.
122
- /// compliant format, while the native GPU format may differ.
123
- std::vector<uint8_t>
124
- getListVectorData(int listId, bool gpuFormat = false) const override;
125
-
126
- /// Return the vector indices contained in a particular inverted list, for
127
- /// debugging purposes.
128
- std::vector<Index::idx_t> getListIndices(int listId) const override;
129
-
130
- protected:
131
- /// Called from GpuIndex for add/add_with_ids
132
- void addImpl_(int n,
133
- const float* x,
134
- const Index::idx_t* ids) override;
135
-
136
- /// Called from GpuIndex for search
137
- void searchImpl_(int n,
138
- const float* x,
139
- int k,
140
- float* distances,
141
- Index::idx_t* labels) const override;
142
-
143
- /// Throws errors if configuration settings are improper
144
- void verifySettings_() const;
145
-
146
- /// Trains the PQ quantizer based on the given vector data
147
- void trainResidualQuantizer_(Index::idx_t n, const float* x);
148
-
149
- protected:
150
- /// Our configuration options that we were initialized with
151
- const GpuIndexIVFPQConfig ivfpqConfig_;
152
-
153
- /// Runtime override: whether or not we use precomputed tables
154
- bool usePrecomputedTables_;
155
-
156
- /// Number of sub-quantizers per encoded vector
157
- int subQuantizers_;
164
+ /// Number of sub-quantizers per encoded vector
165
+ int subQuantizers_;
158
166
 
159
- /// Bits per sub-quantizer code
160
- int bitsPerCode_;
167
+ /// Bits per sub-quantizer code
168
+ int bitsPerCode_;
161
169
 
162
- /// Desired inverted list memory reservation
163
- size_t reserveMemoryVecs_;
170
+ /// Desired inverted list memory reservation
171
+ size_t reserveMemoryVecs_;
164
172
 
165
- /// The product quantizer instance that we own; contains the
166
- /// inverted lists
167
- std::unique_ptr<IVFPQ> index_;
173
+ /// The product quantizer instance that we own; contains the
174
+ /// inverted lists
175
+ std::unique_ptr<IVFPQ> index_;
168
176
  };
169
177
 
170
- } } // namespace
178
+ } // namespace gpu
179
+ } // namespace faiss