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

相关推荐
数据知道1 小时前
PostgreSQL:如何直接在数据库中查询 CSV/JSON文件?
数据库·postgresql·json
冬奇Lab1 小时前
一天一个开源项目(第27篇):Awesome AI Coding - 一站式 AI 编程资源导航
人工智能·开源·资讯
XLYcmy2 小时前
智能体大赛 核心功能 惊喜生成”——创新灵感的催化器
数据库·ai·llm·prompt·agent·检索·万方
AI_56782 小时前
ableau可视化进阶:颜色与交互设计让数据会说话
数据库·云原生·excel
A小码哥2 小时前
Claude 今天发布了 Sonnet 4.6, 深度对比:sonnet vs Opus,如何选择最适合你的模型?
大数据·数据库·人工智能
破晓之翼2 小时前
关于AI应用开发需要了解专有名词解释和实际作用
大数据·人工智能
城数派2 小时前
2001-2024年我国乡镇级的逐年植被净初级生产力(NPP)数据(Shp/Excel格式)
大数据·数据分析·excel
予枫的编程笔记2 小时前
【Docker高级篇】吃透Linux底层:Namespace做隔离,Cgroups控资源,UnionFS搭存储
linux·人工智能·namespace·cgroups·unionfs·linux底层原理·容器核心技术
工业HMI实战笔记2 小时前
工业机器人HMI:协作机器人的人机交互界面
人工智能·ui·性能优化·机器人·自动化·人机交互·交互