【オリジナル】FAISSのインストールと使用


目次
Makefileでインストール
インストールコマンド
cmakeでインストール
インストールコマンド:
問題にぶつかる
1、インストールタイムズが間違っていて、gtestが見つからないことを提示します
2、インストール時報が間違っていて、openBlasが見つからないことを提示する
3、ヒントが見つからない
4、関数参照未定義
FAISSはFacebook AI研究チームがオープンソースしたクラスタリングおよび類似性検索ライブラリであり、RAMに不適切になる可能性があるまで任意のサイズのベクトルセットで検索する新しいアルゴリズムを含む.評価およびパラメータ調整のためのサポートコードも含まれています.会社のサーバーは外部のネットに接続していないため、condaを使ってインストールすることができなくて、直接ソースコードはインストールして、githupウェブサイトは住所をダウンロードします:
https://github.com/facebookresearch/faiss
インストール方法はインストールの説明を参照してください.
https://github.com/facebookresearch/faiss/blob/master/INSTALL.md
faissインストールではmakeツールまたはcmakeツールを使用できます.makeはc++インタフェースとpythonインタフェースを生成することができ、cmakeコンパイルはc++インタフェースしか生成できません.
Makefileでインストール
インストールコマンド
1、cpuバージョンライブラリ関数のコンパイル
./configure
make
make install

configureが完了するとmakefileが生成される.inc、デフォルトはintel MTKライブラリを使用して、私が使っているOpenBlasオープンソースライブラリ、ここで修正しないとlibmkl_が見つからないことをヒントにしますavx2.so or libmkl_def.so.
解決策:生成makefileを修正する.incファイル、OpenBlasライブラリ関数の接続を指定し、make&make installを再実行します.
#  OpenBlas lapack     
#LDFLAGS      = -fopenmp
LDFLAGS      = -fopenmp -L/usr/local/OpenBLAS/lib -L/usr/lib64/atlas
#     mkl ,  OpenBlas lapack   
#LIBS         = -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl  
LIBS         = -lopenblas -llapack -lgomp -lpthread -lm -ldl  

2、pythonインタフェースのコンパイル
#      
make py

#  
cd python 
make install

pthonインタフェースのテスト:
[root@host233186 python]# python ../tutorial/python/1-Flat.py 
True
100000
[[  0 393 363  78]
 [  1 555 277 364]
 [  2 304 101  13]
 [  3 173  18 182]
 [  4 288 370 531]]
[[ 0.          7.17517328  7.2076292   7.25116253]
 [ 0.          6.32356453  6.6845808   6.79994535]
 [ 0.          5.79640865  6.39173603  7.28151226]
 [ 0.          7.27790546  7.52798653  7.66284657]
 [ 0.          6.76380348  7.29512024  7.36881447]]
[[ 381  207  210  477]
 [ 526  911  142   72]
 [ 838  527 1290  425]
 [ 196  184  164  359]
 [ 526  377  120  425]]
[[ 9900 10500  9309  9831]
 [11055 10895 10812 11321]
 [11353 11103 10164  9787]
 [10571 10664 10632  9638]
 [ 9628  9554 10036  9582]]

3、gpu版ライブラリファイルのコンパイル
GPU版ライブラリはlibfaissに依存する.aファイルですので、手順1を先に実行する必要があります.
他にもinc中compute_60とcompute_61,サーバはサポートされていません.2行削除すればいいです.
cd  gpu
make  -j10

4、gpuバージョンのpythonインタフェースをコンパイルする
cd python
make _swigfaiss_gpu.so
make  install

