在 Elasticsearch 中扩展 ML 推理管道:如何避免问题并解决瓶颈

作者:来自 Elastic Iulia Feroli


是时候考虑语义搜索运营了吗?

无论你是一位经验丰富的搜索工程师,希望探索新的人工智能功能,还是一位机器学习专家,希望更多地利用搜索基础设施来增强语义相似性模型 —— 充分利用这些领域的交集可能需要熟悉一些新概念。

虽然 Elasticsearch 提供了一些快速启动指南,比如 ELSER 示例 notebook (或者对于本地的 Elasticsearch, 你可以参考 “Elasticsearch:使用 ELSER 文本扩展进行语义搜索”),但当你希望扩展推理过程时,会引入更多的配置选项。

在本博客中,我们将看看在处理更复杂的工作负载时,可能遇到的潜在瓶颈以及缓解成长烦恼的方法。

在部署大型语言模型到你的环境时,以下是一些需要注意的步骤。

在下载模型之前

机器学习节点大小 在 Elasticsearch 中使用 NLP 模型构建项目的第一步是设置部署模型的正确基础设施。

正确的机器学习节点配置可能是第一个潜在的瓶颈,因此请确保你为预期的结果选择了合适的大小。

推荐的最小大小:

如果关闭了部署自动扩缩,则部署和使用 ELSER 模型的专用机器学习节点的最小大小为 4 GB;对于自然语言处理模型,则为 16 GB。

建议打开自动扩缩,因为它允许你的部署根据需求动态调整资源。

参见文档。

你可能遇到的故障排除场景:

潜在的瓶颈Error 信息解决方案
ML Node is not big enoughApiError(429, 'status_exception', 'Could not start deployment because no ML nodes with sufficient capacity were found')确保为 ML 节点选择合适的大小,并最好启用自动扩展,以便你的部署在遇到额外请求时可以扩展。
Autoscaling limit is not high enoughAutoscaling limits reached. To continue experiencing optimal performance, we recommend increasing your maximum size per zone for the topologies: Machine Learning.还有一些情况,ML 节点足够大,可以下载模型,但如果配置不正确,大吞吐量的推理调用仍然会使系统过载。 增加大小,确保你的分配使用所有可用的 CPU,或使用较小的数据批次来缓解。

模型配置

更大的节点大小也允许在选择模型的分配和线程数量时具有更大的灵活性。

每个线程需要一个 CPU 或 vCPU,所以例如 8 个 CPU 可以让你拥有 1 个分配,每个分配最多 8 个线程,或者最多 8 个分配,每个分配 1 个线程,或者其他排列组合,只要满足以下条件:

umber_of_allocations * threads_per_allocation <= number of available CPUs.

在同一 ML 节点上部署多个模型将共享这些资源,因此你可以通过配置每个模型的最大访问来根据需要分配你的 CPU。

此外,每个模型部署的分配都有一个用于推理请求的有限队列。当对同一部署进行了太多调用并且队列填满时,所有后续请求都将被拒绝。考虑使用专用部署以防止此情况发生。

对于每个部署和用例,你应考虑以下参数:

参数功能
number_of_allocations通过允许并行执行更多推理请求来提高吞吐量。 这反过来又会提高摄取性能。默认为 1; 但你应该更改此设置,以便使用所有可用的 CPU。
threads_per_allocation提高每个推理请求的速度,从而提高搜索速度。默认为 1; 但你应该更改此设置,以便使用所有可用的 CPU。
queue_capacity控制队列中一次允许有多少个推理请求。 当请求数量超过总数时,新请求将被拒绝并返回 429 错误。默认为 1024。最大允许值为 1000000。

此设置的值不得超过每个节点可分配的处理器数量。

请参考有关 ELSER 性能随分配数量增加而提高的基准测试信息作为示例。

在部署模型时

一旦模型已经下载到你的集群中,你可以开始部署它,同时考虑前面讨论的参数。在这个阶段,如果你计划部署同一模型的多个实例,可以考虑使用唯一的 deployment_id。

client.ml.start_trained_model_deployment(model_id=".elser_model_2", deployment_id="elser_inference_1",number_of_allocations=1, threads_per_allocation=8,queue_capacity=7000, timeout="1m", wait_for="starting"
)

