#nearest-neighbor #approximate #memory-mapped

sys granne

Graph-based Retrieval of Approximate Nearest Neighbors

3 unstable releases

0.5.2 Jun 6, 2021
0.5.0 Feb 20, 2020
0.0.0 Dec 6, 2019

#15 in #approximate

23 downloads per month

MIT license

195KB
4K SLoC

granne*

Crates.io documentation license

granne (graph-based retrieval of approximate nearest neighbors) is a Rust library for approximate nearest neighbor search based on Hierarchical Navigable Small World (HNSW) graphs and is used in Cliqz Search. It focuses on reducing memory usage in order to allow indexing billions of vectors.

Features

  • Memory-mapped
  • Multithreaded index creation
  • Extensible indexes (add elements to an already built index)
  • Python bindings
  • Dense float or int8 elements (cosine distance)

Installation

Requirements

You will need to have Rust installed. This can be done by calling:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Or by visiting https://rustup.rs/ and following the instructions there.

Rust

# build
cargo build --release

# test
cargo test

# bench
cargo +nightly bench

Python

See Python Bindings.

Optional Requirements

granne can use BLAS (https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) to improve speed of some computations. On Debian/Ubuntu both libblas-dev and libopenblas-dev should work, with the latter being significantly faster.

BLAS can be enabled by passing the blas feature during compilation, e.g.

cargo build --release --features "blas"

On Mac OS there seems to be some issue (maybe this one) with the default BLAS library. A workaround is to install e.g. openblas and link to that instead.


*granne is Swedish and means neighbor

Dependencies

~4.5–6MB
~113K SLoC