gpu版pythonインタフェースをコンパイルするときに、エラーを提示しました(後で再コンパイルするとき、エラーが発生しないのはおかしいです):
/usr/bin/ld: ../gpu/libgpufaiss.a(gpufaiss_generated_GpuIndexFlat.cu.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
../gpu/libgpufaiss.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [_swigfaiss_gpu.so] Error 1

ネットで解決策を探したのはlibgpufaissをコンパイルすることだ.aの場合、CFLAGS='$CFLAGS-fpic'オプションを使用して、試してみると有効です.
cd gpu
make CFLAGS='$CFLAGS -fpic' -j10

 
テスト:
[root@host233186 faiss]# python tutorial/python/4-GPU.py 
100000
[[ 381  207  210  477]
 [ 526  911  142   72]
 [ 838  527 1290  425]
 [ 196  184  164  359]
 [ 526  377  120  425]]
[[ 9900 10500  9309  9831]
 [11055 10895 10812 11321]
 [11353 11103 10164  9787]
 [10571 10664 10632  9638]
 [ 9628  9554 10036  9582]]
100000
[[ 381  207  210  477]
 [ 526  911  142   72]
 [ 838  527 1290  425]
 [ 196  184  164  359]
 [ 526  377  120  425]]
[[ 9900  9309  9810 10048]
 [11055 10895 10812 11321]
 [11353 10164  9787 10719]
 [10571 10664 10632 10203]
 [ 9628  9554  9582 10304]]

cmakeでインストール
インストールコマンド:
#  build   
mkdir build
cmake  ../
make
make install

注:cmakeコンパイルfaissを使用すると、cpuとgpuバージョンのライブラリファイルを生成できますが、pythonインタフェースの生成はサポートされていません.pythonインタフェースが必要な場合は、Makefileコンパイルでpythonインタフェースを生成する方法でコンパイルする必要があります.
問題にぶつかる
0、configureはエラーです
checking for cuInit in -lcuda... configure: error: in `/faiss':
no
configure: error: Couldn't find libcuda
See `config.log' for more details

解決策:./configure --with-cuda=/dev/null
1、インストールタイムズが間違っていて、gtestが見つからないことを提示します
理由:googletestがインストールされていません
解決策:
ダウンロード先:https://github.com/abseil/googletest
#  build   
mkdir build
cmake  ../
make
make install

2、インストール時報が間違っていて、openBlasが見つからないことを提示する
エラーメッセージ:
-- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
CMake Error at cmake/Modules/FindOpenBLAS.cmake:59 (MESSAGE):
Could not find OpenBLAS
理由:OpenBlasのヘッダファイルパスとライブラリファイルパスが指定されていません.
解決方法:サーバー上のOpenBlasのインストールディレクトリは/usr/local/openBlasで、cmake/Modules/FendOpenBLASを修正する.cmakeはディレクトリを追加します.
SET(Open_BLAS_INCLUDE_SEARCH_PATHS
  /usr/include
  /usr/include/openblas
  /usr/include/openblas-base
  /usr/local/include
  /usr/local/include/openblas
  /usr/local/include/openblas-base
  /opt/OpenBLAS/include
  /opt/local/include
  /usr/local/OpenBLAS/include        #  OpenBlas        
  $ENV{OpenBLAS_HOME}
  $ENV{OpenBLAS_HOME}/include
)

SET(Open_BLAS_LIB_SEARCH_PATHS
        /lib/
        /lib/openblas-base
        /lib64/
        /usr/lib
        /usr/lib/openblas-base
        /usr/lib64
        /usr/local/lib
        /usr/local/lib64
        /usr/local/OpenBLAS/lib    #  OpenBlas        
        /opt/OpenBLAS/lib
        /opt/local/lib
        $ENV{OpenBLAS}cd
        $ENV{OpenBLAS}/lib
        $ENV{OpenBLAS_HOME}
        $ENV{OpenBLAS_HOME}/lib
 )

3、ヒントが見つからない
エラーメッセージ:[79%]Building CXX object tutorial/cpp/CMakeFiles/1-Fill.dir/1-Flat.cpp.o faiss-master/tutorial/cpp/1-Flat.cpp:12:29: fatal error: faiss/IndexFlat.h: No such file or directory  #include compilation terminated.b
理由:1-Flat.cppコードでは「faiss/indexFlat.h」相対パス名が使用されますが、githupからダウンロードしたソースコードは「faiss-master/indexFlat.h」です.
解決策:「faiss-master」を「faiss」と再名するか、includeソースコードを1つずつ変更するのは簡単です.
4、関数参照未定義
ヒント:
undefined reference to `faiss::gpu::getNumDevices()'
理由:
tutorial/cpp/CMakeLists.txtでコンパイルを定義する際にlibfaissを統一的に使用する.aライブラリファイル、libgpufaissが指定されていません.a
解決策:tutorial/cpp/CMakeListsを修正する.txtファイル
file(GLOB srcs ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)

# Build each source file independently
include_directories(../../../)  # faiss root directory

foreach(source ${srcs})
    get_filename_component(name ${source} NAME_WE)

    #     gpu         
    IF(name MATCHES ".*GPU.*")
        SET(faiss_lib gpufaiss faiss cublas)
        #  cublas      
        link_directories("/usr/local/cuda-7.5/lib64")   
    ENDIF(name MATCHES ".*GPU.*")

    message("****************" ${name} "libraries:" ${faiss_lib} "****************")
    add_executable(${name} ${source}) 
    target_link_libraries(${name} ${faiss_lib})

    # Install
    install(TARGETS ${name} DESTINATION bin)
endforeach(source)