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