在此阶段你可能会遇到一些潜在的瓶颈或错误:

瓶颈解释 / Error 信息解决方案
部署期间超时在不指定 wait_for 参数的情况下,它默认为 started,这意味着只有当模型下载完成并成功部署时,你才会收到响应。然而,这个过程会相当耗时,具体取决于模型大小,而且由于 timeout 参数也默认为仅 30 秒,这通常会导致错误。请改用 wait_for="starting",和/或 增加引发错误之前的等待时间:timeout="3m"
不按顺序运行这些步骤(具体示例请参阅下面的行)在上一步完成运行之前运行命令将导致错误:使用 status = client.ml.get_trained_models(model_id=".elser_model_2", include="definition_status") 检查模型的状态
尝试在模型完全下载之前部署模型Model definition truncated. Unable to deserialize trained model definition [.elser_model_2]你应该仅在 status["trained_model_configs"][0]["complete_define"] == True 时尝试部署模型
尝试对尚未完全部署的模型运行推理404, 'resource_not_found_exception', 'Could not find trained model [.elser_model_2]'

在运行推理之前

一旦模型部署完成,你就可以开始对其进行推理调用。这可以通过 inference API 来完成:

response = client.ml.infer_trained_model(model_id=model_id, docs=[{"text_field": query}])

这个推理命令也有一个默认的超时时间为 10 秒,当一次生成少量文档的嵌入时是足够的。

然而,对于大多数实际用例,将会有大量需要处理的文档;例如,在一个大型索引中为每个文档创建嵌入以启用语义搜索功能。

你可以增加超时时间:

response = client.ml.infer_trained_model(model_id=model_id, docs=docs, timeout="5m")

然而,正如前面的部分所提到的,根据分配的数量或发送到同一部署的不同任务的数量,模型也将有一个最大文档队列接受限制。因此,即使设置了较长的超时时间,对于大吞吐量来说,这种方法可能仍然不足够。

另一个选择是为推理过程创建摄入管道。你还可以为不同的管道使用不同的部署:一个用于在摄入新数据时生成嵌入,另一个用于在搜索时运行推理。 管道还允许你通过在 processors 列表中添加元素来设置自定义操作,例如重命名字段或为不同任务使用多个模型。你还可以在后台或按照定期时间表运行较长的任务。

