不要急,总有办法的

OpenSearch里的机器学习demo简介

OpenSearch | 作者 Charele | 发布于2024年06月09日 | 阅读数:3150

ES里面也有ML功能,但它底层用的是一个ES自己开发的C++程序,虽然好像也是开源的,
对于像我这样C盲来说,它就是黑盒子,理解不了。
1111.PNG
 
 
 OS里面用的是DJL,是亚妈逊开发的Java版的DL处理工具,
https://djl.ai/
  
https://opensearch.org/docs/la ... index
拿这个神经查询的例子来说明
PS: 这个例子中用了BERT模型来生成输入输出,
OS里面,“模型”并不一定是这些深度学习的模型,
也可以是传统机器学习的模型,比如你可以训练一个SVM模型来进行异常检测
xxxx.PNG

 
回到本例,此demo大致分为这么几步: 
1 创建model组(忽略)
2 注册model
3 发布model
4 插入文档(生成Knn数据)
5 执行神经查询(实质就是Knn查询)
已邀请:

Charele - Cisco4321

赞同来自:

2 注册model
1111.PNG

此demo中用了一个DistilBERT模型,DistilBERT等于一个简化版的BERT,由HuggingFace提出。
 
你也可以用自已训练的模型 
 
 这里有DistilBERT的介绍
https://blog.csdn.net/qq_41185 ... 64185
(对于我们非NLP码农来说,想要一下子理解这些模型的细节有点困难的)
 
2222.png

相对于BERT的输入有4个,它去掉了两个,只有两个张量输入。
也就是说,不管你在训练还是test的时候,你输入的一句话,它会转成两个张量给模型
 

Charele - Cisco4321

赞同来自:

这点可以在OpenSearch的代码中得到验证:
3333.PNG

如何生成这两个向量,要看代码。

1 indicesArray
表示句子中每个词的编码id, 不是随便编码的,而是根据模型(里的编码文件)生成
(有前导CLS和后缀SEP,如果你了解过BERT就知道什么意思)
 
2 attentionMaskArray
表示我要关注输入中的哪些词,这里全是1
 
 说下“注册model",它执行的流程,
它会从网上把模型文件下载到本地(本地cache有就不必下载),
然后把模型文件切成一块一块的(每个块10M),然后插入到系统索引中(每一个块一个文档).
下载只有一个节点会下载,
但放到索引里,每个节点都到见到这个模块了。
4444.PNG

Charele - Cisco4321

赞同来自:

3 发布model

发布model,就是各数据节点从.plugins-ml-model索引中取出模型文件各块,拼成一个完整模型,
然后加载到内存中。
PS: 注册model,发布model什么的具体是包装成ML任务来进行的。
有专门的组件来管理ML任务,比如任务fail后如何处理等等。
 
这是发布model时的代码片断:
4444.PNG

A 有一个"model控制器"的概念,用来对模型使用进行控制,比如限速什么的。这是可选项
 B 模型要占内存。所以OS里有一个专门的ML容断器来检查内存

3333.PNG

这是加载模型,
A 程序中,并不是直接使用模型,而是用由模型产生的predictor。
在这里就是:input:句子 ---> output:768维向量
(实际output是4个向量,这个例子只用了一个)
 
B 这里模型是一个Zoo模型对像,你并不能改变他的结构,比如增加一层什么的。
C 最后warm一下模型

Charele - Cisco4321

赞同来自:

4 插入文档(生成Knn数据)
 
 创建一个带有Knn字段的索引,
先通过模型把传入的句子转成768维向量,然后通过ingest方式插入到索引中。

1111.PNG

OS里面,Knn用起来好像比ES里面的复杂一些,除了有Lucene形式,
还支持另外两种方式,此时,底层执行的就不是常规的Lucene Knn查询了。
而是通过JNI方式直接找的段文件。这些Knn细节跟现在说的无关。
 
下面是如何得到那个768维向量的代码:
2222.png

兰色就是你的输入,红色是用模型生成相应的输出
输出会转成Knn,插入到相应字段里

要回复问题请先登录注册