1. 程式人生 > 其它 >深入理解Faiss 原理&原始碼 (一) 編譯

深入理解Faiss 原理&原始碼 (一) 編譯

目錄

深入理解Faiss 原理&原始碼 (一) 編譯

Faiss系列, 從單機lib到構建大規模分散式向量檢索系統, 且聽我娓娓道來

Faiss是什麼?

Faiss是Facebook AI團隊開源的針對聚類和相似性搜尋庫,為稠密向量提供高效相似度搜索和聚類,支援十億級別向量的搜尋,是目前最為成熟的近似近鄰搜尋庫。它包含多種搜尋任意大小向量集(備註:向量集大小由RAM記憶體決定)的演算法,以及用於演算法評估和引數調整的支援程式碼。Faiss用C++編寫,並提供與Numpy完美銜接的Python介面。除此以外,對一些核心演算法提供了GPU實現

mac下安裝

安裝mac xcode工具包

xcode-select --install

因為是通過原始碼編譯, 需要依賴gcc系列工具包, 所以要先執行這一步

安裝 openblas

brew install openblas

BLAS是 Basic Linear Algebra Subprograms (基本線性代數子程式)的首字母縮寫,主要用來做基礎的矩陣計算,或者是向量計算。它分為三級:

  • BLAS 1級,主要做向量與向量間的dot或乘加運算,對應元素的計算;

  • BLAS 2級,主要做矩陣和向量,就類似PPT中藍色部分所示,矩陣A*向量x, 得到一個向量y。除此之外,可能還會有對稱的矩陣變形;

  • BLAS 3級,主要是矩陣和矩陣的計算,最典型的是A矩陣B矩陣,得到一個C矩陣。由矩陣的寬、高,得到一個mn的C矩陣。

為什麼BLAS是一個非常重要的庫或者介面,是因為它是很多科學計算的核心之一。每年做超級計算機的排行榜,都要做LINPACK測試,該測試很多部分就是做BLAS 3級矩陣和矩陣的計算。此外,還有很多科學和工程的模擬,在轉換後都變成了一種矩陣上的操作。如果你把矩陣優化的特別好的話,對整個應用的提升,都是非常有幫助的。

安裝swig

brew install swig

簡單包裝介面產生器(英語:Simplified Wrapper and Interface Generator, SWIG)是一個開源軟體工具,用來將C語言或C++寫的計算機程式或函式庫,連線指令碼語言,例如Lua, Perl, PHP, Python, R, Ruby, Tcl, 和其它語言,例如C#, Java, JavaScript, Go, D, OCaml, Octave, Scilab以及Scheme. 也可以輸出成XML格式。

安裝libomp

brew install libomp

OpenMP(Open Multi-Processing)是一套支援跨平臺共享記憶體方式的多執行緒併發的程式設計API,使用C,C++和Fortran語言,可以在大多數的處理器體系和作業系統中執行,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套編譯器指令、庫和一些能夠影響執行行為的環境變數。

編譯faiss

  • 下載程式碼, 此處選擇最新v1.7.1 tag
git clone https://github.com/facebookresearch/faiss.git

cd faiss

git checkout v1.7.1
  • cmake引數選擇
vim CMakeLists.txt

此處不需要gpu索引和python版本, 修改CMakeLists.txt 對應設定

option(FAISS_OPT_LEVEL "" "generic")
option(FAISS_ENABLE_GPU "Enable support for GPU indexes." OFF)
option(FAISS_ENABLE_PYTHON "Build Python extension." OFF)
option(FAISS_ENABLE_C_API "Build C API." ON)

cmake 依賴校驗

cmake -B build .
  • 開始編譯
make -C build -j faiss
  • 生成c++ lib
make -C build install
  • 跑下測試用例
make -C build install
  • 跑下 ivfpq的例子
make -C build demo_ivfpq_indexing

至此, 安裝驗證完成, 下一篇將會剖析下 c++版本 flat索引 原理+原始碼

對向量檢索感興趣以及對搜尋&推薦感興趣的小夥伴的歡迎加qq 564790073 討論, 一線大廠搜尋中心長期招人

github: https://github.com/hashyong

未經允許禁止轉載 謝謝

附錄