共计 2869 个字符,预计需要花费 8 分钟才能阅读完成。
✏️ 编者按:
对于短视频产品而言,晋升视频去重性能、升高误杀率,是晋升用户体验的必要环节。在此次 Milvus 社区发动的「Milvus 实战系列直播」中,咱们有幸邀请到了 vivo 互联网服务器开发工程师马运杰,与大家分享开源向量数据库 Milvus 在 vivo 视频中的实际。
🌟 嘉宾简介:
马运杰,vivo 短视频后端架构师,负责 vivo 短视频服务端以及视频解决平台的零碎架构设计,毕业于南京邮电大学,热衷新技术预研与难点攻坚。
业务背景
为什么要视频去重?
对于观众来说,良好的观看体验与视频内容有着很大的关系。以后,全网范畴内次要精品视频次要来自于 MCN 机构,一些公司为了更快更好地去笼罩全网内容,会抉择和内容代理单干,而代理手上会有很多反复的版权内容,导致反复内容呈现。另外,搬运类视频也会产生反复内容。如果将反复的内容间接分发给用户,就会造成极差的用户体验,堪称「劝退」。所以,内容进行去重解决是十分有必要的。
目前,视频去重面临哪些痛点?
目前,根底样本数据已达到大几千万,在不久的未来会过亿。目前的难点是,在亿级样本数据的根底上反对百万级别的吞吐量,同时须要兼顾去重的精度以及高召回率。接下来,我将为大家介绍咱们是如何应答这几个问题的。
算法流程设计
首先,进行视频特征提取,对视频进行抽帧。视频抽帧有多种策略,能够依照固定的工夫距离抽帧,或者抽取视频所有的关键帧等。咱们首先对视频进行场景检测,优先抽取出场景切换中具备代表性的一些关键帧,而后利用图像算法提取关键帧的部分特色,之后再把这些部分特色去合并失去全局特色。全局特色是几千维的浮点型的向量,最初咱们还会再进行一层哈希压缩,这层哈希压缩其实压缩了很多的数字量,然而也会给咱们带来一些问题,后续会提到。除了视频特色之外,咱们还会提取视频的音频指纹,作为比对的重要依据。
特征提取后,咱们进行特色匹配。将历史提取的视频特色放在向量数据库 Milvus 中,通过 Milvus 数据库召回 topK 的向量,而后通过肯定的策略进行过滤合并,失去类似的视频的候选集,通过粗疏的音频指纹的比对,根本能够失去类似视频的汇合。最初,依据业务上的其余特色,如时长、题目等等特色的残缺比对,最终造成类似视频汇合。
辨认成果须要同时兼顾召回和精度这两个方面。在视频召回的时候,咱们会适当放宽整个限度,尽可能多地召回类似视频;而在音频比对当中,咱们会更严格地进行筛选。这种策略有肯定缺点,比方短视频罕用的“拍同款”性能中,拍进去的音频十分相似,比对后果可能不是很好。整体来看的话,这样的策略还是能达到 90% 以上的精度和召回率指标。
去重零碎设计
整体零碎架构如上图,分为三个服务、四个步骤。第一个局部是特征提取,次要是负责视音频特色的提取以及特色文件的治理,其中还包含了视频的镜头检测以及抽帧。第二个局部是去重策略,次要包含了业务上的逻辑以及去重的策略管制。第三个局部是特色召回局部,次要是作为 Milvus 数据库的客户端代理工作,工作内容次要是负责创立汇合以及索引。第四个局部则是基于 Milvus 数据库搭建的检索集群,外面分为主集群和备集群。
在进行零碎的具体介绍之前,咱们先来看一组压测后果。从后果中能够看到,第一列向量数量、第三列向量维度和最终的 TPS 呈负线性相关。向量数量、向量维度和索引参数,是影响 TPS 的次要因素,也是咱们前面去晋升这个性能的次要方向。
咱们所做的第一个工作是集群化部署。
从压测数据能够看出,单实例只能反对几百万的向量检索,也就是几十万的视频样本。尽管这种单机部署也会有它的一些劣势,比如说部署起来非常简单,使用方便等等。然而对于全局去重的业务不适合的。咱们抉择应用 Mishards 插件来搭建分布式集群,通过一直地退出 Milvus 实例,来分担每个实例的查问数量,晋升整个集群的吞吐量。Milvus 数据库外部解决申请的时候其实都是单线程的,如果要晋升整个零碎的并发能力,能够思考左边这样多集群部署形式,晋升咱们整体的吞吐量。
除了集群化部署之外,创立索引也是晋升性能的次要形式。上图右边示意精度,左边示意性能。能够看到,在增加索引之后会导致一些召回率上的损失,nlist 越小,损失越大,所以咱们天然想把 nlist 设置得大一些。然而,Milvus 对二值型向量的反对比拟弱,在构建索引的时候没有充分利用 CPU 资源,构建工夫十分长。比方,nlist 等于 1024 的时候,索引构建工夫曾经达到一个小时左右。咱们就只能斗争地升高 nlist 的大小,给咱们带来了召回率上的一些损失。
此外,构建索引期间集群外面的数据无奈失常写入的,只有期待整个索引构建实现之后后,才可能失常插入申请,这也是为什么咱们须要 Milvus 备级群。咱们把向量的读写分为三个状态:失常状态(对主集群进行读写)、索引构建时的状态(不能写入主集群,应用备集群,而后同时查问主集群及备集群)索引构建完结状态(主集群曾经能够失常读写,须要把备用集群的数据迁徙回主集群,迁徙实现后,这个状态也就从新变成了失常的状态)。通过这样主备切换,咱们解决了索引构建期间无奈失常写数据的问题。
整个集群的样本数据量越来越大,集群的吞吐量会随着工夫的迁徙而变小。为了管制整个集群的吞吐量,咱们抉择通过业务上的一些规定进行了分支。比方,咱们发现两个雷同或者类似的视频,咱们会是依据视频的公布工夫以周为单位去进行分区。在召回的时候,抉择该视频所在分区相近的几个分区进行查问。通过这样一种形式,咱们对整个比对的数量进行了严格控制,从而保障了检索效率。以上就是咱们基于 Milvus 数据库所做的零碎设计和性能优化。
期待与总结
在辨认成果方面,通过视音频特色的联合,采纳宽视频阈值、严音频阈值的形式,目前咱们去重辨认的精度与召回都达到了 90% 以上;在零碎性能方面,Milvus 集群的吞吐量和每台机器检索的数据量强相干,咱们通过集群化部署、数据分区的形式,限度每台机器检索的向量数量,以此达到咱们零碎吞吐量 100 W/ 天的指标;在索引构建方面,咱们遇到了比拟多的问题,咱们临时以主备集群的形式满足零碎可用性的条件,接下来咱们会和社区继续沟通,解决二值索引的相干问题。
在将来,咱们期待 Milvus 数据库对以下方向进行优化:
匹配分级:对匹配后果进行分级,对于低于阈值之下的视频通过视频解决、采集更粗疏的视频特色,进行二次匹配;
索引构建效率晋升:与社区单干,针对二值索引的构建性能进行优化;
集群主动扩缩容:通过 Milvus 服务的主动注册与主动方向,解决集群动态扩缩容的问题;
零碎高可用:通过多集群部署等形式,解决 Mishards 以及 Milvus 数据库写节点单点问题。
Zilliz 以从新定义数据迷信为愿景,致力于打造一家寰球当先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的暗藏价值。
Zilliz 构建了 Milvus 向量数据库,以放慢下一代数据平台的倒退。Milvus 数据库是 LF AI & Data 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。