<返回更多

为什么微信推荐这么快?

2020-07-24    
加入收藏

1. 背景

在一些推荐系统、图片检索、文章去重等场景中,对基于特征数据进行 k 近邻检索有着广泛的需求:

在经过调研后,发现已有的解决方案存在以下问题:

基于上述的这些要求以及业内组件的限制,我们借助 WFS 和 Chubby 设计并实现了 SimSvr,它是一个高性能、功能丰富的特征检索组件,具有以下特点:

SimSvr 目前已广泛应用于微信视频号、看一看、搜一搜、微信安全、表情搜索等业务,接下来会阐述 SimSvr 的设计以及如何解决来自于业务的难题。

2. 检索引擎

2.1 引擎的选择

ANN 问题在学术界已被长期研究,并且已有成熟的开源 ANN 搜索库存在,如 nmslib、hnswlib、faiss 等。在 SimSvr 中,性能及集群的存储容量是最主要考量的两个指标,因此选择了以下两个检索引擎:

为什么微信推荐这么快?

 

ANN检索引擎效果对比

2.2 巧妙利用资源,提升 50% 的数据容纳量

为什么微信推荐这么快?

 

为什么微信推荐这么快?

 

为什么微信推荐这么快?

 

2.3 点积距离召回率从 62.6% 到 97.8% 的蜕变心路历程

为什么微信推荐这么快?

 

为什么微信推荐这么快?

 

为什么微信推荐这么快?

 

在 ip2cos 距离转换的理论基础上,我们使用看一看视频实时 DSSM 模型进行了实际召回情况的效果对比(64 维、ip 距离、100 万索引数据量,进行 1 万次查询取平均耗时),并见证了 ip2cos 的神奇效果:

为什么微信推荐这么快?

 

2.4 如何使用 faiss 省下 2h 的训练时间并提升 30% 的召回率

为什么微信推荐这么快?

 

从结果中可以看到,在相同迭代轮次下,不使用 batch kmeans 的方法训练耗时更长,且没有很好收敛,导致召回率不高。

3. 总体设计

3.1 数据结构 - 为达成一个小目标,需要做出怎样的改变

为了满足单模块多模型的需求,SimSvr 使用了表的概念进行多模型的管理;另外,为支持亿级以上 HNSW 索引的表,并且希望能够并发加速构建索引,我们根据单表的数据情况,将一张表分成了多个 sharding,使得每个 sharding 承担表数据的其中一部分:
tablei 的索引,由 shard0、shard1、…、shardn 构成一份完整的索引数据;而 sect 的数量则决定了表的副本数(可用于伸缩读能力、提供容灾等)。
在 SimSvr 中,我们将一个 shardi_sectj 称之为一个 container,这是 SimSvr 中最小的数据调度和加载单位。

3.2 系统架构 - 如何支撑亿级索引、5毫秒级的检索

为什么微信推荐这么快?

 

SimSvr 架构

3.3 数据调度 - 鸡蛋怎么放在多个篮子中

为什么微信推荐这么快?

 

为什么微信推荐这么快?

 

3.4 系统拓展 - 篮子装满了该怎么办

为什么微信推荐这么快?

 

4. 近实时增量更新的挑战 - 十秒内完成索引的更新

为什么微信推荐这么快?

 

增量持久化

为什么微信推荐这么快?

 

增量更新

5. 丰富的功能特性

5.1 支持额外的特征存储库

5.2 支持原子性更新的单表多索引

5.3 多版本索引

5.4 支持布隆过滤器、阈值过滤器等

5.5 支持过期删除

6. 现网运营情况

7. 总结

随着推荐系统的强势发展,特征检索的使用场景越来越广泛。而作为基础组件,除了要拥有支持亿级索引的基本素养外,在功能特性上也需要不断迎合业务的发展。因此我们开发了 SimSvr,搭配特征存储 FeatureKV,在视频号、看一看、搜一搜等推荐系统中发挥了重要的作用。

作者:sauronzhang、flashlin、fengshanliu,微信后台开发工程师

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>