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
|
@@ -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
|
|
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
|
|
25
|
-
Index
|
|
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
|
|
30
|
+
struct ToGpuCloner : faiss::Cloner, GpuClonerOptions {
|
|
31
|
+
GpuResourcesProvider* provider;
|
|
32
32
|
int device;
|
|
33
33
|
|
|
34
|
-
ToGpuCloner(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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(
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
ToGpuClonerMultiple(
|
|
47
|
+
std::vector<GpuResourcesProvider*>& provider,
|
|
48
|
+
std::vector<int>& devices,
|
|
49
|
+
const GpuMultipleClonerOptions& options);
|
|
48
50
|
|
|
49
|
-
ToGpuClonerMultiple(
|
|
50
|
-
|
|
51
|
+
ToGpuClonerMultiple(
|
|
52
|
+
const std::vector<ToGpuCloner>& sub_cloners,
|
|
53
|
+
const GpuMultipleClonerOptions& options);
|
|
51
54
|
|
|
52
|
-
void copy_ivf_shard
|
|
53
|
-
|
|
55
|
+
void copy_ivf_shard(
|
|
56
|
+
const IndexIVF* index_ivf,
|
|
57
|
+
IndexIVF* idx2,
|
|
58
|
+
long n,
|
|
59
|
+
long i);
|
|
54
60
|
|
|
55
|
-
Index
|
|
61
|
+
Index* clone_Index_to_shards(const Index* index);
|
|
56
62
|
|
|
57
63
|
/// main function
|
|
58
|
-
Index
|
|
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
|
-
///
|
|
65
|
-
faiss::Index * index_gpu_to_cpu(const faiss::Index *gpu_index);
|
|
83
|
+
/// index factory for the ProgressiveDimClustering object
|
|
66
84
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
85
|
+
struct GpuProgressiveDimIndexFactory : ProgressiveDimIndexFactory {
|
|
86
|
+
GpuMultipleClonerOptions options;
|
|
87
|
+
std::vector<GpuResourcesProvider*> vres;
|
|
88
|
+
std::vector<int> devices;
|
|
89
|
+
int ncall;
|
|
72
90
|
|
|
73
|
-
|
|
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
|
-
}
|
|
98
|
+
} // namespace gpu
|
|
99
|
+
} // namespace faiss
|
|
@@ -7,22 +7,20 @@
|
|
|
7
7
|
|
|
8
8
|
#include <faiss/gpu/GpuClonerOptions.h>
|
|
9
9
|
|
|
10
|
-
namespace faiss {
|
|
10
|
+
namespace faiss {
|
|
11
|
+
namespace gpu {
|
|
11
12
|
|
|
12
13
|
GpuClonerOptions::GpuClonerOptions()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
24
|
-
shard_type(1)
|
|
25
|
-
{
|
|
26
|
-
}
|
|
23
|
+
: shard(false), shard_type(1) {}
|
|
27
24
|
|
|
28
|
-
}
|
|
25
|
+
} // namespace gpu
|
|
26
|
+
} // namespace faiss
|
|
@@ -9,45 +9,47 @@
|
|
|
9
9
|
|
|
10
10
|
#include <faiss/gpu/GpuIndicesOptions.h>
|
|
11
11
|
|
|
12
|
-
namespace faiss {
|
|
12
|
+
namespace faiss {
|
|
13
|
+
namespace gpu {
|
|
13
14
|
|
|
14
15
|
/// set some options on how to copy to GPU
|
|
15
16
|
struct GpuClonerOptions {
|
|
16
|
-
|
|
17
|
+
GpuClonerOptions();
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
/// how should indices be stored on index types that support indices
|
|
20
|
+
/// (anything but GpuIndexFlat*)?
|
|
21
|
+
IndicesOptions indicesOptions;
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
/// is the coarse quantizer in float16?
|
|
24
|
+
bool useFloat16CoarseQuantizer;
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
/// for GpuIndexIVFFlat, is storage in float16?
|
|
27
|
+
/// for GpuIndexIVFPQ, are intermediate calculations in float16?
|
|
28
|
+
bool useFloat16;
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
/// use precomputed tables?
|
|
31
|
+
bool usePrecomputed;
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
/// reserve vectors in the invfiles?
|
|
34
|
+
long reserveVecs;
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
/// For GpuIndexFlat, store data in transposed layout?
|
|
37
|
+
bool storeTransposed;
|
|
37
38
|
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
/// Set verbose options on the index
|
|
40
|
+
bool verbose;
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
struct GpuMultipleClonerOptions : public GpuClonerOptions {
|
|
43
|
-
|
|
44
|
+
GpuMultipleClonerOptions();
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
/// Whether to shard the index across GPUs, versus replication
|
|
47
|
+
/// across GPUs
|
|
48
|
+
bool shard;
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
/// IndexIVF::copy_subset_to subset type
|
|
51
|
+
int shard_type;
|
|
51
52
|
};
|
|
52
53
|
|
|
53
|
-
}
|
|
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 {
|
|
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
|
-
|
|
20
|
-
|
|
19
|
+
F32 = 1,
|
|
20
|
+
F16,
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
// Scalar type of the indices data
|
|
24
24
|
enum class IndicesDataType {
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|