Milvus
一、 简介
Milvus 是 一款开源的、针对海量特征向量的相似性搜索引擎。Milvus能够很好地应对海量向量数据,它集成了目前在向量相似性计算领域比较知名的几个开源库(Faiss, SPTAG等),通过对数据和硬件算力的合理调度,以获得最优的搜索性能。
相比 Faiss 和 SPTAG 这样的算子库,Milvus 提供完整的向量数据更新,索引与查询框架。Milvus 利用 GPU(Nvidia)进行索引加速与查询加速,能大幅提高单机性能。除了提供针对向量的近实时搜索能力外,Milvus 可以对标量数据进行过滤。
随着数据和查询规模的增加,Milvus 还提供了集群分片的解决方案,支持读写分离、水平扩展、动态扩容等功能,实现了对于超大数据规模的支持。目前,Milvus 是一个单节点主从式架构(Client-server model)的服务器,最高可以支持 TB 级特征数据的存储和搜索服务。对于有更大数据规模或者高并发需求的用户,可以使用目前尚在实验阶段的集群分片中间件 Mishards 进行部署。
二、 发展历程
l 2019年5月31日,内部正式开发。
l 2019年10月15日,向广大开发者开源。
l 2020年1月通过LF AI技术答辩
l 2020年4月下旬完成LF AI全部手续,正式成为Linux基金会的孵化项目
l 保持着每个月一小版本的更新迭代。
三、 重要版本功能
Milnuv自开源至今(2020.7.30)已有一年两个月,从最初的v0.2.0到如今的v0.10.1,更新迭代了17个版本,可以看出其的开发者活跃程度,如果不谦虚的说,Milvus是Linux基金会中开发最活跃的AI项目。
l V0.2.0
n 添加基于 C++ 和 Python 的 SDK。
n 增加基于 Prometheus 的监控指标。
n 增加基于 Inverted File Index 的向量索引。
n 实现单节点的 Milvus。
l V0.3.0
n 增加基于 Celery 的水平扩展方案。
n 增加了删除 Table 的功能。
n 支持 ARM64 架构。
l V0.4.0
n Milvus 现在支持添加多个 GPU 协调分配资源。
n 支持新的索引类型 IVF_SQ8。
n 新增了“创建索引”,“用户自定义向量 id”,和“按日期范围删除向量”等 API 接口。
l V0.5.0
n 支持全新的 IVF_SQ8H 混合计算索引。
n 新增 Java SDK。
n 系统启动可以设置预加载向量数据,免去首次查询时的加载时间。
l V0.6.0
n Milvus v0.6.0 提供了仅支持 CPU 和支持 GPU 两个版本的 Milvus。同时支持在纯 CPU 和 GPU 环境下在 Docker 容器中编译 Milvus。
n 新增了分区表功能以确保增量数据的高性能查询。Python,Java 和 C++ SDK 中增加了表分区相关接口,支持创建/删除分区表,向量插入指定分区表,以及指定分区表的查询等
l V0.7.0
n 新增了对单条或多条向量的删除功能。如果你对一个集合进行了向量删除操作,后续对这个集合的搜索操作仅支持一部分索引类型,包括在 CPU 上运行的 Flat、IVFlat、IVFSQ8 等。Milvus 的后续版本将为其他索引类型提供支持。#861
n 新增了通过向量 ID 读取对应的向量值的功能。
n 新增了数据落盘与压缩功能。你可以设置定时落盘或者手动落盘,从而避免数据丢失。如果一个段中的向量数据被删除,被删除的向量数据占据的空间并不会自动释放。你可以对集合中的段进行压缩操作以释放多余空间。
n 新增了运行时更改 Milvus 服务端参数的功能。你可以通过 Milvus 客户端对 Milvus 服务端参数进行更改,部分参数更改后可即时生效,无需重启 Milvus
n 新增了 WAL 功能,可以大大提高数据操作的可靠性。你可以在 Milvus 服务端配置文件(server_config.yaml)中对 WAL 进行设置。#830
n 新增了 RESTful API。
n 新增了 Go SDK,详细信息请参考 https://github.com/milvus-io/milvus-sdk-go。
n 新增了对 HNSW 索引类型的支持。关于 HNSW 的详细介绍请参考向量索引算法 HNSW 和 NSG 的比较。
n 新增了对 Jaccard、Hamming、Tanimoto 距离的支持。#823
n 新增了在 Prometheus 中 Pushgateway 的支持。Pushgateway 使生命周期短、批量的 metric 能够被 Prometheus 提取。#813
n 新增了对 AVX 512 指令集的支持。Milvus 理论上可支持所有包含 AVX 512 指令集的 CPU。
l V0.8.0
n 增加 ANNOY 索引类型,关于 ANNOY 索引的详细介绍请参考文档。
n 新增下列索引类型支持删除操作。包括:Flat/IVFlat/IVFPQ/IVFSQ8/IVFSQ8H/NSG/HNSW/ANNOY
l V0.9.0(重要更新)
n 支持在 Milvus 启动时检查 CPU 指令集、GPU 驱动版本 和 CUDA 版本。
n 避免多个 Milvus 实例同时操作同一 Milvus 数据。
n 支持日志文件轮转。
n 处理搜索请求时暂停创建索引。
n 添加和更新了API调用方法
n 重构了日志输出。 #221
n 升级了 OpenBLAS 版本以提高 Milvus 性能。 #1796
n 统一了 FAISS、NSG、HNSW 和 ANNOY 的向量距离计算方法。#1965
n 支持 SSE4.2 指令集。 #2039
n 重构了配置文件。 #2149 #2167
n 采用了 Elkan K-means 算法提高 IVF 索引性能。
n 优化数据合并机制,解决“写放大”问题。
四、 可支撑的应用场景
l 图像视频检索
深度学习模型最开始就是用来对图像、视频等进行处理,通过训练可以精准的提取图片、视频中的特征从而对图片、视频进行分类,打标签,以图搜图,以图搜视频等等。Milvus凭借其出色的性能和数据管理能力,可以支持各种深度学习模型,实现对海量图片和视频的高性能分析检索能力。
n 图片搜索
n 图片去重
n 视频去重
n 以商品搜商品
l 智能问答机器人
传统的问答机器人大都是基于规则的知识图谱方式实现,这种方式需要对大量的语料进行分类整理。而基于深度学习模型的实现方式可以彻底摆脱对语料的预处理,只需提供问题和答案的对应关系,通过自然语言处理的语义分析模型对问题库提取语义特征向量存入Milvus中,然后对提问的问题也进行语义特征向量提取,通过对向量特征的匹配就可以实现自动回复,轻松实现智能客服等应用。
n 语义提取
n 个性化推荐
n 语料分析和推荐
l 赋能传统向量计算
在传统的数据处理领域也存在大量向量计算的场景,使用传统的计算方式需要消耗大量的算力而Milvus凭借先进的算法可以在同等算力资源下将向量数据处理能力提高至少两个数量级。
n 分子结构相似性分析
n 分子药理分析
n 药物分子虚拟筛选
l 音频数据处理
利用深度学习模型对音频数据进行分析和处理能够大大提高语音识别的准确率,而其核心也是对相关音频切片进行向量化处理并且通过向量距离的计算来判断其表达的含义,因此,Milvus在语音、音乐等音频数据处理领域的也有丰富的应用。
n 个性化音乐推荐
n 音乐去重
n 声纹验证
n 语音识别
n 智能语音小助手
n 智能翻译机器人
五、 上升空间
Milvus的上升空间我们可以从两方面来探讨,一是其技术层面的优势,二是其市场需求的角度。
从技术层面上来讲,其全面的相似度指标令人向往,可根据场景具体需求来挑选最有效的向量相似度计算方式,从基础奠定了他的普适性。同时其提供了多达4种语言的SDK,使其开发及使用生态圈更加广泛,并且其的动态数据管理及近实时搜索的特性,也是其他框架无法比拟的。在后来的版本中,其实现了分布式部署以及使用多个GPU进行创建查询索引操作的功能,在性能方面大大上升了一步。
而且Milvus同时集成了诸如著名的Faiss,Annoy,Hsnwlib等ANNS算法库的优点,并隐蔽了它们自身的复杂性,提供给外界一种更简单易用的API,更加赢得了广大开发者们的青睐。
所以从技术层面上来讲,目前仅仅经过一年的发展,就积累了上百家社区用户,在机器视觉(CV),自然语言处理(NLP)和声音识别(Voice)等领域吸引了众多用户,由此可见,Milvus的发展和上升空间还很大,等着众多AI爱好者和开发者去更新维护它,随时技术的不断更新,其也会登上一个技术巅峰。
但事情要从两面看,在另一面市场需求的角度上来说,Milvus作为一款开源软件,虽然避免了被供应商锁定,可以拥有更广阔的市场和选择权,但是他的弊端也很明显,对于企业来说,他们更偏向于闭源软件,且Milvus又是一种关乎用户的软件,企业在选择时会更加慎重,因为开源软件存在不稳定性,关键程序的技术人员有可能会退出,造成开源软件的停顿甚至死亡,且在使用过程中产生的问题,开源社区的人是没有义务和责任来帮你排忧解难的。所以作为企业,闭源软件是更被青睐的。那么为什么,Milvus还是选择了开源。其实原因无他,开源的技术现在已经占据了主流,因为它更保值,发展更快。
综上所述,Milvus这样的新一代基础软件,虽然没有现成的对标项目,但一样要坚持开源。不是企业不敢用闭源的基础软件,而是不开源的基础软件没什么人愿意花时间学。开源是基础软件的未来,这不是由新的商业模式决定的,这是人性使然,同时Milvus的发展空间是很大的。
六、 竞争产品
Jina-ai
一、简介
Jina于2020年2月6日正式开源,是一款基于Python开发的下一代云端神经搜索框架,它是由AI界大名鼎鼎的肖涵老师带领的开源团队创始和开发,秉承了肖涵老师团队优秀的开源文化,其团队名下的Bert as server 和Fashion-Mnist 在GitHub的star数都高达8000,故本次的Jina质量可见一斑
肖涵老师对于神经搜索引擎的构造想法由来已久,最直接的因素就是在企业IT和消费者市场中,无法通过基于令牌/符号的搜索处理的无法搜索的内容越来越多。这包括图像,视频,动画,音频,3D模型渲染和元数据。所以基于向量搜索的引擎已经会成为未来的趋势。
Jina以通用性为目标,几乎可以搜索任何内容形式(例如文本,图像,视频,音频);它的目标是在AI生产中,利用现代软件基础架构并以最佳工程实践进行构建。旨在易于使用,针对多个平台,架构和用例进行优化。
二、发展历程
2020年2月9日正式开源
三、重要版本功能
Jina截至目前(8月1日)为止,依然保持着高度的活跃,每周一次更新迭代,这在AI项目中属于很高的速度和新鲜。
l V0.0.5
n 添加流cli
n 向Pod添加负载均衡
n 添加SPTAG索引
n 添加NMSLIB索引
l V0.0.8
n 添加一个选项来保存raw_bytes
n 在helloworld中添加日志服务器选项
n 将cli args添加到hello world
n 添加Hello world Yaml
n 添加Hello world
n 添加配置文件终结点
n 向pod cli中添加减少Yaml路径
n 将后端添加到npindexer
l V0.2.2
n 添加频谱音频编码器(redram)
n 将gevent用作日志记录服务器(fhaase2)
n 为nlp(fhaase2)更新SlidingWindowSegmenter
n 为nlp(Frederic Haase)添加SlidingWindowSegmenter
n 添加缓冲区,data_uri,file_path转换(韩小)
n 原型:将mime_type添加到原型(韩小)
l V0.4.0
n 添加search_k参数
n 将距离参数添加到faiss索引器中
n 将nprobe参数添加到faiss索引器中
n 为了保持一致性,将search_numpy更改为search_ndarray
n 重命名端口grpc(fhaase2)[ee00b938]-索引器:添加空格
n 索引器:根据建议修复代码
n helloworld:添加cli arg'download-proxy'
n 允许用户在查询时间内切换索引器
n 将fastica添加到数字编码器
n 添加图片自定义keras
n 添加召回与速度均衡
n 添加ngt索引
n 添加深层细分
四、支撑应用场景
多媒体搜索引擎
智能聊天回答机器人
赋能传统向量计算
五、上升空间
Jina的基础毋庸置疑是非常好的,在短短的半年内就收获了近1000的star数,从技术层面上来讲,其集成了各种底层算法库的向量表示方式,且做到了云端部署,方便了用户的部署及使用。但目前Jina还只是基于Python开发,并没有对其他语言提供SDK,故在某些情况下限制了其的生态环境。
Jina也有着自身的Yaml语法,可通过API和仪表盘迅速的搭建出一个属于自己的云端系统。同时他最大的亮点就是其可以在多个平台和架构上实现任意类型的大规模索引和查询。
以上种种都可看出Jina的未来发展是很可观的,但是又作为一个新产品项目,能否与现有的生产环境相兼容还有待考量。
六、竞品