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

相关推荐
韩楚风18 小时前
【参天引擎】事务生命周期 / MVCC / Undo / ACID / 分布式事务 功能域整体解析
数据库·分布式·mysql·架构·cantian
通问AI18 小时前
Apple Intelligence 国行备案深度技术解析:阿里千问如何被集成到苹果端侧AI架构
人工智能·架构
明航咨询—张老师18 小时前
软考软件评测师技术深度剖析:2026年考试改革后的知识体系与备考架构
大数据·架构
视***间18 小时前
算力赋能零售与创意新生态:视程空间Pandora,解锁线下场景智能化无限可能
人工智能·边缘计算·智慧零售·ai算力·视程空间·创意开发
冬奇Lab19 小时前
MCP 系列(08):企业治理——Registry、路由与可观测性
人工智能·llm·mcp
冬奇Lab19 小时前
每日一个开源项目(第161篇):Open Interpreter - 开源 AI 编程 Agent,用 Rust 重写,支持 Kimi、Qwen、DeepSeek
人工智能·开源·资讯
renhongxia119 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
天上路人19 小时前
AU-48双麦多功能语音处理模组:100dB AEC + 波束定向拾音,会议与监控全场景覆盖
人工智能·ai降噪·语音处理·ai语音·麦克风·回音消除
程序员无隅19 小时前
Coding Agent 为什么压缩上下文后还能继续工作?上下文模块设计拆解
java·开发语言·数据库
甲维斯19 小时前
Codex定制皮肤,Windows一键切换已经搞定!
人工智能