一、安装faiss
我的faiss,用的是曾经安装过的
pip install faiss-gpu==1.7
当时搞得环境名称是pni
二、配置环境
三、例子代码
#include <faiss/IndexFlat.h>
#include <faiss/Index.h>
#include <faiss/VectorTransform.h>
#include <faiss/impl/AuxIndexStructures.h>int main()
{// 定义特征向量的维度int d = 6;// 使用FlatL2距离度量创建索引faiss::IndexFlatL2 index(d);// 向索引中添加一些向量std::vector<float> vecs = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f,7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f// 可以添加更多的向量...};// 添加向量到索引index.add(vecs.size() / d, vecs.data());// 定义查询向量std::vector<float> query = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};// 搜索参数int k = 4; // 希望返回的最近邻个数std::vector<float> distances(k); // 存储与最近邻的距离std::vector<faiss::idx_t> ids(k); // 使用faiss::idx_t存储最近邻的ID// 执行搜索index.search(1, query.data(), k, distances.data(), ids.data());// 输出搜索结果std::cout << "Search results for the query vector:" << std::endl;for (int i = 0; i < k; ++i) {std::cout << "ID: " << ids[i] << ", Distance: " << distances[i] << std::endl;}return 0;
}
四、带GPU的例子代码
#include <iostream>
#include <vector>
#include "faiss/IndexFlat.h"
#include "faiss/MetaIndexes.h"#include <faiss/Index.h>
#include <faiss/VectorTransform.h>
#include <faiss/impl/AuxIndexStructures.h>#include <faiss/IndexIVFFlat.h>
#include <faiss/IndexPQ.h>
#include <faiss/index_factory.h>#include <faiss/gpu/GpuCloner.h>
#include <faiss/gpu/GpuIndexFlat.h>
#include <faiss/gpu/GpuResources.h>
#include <faiss/gpu/GpuCloner.h>
#include <faiss/gpu/GpuAutoTune.h>
#include <faiss/gpu/StandardGpuResources.h>int main()
{// 定义维度和数据集大小size_t d = 64; // 特征维度size_t nb = 100000; // 数据集大小size_t nq = 10; // 查询数量// 随机生成一些数据和查询向量std::vector<float> database(d * nb);std::vector<float> queries(d * nq);// ... 填充 database 和 queries ...// 初始化GPU资源faiss::gpu::StandardGpuResources res;// 创建一个使用L2距离的Flat索引,并将其克隆到GPU上faiss::IndexFlatL2 index(d);faiss::Index* gpu_index = faiss::gpu::index_cpu_to_gpu(&res, 0, &index);// 将数据加入索引gpu_index->add(database.size() / d, database.data());// 搜索查询向量std::vector<faiss::idx_t> ids(10); // 使用faiss::idx_t存储最近邻的IDstd::vector<float> distances(nq * 10); // 存储最近邻的距离gpu_index->search(nq, queries.data(), 10, distances.data(), ids.data());// 打印搜索结果for (int i = 0; i < nq; ++i) {std::cout << "Query " << i << " results:" << std::endl;for (int j = 0; j < 10; ++j) {std::cout << "ID: " << ids[i * 10 + j] << ", Distance: " << distances[i * 10 + j] << std::endl;}}// 释放资源delete gpu_index;return 0;
}