一种基于Faiss的分布式海量相似向量增量训练系统
技术领域
本发明属于数据检索领域,特别涉及一种基于Faiss的分布式海量相似向量增量训练系统。
背景技术
现有技术中的分布式特征向量训练系统,在高并发访问时,响应时间较为缓慢,或是存在宕机的情况,无法对在线的实时索引特征向量数据和离线的批量索引特征向量数据进行一致更新,导致索引特征向量数据不一致,影响训练系统的可靠性。并且,目前在现有技术中存在一定的问题,无论是Google的双塔模型或基于双塔模型思想的衍生模型,为了能够对新物品生成特征向量,需要频繁的训练模型,而这将同时改变旧物品的Embedding,需要频繁更新物品特征向量库。因此亟需一种能够在线支持特征向量库的增删改、满足在线增量训练的海量相似向量增量训练系统。
公开号为“CN113449132A”的中国专利公开了一种向量检索方法及装置,在获取到目标向量后,根据预先训练的分布预测模型,得到了反映相似向量在每个聚类分区中的分布概率的预测分布,根据预测分布,将表征概率较大的若干个聚类分区作为检索分区,根据预测分布确定检索分区,使得确定的检索分区更为准确,提升了检索精度。该发明同Faiss工具一样,使用聚类计算的方法快速实现相似向量的分区和计算功能,但该方法对中小企业开发成本较高,不宜采用。并且对于不同业务场景,聚类计算需要的方法也存在不同,Faiss工具支持欧式距离和内积的计算方法,可以对不同场景和不同特征向量规模使用不同的聚类计算方法,大大提高效率。
发明内容
本发明提供一种基于Faiss的分布式海量相似向量增量训练系统,旨在解决现有检索技术的训练成本较高的问题。
为解决上述技术问题,本发明提出了一种基于Faiss的分布式海量相似向量增量训练系统,包括FaissTrainer、FaissWorker及FaissDriver,所述FaissTrainer为Faiss训练组件,其用于对特征向量库文件进行训练,生成或更新索引文件,所述FaissWorker为Faiss检索组件,其用于相似特征向量检索计算、在线和离线索引文件的更新,所述FaissDriver为Faiss代理组件,其用于获取特征向量检索查询请求,并进行代理转发。
所述FaissTrainer包括批量训练模块和增量训练模块,批量训练模块用于对某一业务场景的特征向量库里的特征向量进行批量训练,并生成索引文件,增量训练模块用于对某一业务场景实时新产生的特征向量在其最新索引文件的基础上进行增量训练,并更新索引文件。
优选的,所述FaissTrainer还包括日志初始化模块、加载配置Etcd监听模块、退出前置处理模块与任务管理模块。
所述日志初始化模块用于FaissTrainer服务启动时初始化日志文件,记录FaissTrainer请求相关训练日志和训练请求操作日志。
所述加载配置Etcd监听模块用于FaissTrainer加载Etcd服务地址,获取Etcd中索引文件列表以及各个索引名称对应的特征向量维度。
所述退出前置处理模块用于服务失败关闭、重启时对FaissTrainer服务器触发通知。
所述任务管理模块用于FaissTrainer的HeartBeat心跳定时任务,通过HeartBeat心跳定时任务实时检测FaissDriver的网络状态。
优选的,所述批量训练模块的批量训练方式具体包括以下步骤:
A1:通过用户客户端上传特征向量库文件到HDFS集群。
A2:执行训练通知脚本,通知FaissTrainer进行训练操作。
A3:FaissTrainer接收到训练通知并进行校验,校验该训练通知是否在FaissTrainer中已经注册,若未注册,则FaissTrainer从HDSF集群中拉取特征向量库文件至服务器本地进行训练,训练完成后,FaissTrainer将训练好的索引文件保存至本地。
A4:FaissTrainer通知FaissDriver,再由FaissDriver通知FaissWorker进行同步和更新本地索引文件,并将最新索引文件上传同步至HDFS集群,从而完成批量训练。
优选的,所述批量训练模块在进行批量训练时,FaissTrainer进行全量更新加锁,避免训练更新导致索引文件不一致。
优选的,所述训练通知脚本的参数包括索引名称和特征向量库文件中的特征向量维度。
优选的,所述增量训练模块的增量训练方式具体包括以下步骤:
B1:通过用户客户端将新增特征向量数据推送至所述FaissTrainer在线训练所对应的消息队列。
B2:所述FaissTrainer加载Etcd索引文件列表,并且从消息队列拉取增量更新消息,获取所述增量更新消息中的新增特征向量,从加载的所述Etcd索引文件列表中检索是否存在新增特征向量对应的索引文件,若不存在,则所述FaissTrainer首先从HDFS集群中拉取该新增特征向量索引文件,并与本地索引文件进行比对是否一致,若存在不一致,则选取新增特征向量索引文件,进行更新训练。
B3:所述FaissTrainer将B2更新训练得到的索引文件保存到本地,替换原有的索引文件。
B4:所述FaissTrainer通知所述FaissDriver,再由所述FaissDriver通知所述FaissWorker进行同步和更新本地索引文件,并将最新索引文件上传同步至HDFS集群,从而完成增量训练。
与现有技术相比,本发明具有以下技术效果:
本发明提供一种基于Faiss的分布式海量相似向量增量训练系统,该系统基于Faiss检索工具开发出高性能、分布式、支持增删改查的海量相似特征向量检索服务系统平台,支持在线实时更新训练特征向量库,并且多节点可以同步更新最新索引文件,保证索引文件的一致性,无需停机全量重新训练特征向量库占用过多时间,降低企业的训练成本。
附图说明
图1是本发明所述的一种基于Faiss的分布式海量相似向量增量训练系统的整体结构图;
图2是本发明所述的FaissTrainer架构图;
图3是本发明所述的FaissTrainer批量训练架构图;
图4是本发明所述的同步索引文件架构图;
图5是本发明所述的FaissTrainer增量训练架构图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例,并参照附图,对本发明的技术方案进行清楚、完整地描述。
实施例
本发明提出了一种基于Faiss的分布式海量相似向量增量训练系统,参阅图1所示,包括FaissTrainer、FaissWorker及FaissDriver,所述FaissTrainer为Faiss训练组件,其用于对特征向量库文件进行训练,生成或更新索引文件,所述FaissWorker为Faiss检索组件,其用于相似特征向量检索计算、在线和离线索引文件的更新,所述FaissDriver为Faiss代理组件,其用于获取特征向量检索查询请求,并进行代理转发。FaissTrainer是与FaissDriver进行通信的。所述FaissDriver为FaissWorker的代理角色。
参阅图2所示,所述FaissTrainer包括批量训练模块和增量训练模块,批量训练模块用于对某一业务场景的特征向量库里的特征向量进行批量训练,并生成索引文件,增量训练模块用于对某一业务场景实时新产生的特征向量在其最新索引文件的基础上进行增量训练,并更新索引文件。
进一步的,所述FaissTrainer还包括日志初始化模块、加载配置Etcd监听模块、退出前置处理模块与任务管理模块。
所述日志初始化模块用于FaissTrainer服务启动时初始化日志文件,记录FaissTrainer请求相关训练日志和训练请求操作日志。
所述加载配置Etcd监听模块用于FaissTrainer加载Etcd服务地址,获取Etcd中索引文件列表以及各个索引名称对应的特征向量维度、特征向量聚类相似计算方法,如内积、欧式距离。
所述退出前置处理模块用于FaissTrainer服务由于人为因素或服务器资源问题导致服务失败关闭、重启时对FaissTrainer服务器触发通知,FaissTrainer能够及时做出FaissIndex索引文件的同步保存工作,保证FaissServer服务的原子一致性,能够提供可靠的服务。
所述任务管理模块用于FaissTrainer的HeartBeat心跳定时任务,具体来说,本发明实例HeartBeat心跳定时任务为3秒,通过HeartBeat心跳定时任务实时检测FaissDriver的网络状态。
进一步的,参阅图3所示,所述批量训练模块的批量训练方式具体包括以下步骤:
A1:通过用户客户端Client上传特征向量库文件到HDFS集群,所述特征向量库文件格式为“索引id,向量Embeddeding”构成,其文件格式可以任意,本发明实例中为csv格式文件,所述用户客户端为开发者用户客户端。
A2:在用户上传完成特征向量库文件之后,执行训练通知脚本Notifier,通知FaissTrainer进行训练操作。训练通知脚本Notifier中包含两个重要参数:索引名和特征向量库文件中特征向量维度。其中索引名对应的csv文件名称在FaissTrainer中进行注册。
A3:FaissTrainer接收到训练通知并进行校验,校验该训练通知是否在FaissTrainer中已经注册,若未注册,则FaissTrainer从HDSF集群中拉取特征向量库文件至服务器本地进行训练,训练完成后,FaissTrainer将训练好的索引文件保存至本地,替换掉原有的索引文件。
A4:参阅图4所示,FaissTrainer在完成训练和索引文件保存之后,将训练成功完成的消息通知FaissDriver。此时FaissDriver会向FaissWorker发出通知要求FaissWorker进行同步索引操作。所述FaissWorker将本地保存的FaissTrainer最新的索引文件替换本地索引文件,然后将最新索引文件上传同步到HDFS集群从而完成批量训练。
进一步的,所述批量训练模块在进行批量训练时,FaissTrainer进行全量更新加锁,避免训练更新导致索引文件不一致。
进一步的,所述训练通知脚本的参数包括索引名称和特征向量库文件中的特征向量维度。
进一步的,参阅图5所示,所述增量训练模块的增量训练方式具体包括以下步骤:
B1:通过用户客户端将新增特征向量数据推送至所述FaissTrainer在线训练所对应的消息队列。例如在电商推荐场景下,当上架一个新的商品,通过推荐算法模型为其生成了特征向量数据,此时由用户客户端Client将数据推送至Faiss在线训练所对应的消息队列,本发明实施例所采用的消息队列为Kafka,但不限于使用Kafka消息工具。
所述推送的消息应包括如下内容:特征向量数据、索引名称、更新操作。所述更新操作包括新增和删除,本发明的FaissTrainer的在线更新训练功能支持增加和删除,满足企业对特征向量库的增删训练要求。
B2:所述FaissTrainer加载Etcd索引文件列表,并且作为消费者从消息队列拉取增量更新消息,获取所述增量更新消息中的新增特征向量,从加载的所述Etcd索引文件列表中检索是否存在新增特征向量对应的索引文件,若不存在,则所述FaissTrainer首先从HDFS集群中拉取该新增特征向量索引文件,并与本地索引文件进行比对是否一致,若存在不一致,则选取新增特征向量索引文件,在此基础上进行新增或删除更新训练。
B3:所述FaissTrainer将B2更新训练得到的索引文件保存到本地,替换原有的索引文件。
B4:参阅图4所示,FaissTrainer在完成训练和索引文件保存之后,将训练成功完成的消息通知FaissDriver。此时FaissDriver会向FaissWorker发出通知要求FaissWorker进行同步索引操作。所述FaissWorker将本地保存的FaissTrainer最新的索引文件替换本地索引文件,然后将最新索引文件上传同步到HDFS集群从而完成增量训练。
以上所述的仅是本发明的优选实施方式,应当指出,对于本领域的普通技术人员来说,在不脱离本发明创造构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。