关于人工智能:2024-年向量数据库的性能卷到什么程度了

31次阅读

共计 3826 个字符,预计需要花费 10 分钟才能阅读完成。

对于数据库(尤其是向量数据库)而言,“性能”是一个非常要害的指标,其用于掂量数据库是否可能在无限资源内,高效解决大量用户申请。对于向量数据库用户而言,只管可能在某些状况下对延时的要求不高,但对性能指标的高要求却判若两人,从未扭转。

这也很好了解,起因在于:

  1. 基于近似最近邻搜寻(ANNS)的向量搜寻,可能会为了进步性能而就义一点精度。但性能的进步却能够让用户在满足雷同业务需要场景下,扩充搜寻、进步准确度。
  1. 在查问提早雷同,应用资源雷同的状况下,数据库性能越高、吞吐量越高,能够适应更大的用户数量。
  1. 雷同场景下,性能越高意味着须要更少的计算资源。

向量数据库实质上是计算密集型的数据库,在计算向量间隔时须要应用大量资源——通常超过总体资源的 80%。因而,负责解决向量搜寻工作的向量搜索引擎,是决定向量数据库整体性能的关键因素。

Zilliz 始终致力于晋升向量数据库性能,无论是 Milvus(https://github.com/milvus-io/milvus)还是全托管的 Zilliz Cloud(https://zilliz.com.cn/cloud),与竞品相比都展现出了卓越的性能。其中,Milvus 的向量搜索引擎 Knowhere(https://github.com/zilliztech/knowhere),施展了重要作用,为新一代的向量搜索引擎奠定了根底。而 Zilliz Cloud 最近公布的外围向量搜索引擎 Cardinal,间接将搜索引擎的性能比原来晋升了 3 倍,搜寻性能(QPS)是 Milvus 的 10 倍。

咱们通过开源向量数据库性能测试工具(https://github.com/zilliztech/VectorDBBench)评估了新版 Zilliz Cloud 的性能,并将其与应用旧引擎的 Milvus 和 Zilliz Cloud 进行了比拟,评估后果如下图所示:

Cardinal 到底是何方神圣?为何能有如此杰出的体现?底层逻辑是什么?本文将一一揭晓。

01.Cardinal 是什么?

Cardinal 是 Zilliz 专门研发的多线程、基于 C++ 语言开发的向量搜索引擎,其整合了最实用、最风行的 ANNS 办法,应用 Cardinal 能够实现高效的计算资源使用率。

Cardinal 可能:

  • 执行暴搜
  • 创立和批改 ANNS 索引
  • 执行索引 Top-K 和索引范畴搜寻(Range Search)
  • 解决包含 FP32、FP16 和 BF16 在内的各种输出数据格式
  • 应用内存中数据或提供基于内存、磁盘和 MMap 等不同形式的索引
  • 依据用户提供的规范在搜寻过程中过滤后果

Cardinal 的能力包含:

  • Zilliz internal 的高性能 ANN 算法实现,通过大量可调整参数适配多种场景。默认会主动调整参数适配不同的场景,在放弃正当精度(召回率)的同时最大化搜寻速度(QPS,每秒查问数)。
  • 高效实现反对 ANNS 的各种算法,例如,提供样本过滤性能的算法。
  • 为搜寻或索引构建过程中大多数计算密集型操作优化的专用 low-level 内核,反对多种硬件平台。除了各种类似度类型外,Cardinal 还蕴含 fused 内核和数据预处理内核。
  • 反对异步操作、内存映射 I/O 能力、缓存、内存分配器、日志记录等性能。

02.Knowhere vs Cardinal

Knowhere 是 Milvus 的外部外围引擎,负责向量搜寻,是基于行业标准开源库(如 Faiss、DiskANN 和 hnswlib 等)的加强版本。

以下为 Knowhere 和 Cardinal 的比拟后果:

能够看到:

  • 两者均已生产就绪,并提供 Milvus 和 Zilliz Cloud 所需的所有可扩展性。
  • Knowhere 设计时思考到实验性和灵活性;Cardinal 的范畴更狭隘,优先思考加强现有性能以进步速度和性能,而不是引入宽泛的新性能。
  • 因为 Knowhere 属于开源,其部署环境更多样,可在所有主机类型上运行;Cardinal 则专门针对 Zilliz Cloud 主机环境进行了优化。
  • Knowhere 依赖于 OSS 库(如 Faiss、DiskANN 和 hnswlib);Cardinal 则进行了针对性的改良和优化。

03.Cardinal 高性能的起因

Cardinal 实现了各种与算法相干的工程优化,它引入了 AUTOINDEX 机制,主动抉择适宜于数据集最佳的搜寻策略和索引。开发者无需手动调优,可能节省时间和精力。

算法优化

算法的优化显著进步了搜寻过程的准确性和有效性,Cardinal 外部算法优化具体包含:

  • 搜索算法,包含基于 IVF 和基于图的办法
  • 帮忙搜寻放弃所需召回率的算法,不管过滤样本的百分比如何
  • 更高效的 Best-First 搜索算法迭代办法
  • 定制了优先队列数据结构中的算法

将算法参数化帮忙开发者灵便衡量性能与 RAM 使用率。因而,Cardinal 的算法优化还波及在参数范畴内抉择最佳操作点。

工程优化

尽管算法最后是针对形象的图灵机设计的,但真正实现时却面临着网络提早、云提供商对 IOPS 的限度以及机器 RAM 限度等挑战(RAM 是一种贵重而无限的资源)。

工程优化能够确保 Cardinal 的向量搜寻 Pipeline 放弃实用,并合乎计算、RAM 和其余资源限度。在 Cardinal 的开发中,Zilliz 交融了规范实际和翻新技术。这种办法使 C++ 编译器可能生成计算上最优的编译代码,同时放弃标准化的性能测试、易于扩大的源代码,便于疾速增加新性能。

以下是在 Cardinal 中工程优化的具体示例:

  • 专门的内存分配器和内存池
  • 正当的多线程代码
  • 组件的层次结构,便于将元素组合成各种搜寻 Pipeline
  • 针对特定、要害用例的定制化代码

其余优化

  1. 搜寻工夫大部分都花在称为内核的绝对较小的代码片段上,最简略的例子是计算两个向量之间 L2 间隔的内核。Cardinal 中包含为不同目标编写和优化的泛滥计算内核,每个内核都针对特定的硬件平台和用例进行了特地优化。
  1. Cardinal 反对 x86 和 ARM 硬件平台,同时也能够轻松增加其余平台。

其中,对于 x 86 平台,Cardinal 内核应用 AVX-512 的 F、CD、VL、BW、DQ、VPOPCNTDQ、VBMI、VBMI2、VNNI、BF16 和 FP16 扩大。此外,咱们还在摸索应用新的 AMX 指令集。对于 ARM 平台,Cardinal 内核反对 NEON 和 SVE 指令集。

  1. 确保 Cardinal 为计算内核获取最优的代码。

为了实现这一点,咱们不仅依赖古代 C++ 编译器,还应用专用工具,如 Linux perf 来剖析热点和 CPU 指标;同时应用机器代码剖析工具,如 GodBolt Compiler Explorer 和 uiCA,以确保最佳应用硬件“资源”,如 RAM/ 缓存拜访次数、应用的 CPU 指令、寄存器、计算端口。此外,还应用迭代办法,交织进行设计、性能测试、性能剖析和汇编代码分析阶段。

  1. 优化后的计算内核可能比一个简略但未优化的内核速度晋升 2-3 倍,这可能进一步转化为 2 倍的 QPS 值,又或是在云主机机器上升高 20% 的内存要求。

AutoIndex:搜寻策略抉择

向量搜寻是一个波及许多独立组件的简单过程,包含量化、索引构建、搜索算法、数据结构等。每个组件都有大量可调参数,它们独特造成了高度多样化的向量搜寻策略范畴,不同的数据集和场景须要不同的搜寻策略。

为了更好地开掘性能改良的后劲,Cardinal 除了反对每个组件中的多种策略外,还实现了一套基于 AI 的动静策略抉择机制,称为 AUTOINDEX。它依据给定数据集的散布、提供的查问和硬件配置自适应抉择最合适的策略,能够满足用户对搜寻品质的需要的同时实现最佳性能。

04.Cardinal 性能测试

咱们测试环境中采纳了 ANN-benchmarks(https://github.com/erikbern/ann-benchmarks)。ANN benchmarks 是一个规范的性能测试工具,用于评估 ANNS 实现,并在应用不同间隔度量的几个规范数据集上运行。每次性能评估都限定在单线程的 docker 容器内进行;指标基于屡次评估迭代,并应用了大量繁多查问申请;每个评估框架的后果汇总成一个“召回率 vs QPS”帕累托边界(Pareto frontier)。

所有测试都在与 ann-benchmarks 雷同的机器类型上进行,即 Amazon EC2 r6i.16xlarge(https://aws.amazon.com/cn/ec2/instance-types/r6i/)机器,配置如下:

  • CPU: Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
  • CPU core: 32 核
  • 禁用超线程
  • RAM: 512 GB
  • 操作系统: Ubuntu 22.04.3 LTS,Linux 内核 6.2.0-1017-aws;未启用 huge page;测试应用 –parallelism=31 选项运行;应用 clang 17.0.6 compiler 编译 Cardinal。

上面出现的性能测试后果仅针对 Cardinal 引擎,不包含 Zilliz Cloud 提供的其余非索引优化(蕴含 Zilliz Cloud 特定优化的后果可在文章结尾获取)。

以下图表是通过 ANN-benchmark GitHub 页面上出现的图表后果,并增加一个 Cardinal 曲线而生成的:

在所有性能测试中,Cardinal 的体现都非常杰出。当然,咱们将来还会面临更多挑战,例如要解决用户不同的需要、更大的数据集等,Cardinal 也需进一步成长,请大家刮目相待。

本文由 mdnice 多平台公布

正文完
 0