一、安装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存储最近邻的ID
std::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;
}