faiss 0.2.0 → 0.2.1

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