Elasticsearch:圣诞晚餐 BBQ

作者:来自 Elastic Ugo_Sangiorgi

什么是 VectorFaces?

既然今天是 12 月 24 日,不如来点圣诞晚餐 BBQ?

VectorFaces 是我开发的一个人脸识别演示,用于在会议上展示 Elasticsearch 向量能力。它使用 Elasticsearch BBQ、DIskBBQ、int8 和 int4 量化技术,在 120 万个名人脸部 embedding 中进行搜索。

点击这里,通过 start-local 在单个 CPU(!)上体验在线演示,或者查看 github 仓库自行运行。

该数据集摘自 IMDB-WIKI 数据集,包含来自 IMDb 和 Wikipedia 的名人图片。我们使用 InsightFace 生成了 512 维的 embedding。

该演示并行使用了四种量化方法,在四个不同的索引中分别包含 318,526 个向量 embedding(总计 120 万个向量),让你可以直接比较它们的性能:

  • BBQ(Better Binary Quantization)------ Elasticsearch 的二进制量化方式,在保持高召回率的同时实现显著压缩
  • DiskBBQ ------ 针对磁盘存储优化的 BBQ,在重评分阶段直接从磁盘读取向量
  • int8 ------ 8 位整数量化,将每个维度从 4 字节减少到 1 字节
  • int4 ------ 4 位量化,提供最大压缩率(比 float32 小 8×)

所有量化都会带来一定的准确性损失。实际中,int8 通常几乎不需要重评分int4 往往受益于 1.5×--2× 的过采样,而 BBQ 通常需要 3×--5× 的过采样才能获得最佳召回率。每种方法在准确性、速度、内存占用和存储之间都有不同的权衡,你可以通过调整参数和过采样来验证这一点。

在 Settings 中,你可以试验这些参数以平衡速度和准确性,并选择在查询时要考虑哪些索引:

  • size:从 Elasticsearch 返回的结果数量。必须 ≤ k。
  • k:在所有 shard 上全局返回的最近邻数量。最终的 top k 结果会从所有 shard 合并而来。
  • num_candidates :在选择 top k 之前,每个 shard 收集的近似邻居数量。值越高,召回率和准确性越好,但会增加延迟。
    • 这是用于优化延迟 / 召回权衡的主要调节参数。
    • 对于量化索引,增加 num_candidates 等同于对搜索空间进行过采样,有助于恢复量化过程中损失的准确性。

在更改这些参数后,注意延迟和相关性是如何变化的。在右下角,框中会显示 top 结果以及两个最重要步骤的延迟:你的快照(摄像头或图片)的 embedding 生成,以及 Elasticsearch ------ 它会显示类似 " Elasticsearch: 50ms "。

分数范围是 0 到 1,或者 0% 到 100% 的相似度,这样更容易理解。对于这个数据集,匹配度高于 0.75 可以认为是正匹配,你可以自己测试。

另一个值得关注的点是每个索引使用了多少内存和磁盘,我们可以使用 Elasticsearch _stats API,并在 Kibana 中发出这些请求:

ini 复制代码
`

1.  GET faces-bbq_hnsw-10.15/_stats?filter_path=*.primaries.dense_vector

3.  GET faces-disk_bbq-10.15/_stats?filter_path=*.primaries.dense_vector

5.  GET faces-int8_hnsw-10.15/_stats?filter_path=*.primaries.dense_vector

7.  GET faces-int4_hnsw-10.15/_stats?filter_path=*.primaries.dense_vector

`AI写代码

更改更多参数

虽然 k 和 num_candidates 可以在查询时修改,但一些量化技术还有可以调整的特殊设置。可以在这里查看完整的设置列表,其中一些只适用于索引阶段(例如 m、ef_construction),这需要重新索引,但也有一些可以在查询阶段使用。

也许最重要的一个是 oversample。它控制使用原始 float 向量进行重评分的候选数量。当 oversample: 3.0 时,搜索会先使用量化向量在每个 shard 上检索 num_candidates,然后在返回最终 top k 结果之前,用原始向量对 top k * oversample 个候选进行重评分。值越高,准确性越好,但会带来额外的计算开销。

对于 BBQ,我们可以在索引 mapping 中修改它:

bash 复制代码
`

1.  PUT faces-bbq_hnsw-10.15/_mapping
2.  {
3.    "properties": {
4.      "face_embeddings": {
5.        "type": "dense_vector",
6.        "dims": 512,
7.        "index": true,
8.        "similarity": "cosine",
9.        "index_options": {
10.          "type": "bbq_hnsw",
11.          "m": 16,
12.          "ef_construction": 100,
13.          "rescore_vector": {
14.            "oversample": 3
15.          }
16.        }
17.      }
18.    }
19.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

对于 DiskBBQ,我们可以修改 rescore_vector.oversample,以及 default_visit_percentage,它控制搜索阶段访问的簇百分比。较低的值通过访问更少的簇来以速度换取准确性。

bash 复制代码
`

1.  PUT faces-disk_bbq-10.15/_mapping
2.  {
3.      "properties": {
4.          "face_embeddings": {
5.            "type": "dense_vector",
6.            "dims": 512,
7.            "index": true,
8.            "similarity": "cosine",
9.            "index_options": {
10.              "type": "bbq_disk",
11.              "cluster_size": 384,
12.              "default_visit_percentage": 0,
13.              "rescore_vector": {
14.                "oversample": 3
15.              }
16.            }
17.          }
18.      }
19.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

同样,在更改这些参数后,注意延迟和相关性的变化。

下一步

查看完整文档,了解如何在你自己的基础设施上索引和运行此演示的设置说明。

圣诞快乐,祝大家 BBQ 开心!

原文:discuss.elastic.co/t/dec-24th-...

相关推荐
老纪的技术唠嗑局9 小时前
告别OpenClaw配置丢失——Mindkeeper内测版邀测
大数据·elasticsearch·搜索引擎
Elasticsearch9 小时前
使用 Elasticsearch + Jina embeddings 进行无监督文档聚类
elasticsearch
勇哥的编程江湖12 小时前
flinkcdc streaming 同步数据到es记录过程
大数据·elasticsearch·flink·flinkcdc
曾阿伦12 小时前
Elasticsearch 7.x 常用命令备忘录
大数据·elasticsearch·搜索引擎
斯特凡今天也很帅13 小时前
Elasticsearch数据库专栏(二)DSL语句总结(更新中)
大数据·elasticsearch·搜索引擎
要记得喝水13 小时前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
二十七剑13 小时前
Elasticsearch的索引问题
大数据·elasticsearch·搜索引擎
A__tao1 天前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
A__tao1 天前
Elasticsearch Mapping 一键生成 Proto 文件(支持嵌套 + 注释过滤)
大数据·elasticsearch·jenkins
Devin~Y1 天前
高并发电商与AI智能客服场景下的Java面试实战:从Spring Boot到RAG与向量数据库落地
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag