坑 之 Ubuntu Conda虚拟环境使用faiss-gpu报错分析及解决办法

  • Post author:
  • Post category:其他


写在前面,笔者用faiss-gpu来执行聚类运算。faiss-gpu的使用于cuda版本是紧密相关的,cuda又是与nvidia driver紧密相关的,nvidia driver又是与显卡紧密相关的。如果

faiss-gpu和cuda版本不匹配会报错而无法使用

我的环境:RTX3090、python3.7.5、pytorch1.7.1+cuda11.0,根据我查阅的资料显示,faiss-gpu==1.7.1支持cuda11.0。


一.错误示例

我首先使用conda 安装 faiss-gpu=1.7.1

conda install faiss-gpu cudatoolkit=11.0 -c pytorch


报错:

Faiss assertion ‘err == CUBLAS_STATUS_SUCCESS’ failed in void faiss::gpu::runMatrixMult(faiss::gpu::Tensor<float, 2, true>&, bool, faiss::gpu::Tensor<T, 2, true>&, bool, faiss::gpu::Tensor<IndexType, 2, true>&, bool, float, float, cublasHandle_t, cudaStream_t) [with AT = float; BT = float; cublasHandle_t = cublasContext*; cudaStream_t = CUstream_st*] at /project/faiss/faiss/gpu/utils/MatrixMult-inl.cuh:265; details: cublas failed (13): (512, 2) x (2, 128)’ = (512, 2) gemm params m 2 n 512 k 128 trA T trB N lda 128 ldb 128 ldc 2

错误原因:依然怀疑是版本问题,在github上也查看到了类似的issue,也没有很好的解决办法。

所以我尝试使用pip安装faiss-gpu

pip install faiss-gpu==1.7.1


依旧报错

:段错误,无效指针等问题,头皮发麻


奇怪现象:

当特征维度是768时并不报错,为512时就会报错,这里依旧没有得到很好的解释,读者可以尝试一下,看有无相同的实验现象。

抱着版本不对升级版本的目的又安装了faiss-gpu=1.7.2的版本,但依旧不好使。


二. 解决办法:使用源码安装的方式编译安装faiss-gpu==1.7.1,成功

说一下前提条件,若要在conda环境里安装则先激活虚拟环境,并检查当前环境的python解释器

conda activate xxx
which python

安装步骤:1.去faiss-gpu官网下载对应版本的faiss-gpu,解压


Releases · facebookresearch/faiss · GitHub


2.进入目录,执行:

cmake -B build . -DCUDAToolkit_ROOT=/usr/local/cuda/ -DFAISS_ENABLE_GPU=ON -DPython_EXECUTABLE=/home/xxx/anaconda3/envs/xxx/python
make -C build -j16
cd build/faiss/python/ && python setup.py install

#注意修改成 自己的 cuda 和 python解释器

3.若报错与swig有关,则需提前安装swig和prec/prec2/prec3(根据报错判断缺哪个版本的prec)

swig下载链接:

SWIG – Browse /swig at SourceForge.net


prec2下载链接:

https://link.zhihu.com/?target=https%3A//sourceforge.net/projects/pcre/files/pcre2/10.37/pcre2-10.37.tar.gz

将prec2压缩包放入swig解压后的文件夹中,执行,否则报错:


Cannot find pcre-config script from PCRE2 (Perl Compatible Regular Expressions)

安装prec2:
1 ./Tools/pcre2-build.sh
安装swig:进入swig目录
1 ./configure
2 make
3 sudo make install	

4.解决报错后重新执行步骤2。

5.进入build目录,测试demo,成功运行,则表示顺利安装

make demo_ivfpq_indexing
cd demos
./demo_ivfpq_indexing


解释并强调

:在虚拟环境下安装,则会存放在虚拟环境下的site-packages,为保证虚拟环境python可以调用,

必须确保步骤2中的python解释器路径是对的。

测试能否调用:成功导入这里就大功告成。

1. python
2. import faiss

import时有可能会遇到报错如下:


ImportError: cannot import name ‘_swigfaiss’,


问题原因:faiss文件是.egg的压缩形式

解决办法:去到虚拟环境下的site-packages,将faiss-xxx-xx.egg解压(tar -zxvf faiss-xxx-xx.egg)

到这里,笔者就没有问题了,希望你们也是。

参考:

prec2:

Nginx系列:依赖安装(pcre,zlib,openssl)(2) – 知乎

www.taodudu.cc/news/show-1683956.html?action=onClick


https://www.cnblogs.com/chen1846847163/p/15605074.html


https://github.com/facebookresearch/faiss/issues/866


https://github.com/facebookresearch/faiss/issues/2064



版权声明:本文为qq_41368074原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。