client.ingest.put_pipeline(id="elser-2-ingest-pipeline-1",description="Ingest pipeline for ELSER with a lot more requests",processors=[# omitting processors code])client.reindex(source={"index": "raw_data"},dest={"index": "data_with_embeddings", "pipeline": "elser-2-ingest-pipeline-1"},wait_for_completion=False,
)
瓶颈解决方案
Timeout与前面的步骤类似,冗长的管道过程可能会导致超时。 使用 wait_for_completion = False 参数。
Waiting for pipeline to finish你可以使用从 reindex 函数获得的任务 ID 稍后通过 client.tasks.get(task_id=task_id) 跟踪管道进度。 使用 wait_for_completion 参数时会生成此 ID。

监控和调整

一旦你部署了模型并开始使用推理服务,你可以查看配置的性能。通常,这是确定特定用例的适当参数的最佳方法,并根据需要进行调整,直到达到所需的性能。

举一个简单的例子,如果你部署了一个模型而没有配置上述讨论的任何设置,这些将是分配的默认值:

{"threads_per_allocation" : 1, "number_of_allocations" : 1, "queue_capacity" : 1024
}

假设通过推理管道将大量文档发送到该模型后,我们注意到线程分配中的一些警告信号。 endpoint:

GET _nodes/hot_threads

响应:

ml.allocated_processors=16100.0% [cpu=3.5%, other=96.5%] cpu usage by thread

ML 节点分配有 16 个处理器,但我们仅在模型的一个实例中利用其中 1 个处理器。 此外,在其他而不是与 CPU 相关的任务下报告的高利用率意味着该过程中存在大量等待和冗余,并且我们的文档大部分时间都在排队。

为了优化性能,你应该使用所有可用的内核。

你还可以在训练模型 UI 中或通过以下命令查看更多指标:

GET _ml/trained_models/_stats

在这里你可以看到更多有用的信息,例如 average_inference_time_ms、number_of_pending_requests 或 peak_throughput_per_分钟。

作为说明,这里有两个模型部署在同一个 ML 节点上,在相同的管道和数据上运行推理,但采用不同的分配策略。 你可以看到配置模型的推理时间几乎减半。

Model IDAllocationAverage Inference time
elser_inference_configured3 * 867.80 milliseconds
.elser_model_21 * 1115.58 milliseconds

结论

这既是一件好事,也可能是一件困难的事情,有多种灵活和模块化的方法来构建适合你的项目的推理架构。 为每个用例构建最佳方法也不仅仅是选择正确的配置或基础设施设置。 你可以详细了解模型的检索优化甚至数据处理决策(例如分块策略)如何影响性能。

Elasticsearch 汇集了令人惊叹的开箱即用功能,并提供自定义选项和指导,帮助你构建最佳的语义搜索解决方案。

准备好将 RAG 构建到你的应用程序中了吗? 想要尝试使用向量数据库的不同 LLMs?
在 Github 上查看我们的 LangChain、Cohere 等示例 notebooks,并参加即将开始的 Elasticsearch 工程师培训!

原文: Scaling ML Inference Pipelines in Elasticsearch: How to avoid issues and troubleshoot bottlenecks — Elastic Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易舟云财务软件免费版和专业版有什么区别?

文章目录 1、价格&#xff08;1&#xff09;免费版&#xff08;2&#xff09;专业版 2、版本功能&#xff08;1&#xff09;免费版&#xff08;2&#xff09;专业版 1、价格 &#xff08;1&#xff09;免费版 永久免费&#xff01; &#xff08;2&#xff09;专业版 298元/…

Games104 现代游戏引擎3

学新的一趴~ 明天继续学习 参考文章&#xff1a;GAMES104课程笔记08-Basics of Animation Technology - Bos Blog (peng00bo00.github.io)

【免费题库】华为OD机试 - 贪吃的猴子(Java JS Python C C++)

须知 哈喽,本题库完全免费,收费是为了防止被爬,大家订阅专栏后可以私信联系退款。感谢支持 文章目录 须知题目描述输入描述输出描述解题思路:Java代码:JS代码:Python代码:C++代码:题目描述 一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根…

笔记本台式机电脑 “睡眠和休眠”有什么区别,那个更省电

笔记本台式机电脑 Windows 系统里睡眠和休眠有什么区别&#xff0c;睡眠和休眠那个更省电&#xff0c;睡眠和休眠使用那个更好&#xff0c;当不用电脑时&#xff0c;通常有三种方式让电脑休息&#xff1a;关机、睡眠和休眠。关机的定义大家都懂&#xff0c;但睡眠和休眠就容易让…

[蓝桥杯] 数位排序(C语言)

题目链接 蓝桥杯2022年第十三届省赛真题-数位排序 - C语言网 题目理解 按照数位之和给数排序。当两个数各个数位之和不同时&#xff0c;将数位和较小的排在前面&#xff0c;当数位之和相等时&#xff0c;将数值小的排在前面。第一次输入一个数字N&#xff0c;求1到数字N之间所…

OpenHarmony应用集成和固件集成中C库差异化分析

背景 OpenHarmony中&#xff0c;三方库的使用有两种方式&#xff1a; 一、固件集成 三方库经由OpenHarmony构建框架编译出的动态库或静态库&#xff0c;打包到rom中 二、应用集成 三方库经由IDE&#xff08;通过IDE中的cmake&#xff09;编译出的动态库或静态库&#xff0…

kafka学习笔记03

SpringBoot2.X项目搭建整合Kafka客户端依赖配置 用自己对应的jdk版本。 先加上我们的web依赖。 添加kafka依赖: SpringBoot2.x整合Kafka客户端adminApi单元测试 设置端口号。 新建一个kafka测试类&#xff1a; 创建一个初始化的Kafka服务。 设置kafka的名称。 测试创建kafka。…

笔记二basis

form-basis input nametitlestring字符串password密码number数字textarea多行文本radio单选checkbox多选Switch开关Slider滑块color颜色Autocomplete自动补全 file nametitleimages多图上传image单图上传file单文件上传files多文件上传 select nametitleselect单选下拉se…

C++测试程序运行的时间

最近测试算法的时间效率&#xff0c;记录一下C测试程序运行的时间模板。 在文件的头部引入包含的头文件 #include <chrono> #include <iostream>int main() {// 获取程序当前时间点auto start std::chrono::high_resolution_clock::now();/* 测试程序的代码块 *…

人工智能技术的创业机遇

人工智能&#xff08;AI&#xff09;技术的创业机遇 人工智能&#xff08;AI&#xff09;技术的快速发展为创业者提供了广阔的机会和挑战。随着AI技术的应用领域不断拓展&#xff0c;未来在AI技术方面的创业机会包括智能硬件、智能机器人、智能医疗、智能教育、智能交通、智能…

MySQL-进阶篇-基础架构:一条sql查询语句是如何执行的

摘自&#xff1a;01 | 基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;-MySQL实战45讲-极客时间 视频讲解&#xff1a;7分钟精通MySql中SQL执行原理_哔哩哔哩_bilibili 可结合学习&#xff0c;本文仅记录SQL语句的执行流程&#xff0c;以上内容有一些额外知识未…

学习MQ异步

1.MQ异步调用的优势 事件驱动模式&#xff1a; 优势&#xff1a; 总结&#xff1a; 2.初识MQ 核心概念以及结构&#xff1a; 常见的消息模型&#xff1a; 基本消息队列模型&#xff1a; 生产者代码&#xff1a; Testpublic void testSendMessage() throws IOException, Timeo…

C语言之_Generic用法实例(九十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(六)(含2022年和2023年)

文章目录 前言1、多比特信号A,在时钟域clk_a存在从8’d100到8’d101的变化过程中,若在时钟域clk_b直接采用D触发器采样,可能采样到数据是2、报文处理设计规格:支持的报文长度为 36-256 字节,其余长度的报文直接丢弃,接收的报文长度小于64字节时填充PAD(任意数据),使报…

快速搭建 Java 项目开发环境

1、Jdk 1.8 链接&#xff1a;https://pan.baidu.com/s/1sh8sv__dgyoYpVDac2OVKw 提取码&#xff1a;efm3 ● 环境配置: JAVA_HOME: Java安装目录 CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; (记住前面有个点) Path: %JAVA_HOME%\bin;%JAVA_HOME%\jre\bi…

janus搭建

一、janus介绍 Janus 官网&#xff1a;https://janus.conf.meetecho.com/index.html 参考文档&#xff1a;https://github.com/meetecho/janus-gateway Janus是一个开源的WebRTC网关&#xff0c;可用于构建实时通信应用程序。它提供了音频、视频和数据传输的功能&#xff0c;可…

政安晨:【Keras机器学习实践要点】(三十)—— 使用斯温变换器进行图像分类

目录 设置 配置超参数 准备数据 辅助函数 基于窗口的多头自注意力计算 模型训练与评估 准备 tf.data.Dataset 建立模型 在 CIFAR-100 上训练 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政…

vue3 导入excel数据

所需包 "xlsx": "^0.18.5"页面导入包 import * as XLSX from xlsx; import {genFileId, UploadProps, UploadRawFile,ElTable } from element-plus;页面 <el-upload accept".xlsx" :on-change"changeExcel" :on-exceed"ha…

[StartingPoint][Tier2]Included

LXD https://www.hackingarticles.in/lxd-privilege-escalation/ Task 1 What service is running on the target machine over UDP? &#xff08;目标机器上通过UDP运行的服务是什么&#xff1f;&#xff09; $ nmap -sU 10.129.232.86 -p 69 tftp Task 2 What class o…

DRF多表关联的序列化和反序列化

DRF多表关联的序列化和反序列化 目录 DRF多表关联的序列化和反序列化序列化定制字段source一对多的序列化 多表关联的序列化方式1&#xff1a;在表模型中定义方法方式2&#xff1a;定制返回格式SerializerMethodField方式3&#xff1a;子序列化 多表关联的反序列化反序列化保存…