# Changelog All notable changes to this project will be documented in this file. ## [Unreleased] ## [1.10.0] - 2025-01-30 Added - Add desc_name to dataset descriptor (#3935) - implement ST_norm_from_LUT for the ResidualQuantizer (#3917) - Add example of how to build, link, and test an external SWIG module (#3922) - add copyright header (#3948) - Add some SVE implementations (#3933) - Enable linting: lint config changes plus arc lint command (#3966) - Re-add example of how to build, link, and test an external SWIG module (#3981) - demo: IndexPQ: separate codes from codebook (#3987) - add all wrapped indexes to the index_read (#3988) - add validity check AlignedTableTightAlloc clear method (#3997) - Add index binary to telemetry (#4001) - Add VectorTransform read from filename to the C API (#3970) - Added IndexLSH to the demo (#4009) - write distributed_kmeans centroids and assignments to hive tables (#4017) - introduce data splits in dataset descriptor (#4012) - Faiss GPU: bfloat16 brute-force kNN support (#4018) - ROCm support for bfloat16 (#4039) - Unit tests for distances_simd.cpp (#4058) - add cuda-toolkit for GPU (#4057) - Add more unit testing for IndexHNSW [1/n] (#4054) - Add more unit testing for IndexHNSW [2/n] (#4056) - Add more unit testing for HNSW [3/n] (#4059) - Add more unit testing for HNSW [4/n] (#4061) - Add more unit tests for index_read and index_write (#4068) - Add testing for utils/hamming.cpp (#4079) - Test sa_decode methd on IndexIVFFlat (#4098) - Conditionally compile extras like benchmarks and demos (#4094) - Add a new architecture mode: 'avx512_spr'. (#4025) - Use _mm512_popcnt_epi64 to speedup hamming distance evaluation. (#4020) - PQ with pytorch (#4116) - add range_search() to IndexRefine (#4022) - Expose accumulate_to_mem from faiss interface (#4099) - Windows Arm64 support (#4087) - add test to cover GPU (#4130) - Added support for building without MKL (#4147) Changed - Move train, build and search to their respective operators (#3934) - PQFS into Index trainer (#3941) - Place a useful cmake function 'link_to_faiss_lib' into a separate file (#3939) - Cache device major version value to avoid multiple calls of getCudaDeviceProperties (#3950) - Consolidate set_target_properties() calls in faiss/CMakeLists.txt (#3973) - Removing Manual Hipify Build Step (#3962) - Allow to replace graph structure for NSG graphs (#3975) - Adjust nightly build (#3978) - Update RAFT CI with pytorch 2.4.1 (#3980) - Moved add_sa_codes, sa_code_size to Index, IndexBinary base classes (#3989) - Update autoclose.yml (#4000) - Migrate from RAFT to CUVS (#3549) - Pin to numpy<2 (#4033) - (1/n) - Preload datasets in manifold so that subsequent stages of training, indexing and search can use those instead of each trainer or indexer downloading data. (#4034) - Constrain conda version for Windows build (#4040) - Updates to faiss-gpu-cuvs nightly pkg (#4032) - pin the dependecies version for x86_64 (#4046) - pin arm64 dependency (#4060) - Pin conda build (#4062) - Improve naming due to codemod (#4063) - Improve naming due to codemod (#4064) - Improve naming due to codemod (#4065) - separare the github build into two conditions (#4066) - Improve naming due to codemod (#4070) - improve naming due to codemod (#4067) - improve naming due to codemod (#4071) - improve naming due to codemod (#4072) - fix nightily build (#4080) - Change github action workflows name (#4083) - Resolve Packaging Issues (#4044) - Update __init__.py (#4086) - Exhaustive IVF probing in scalar quantizer tests (#4075) - Pin Nightlies with testing on PR (#4088) - Update benchmarking library code to work for IdMap index as well (#4093) - Update action.yml (#4100) - Upgrade CUVS to 24.12 (#4021) - Link cuVS Docs (#4084) - Set KnnDescriptor.desc_name in the Benchmarking core framework in FAISS like other descriptors (#4109) - enable quiet mode for conda install (#4112) - Disable retry build (#4124) - Add ngpu default argument to knn_ground_truth (#4123) - Update code comment to reflect the range of IF from [1, k] (#4139) - Reenable auto retry workflow (#4140) - Migration off defaults to conda-forge channel (#4126) - Benchmarking Scripts for cuVS Index, more docs updates (#4117) Fixed - Fix total_rows (#3942) - Fix INSTALL.md due to failure of conflict resolving (#3915) - Back out "Add example of how to build, link, and test an external SWIG module" (#3954) - Fix shadowed variable in faiss/IndexPQ.cpp (#3959) - Fix shadowed variable in faiss/IndexIVFAdditiveQuantizer.cpp (#3958) - Fix shadowed variable in faiss/impl/HNSW.cpp (#3961) - Fix shadowed variable in faiss/impl/simd_result_handlers.h (#3960) - Fix shadowed variable in faiss/utils/NeuralNet.cpp (#3952) - Resolve "incorrect-portions-license" errors: add no license lint to top of GPU files with both licenses (#3965) - Resolve "duplicate-license-header": Find and replace duplicate license headers (#3967) - fix some more nvidia licenses that get erased (#3977) - fix merge_flat_ondisk stress run failures (#3999) - Fix reverse_index_factory formatting of ScalarQuantizers (#4003) - Fix shadowed variable in faiss/IndexAdditiveQuantizer.cpp (#4011) - facebook-unused-include-check in fbcode/faiss (#4029) - fix linter (#4035) - Some chore fixes (#4010) - Fix unused variable compilation error (#4041) - stop dealloc of coarse quantizer when it is deleted (#4045) - Fix SCD Table test flakiness (#4069) - Fix IndexIVFFastScan reconstruct_from_offset method (#4095) - more fast-scan reconstruction (#4128) - Fix nightly cuVS 11.8.0 failure (#4149) - Correct capitalization of FAISS to Faiss (#4155) - Fix cuVS 12.4.0 nightly failure (#4153) Deprecated - Remove unused-variable in dumbo/backup/dumbo/service/tests/ChainReplicatorTests.cpp (#4024) - remove inconsistent oom exception test (#4052) - Remove unused(and wrong) io macro (#4122) ## [1.9.0] - 2024-10-04 ### Added - Add AVX-512 implementation for the distance and scalar quantizer functions. (#3853) - Allow k and M suffixes in IVF indexes (#3812) - add reconstruct support to additive quantizers (#3752) - introduce options for reducing the overhead for a clustering procedure (#3731) - Add hnsw search params for bounded queue option (#3748) - ROCm support (#3462) - Add sve targets (#2886) - add get_version() for c_api (#3688) - QINCo implementation in CPU Faiss (#3608) - Add search functionality to FlatCodes (#3611) - add dispatcher for VectorDistance and ResultHandlers (#3627) - Add SQ8bit signed quantization (#3501) - Add ABS_INNER_PRODUCT metric (#3524) - Interop between CAGRA and HNSW (#3252) - add skip_storage flag to HNSW (#3487) - QT_bf16 for scalar quantizer for bfloat16 (#3444) - Implement METRIC.NaNEuclidean (#3414) - TimeoutCallback C++ and Python (#3417) - support big-endian machines (#3361) - Support for Remove ids from IVFPQFastScan index (#3354) - Implement reconstruct_n for GPU IVFFlat indexes (#3338) - Support of skip_ids in merge_from_multiple function of OnDiskInvertedLists (#3327) - Add the ability to clone and read binary indexes to the C API. (#3318) - AVX512 for PQFastScan (#3276) ### Changed - faster hnsw CPU index training (#3822) - Some small improvements. (#3692) - First attempt at LSH matching with nbits (#3679) - Set verbosoe before train (#3619) - Remove duplicate NegativeDistanceComputer instances (#3450) - interrupt for NNDescent (#3432) - Get rid of redundant instructions in ScalarQuantizer (#3430) - PowerPC, improve code generation for function fvec_L2sqr (#3416) - Unroll loop in lookup_2_lanes (#3364) - Improve filtering & search parameters propagation (#3304) - Change index_cpu_to_gpu to throw for indices not implemented on GPU (#3336) - Throw when attempting to move IndexPQ to GPU (#3328) - Skip HNSWPQ sdc init with new io flag (#3250) ### Fixed - FIx a bug for a non-simdlib code of ResidualQuantizer (#3868) - assign_index should default to null (#3855) - Fix an incorrectly counted the number of computed distances for HNSW (#3840) - Add error for overflowing nbits during PQ construction (#3833) - Fix radius search with HSNW and IP (#3698) - fix algorithm of spreading vectors over shards (#3374) - Fix IndexBinary.assign Python method (#3384) - Few fixes in bench_fw to enable IndexFromCodec (#3383) - Fix the endianness issue in AIX while running the benchmark. (#3345) - Fix faiss swig build with version > 4.2.x (#3315) - Fix problems when using 64-bit integers. (#3322) - Fix IVFPQFastScan decode function (#3312) - Handling FaissException in few destructors of ResultHandler.h (#3311) - Fix HNSW stats (#3309) - AIX compilation fix for io classes (#3275) ## [1.8.0] - 2024-02-27 ### Added - Added a new conda package faiss-gpu-raft alongside faiss-cpu and faiss-gpu - Integrated IVF-Flat and IVF-PQ implementations in faiss-gpu-raft from RAFT by Nvidia [thanks Corey Nolet and Tarang Jain] - Added a context parameter to InvertedLists and InvertedListsIterator - Added Faiss on Rocksdb demo to showing how inverted lists can be persisted in a key-value store - Introduced Offline IVF framework powered by Faiss big batch search - Added SIMD NEON Optimization for QT_FP16 in Scalar Quantizer. [thanks Naveen Tatikonda] - Generalized ResultHandler and supported range search for HNSW and FastScan - Introduced avx512 optimization mode and FAISS_OPT_LEVEL env variable [thanks Alexandr Ghuzva] - Added search parameters for IndexRefine::search() and IndexRefineFlat::search() - Supported large two-level clustering - Added support for Python 3.11 and 3.12 - Added support for CUDA 12 ### Changed - Used the benchmark to find Pareto optimal indices. Intentionally limited to IVF(Flat|HNSW),PQ|SQ indices - Splitted off RQ encoding steps to another file - Supported better NaN handling - HNSW speedup + Distance 4 points [thanks Alexandr Ghuzva] ### Fixed - Fixed DeviceVector reallocations in Faiss GPU - Used efSearch from params if provided in HNSW search - Fixed warp synchronous behavior in Faiss GPU CUDA 12 ## [1.7.4] - 2023-04-12 ### Added - Added big batch IVF search for conducting efficient search with big batches of queries - Checkpointing in big batch search support - Precomputed centroids support - Support for iterable inverted lists for eg. key value stores - 64-bit indexing arithmetic support in FAISS GPU - IndexIVFShards now handle IVF indexes with a common quantizer - Jaccard distance support - CodePacker for non-contiguous code layouts - Approximate evaluation of top-k distances for ResidualQuantizer and IndexBinaryFlat - Added support for 12-bit PQ / IVFPQ fine quantizer decoders for standalone vector codecs (faiss/cppcontrib) - Conda packages for osx-arm64 (Apple M1) and linux-aarch64 (ARM64) architectures - Support for Python 3.10 ### Removed - CUDA 10 is no longer supported in precompiled packages - Removed Python 3.7 support for precompiled packages - Removed constraint for using fine quantizer with no greater than 8 bits for IVFPQ, for example, now it is possible to use IVF256,PQ10x12 for a CPU index ### Changed - Various performance optimizations for PQ / IVFPQ for AVX2 and ARM for training (fused distance+nearest kernel), search (faster kernels for distance_to_code() and scan_list_*()) and vector encoding - A magnitude faster CPU code for LSQ/PLSQ training and vector encoding (reworked code) - Performance improvements for Hamming Code computations for AVX2 and ARM (reworked code) - Improved auto-vectorization support for IP and L2 distance computations (better handling of pragmas) - Improved ResidualQuantizer vector encoding (pooling memory allocations, avoid r/w to a temporary buffer) ### Fixed - HSNW bug fixed which improves the recall rate! Special thanks to zh Wang @hhy3 for this. - Faiss GPU IVF large query batch fix - Faiss + Torch fixes, re-enable k = 2048 - Fix the number of distance computations to match max_codes parameter - Fix decoding of large fast_scan blocks ## [1.7.3] - 2022-11-3 ### Added - Added sparse k-means routines and moved the generic kmeans to contrib - Added FlatDistanceComputer for all FlatCodes indexes - Support for fast accumulation of 4-bit LSQ and RQ - Added product additive quantization - Support per-query search parameters for many indexes + filtering by ids - write_VectorTransform and read_vectorTransform were added to the public API (by @AbdelrahmanElmeniawy) - Support for IDMap2 in index_factory by adding "IDMap2" to prefix or suffix of the input String (by @AbdelrahmanElmeniawy) - Support for merging all IndexFlatCodes descendants (by @AbdelrahmanElmeniawy) - Remove and merge features for IndexFastScan (by @AbdelrahmanElmeniawy) - Performance improvements: 1) specialized the AVX2 pieces of code speeding up certain hotspots, 2) specialized kernels for vector codecs (this can be found in faiss/cppcontrib) ### Fixed - Fixed memory leak in OnDiskInvertedLists::do_mmap when the file is not closed (by @AbdelrahmanElmeniawy) - LSH correctly throws error for metric types other than METRIC_L2 (by @AbdelrahmanElmeniawy) ## [1.7.2] - 2021-12-15 ### Added - Support LSQ on GPU (by @KinglittleQ) - Support for exact 1D kmeans (by @KinglittleQ) ## [1.7.1] - 2021-05-27 ### Added - Support for building C bindings through the `FAISS_ENABLE_C_API` CMake option. - Serializing the indexes with the python pickle module - Support for the NNDescent k-NN graph building method (by @KinglittleQ) - Support for the NSG graph indexing method (by @KinglittleQ) - Residual quantizers: support as codec and unoptimized search - Support for 4-bit PQ implementation for ARM (by @vorj, @n-miyamoto-fixstars, @LWisteria, and @matsui528) - Implementation of Local Search Quantization (by @KinglittleQ) ### Changed - The order of xb an xq was different between `faiss.knn` and `faiss.knn_gpu`. Also the metric argument was called distance_type. - The typed vectors (LongVector, LongLongVector, etc.) of the SWIG interface have been deprecated. They have been replaced with Int32Vector, Int64Vector, etc. (by h-vetinari) ### Fixed - Fixed a bug causing kNN search functions for IndexBinaryHash and IndexBinaryMultiHash to return results in a random order. - Copy constructor of AlignedTable had a bug leading to crashes when cloning IVFPQ indices. ## [1.7.0] - 2021-01-27 ## [1.6.5] - 2020-11-22 ## [1.6.4] - 2020-10-12 ### Added - Arbitrary dimensions per sub-quantizer now allowed for `GpuIndexIVFPQ`. - Brute-force kNN on GPU (`bfKnn`) now accepts `int32` indices. - Nightly conda builds now available (for CPU). - Faiss is now supported on Windows. ## [1.6.3] - 2020-03-24 ### Added - Support alternative distances on GPU for GpuIndexFlat, including L1, Linf and Lp metrics. - Support METRIC_INNER_PRODUCT for GpuIndexIVFPQ. - Support float16 coarse quantizer for GpuIndexIVFFlat and GpuIndexIVFPQ. GPU Tensor Core operations (mixed-precision arithmetic) are enabled on supported hardware when operating with float16 data. - Support k-means clustering with encoded vectors. This makes it possible to train on larger datasets without decompressing them in RAM, and is especially useful for binary datasets (see https://github.com/facebookresearch/faiss/blob/main/tests/test_build_blocks.py#L92). - Support weighted k-means. Weights can be associated to each training point (see https://github.com/facebookresearch/faiss/blob/main/tests/test_build_blocks.py). - Serialize callback in python, to write to pipes or sockets (see https://github.com/facebookresearch/faiss/wiki/Index-IO,-cloning-and-hyper-parameter-tuning). - Reconstruct arbitrary ids from IndexIVF + efficient remove of a small number of ids. This avoids 2 inefficiencies: O(ntotal) removal of vectors and IndexIDMap2 on top of indexIVF. Documentation here: https://github.com/facebookresearch/faiss/wiki/Special-operations-on-indexes. - Support inner product as a metric in IndexHNSW (see https://github.com/facebookresearch/faiss/blob/main/tests/test_index.py#L490). - Support PQ of sizes other than 8 bit in IndexIVFPQ. - Demo on how to perform searches sequentially on an IVF index. This is useful for an OnDisk index with a very large batch of queries. In that case, it is worthwhile to scan the index sequentially (see https://github.com/facebookresearch/faiss/blob/main/tests/test_ivflib.py#L62). - Range search support for most binary indexes. - Support for hashing-based binary indexes (see https://github.com/facebookresearch/faiss/wiki/Binary-indexes). ### Changed - Replaced obj table in Clustering object: now it is a ClusteringIterationStats structure that contains additional statistics. ### Removed - Removed support for useFloat16Accumulator for accumulators on GPU (all accumulations are now done in float32, regardless of whether float16 or float32 input data is used). ### Fixed - Some python3 fixes in benchmarks. - Fixed GpuCloner (some fields were not copied, default to no precomputed tables with IndexIVFPQ). - Fixed support for new pytorch versions. - Serialization bug with alternative distances. - Removed test on multiple-of-4 dimensions when switching between blas and AVX implementations. ## [1.6.2] - 2020-03-10 ## [1.6.1] - 2019-12-04 ## [1.6.0] - 2019-09-24 ### Added - Faiss as a codec: We introduce a new API within Faiss to encode fixed-size vectors into fixed-size codes. The encoding is lossy and the tradeoff between compression and reconstruction accuracy can be adjusted. - ScalarQuantizer support for GPU, see gpu/GpuIndexIVFScalarQuantizer.h. This is particularly useful as GPU memory is often less abundant than CPU. - Added easy-to-use serialization functions for indexes to byte arrays in Python (faiss.serialize_index, faiss.deserialize_index). - The Python KMeans object can be used to use the GPU directly, just add gpu=True to the constuctor see gpu/test/test_gpu_index.py test TestGPUKmeans. ### Changed - Change in the code layout: many C++ sources are now in subdirectories impl/ and utils/. ## [1.5.3] - 2019-06-24 ### Added - Basic support for 6 new metrics in CPU IndexFlat and IndexHNSW (https://github.com/facebookresearch/faiss/issues/848). - Support for IndexIDMap/IndexIDMap2 with binary indexes (https://github.com/facebookresearch/faiss/issues/780). ### Changed - Throw python exception for OOM (https://github.com/facebookresearch/faiss/issues/758). - Make DistanceComputer available for all random access indexes. - Gradually moving from long to uint64_t for portability. ### Fixed - Slow scanning of inverted lists (https://github.com/facebookresearch/faiss/issues/836). ## [1.5.2] - 2019-05-28 ### Added - Support for searching several inverted lists in parallel (parallel_mode != 0). - Better support for PQ codes where nbit != 8 or 16. - IVFSpectralHash implementation: spectral hash codes inside an IVF. - 6-bit per component scalar quantizer (4 and 8 bit were already supported). - Combinations of inverted lists: HStackInvertedLists and VStackInvertedLists. - Configurable number of threads for OnDiskInvertedLists prefetching (including 0=no prefetch). - More test and demo code compatible with Python 3 (print with parentheses). ### Changed - License was changed from BSD+Patents to MIT. - Exceptions raised in sub-indexes of IndexShards and IndexReplicas are now propagated. - Refactored benchmark code: data loading is now in a single file. ## [1.5.1] - 2019-04-05 ### Added - MatrixStats object, which reports useful statistics about a dataset. - Option to round coordinates during k-means optimization. - An alternative option for search in HNSW. - Support for range search in IVFScalarQuantizer. - Support for direct uint_8 codec in ScalarQuantizer. - Better support for PQ code assignment with external index. - Support for IMI2x16 (4B virtual centroids). - Support for k = 2048 search on GPU (instead of 1024). - Support for renaming an ondisk invertedlists. - Support for nterrupting computations with interrupt signal (ctrl-C) in python. - Simplified build system (with --with-cuda/--with-cuda-arch options). ### Changed - Moved stats() and imbalance_factor() from IndexIVF to InvertedLists object. - Renamed IndexProxy to IndexReplicas. - Most CUDA mem alloc failures now throw exceptions instead of terminating on an assertion. - Updated example Dockerfile. - Conda packages now depend on the cudatoolkit packages, which fixes some interferences with pytorch. Consequentially, faiss-gpu should now be installed by conda install -c pytorch faiss-gpu cudatoolkit=10.0. ## [1.5.0] - 2018-12-19 ### Added - New GpuIndexBinaryFlat index. - New IndexBinaryHNSW index. ## [1.4.0] - 2018-08-30 ### Added - Automatic tracking of C++ references in Python. - Support for non-intel platforms, some functions optimized for ARM. - Support for overriding nprobe for concurrent searches. - Support for floating-point quantizers in binary indices. ### Fixed - No more segfaults due to Python's GC. - GpuIndexIVFFlat issues for float32 with 64 / 128 dims. - Sharding of flat indexes on GPU with index_cpu_to_gpu_multiple. ## [1.3.0] - 2018-07-10 ### Added - Support for binary indexes (IndexBinaryFlat, IndexBinaryIVF). - Support fp16 encoding in scalar quantizer. - Support for deduplication in IndexIVFFlat. - Support for index serialization. ### Fixed - MMAP bug for normal indices. - Propagation of io_flags in read func. - k-selection for CUDA 9. - Race condition in OnDiskInvertedLists. ## [1.2.1] - 2018-02-28 ### Added - Support for on-disk storage of IndexIVF data. - C bindings. - Extended tutorial to GPU indices. [Unreleased]: https://github.com/facebookresearch/faiss/compare/v1.9.0...HEAD [1.9.0]: https://github.com/facebookresearch/faiss/compare/v1.8.0...v1.9.0 [1.8.0]: https://github.com/facebookresearch/faiss/compare/v1.7.4...v1.8.0 [1.7.4]: https://github.com/facebookresearch/faiss/compare/v1.7.3...v1.7.4 [1.7.3]: https://github.com/facebookresearch/faiss/compare/v1.7.2...v1.7.3 [1.7.2]: https://github.com/facebookresearch/faiss/compare/v1.7.1...v1.7.2 [1.7.1]: https://github.com/facebookresearch/faiss/compare/v1.7.0...v1.7.1 [1.7.0]: https://github.com/facebookresearch/faiss/compare/v1.6.5...v1.7.0 [1.6.5]: https://github.com/facebookresearch/faiss/compare/v1.6.4...v1.6.5 [1.6.4]: https://github.com/facebookresearch/faiss/compare/v1.6.3...v1.6.4 [1.6.3]: https://github.com/facebookresearch/faiss/compare/v1.6.2...v1.6.3 [1.6.2]: https://github.com/facebookresearch/faiss/compare/v1.6.1...v1.6.2 [1.6.1]: https://github.com/facebookresearch/faiss/compare/v1.6.0...v1.6.1 [1.6.0]: https://github.com/facebookresearch/faiss/compare/v1.5.3...v1.6.0 [1.5.3]: https://github.com/facebookresearch/faiss/compare/v1.5.2...v1.5.3 [1.5.2]: https://github.com/facebookresearch/faiss/compare/v1.5.1...v1.5.2 [1.5.1]: https://github.com/facebookresearch/faiss/compare/v1.5.0...v1.5.1 [1.5.0]: https://github.com/facebookresearch/faiss/compare/v1.4.0...v1.5.0 [1.4.0]: https://github.com/facebookresearch/faiss/compare/v1.3.0...v1.4.0 [1.3.0]: https://github.com/facebookresearch/faiss/compare/v1.2.1...v1.3.0 [1.2.1]: https://github.com/facebookresearch/faiss/releases/tag/v1.2.1