← 返回信息流
AI 资讯Hacker News·3 小时前

Manticore搜索重构ONNX路径,让文本嵌入速度提升14倍

原标题:14× faster embeddings: how we rebuilt the ONNX path in Manticore

速览

Manticore Search在Auto Embeddings功能中通过重新实现ONNX路径实现这一突破。原路径依赖SentenceTransformers和Candle,存在并发锁定和批处理开销问题。新后端利用ONNX Runtime的图融合、线程安全等特性,移除内部批处理并优化并发模型。结果是相同硬件下嵌入速度显著提升,适合实时数据处理和向量搜索场景。

AI 深度解读

背景

Manticore Search 是一款开源数据库,近期重点推出了 Auto Embeddings 功能。该功能允许用户无需独立模型服务,即可将任何文本列自动转换为向量。用户最初最常见的反馈是查询速度较慢。旧路径通过 SentenceTransformers 搭建于 Candle(Hugging Face 的纯 Rust ML 推理运行时)之上,导致大量 CPU 资源未被充分利用。无论如何调整输入量,多数负载始终维持在低双位数字的 docs/sec(每秒文档数),并发调用还会对单个模型会话进行序列化处理。

为此,Manticore 团队花了几周时间重新设计如何在数据库中运行 ONNX 模型。新版 ONNX Runtime 后端已于 Manticore Search 27.1.5 版本中正式发布并成为默认路径。

核心内容

ONNX(Open Neural Network Exchange)是一种可移植的模型格式,多数流行开源嵌入模型(如 MiniLM、BGE、E5 及相关系列)已在 Hugging Face 上线发布。Manticore 的新 ONNX Runtime 后端在同一硬件(平均 16 核/32 线程的廉价服务器)上,针对相同模型和权重,遍历完整线程数 × 批次工作负载网格(1/2/4/8/16/32 线程 × 批次 1…128),实现了平均 14 倍于先前 SentenceTransformers/Candle 路径的性能。优势在单客户端线程或 32 线程并发场景下均保持不变。

旧路径在整个网格中始终稳定在 5–11 docs/sec;新路径则落在 70–230 docs/sec 区间。新路径在所有测试配置下都保持这一 ~14 倍优势。

该性能提升体现在多维度测试:

  • 单行插入延迟:在测试服务器上,单客户端时约 14 ms;8 路并发时约 56 ms(均远低于 Candle 曾达到的 200+ ms)。
  • 批量吞吐量:追求最大批量摄入吞吐量时,建议使用高批次大小(32–128),新后端在调用内部实现并行化,客户端侧的散列操作只会叠加协调开销。单客户端 + 批次 64 时峰值达到 233 docs/sec。
  • 单行插入吞吐量:单线程单行插入已达 72 docs/sec(约为旧 Candle 峰值的 7 倍)。增加并发或批次后可升至 130–230 docs/sec,全网格平均约旧路径的 14 倍。

新后端的两项关键改进:关闭 intra_op_spinning,以及放弃在工作线程内对文档进行批处理。这两项调整是性能飞跃的决定性因素。

新路径无缝集成,无需用户 API 修改。现有表若已指向支持 ONNX 的 MODEL_NAME,会自动切换至新路径。切换已有表至不同模型无法直接一键修改 FLOAT_VECTOR 字段的 MODEL_NAME,但可新增一列使用新模型,重新生成嵌入后删除旧列。

关键要点

  • 新 ONNX Runtime 后端在相同硬件、模型与权重下,平均性能提升至旧路径的 14 倍,涵盖 1–32 线程与 1–128 批次全网格测试。
  • 旧 Candle 路径始终锁定在 5–11 docs/sec,新路径稳定于 70–230 docs/sec,单行插入延迟显著降低(14 ms 单客户端,56 ms 8 路并发)。
  • 峰值吞吐量:单客户端高批次(64)达 233 docs/sec,建议最大化批量摄入时优先使用此配置。
  • 关键改进:关闭 intra_op_spinning 与放弃工作线程内文档批处理,两项决策带来最大收益。
  • 无用户 API 变更:表自动切换新路径,模型切换需额外列操作而非直接修改。
  • 为什么选择 ONNX 而非 Candle:ORT 提供图融合、常量折叠、内核自调优;Hugging Face 模型已预发布 .onnx 文件;同权重下 CPU 上性能优于 Candle,ORT 会话创建配置包括 Level3 优化、intra_threads(0)、intra_op_spinning(false)、flush_to_zero() 及 approximate_gelu()。
  • 并发模型突破:Linux/macOS 下 ORT 的 C Run() API 原生线程安全,可共享单一 Session 实现无锁并发;Windows 下使用闭包级 Mutex 保护。
  • 设计原型:尝试共享 Mutex 及 Session 池两种模式均失败,最终采用 UnsafeCell + Sync/Send 包装实现跨线程共享。

意义与影响

在 Auto Embeddings 场景下,数据库自身会在每条 INSERT 操作中运行模型,因此嵌入速度直接决定了 INSERT 速度,即摄入吞吐量取决于模型处理能力。旧路径留存大量 CPU 资源未用,存在锁竞争、批次补齐开销及会话间线程状态无法无缝衔接等问题,导致 CPU 利用率始终偏低。

新 ONNX 路径将性能基线提升一个数量级,并为用户提供可调节的优化选项:单线程单行插入已实现 72 docs/sec,加入并发或批次后可达 130–230 docs/sec,峰值甚至触及 233 docs/sec。整体网格平均性能提升 14 倍,意味着用户在生产环境中可通过简单配置实现显著更高的向量生成能力。

ONNX 作为默认路径的启用,意味着 Manticore Search 27.1.5 版本后,凡 Hugging Face 模型在 onnx/ 目录预发布 .onnx 文件的场景均可自动享受高速推理,无需额外迁移成本。文章还详细探讨了 Rust ONNX 后端设计中常见的并发陷阱、跨平台线程安全处理,以及 ORT 特定配置的权衡与收益,展示了数据库级向量处理工程实践中如何通过精准调优实现数量级性能突破。

查看原文 →manticoresearch.com