milvus和faiss安装及其使⽤教程
写在前⾯
⾼性能向量检索库(milvus & faiss)简介
Milvus和Faiss都是⾼性能向量检索库,可以让你在海量向量库中快速检索到和⽬标向量最相似的若⼲个向量,这⾥相似度量标准可以是内积或者欧式距离等。这⾥借⽤的话再次
说明这两个库的特点:
Milvus 是⼀款开源的、针对海量特征向量的相似性搜索引擎。基于异构众核计算框架设计,成本更低,性能更好。在有限的计算资源下,⼗亿向量搜索仅毫秒响应。
说⽩了就是速度快,暂且不说⼗亿向量,⾃⼰写代码去完成对100万300维向量的余弦相似度计算并排序就需要不⼩的响应时间吧,就本⼈测试⽽⾔,即便使⽤scipy库计算速度
依然要⽐milvus和faiss慢很多。
本⽂主要内容
本⽂主要内容分为三块:
1. 两个⾼性能搜索引擎的对⽐
2. milvus安装及其使⽤教程
3. faiss安装及其使⽤教程
milvus和faiss的对⽐
在milvus开源之前,也存在⾼性能向量相似性搜索引擎(库),这个引擎就是Facebook的Faiss,功能都是⼀样的,具体可以参考。
就我个⼈⽽⾔,我是推荐使⽤milvus的,主要是在我个⼈看来,milvus有如下⼏个好处:
多平台通⽤,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也是⼀个很好的选择。
milvus安装及其使⽤教程
milvus 安装步骤
milvus ⼀共有两种安装⽅式:⾃⼰编译安装和使⽤docker安装。这⾥推荐⼤家使⽤docker安装,docker安装⽅便快捷,可在Windows上使⽤。⾃⼰编译安装,由于每个⼈环境不
同,很容易出问题。本⽂只介绍基于docker的安装,另外因为我⽐较穷,所以只介绍cpu版本的安装,不过gpu安装也是⼤同⼩异。
Step1 安装docker
⾸先就是要安装docker,还不了解docker可以了解⼀波,⾮常好⽤的虚拟机⼯具,强⼒推荐真是太⾹了,直接去下载对应平台的安装⽂件即可。
Step2 下载相应版本镜像
安装好docker后,要去pull对应的镜像(image),⾸先进到,然后搜索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.yaml⽂件不需要再修改,如果有个⼈配置需求,可根据官⽹教程进⾏修改。
然后就需要配置⼯作⽬录了,⼀共需要建⽴三个⽂件夹,在/home/$USER/milvus/⽬录下建⽴db,logs和wal⽂件夹。
注意上述⽬录均可根据⾃⼰需求进⾏修改,只是在启动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:\Us
命令看起来有点长,我稍微解释下,-td是后台运⾏,--name是给⾃⼰的容器起个名字,-p是端⼝映射,不想⽤默认的话,可以去服务器配置⽂件⾥改,-v就是为了映射三个⼯作
⽬录。具体可以参考docker的。
执⾏完命令后,运⾏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 # 使⽤内积作为度量值
}
# 随机⽣成⼀批向量数据
# ⽀持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])
# 输出统计信息
_collection_stats(collection_name))
# 创建查询向量
python转java代码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,私⼈编译,⾮官⽅,稳定性和成功率不保证,我⾃⼰⽤过没啥问题,详见
最后的最后,⾎和泪的教训,环境⼀定要安装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)
代码是为了抛砖引⽟,⼤概介绍使⽤流程,⾼阶⽤法可以去看。最后感谢各位阅读, 希望能帮到你们.
⽂章可以转载, 但请注明出处:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论