当前位置: 首页 > 后端技术 > Python

和Milvus聊天(一)问答

时间:2023-03-26 11:54:33 Python

本周二我们和Milvus的小伙伴们进行了一场精彩的在线问答。我们还为那些不能参加的人做了一份完整的成绩单。觉得字数看着累的朋友可以根据自己想知道的看视频播放。[点击此处查看视频!]也想加入我们的讨论吗?本次活动我们每周二晚上8:00定期举办,通过zilliz小助手(微信:zilliz-tech)报名下周活动,或扫描二维码直接报名!Q&A视频/文字录制*语音转文字可能会有一些差异,实际内容以音视频为准用户1:你好,我目前正在做特征检索,我想知道:有一个特征你刚才提到的分析,然后你会在不久的将来做一些混合查询功能。将来会支持标准SQL吗?Milvus:对于标准的SQL,因为我们现在在做DSL设计,可能先支持像ElasticSearch这样的描述语言。相对来说,SQL部分可能会暂时放在较低的优先级顺序。我不知道你现在在你的场景下是怎么做到的?用户1:我们也打算做这个,但是可能会考虑结合其他现有的数据库比如PostgreSQL来修改。Milvus:那你们也在做向量相似度搜索,想集成到关系型数据库中,对吧?用户1:是的。Milvus:在这部分,阿里云其实也做了这样的尝试,但其实仔细想想它的向量数据背后的存储和边缘计算方式,和结构化数据的方式是有很大区别的。的。因为在整个传统的结构化数据库中,比较本质的部分可能是一个B+树索引,然后SQL优化器如何根据B+树索引来生成和优化访问路径,但是在vector中有些部分其实是没有用到的,所以感觉可复用的部分比较少。网友1:因为PG(PostgreSQL)目前有一个类似相似度检索的插件,他们只是做了一些类似的索引来推广PG。Milvus:之前有一个项目叫PG-ANN,但是现在这个项目好像有点不活跃,而且当时也很久没有做了,所以这方面的探索确实有一些挑战。用户1:我看过我们的代码,我们是不是用了一些其他的存储引擎?Milvus:是的,现在的话已经没用了。因为数据库的存储引擎实际上是一个基于数据库本身形式的存储引擎,像那些事务型数据库,它可能是一个按照页来组织它的数据文件的存储引擎。还有一种像这样的KV类型,可能是KV格式。但是vectors其实和他们的需求是不一样的。vector有点像KV但又不是很像,因为我们做索引的时候,比如聚类索引,有些IVF索引其实是需要携带一些聚类信息在里面的。.所以这部分确实和现有的数据存储引擎有很大的不同。所以这部分确实是我们自己做的,但是底层承载了这部分数据文件,我们下一个版本希望能接入S3存储。这样,将数据文件放在S3存储上实现高可用和分发会更容易。用户1:有没有考虑过以后和HBase或者HDFS这样的数据库结合?Milvus:HBase暂时还没有想过,因为场景可能太相似了。因为和HBase、HDFS一样,都是数据块,但是在向量检索的场景下,其实我们的文件也可以叫做数据块,只不过我们的数据块其实承载的信息更多。首先他有聚类信息,如果是试管婴儿索引。那么,为了IO效率和检索效率,我们其实是希望数据块能够尽可能的大,HDFS这部分考虑的因素可能会有所不同。HDFS可能会将一个文件分成若干个块,每个块可能需要128MB才能分布在多台机器上。那么如果我们的文件是这样划分的,很多时候,我的聚类信息可能是在第一个块上。在很多情况下,我想一起阅读一个文件。如果我要在不同的节点上读取,如果不同的节点加载不同的分片,没有集群信息,那就尴尬了。用户1:我们现在有一些业务场景,比如除了相似度检索,还有一些特征聚类的业务,还有一些其他的分类业务。我们的特征已经存储在里面了,我们想把自己的聚类、分类等一些算子集成到这个项目(Milvus)中。这个项目有提供这些开放接口吗?Milvus:对,也就是说,在我们现有的客户端场景中,Milvus负责存储向量特征;在此阶段,用户应用程序和模型构建在上层。所以你也一样,你的算子没问题,你的应用都在上层,然后你把特征存到Milvus里面,然后做索引和搜索加速。用户1:所以目前只提供检索功能?Milvus:你希望(比如你有100万个向量)索引这个向量后能得到聚类信息吗?用户1:是的,这些cluster的信息比一些cluster更动态,比如每天输入100000个vector,然后我每天发一些operator就算有更新,基本就是存储,然后上面的operators该层还具有用于检索的运算符和一些用于分类的运算符。Milvus:我大概明白你的意思,但是它的实现是这样的:比如在原来的FAISS中,假设你有10万条数据进行预训练,它会预训练一个大的分类,然后你插入数据是基于最初训练的大分类,然后将这些数据放在那里。那么,在这种情况下,你可以说你做了一个分类或者聚类,但是在我们的矢量搜索引擎中,因为提供了矢量来进一步管理矢量数据,所以实际上是这样的外观:假设你假设有这里100万个向量,那么可能假设这100万是放在同一个文件里,那么这100万个向量,在这个文件里,他形成了一个比方说试管婴儿这个分类的结果。明天你还有另外100万个向量,它们也可能在一个文件中,而那个文件又是分开的。另外一个就是这个索引会训练出另一组分类结果,所以其实你不断有新的东西进来,他们会在达到预设值的时候建立一个新的索引文件。所以在这种情况下,如果你要对它进行聚类或者分类,那么你就需要在这个东西上面有一层(业务层),你需要一个大的整体分类的指导,比如在这个东西方面,它是比较与原来的。例如,如果您有100个类别,则将其与前100个类别进行比较,看看哪个最接近。所以这个会有点不同。因为我们把流更新数据分成几个文件,每个文件的聚类信息都不一样,所以返回给你的东西可能不是一个统一的东西。目前,Milvus的定位是一个比较基础的服务于AI的向量搜索引擎。用户一:后期没考虑集成更多的机器学习算子?比如SVM,逻辑回归等。Milvus:目前还没有计划把这部分包括进来。我们目前正在做的一些集成就像一些新的ANN算法。比如我们原来没有HNSW和ANNOY,后面会整合。网友1:Milvus现有的应用场景有哪些?Milvus:在深度学习方面,比如这种安防智慧城市,智慧零售,还有一些互联网SaaS平台,比如智能海报生成,它会有很多基本的图片元素,然后根据用户的需求去搜索图片图书馆,以形成个性化的海报。另一部分是做这个推荐系统,就是给用户推荐一些视频和场景比如短视频,还有一部分是自然语言处理的方向。因为大家现在可能用的比较多的是这种Bert的模型,生成的向量也是这种高维向量。在我们的Milvus网站上,我们也有一个化合物分子分析的demo,那部分不是AI模型,它是一个基于规则的模型转化为一个特征向量,然后我们用这个来计算Tanimoto相似度。用户2:你刚才说你的索引固件是把文件分块后重新训练码本。这样的话,会不会说码本不统一呢?Milvus:是的,因为每个分片都是一个重训练的分类,所以每个文件里面的分类信息其实是不一样的。事实上,这样做,当然会付出一定的代价来重新训练它。当然,如果是GPU,它会非常快。它的一个优点是,如果后面的数据分布和原来的不一样,不会造成太大的影响,因为比如我用20%的数据来训练一个分类,那么后面的数据其实可能是不一样的从原来的。之前的训练数据分布不一样,所以可能某个cluster的数据很多,搜索某些地方的时候响应会不均衡。我们现在这个模型的好处就是后面进来的数据反正都是重新训练的,所以我搜索固定空间大小的时候,它的响应时间是比较一致的。用户2:我的想法是,要不要采用这种分布式结构,然后在全局数据上加一个codebook。这样,码本就统一了。另一个问题是使用数据划分监控方式是否会影响准确性。更好的?Milvus:先回答第一个问题:假设我有两个节点,在两个节点上共享codebook,还是没有办法解决之前提到的问题。你真正进来的是你训练的那套,在分布上可能不一样。可能会有一些分类不均匀,导致性能波动,这个问题其实是无法避免的。另一种情况是,他在Facebook里用FAISS做集群的时候,他把它分成了200个类,比如他自己建了20台机器,2台为一组,他去每个组Host200个类中的10%,比如,那台机器上有20个班级,那么你的新数据会根据你所属的班级插入到特定的一组机器中。其实这也是同一个问题,就是后面你的系统数据的分布变化比较大的时候,那么你可能这10组机器中有的特别忙,存储的vec??tor数据很多。,仍然会导致问题。那么,在这种情况下,如果我们对所有的全局向量数据做一次重分类训练,其实成本会比较高。这有点像传统的数据库表,你总是往里面插入数据,然后不断删除数据,你的索引就会乱七八糟。你必须做一些全局的索引重建,这会导致一定时间的向量搜索服务。不可用。所以也正是因为这个原因,我们现在考虑的模型可以算是一种取舍。FAISS在他们论文里讲的模式可能是20台机器,两个一组,每组有一些分类(和其他方法)。从理论上讲,它可以提供非常好的查询性能,但在实际操作时,尤其是当你不停地输入数据时,它的维护成本其实是比较大的。第二个问题:统一码本的另一个挑战就像传统的数据库。需要有实时的统计信息,然后定期查看,因为聚类类型等这些指标最基本的算法是K-means,那么K-means的意思就是K均值,希望能平分分为K类,所以如果是统一的码本,需要持续监控这些东西,然后确保当数据在不同类之间分布不均匀达到一定程度时,需要触发操作重新索引并重新计算所有类别。所以实际上,这种监控会给用户带来一种更容易发现潜在性能问题的方法。但是当你重建整个分类的时候,维护成本和不可用时间还是存在的,但是当用户有意识地触发这个事件的时候,他可以把它放在一个比较低的业务时间里,不可用的影响可以降低到比较小。用户1:现在这个系统的最大单机容量是多少?实测单机容量Milvus:是这样的。我们在自己的物理机上测到的最大的数据集来自sift-1b,它有10亿条128维的数据。我们测试的机器是512G内存的双路机器。但是因为我们可以在IVF索引中使用标量量化将其转换为SQ8索引,所以它的实际内存消耗在140G左右。那么在我们实际部署的一些用户的产品下,因为是1024维的向量,基本上每个做几千万上亿是没有问题的。就人脸的1024维向量而言,512GB或者256GB内存的机器支持上亿个向量是没有问题的。用户3:话务员分机如何支持?Milvus:如果是指ANNS的算子扩展,我们的代码结构里面有一些解释。因为之前有一个做智能零售的用户问如果要加一些我们还没有的指标怎么办。在我们索引的相关目录中有开发说明。如果你对这里感兴趣,我们会后把链接发给你,我们也可以在群里交流。欢迎加入Milvus社区Milvus源码github.com/milvus-io/milvusMilvus官网milvus.ioMilvusSlack社区milvusio.slack.com?2020ZILLIZ?