Elasticsearch 9.3 增加 bfloat16 向量 支持

作者:Simon Cooper

探索新的 Elasticsearch element_type: bfloat16,可以将你的向量数据存储减半。

从向量搜索到强大的 REST APIs, Elasticsearch 为开发者提供了最全面的搜索工具包。深入探索 Elasticsearch Labs repo 中的示例 notebooks,尝试一些新的东西。你也可以现在就开始你的 free trial,或者在本地运行 Elasticsearch。


Elasticsearch 9.3 带来了多项针对向量数据的重要改进,包括一个新的 element_type: bfloat16。这有可能将你的向量数据存储减半,并且在大多数使用场景下,对召回率和运行时性能的影响都非常小。

Dense_vector 字段中的存储格式

在 9.3 之前, dense_vector 字段支持单比特向量、 1-byte 整数以及 4-byte 浮点数。我们在用于索引的任何量化和/或分层可导航小世界( HNSW )图之上存储原始向量,而原始向量占据了向量索引所需磁盘空间的绝大部分。如果你的向量是浮点数,那么在 9.3 之前的 Elasticsearch 版本中,唯一的选择是每个向量值存储 4 bytes:对于一个 1024 维向量来说,就是 4kB。

当然,还有其他可用的浮点大小: IEEE-754 规定了多种不同长度的浮点格式,包括 Java 的 float 和 double 类型所使用的 4-byte float32 和 8-byte float64。它还定义了一种 float16 格式,每个值只使用 2 bytes。然而,它的最大值只有 65,504,相比之下 4-byte float32 的最大值是 3.4x10^38,并且在两者之间进行转换需要多次算术运算。

作为一种替代方案,许多机器学习(machine learning - ML)应用现在使用 bfloat16,它是对 IEEE-754 float32 的一种修改,只使用 2 bytes。它通过丢弃数值小数部分的最低 2 bytes 来实现,从而保留符号位和指数位不变。这在不相应降低取值范围的情况下,有效降低了浮点值的精度。从 float32 转换为 bfloat16 只是对 float32 值进行一次简单的按位截断,并通过少量处理来实现正确的舍入。
Source: Wikipedia

Elasticsearch 9.3 中的 bfloat16

Elasticsearch 9.3 现在支持将向量元素类型存储为 bfloat16。在内存中,它仍然会将每个向量值处理为 4-byte 的 float32,因为 Java 并没有内置对 bfloat16 的支持。当将向量数据写入磁盘时,它会简单地将每个 float32 值截断并舍入为 2-byte 的 bfloat16,并在将值读入内存时把每个 bfloat16 值零扩展回 float32。

这实际上将你的向量索引大小减半,因为每个值使用 2 bytes 而不是 4 bytes。在读取和写入数据时, Elasticsearch 在执行必要的转换过程中可能会有一些小的性能开销,但这通常会被 I/O 需求的大幅减少所抵消,因为 OS 现在只需要读取一半的数据。而且对于大多数数据集来说,对搜索召回率的影响是最小的。

作为一个示例,这是在我们的 dense_vector 数据集上使用 bfloat16 时的大小差异:

所以,如果你的输入向量已经是 bfloat16 精度,那就太好了! Elasticsearch 接受以 float 值形式以及 Base64 编码向量形式提供的原始 bfloat16 向量。这些向量会以与你原始源数据相同的精度持久化到磁盘,从而立即将你的数据存储需求减半。

如果你的输入向量是 4-byte 精度,你同样可以使用 bfloat16 格式来将索引数据大小减半。 Elasticsearch 会将每个值截断并舍入为 2-byte 精度,丢弃小数部分中最低有效的比特。这意味着你从 Elasticsearch 取回的向量值将不会与最初索引时的值完全相同,因此如果你需要保持 float32 的完整 4-byte 精度,就不要使用 bfloat16。

从 Elasticsearch 9.3 开始,以及在 Elasticsearch Serverless 上,你可以在任何新创建的索引中,为所有 dense_vector 索引类型指定 element_type: bfloat16。如果你希望在现有索引中使用 bfloat16,可以重新索引到一个 element_type: bfloat16 的索引中, Elasticsearch 会自动将你现有的 float 向量转换为 bfloat16。

原文:https://www.elastic.co/search-labs/blog/bfloat16-vector-support-elasticsearch

相关推荐
IT_陈寒1 小时前
Vite 凭什么比 Webpack 快50%?揭秘闪电构建背后的黑科技
前端·人工智能·后端
寻见9032 小时前
救命!RAG检索总跑偏?bge-reranker-large彻底解决「找错文档」痛点
人工智能·langchain
TechFind2 小时前
我用 OpenClaw 搭了一套运营 Agent,每天自动生产内容、分发、追踪数据——独立开发者的运营平替
人工智能·agent
小成C2 小时前
Vibe Coding 时代,研发体系该怎么重新分工
人工智能·架构·全栈
37手游后端团队2 小时前
全网最简单!从零开始,轻松把 openclaw 小龙虾装回家
人工智能·后端·openai
该用户已不存在2 小时前
月薪2w养不起龙虾?试试OpenClaw+Ollama
人工智能·aigc·ai编程
Seeker2 小时前
别盲目跟风“养龙虾”!OpenClaw爆火背后,这些致命安全风险必须警惕
人工智能·安全
golang学习记2 小时前
Claude Code 官宣新 AI 功能!随时随地 AI 为你打工
人工智能·claude
IvorySQL2 小时前
PostgreSQL 技术日报 (3月11日)|4库合一性能提升350倍与内核新讨论
数据库·postgresql·开源
IvorySQL2 小时前
谁动了我的查询结果?PostgreSQL 联表加锁的隐藏陷阱
数据库·postgresql·开源