ADB向量轻量版介绍

1. 背景

ADB向量团队,focus在向量检索领域,面向向量检索全场景覆盖,我们构建了下列的产品矩阵:

这里介绍的是兼容PostgreSQL(简称PG)生态打造的,跟随专有云敏捷 PaaS-v3.5.0r 正式发布的ADB向量轻量版。

ADB向量轻量版解决的问题主要是降低对系统的最低资源要求,可以部署在小区,景点等资源受限的场景。

2. 功能特性介绍

  1. 支持暴力扫描和索引加速2种模式。索引加速定位于高维度,高召回和高性能的高价值场景。
  2. 完整事务支持。
  3. 支持自动分区管理。支持按时间,天/月自动创建删除分区。
  4. 低成本。支持fp32转fp16,recall极小损失下,降低一半存储成本。
  5. 高可用,高可靠,可维可测,易扩展。
  6. 易使用,兼容PG SQL,PQ训练对用户透明。跟随专有云敏捷版PaaS发布,容器化部署,与k8s集成,简化部署和运维。

2.1 支持暴力扫描和索引加速

  • 对于数据量较少,例如512维,100w级别数据量,我们建议直接使用暴力扫描,可以在秒级别返回,并且recall没有损失。
  • 对于数据量较大,千万到亿规模数据,我们建议使用索引加速,我们使用512维人脸数据,可以保证top5 99% recall的情况下,1秒以内返回。

2.2 完整事务支持

PG本身支持完整的事务,我们基于PG的索引扩展实现向量索引,完全复用了PG原来的磁盘管理,缓存管理,锁管理机制。我们需要特别处理的地方有2个:

  1. 读写PG的Page时,需要遵循PG本身的加锁保护和写事务日志约定。
  2. PG的heap存储才有多版本管理,索引本身并没有多版本管理机制,所以我们需要管理索引的可见性。由于向量检索是典型的使用场景是,大部分是insert,少量单条更新删除。针对这种场景,实现了异步向量索引的标记删除。
  • PG在回收资源的时候,如果检测到向量已经被删除,则对对应的向量索引增加删除标记,同样写入的时候,如果读取向量失败,会判断是因为可见性问题导致的失败(例如访问的向量事务还未提交),还是因为该条向量已经被删除,如果被删除,同样会触发标记删除逻辑。
  • 异步的方式在图算法构建的图中删除已经被标记删除的记录,这样避免了一次更新需要大量遍历造成性能急剧下降。在写入的时候有2个地方会从小世界图中剔除掉标记删除的索引记录。
  • 在构建插入向量的邻居队列的时候,会踢除掉已经被标记删除的向量;
  • 在构建图的时候,需要更新邻居的邻居,这个时候也会剔除掉已经被标记删除的向量。

2.3 支持自动分区管理

在人脸识别等各种场景下,用户通常需要保存一定时间窗口的数据,例如保存最近30天的数据,为此我们实现了自动分区管理。

  • 支持按小时,天,周,月,年的粒度做分区
  • 支持保存时间可配置
  • 自动创建新分区,删除过期的老分区。

对PG生态比较在做技术选型的时候我们对比了pg_pathman,之所以没有基于pg_pathman的原因在于:

  1. pg_pathman支持创建新分区,但是不支持自动删除老分区;
  2. pg_pathman太重,我们需要一个轻量级的分区自动管理。

2.4 低成本

向量索引的计算模型是一个典型的IO访问密集型,这是由2点决定的: - 每条向量占用的空间比典型的结构化数据高几个数量级,例如512维float向量,一条向量占用2k空间,而典型结构化数据float只需要4个字节。 - 基于PQ算法的向量索引都需要放大召回的问题,并且随着数据量的增大,内存并不能完全放下这么多向量,另外一点就是召回访问的向量并不能完全保证他们的顺序存放,无法避免随机IO。

综合上述2点,对性能要求较高的客户,我们建议使用NVME SSD的磁盘,单机上亿数据的情况下,磁盘成本占了较大比例,所以我们的解法是利用fp16对float做编码,把原来4字节浮点转成2个字节的半精度浮点,降低磁盘存储空间,用户使用起来非常简单,只需要把向量列的数据类型声明为float2数组即可。

对于fp32转fp16用户最关心的是recall的损失,我们对512维人脸数据做了对比测试,精度损失<1%。以1000w 512维人脸数据为例,对比测试结果如下(top 5 recall):

2.5 高可用,高可靠,可维可测

  • 高可用,复用了PG的流式复制方案,支持全同步,同步,异步复制,支持自动拉起,主备切换,结合k8s的service,用户通过域名访问主备,无需关注主备ip变换。
  • 高可靠,基于PG的dump工具,我们实现了数据按日备份,备份目的地支持本地磁盘和OSS。
  • 可维可测
  • 实现了向量索引监控表pg_ann_meta_info和pg_ann_perf,实时监控向量索引状态,并且与grafana集成,可以直接通过图表可视化。
  • 对于用户最关注的性能和召回,我们提供2个UDF,方便用户快捷评估。
  • 性能测试。以32个进程运行下列的sql 10秒。下列的sql表示从precision_test表的b列检索,与随机生成的512维值在0~1之间的向量距离最相似的10条记录。 sql select performance_test('select * from precision_test order by b <-> gen_rand_arr(1, 512) limit 100', 32, 10)
  • 召回测试。测试public schema,precision_test表,precision_test_b_idx索引,top 100的召回。 sql select recall_test('public', 'precision_test', 'precision_test_b_idx', 100, 100, 'Set(fastann.topk 1000)', 10, true)

2.6 易扩展

  • 向量距离计算接口化,支持宇视科技的一种新的数据和距离计算,笔者用了2人天。

2.7 易使用

  • 兼容PG生态。
  • PQ训练编码对用户透明,后台自动运行。
  • 跟随专有云敏捷版PaaS发布,容器化部署,与k8s集成,简化部署和运维。

3. 参考资料

  1. ADB for MySQL向量版
  2. ADB for PG向量版
编辑于 2019-09-12

文章被以下专栏收录