#vector-search #vector #faiss #ai #simarly

sys faiss4rs

Rust对Facebook的faiss的包装

7个稳定版本

1.6.307 2020年5月7日
1.6.306 2020年5月3日
1.6.305 2020年5月1日
1.6.301 2020年4月30日

#323 in 机器学习

每月21次下载

Apache-2.0

18KB
375 代码行

Faiss for rust

本项目为Faiss(先进的向量搜索和聚类库)提供Rust绑定。

[dependencies]
faiss4rs = "1.6.306"
  • 1.6.3是faiss版本,最后的xx是本项目版本

您需要在您的编译器中编译faiss,并将其设置为 /usr/local/lib/usr/lib 或环境变量 LD_LIBRARY_PATH

此库可在 'macos' 或 linux 上使用,但不支持 windows

示例

    use rand;
    let dimension: usize = 128;
    let index_size = 100000;
    let train_size = 10000;

    let mut conf = Config::new(dimension as i32);
    conf.path = String::from("temp/large.index");
    conf.description = String::from("PCA32,IVF1,PQ8");
    let index = Index::new(conf);

    assert!(index.dimension() == dimension as i32);

    println!("========= dimension {}", index.dimension());
    println!("========= test train");
    let mut vec = Vec::with_capacity(dimension * train_size);
    for _ in 0..vec.capacity() {
        let v = rand::random::<f32>();
        vec.push(v);
    }

    assert!(!index.is_trained());
    println!("is_trained:{}", index.is_trained());
    index.train(&vec).unwrap();

    println!("========= test add with id");

    for i in 0..200 {
        let mut vec = Vec::with_capacity(dimension);
        for _i in 0..vec.capacity() {
            vec.push(rand::random::<f32>());
        }
        index.add_with_id(i * 9, &vec).unwrap();
    }

    println!("========= test add with ids");
    let mut vec = Vec::with_capacity(dimension * index_size);
    let mut ids: Vec<i64> = Vec::with_capacity(vec.capacity());
    for _i in 0..vec.capacity() {
        vec.push(rand::random::<f32>());
    }
    for i in 0..index_size {
        ids.push(i as i64);
    }
    // index.add_with_ids(&ids, &vec).unwrap();

    println!("========= test search");
    let mut vec = Vec::with_capacity(dimension);
    for _i in 0..vec.capacity() {
        vec.push(rand::random::<f32>());
    }
    let result = index.search(2000, 1, &vec);
    println!("search result : {:?}", result);

    assert!(index.is_trained());
    println!("is_trained:{}", index.is_trained());

    assert_eq!(200, index.count());
    println!("all count:{}", index.count());

    println!("max_id:{}", index.max_id());

    std::fs::create_dir_all("temp");

    //to persistence index
    index.write_index();

    drop(index);

    let mut conf = Config::new(dimension as i32);
    conf.path = String::from("temp/large.index");

    let index = Index::open_or_create(conf);

    println!("========= test search");
    let mut vec = Vec::with_capacity(dimension);
    for _i in 0..vec.capacity() {
        vec.push(rand::random::<f32>());
    }
    let result = index.search(2000, 1, &vec);
    println!("search result : {:?}", result);

    assert!(index.is_trained());
    println!("is_trained:{}", index.is_trained());

    assert_eq!(200, index.count());
    println!("all count:{}", index.count());

    println!("max_id:{}", index.max_id());

依赖项

~1-2MB
~37K SLoC