milvus安装及其使⽤教程
milvus 简介
milvus是⼲什么的?通俗的讲,milvus可以让你在海量向量库中快速检索到和⽬标向量最相似的若⼲个向量,这⾥相似度量标准可以是内积或者欧式距离等。借⽤的话说就是:
Milvus 是⼀款开源的、针对海量特征向量的相似性搜索引擎。基于异构众核计算框架设计,成本更低,性能更好。 在有限的计算资源下,⼗亿向量搜索仅毫秒响应。
说⽩了就是速度快,先不说⼗亿向量,⾃⼰写代码去完成对100万300维向量的余弦相似度计算并排序就需要不⼩的响应时间吧,就本⼈测试⽽⾔,即便使⽤scipy库计算速度依然要⽐milvus慢很多。
milvus和Faiss的对⽐
jp在医学上是什么意思其实在milvus开源之前,也存在⾼性能向量相似性搜索引擎(库),这个引擎就是Facebook的Faiss,它的功能和milvus是⼀样的,所以就不再做过多介绍,具体可以参考
就我个⼈⽽⾔,我是推荐使⽤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测试,有兴趣的⼩伙伴可以试⼀下。
当然milvus也有难⽤的地⽅,我⾃⼰发现了两点,如果是我⾃⼰使⽤不当造成的,还请各位朋友在评论指出:
milvus的向量格式不⽀持numpy,要⽤列表的形式存储向量,⽽列表占⽤内存要远远⼤于ndarray的,这对于⼩内存主机简直是个天灾,我16GB内存情况下,把500000*768的矩阵转成list,电脑直接卡死。
milvus在第⼀次search时速度会慢,之后机会快起来了,这应该是个⼩,有⼈在github提出了,应该很快就可以修复,所以你们在测试milvus的速度时千万别算第⼀次的时间。
milvus 安装及常见问题
milvus ⼀共有两种安装⽅式:⾃⼰编译安装和使⽤docker安装。这⾥推荐⼤家使⽤docker安装,docker安装⽅便快捷,可在Windows上使⽤。⾃⼰编译安装,由于每个⼈环境不同,很容易出问题。本⽂只介绍基于docker的安装,另外因为我⽐较穷,所以只介绍cpu版本的安装,不过gpu安装也是⼤同⼩异。
基于docker安装milvus CPU版本
简⾔之安装⽐较简单,毕竟⼤佬们已经把milvus部署在了docker⾥,我们只要启动起来就⾏了
电脑python安装教程
vba排序函数sort用法
安装docker
⾸先就是要安装docker,还不了解docker可以了解⼀波,⾮常好⽤的虚拟机⼯具,直接去下载对应平台的安装⽂件即可。
下载相应版本镜像
安装好docker后,要去pull对应的镜像(image),⾸先进到,然后搜索milvus,第⼀个结果就是。因为我们安装的是CPU版本,所以在tags⾥cpu-latest,然后pull下来就可以了,即在你的命令⾏窗⼝输⼊
docker pull milvusdb/milvus:cpu-latest。注意:随着版本迭代更新,这⼀条命令在未来可能会失效,建议先去dockerhub搜索⼀下,去看⼀下应该⽤什么tag。
设置⼯作⽬录和配置⽂件
在创建启动容器之前,我们要先设置好⼯作⽬录和配置⽂件。
⼀共要设置三个⽬录,分别是数据库存储⽬录,⽇志存储⽬录和配置⽂件⽬录。其中配置⽂件⽬录就存放着我说的配置⽂件。配置⽂件⼀共有两个,分别是服务器设置⽂件和⽇志设置⽂件。
所以我们要想好这三个⽂件夹放在哪⾥,⽐如我们可以在当前⽤户⽬录下建⽴⼀个milvus⽂件夹,然后在这⾥⾯存储上述三个⽬录。下⾯我们需要设置两个配置⽂件,记得要把服务器配置⽂件名改为server_config.yaml,把⽇志配置⽂件改为f。
两个配置⽂件的内容: 。配置⽂件也可以到。
下⾯是我的⽂件⽬录结构,共⼤家参考:
milvus
├─conf //配置⽂件⽬录
│      f  //服务器配置⽂件
│      server_config.yaml  //⽇志配置⽂件
├─db //数据库存储⽬录
title header 英语 区别│
└─logs //⽇志存储⽬录
启动docker服务
设置好⼯作⽬录后,就可以使⽤镜像创建容器了,我的⼯作⽬录是C:\Users\Zhdun\milvus,所以我的创建命令是:
数据库课程设计图书管理系统需求分析docker run -td --name mymilvus -e "TZ=Asia/Shanghai" -p 19530:19530 -p 8080:8080 -v C:\Users\Zhdun\milvus\db:/var/lib/milvus/db -v C:\Users\Zhdun\m
命令看起来有点长, 我稍微解释下,-td是后台运⾏,--name是给⾃⼰的容器起个名字,-p是端⼝映射,不想⽤默认的话,可以去服务器配置⽂件⾥改,-v就是为了映射三个⼯作⽬录。具体可以参考docker的。
执⾏完命令后,运⾏docker ps -a,如果发现⾃⼰创建的容器excited的了,那就docker logs⼀下,看出了什么问题。如果发现容器在运
⾏了,就代表基本没问题了。
接下来我会说⼀下常见的安装问题,以及如何去使⽤milvus。
安装时的常见问题及解决
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, IndexType, MetricType
# 初始化⼀个Milvus类,以后所有的操作都是通过milvus来的
milvus = Milvus()
# 连接到服务器,注意端⼝映射,要和启动docker时设置的端⼝⼀致
# 向量个数
num_vec = 5000
# 向量维度
vec_dim = 768
# 创建表
# 参数含义
# table_name: 表名
# dimension: 向量维度
# metric_type: 向量相似度度量标准, MetricType.IP是向量内积; MetricType.L2是欧式距离
table_param = {'table_name': 'mytable', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.IP}
# 随机⽣成⼀批向量数据
vectors_array = np.random.rand(num_vec,vec_dim)
vectors_list = list()
# 官⽅建议在插⼊向量之前,建议先使⽤ ate_index 以便系统⾃动增量创建索引
# 索引类型有:FLAT / IVFLAT / IVF_SQ8 / IVF_SQ8H,其中FLAT是精确索引,速度慢,但是有100%的召回率
index_param = {'index_type': IndexType.FLAT, 'nlist': 128}
# 把向量添加到刚才建⽴的表格中
# ids可以为None,使⽤⾃动⽣成的id
status, ids = milvus.add_vectors(table_name="mytable",records=vectors_list,ids=None) # 返回这⼀组向量的ID
# 官⽅建议向量插⼊结束后,相同的索引需要⼿动再创建⼀次
# 输出⼀些统计信息
status, tables = milvus.show_tables()
print("所有的表格:",tables)
print("表格的数据量(⾏):{}".format((unt_table('mytable')[1])))
print("mytable表格是否存在:",milvus.has_table("mytable")[1])
# 加载表格到内存
milvus.preload_table('mytable')
# 创建查询向量
query_vec_array = np.random.rand(1,vec_dim)
query_vec_list = query_list()
# 进⾏查询, 注意这⾥的参数nprobe和建⽴索引时的参数nlist 会因为索引类型不同⽽影响到查询性能和查询准确率
# 对于 FLAT类型索引,两个参数对结果和速度没有影响
status, results = milvus.search(table_name='mytable', query_records=query_vec_list, top_k=4, nprobe=16)
print(status)
print(results)
# 删除表格和索引, 不删除的话,下⼀次还可以继续使⽤
milvus.drop_index(table_name="mytable")
milvus.delete_table(table_name="mytable")
# 断开连接
milvus.disconnect()
milvus 多进程使⽤
写这⼀章的主要⽬的是为了进⾏并发测试,以及多进程能否节省时间,官⽅说明在使⽤多进程时需要满⾜下⾯两个条件:
下⾯是我的测试代码:
# -*- coding: utf-8 -*-
import time
from multiprocessing import Pool
import numpy as np
desirable什么意思中文import random
from milvus import Milvus, IndexType, MetricType
def create_data(host,port,num_vec,vec_dim):
""" 创建⼀些表格和索引⽤来做多进程测试 """
milvus = Milvus()
# 创建2个表
table_param = {'table_name': 'table1', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.IP}    ate_table(table_param)
table_param = {'table_name': 'table2', 'dimension':vec_dim, 'index_file_size':1024, 'metric_type':MetricType.L2}    ate_table(table_param)
# 随机⽣成⼀批向量数据
vectors_array = np.random.rand(num_vec,vec_dim)
vectors_list = list()
# 创建索引
index_param = {'index_type': IndexType.FLAT, 'nlist': 128}
# 添加数据
milvus.add_vectors(table_name="table1",records=vectors_list,ids=None)
milvus.add_vectors(table_name="table2",records=vectors_list,ids=None)
# 创建索引
print(milvus.show_tables())
# 断开连接
milvus.disconnect()
def clear_table(host,port):
""" 清空表格和索引 """
milvus = Milvus()
for table_name in milvus.show_tables()[1]:
milvus.drop_index(table_name=table_name)
milvus.delete_table(table_name=table_name)
milvus.disconnect()
def milvus_search(host,port,table_name,query_vec,search_time=10):
""" 测试查询, 返回查询的秒数"""
milvus = Milvus()
# 因为bug的原因,要先搜索⼀次
milvus.search(table_name,4,8,query_vec)
# 开始测试
for _ in range(search_time):
query_vec[0][0] = random.random() # 稍微随机化⼀下
milvus.search(table_name, 4, 8, query_vec)
if __name__  == "__main__":
host = "localhost"
port = "19530"
num_vec = 100000
vec_dim = 768
num_proc = 3 # 进程数
search_time = 2000 # 搜索次数
>## Step1 先创建⽤于测试的数据运⾏⼀次就⾏了
# create_data(host=host,port=port,num_vec=num_vec,vec_dim=vec_dim)
# clear_table(host,port)
# exit(0)
>## Step2 测试依次执⾏的时间
start_time = time.time()
for _ in range(num_proc):
query_vec = np.random.rand(1,vec_dim).tolist()
milvus_search(host,port,"table1",query_vec,search_time)
end_time = time.time()
print("顺序执⾏milvus_search的时间总和是:",end_time-start_time)
>## Step3 测试多进程时间
pool = Pool(num_proc)
start_time = time.time()
for _ in range(num_proc):
query_vec = np.random.rand(1,vec_dim).tolist()
pool.apply_async(milvus_search,args=(host,port,"table1",query_vec,search_time))
pool.close()
pool.join()
end_time = time.time()
print("并⾏执⾏milvus_search的时间总和是:",end_time-start_time)
结论就是对于search操作,依次search100次,和10个进程同时开,每个进程search10次,开多进程速度是会变快的。感谢阅读,如有问题,烦请指出。
⽂章可以随意转载,但请务必注明出处:
事实是什么? 这些事实所证实的真理是什么? 永远不要让⾃⼰被⾃⼰所更愿意相信所影响, 只是单单地去审视, 什么才是事实.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论