milvus和faiss安裝及其使用教程

寫在前面

高性能向量檢索庫(milvus & faiss)簡介

Milvus和Faiss都是高性能向量檢索庫,可讓你在海量向量庫中快速檢索到和目標向量最類似的若干個向量,這裏類似度量標準能夠是內積或者歐式距離等。這裏借用milvus官方的話再次說明這兩個庫的特色:html

Milvus 是一款開源的、針對海量特徵向量的類似性搜索引擎。基於異構衆覈計算框架設計,成本更低,性能更好。 在有限的計算資源下,十億向量搜索僅毫秒響應。java

說白了就是速度快,暫且不說十億向量,本身寫代碼去完成對100萬300維向量的餘弦類似度計算並排序就須要不小的響應時間吧,就本人測試而言,即使使用scipy庫計算速度依然要比milvus和faiss慢不少。python

本文主要內容

本文主要內容分爲三塊:linux

  1. 兩個高性能搜索引擎的對比
  2. milvus安裝及其使用教程
  3. faiss安裝及其使用教程

milvus和faiss的對比

在milvus開源以前,也存在高性能向量類似性搜索引擎(庫),這個引擎就是Facebook的Faiss,功能都是同樣的,具體能夠參考官網c++

就我我的而言,我是推薦使用milvus的,主要是在我我的看來,milvus有以下幾個好處:git

  • 多平臺通用,mac,windows和linux都是支持的,由於milvus能夠經過docker部署,所以平臺通用性好了很多。
  • 支持編程語言多,Java,c,c++和python都支持,要知道Faiss是不支持java的,這一點簡直讓人抓狂,github上好幾個項目就是關於把Faiss轉成java的,由於我Java和python都是要使用的,我把github上關於faiss轉java的項目都試了個遍,結論就是很是難安裝,只要Faiss版本更新了,必需要重來一遍,即使最後java能夠用了,也不敢保證其穩定性。因此想在Java上用Faiss仍是放棄吧。
  • 在速度方面,就我本身測試而言,milvus不輸Faiss,可是我沒有使用GPU測試,有興趣的小夥伴能夠試一下。

固然Faiss也並不是一無可取,首先速度並不輸於Milvus,並且使用起來更方便,不須要使用docker,代碼寫起來更爲簡潔(後面章節會有示例代碼,你們看了就知道faiss比較簡潔了),且有大廠作技術支持,若是部署環境就是python,Faiss也是一個很好的選擇。github

milvus安裝及其使用教程

milvus 安裝步驟

milvus 一共有兩種安裝方式:本身編譯安裝和使用docker安裝。這裏推薦你們使用docker安裝,docker安裝方便快捷,可在Windows上使用。本身編譯安裝,因爲每一個人環境不一樣,很容易出問題。本文只介紹基於docker的安裝,另外由於我比較窮,因此只介紹cpu版本的安裝,不過gpu安裝也是大同小異。docker

Step1 安裝docker

首先就是要安裝docker,還不瞭解docker能夠了解一波,很是好用的虛擬機工具,強力推薦真是太香了,直接去Docker官網下載對應平臺的安裝文件便可。數據庫

Step2 下載相應版本鏡像

安裝好docker後,要去pull對應的鏡像(image),首先進到dockerhub官網,而後搜索milvus,第一個結果就是。由於咱們安裝的是CPU版本,因此在tags裏找cpu-latest,而後pull下來就能夠了,即在你的命令行窗口輸入
docker pull milvusdb/milvus:cpu-latest注意:隨着版本迭代更新,這一條命令在將來可能會失效,建議先去dockerhub搜索一下,去看一下應該用什麼tag。
pull好以後, 在docker images看一下應該會有該鏡像,整個流程記錄以下圖:
編程

Step3 設置配置文件和工做目錄

在建立啓動容器以前,咱們要先設置配置文件。
/home/$USER/milvus/conf 目錄下建立 server_config.yaml 文件,而後將 server config 文件 的內容複製到你建立的配置文件中。
通常狀況下 server_config.yaml文件不須要再修改,若是有我的配置需求,可根據官網教程進行修改。

而後就須要配置工做目錄了,一共須要創建三個文件夾,在/home/$USER/milvus/目錄下創建dblogswal文件夾。

注意上述目錄都可根據本身需求進行修改,只是在啓動docker服務是必定要映射到對的目錄上!爲了方便演示,我舉個本身的目錄例子,個人工做目錄是C:\Users\Zhdun\milvus,個人目錄結構是:

milvus
    │
    ├─conf //配置文件目錄
    │      server_config.yaml  //配置文件 搜索引擎配置都在這裏修改
    │
    ├─db //數據庫存儲目錄 你的索引與向量存儲的位置
    │
    └─logs //日誌存儲目錄 
    │
    └─wal // 預寫式日誌相關配置

Step4 啓動docker服務

設置好工做目錄後,就可使用鏡像建立容器了,以我本身工做目錄爲例,須要以下命令

docker run -td --name mymilvus -e "TZ=Asia/Shanghai" -p 19530:19530 -p 19121:19121 -v C:\Users\Zhdun\milvus\db:/var/lib/milvus/db -v C:\Users\Zhdun\milvus\conf:/var/lib/milvus/conf -v C:\Users\Zhdun\milvus\logs:/var/lib/milvus/logs -v C:\Users\Zhdun\milvus\wal:/var/lib/milvus/wal milvusdb/milvus:cpu-latest

