从Faiss 1.7.1版本升级到Faiss 1.7.4
1.7.1版本的Faiss依赖的cmake为3.17及以后版本,而Faiss1.7.4依赖的cmake版本为3.23.1及以后版本,因此将Faiss从1.7.1版本升级到1.7.4版本之前,需要先升级cmake版本。
安装Faiss1.7.4前,请先卸载旧版本Faiss,再参考9.1.3-Faiss安装参考完成Faiss的安装。若之前Faiss安装在指定目录,直接删除该文件夹即可。若未指定目录,默认安装在/usr/local路径下,请删除以下文件以及文件夹。
sudo rm -f /usr/local/lib/libfaiss.so sudo rm -rf /usr/local/include/faiss/ sudo rm -rf /usr/local/share/faiss/
若编译旧版本faiss时安装了静态库, 请把静态库也删除:
sudo rm -f /usr/local/lib/libfaiss.a
注意事项
- 由于faiss1.7.4内部idx_t类型所属命名空间变动,为与faiss1.7.4保持一致,接口中涉及类型为faiss::Index::idx_t的参数全部改为faiss::idx_t。
- 由于faiss1.7.4内部头文件变动,涉及使用IDSelector类型的函数(主要涉及remove_ids函数)需要新增头文件 #include <faiss/impl/IDSelector.h>。
- 在faiss1.7.4的Flat检索中,保存底库数据的变量由faiss1.7.1的std::vector<float> xb修改为fiass1.7.4的std::vector<uint8_t> codes。AscendIndexFlat通过getBase接口获取到的特征向量数据仍可存入float类型的数组中,而对cpu侧(开源faiss)的索引来讲,faiss1.7.4使用数据类型为uint8_t的codes向量存入数据,若需将数据存入float数据类型的向量,可以通过faiss的sa_decode函数进行转换。
// AscendIndexFlat获取底库数据示例 std::vector<float> xbAscend;// xbAsend用于储存所有device上存储的底库特征向量 for (auto deviceId : conf.deviceList) { … // base向量储存AscendIndexFlat在deviceId上存储的底库特征向量 std::vector<float> base(size * dim); ascendindex.getBase(deviceId, (char *)base.data()); xbAsend.insert(xbAsend.end(), base.begin(), base.end()); … } // cpu侧(开源faiss)Index获取底库数据示例 std::vector<float> faissXb(dim * ntotal); //构建 faissxb向量 //使用fiass的sa_decode函数,将cpuIndex.codes的数据存入faissXb cpuIndex.sa_decode(static_cast<faiss::idx_t>(ntotal), cpuIndex.codes.data(), faissXb.data());
如果升级Faiss后,IVFSQ算法train和add接口性能下降,可参考升级Faiss后,IVFSQ算法train和add接口性能下降解决。
父主题: 附录