命令看起來有點長, 我稍微解釋下,-td是後臺運行,--name是給本身的容器起個名字,-p是端口映射,不想用默認的話,能夠去服務器配置文件裏改,-v就是爲了映射三個工做目錄。具體能夠參考docker的run命令

執行完命令後,運行docker ps -a,若是發現本身建立的容器Exited的了,那就說明報錯了,那就docker logs <container id>一下,看出了什麼問題。若是發現容器在運行了,就表明基本沒問題了。
正常啓動記錄以下截圖:

接下來我會說一下常見的安裝問題。

安裝時的常見問題及解決

Config check fail: Invalid config version: . Expected config version: 0.1 遇到這種問題就在服務器的配置文件第一行加上version: 0.1

Config check fail: Invalid cpu cache capacity: 1. Possible reason: sum of cache_config.cpu_cache_capacity and db_config.insert_buffer_size exceeds system memory.
這種問題就說明內存超出了限制,首先檢查服務器配置裏的 cpu_cache_capacity 和 insert_buffer_size 是否是過大了。

而後再檢查給定docker設定的內存是多少,能夠經過docker info來檢查。

milvus 基本使用

安裝完成後,終於能夠開始使用milvus了,milvus支持python,java和c++。在這裏我只介紹python的使用。
首先安裝 pymilvus庫:pip install pymilvus,而後就可使用這個庫來寫代碼了,接下來我會直接把本身寫的範例代碼貼上去,其中每一步的具體含義以及可能的擴展我會直接在註釋裏告訴你們,若有錯誤還請各位指出。

# -*- coding: utf-8 -*-  
  
# 導入相應的包  
import numpy as np  
from milvus import Milvus, MetricType  
  
# 初始化一個Milvus類,之後全部的操做都是經過milvus來的  
milvus = Milvus(host='localhost', port='19530')  
  
# 向量個數  
num_vec = 5000  
# 向量維度  
vec_dim = 768  
# name  
collection_name = "test_collection"  
# 建立collection,可理解爲mongo的collection  
collection_param = {  
    'collection_name': collection_name,  
    'dimension': vec_dim,  
    'index_file_size': 32,  
    'metric_type': MetricType.IP  # 使用內積做爲度量值  
}  
milvus.create_collection(collection_param)  
  
# 隨機生成一批向量數據  
# 支持ndarray,也支持list  
vectors_array = np.random.rand(num_vec, vec_dim)  
  
# 把向量添加到剛纔創建的collection中  
status, ids = milvus.insert(collection_name=collection_name, records=vectors_array)  # 返回 狀態和這一組向量的ID  
milvus.flush([collection_name])  
  
# 輸出統計信息  
print(milvus.get_collection_stats(collection_name))  
  
# 建立查詢向量  
query_vec_array = np.random.rand(1, vec_dim)  
# 進行查詢,  
status, results = milvus.search(collection_name=collection_name, query_records=query_vec_array, top_k=5)  
print(status)  
print(results)  
  
# 若是不用能夠刪掉  
status = milvus.drop_collection(collection_name)  
  
# 斷開、關閉鏈接  
milvus.close()

這裏也推薦下官方示例代碼,寫的很好,更加權威,可借鑑學習。

faiss安裝及其使用教程

faiss的安裝

faiss有三種安裝方式:
1 源碼編譯安裝

根據官方教程來。作好踩坑的準備,這個能寫好多,我就不寫了,遇到問題私聊我吧

2 conda 安裝
最爲簡單,可是須要conda。

# CPU version only
conda install faiss-cpu -c pytorch

# GPU version
conda install faiss-gpu cudatoolkit=8.0 -c pytorch # For CUDA8
conda install faiss-gpu cudatoolkit=9.0 -c pytorch # For CUDA9
conda install faiss-gpu cudatoolkit=10.0 -c pytorch # For CUDA10

3 第三方預編譯庫

有熱心網友本身預編譯了,能夠直接pip install,私人編譯,非官方,穩定性和成功率不保證,我本身用過沒啥問題,詳見https://pypi.org/project/faiss/

最後的最後,血和淚的教訓,環境必定要安裝openblas,注意不是blas,是openblas,那否則多核利用率會變得極差

faiss的使用

就像使用milvus同樣,一樣提供一份範例代碼加以詳細的註釋,若有錯誤還請指正!

# 導入庫  
import numpy as np  
import faiss  
  
# 向量個數  
num_vec = 5000  
# 向量維度  
vec_dim = 768  
# 搜索topk  
topk = 10  
  
# 隨機生成一批向量數據  
vectors = np.random.rand(num_vec, vec_dim)  
  
# 建立索引  
faiss_index = faiss.IndexFlatL2(vec_dim)  # 使用歐式距離做爲度量  
# 添加數據  
faiss_index.add(vectors)  
  
# 查詢向量 假設有5個  
query_vectors = np.random.rand(5, vec_dim)  
# 搜索結果  
# 分別是 每條記錄對應topk的距離和索引  
# ndarray類型 。shape:len(query_vectors)*topk  
res_distance, res_index = faiss_index.search(query_vectors, topk)  
print(res_index)  
print(res_distance)

代碼是爲了拋磚引玉,大概介紹使用流程,高階用法能夠去看官網wiki

最後感謝各位閱讀, 但願能幫到大家.

文章能夠轉載, 但請註明出處:

相關文章
相關標籤/搜索