elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南)

这篇具有很好参考价值的文章主要介绍了elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        es自2020年的8.x版本以来,就提供了机器学习的能力。我们可以使用es官方提供的工具eland,将hugging face上的NLP模型,上传到es集群中。利用es的机器学习模块,来运维部署管理模型。配合es的管道处理,来更加便捷的处理数据。
        但是在国内操作,根据官方文档或者根据官方博客操作,有无穷无尽的坑。看着官方的文档写的很清楚,实际上操作的时候,还是操作不下来。这里写一个闭坑指南。
        在你上车体验ES的机器学习之前,看看我这篇文章,肯定是会有收获的。因为我已经花了时间,踩了坑,并解决了它。

上传模型存在的坑

  1. 第一个坑是,es的机器学习,是收费的功能,白金版才能使用。这里需要开启试用才能用(试用期限为一个月)。如果只是体验,一个月已经足够了。体验效果不错,就可以找老板花钱了。(不过网上也有很多绿色的方案,可以用,不推荐,有法律风险,特别是商用)
  2. 开启白金试用,需要开启xpack安全认证,开启用户认证,在kibana上登录的时候,要使用elastic用户登录,否则无法开启试用,会告诉你无权限。
  3. 网络环境问题。如果你能开启科学上网,肯定可以避免问题。但是即使有科学上网,也只是体验一下。并不是生产实践方案,生产环境通常都是在内网环境下,即使能上网,也肯定是在国内网络环境下。这会有各种各样的问题。所以要做我们就做生产环境版本,要做就做离线版本。举一个最简答的例子,国内的网络,很难访问huggingface,去拉取模型。

    这里是我直接使用eland,上传模型的时候遇到的错误。

    docker run -it   -/u01/isi/.cache/huggingface/hub/:/usr/local/bin/eland_import_hub_model  --rm elastic/eland \
    eland_import_hub_model \
    --url http://elastic:123123@10.99.100.49:9200 \
    --hub-model-id sentence-transformers/clip-ViT-B-32-multilingual-v1 \
    --task-type text_embedding \
    --start
    
    

    报错为无法访问huggingface.co 国内域名污染导致的。如果可以挂代理,可以解决。如果没有代理,则看下边离线安装版本

    2023-11-22 09:40:30,738 INFO : Establishing connection to Elasticsearch
    2023-11-22 09:40:30,751 INFO : Connected to cluster named 'es' (version: 8.8.0)
    2023-11-22 09:40:30,752 INFO : Loading HuggingFace transformer tokenizer and model 'sentence-transformers/clip-ViT-B-32-multilingual-v1'
    'HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/tokenizer_config.json (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f50eb16cc10>, 'Connection to huggingface.co timed out. (connect timeout=10)'))' thrown while requesting HEAD https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/tokenizer_config.json
    2023-11-22 09:40:41,125 WARNING : 'HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/tokenizer_config.json (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f50eb16cc10>, 'Connection to huggingface.co timed out. (connect timeout=10)'))' thrown while requesting HEAD https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/tokenizer_config.json
    'HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/config.json (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f50eb16cfd0>, 'Connection to huggingface.co timed out. (connect timeout=10)'))' thrown while requesting HEAD https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/config.json
    2023-11-22 09:40:51,583 WARNING : 'HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/config.json (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7f50eb16cfd0>, 'Connection to huggingface.co timed out. (connect timeout=10)'))' thrown while requesting HEAD https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1/resolve/main/config.json
    Traceback (most recent call last):
      File "/usr/local/lib/python3.9/dist-packages/transformers/utils/hub.py", line 409, in cached_file
        resolved_file = hf_hub_download(
      File "/usr/local/lib/python3.9/dist-packages/huggingface_hub/utils/_validators.py", line 118, in _inner_fn
        return fn(*args, **kwargs)
      File "/usr/local/lib/python3.9/dist-packages/huggingface_hub/file_download.py", line 1291, in hf_hub_download
        raise LocalEntryNotFoundError(
    huggingface_hub.utils._errors.LocalEntryNotFoundError: Connection error, and we cannot find the requested files in the disk cache. Please try again or make sure your Internet connection is on.
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/local/bin/eland_import_hub_model", line 219, in <module>
        tm = TransformerModel(model_id=args.hub_model_id, task_type=args.task_type, es_version=cluster_version, quantize=args.quantize)
      File "/usr/local/lib/python3.9/dist-packages/eland/ml/pytorch/transformers.py", line 613, in __init__
        self._tokenizer = transformers.AutoTokenizer.from_pretrained(
      File "/usr/local/lib/python3.9/dist-packages/transformers/models/auto/tokenization_auto.py", line 634, in from_pretrained
        config = AutoConfig.from_pretrained(
      File "/usr/local/lib/python3.9/dist-packages/transformers/models/auto/configuration_auto.py", line 896, in from_pretrained
        config_dict, unused_kwargs = PretrainedConfig.get_config_dict(pretrained_model_name_or_path, **kwargs)
      File "/usr/local/lib/python3.9/dist-packages/transformers/configuration_utils.py", line 573, in get_config_dict
        config_dict, kwargs = cls._get_config_dict(pretrained_model_name_or_path, **kwargs)
      File "/usr/local/lib/python3.9/dist-packages/transformers/configuration_utils.py", line 628, in _get_config_dict
        resolved_config_file = cached_file(
      File "/usr/local/lib/python3.9/dist-packages/transformers/utils/hub.py", line 443, in cached_file
        raise EnvironmentError(
    OSError: We couldn't connect to 'https://huggingface.co' to load this file, couldn't find it in the cached files and it looks like sentence-transformers/clip-ViT-B-32-multilingual-v1 is not the path to a directory containing a file named config.json.
    Checkout your internet connection or see how to run the library in offline mode at 'https://huggingface.co/docs/transformers/installation#offline-mode'.
    
  4. 官方指定的向es中导入NLP模型的工具是Eland,下载和构建镜像也是有网络问题,这里需要指定国内的镜像源。
  5. 关于从hugging face上拉取NLP模型的问题。使用eland,它可以根据我们指定的模型id,去hugging face上拉取模型,但是还是国内的网络环境问题,死活拉不下来。因为无法访问huggingface域名。
  6. 目前,截止到2023年12月2号为止。es所谓的机器学习能力,仅支持文本类操作的模型。官方一直在说拥有跨模态的能力。实际上es并不支持,将图片转向量的模型导入到es中(例如常用的CLIP多模态模型,其实它是两部分,双塔模型,一个是将图片做embedding,转成向量。另一个模型是将我们的文本内容做embedding转为向量。其中图片转向量的模型,在es中是不支持上传的,文本转向量的模型是可以上传的)。如下所示,上传clip 将图片转为向量的模型。会报错
docker run -it   -v /u01/isi/.cache/huggingface/hub/sentence-transformers/clip-vit-base-patch32:/eland/sentence-transformers/clip-vit-base-patch32   --rm elastic/eland \
eland_import_hub_model \
--url http://elastic:123123@10.99.100.49:9200 \
--hub-model-id sentence-transformers/clip-vit-base-patch32 \
--task-type text_embedding \
--start

报错如下

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

准备工作

1. 需要搭建一个8.8以上版本的ES集群。默认会开启安全访问认证,不要关它。

2. 使用源码构建eland工具

3. 从huggingface上,离线下载NLP模型

4. 将模型上传到构建eland的服务器上

安装Elasticsearch 和kibana

 这里参看以下文章,跟着搭建集群就可以了(其实我整个导入的过程,也是参考的这篇文章,只是在国内安装,遇到了上述的坑)。

Elasticsearch:如何在 Elastic 中实现图片相似度搜索_es 相似度查询_Elastic 中国社区官方博客的博客-CSDN博客

 搭建的es版本>=8.8.0 ,一定要开安全认证,不然无法开启机器学习的试用,无法导入模型

需要kibana

开启试用

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

可以看到模型

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

安装准备Eland

eland是如何工作的

 Eland 可以从huggingFace上,把模型下载下来,并上传导es中。如下图所示

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

应该如何安装eland

这里提供在线的方式,和离线的方式。

Eland 可以通过 pip 从 PyPI 安装

在安装之前,我们需要安装好自己的 Python。

$ python --version
Python 3.10.2

可以使用 Pip 从 PyPI 安装 Eland:

python -m pip install eland

可以使用 Conda 从 Conda Forge 安装 Eland

conda install -c conda-forge eland

Docker容器的方式来使用它

希望在不安装 Eland 的情况下使用它,为了只运行可用的脚本,可以构建 Docker 容器。个人认为这种方式是最符合生产环境的部署方式。易交付。可以移植,不依赖网络环境,可以提前构件好,然后将eland镜像导入。

 第一步需要需要在有网的环境下,下载源码。可以将源码上传到有docker环境的服务器上。(如果没有docker环境,可以以最简单的方式来安装docker,这里就不提供方法了,可以网上搜搜文章,是在不行麻烦麻烦运维同事)

# 下载源码
git clone https://github.com/elastic/eland

# 这里可以把源码上传到有docker环境的,且能够访问到es集群的服务器上。
cd eland

这里注意,因为是在国内,我们先pass掉挂代理的事情(并不一定每个人都能挂代理)
这里需要先编辑一下dockerFile,添加指定国内的源。添加如下一行
RUN python3 -m pip install --no-cache-dir --disable-pip-version-check .[all] -i https://mirror.baidu.com/pypi/simple

#然后构建镜像
docker build -t elastic/eland .

在huggingface上下载所需的NLP模型

 在huggingface上找到该模型。(这里可以根据自己的需求,找到合适的模型)这里我以CLIP的模型为例(这个是clip中做文本embedding的模型),来下载。

https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1/tree/main

全部下载下来

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

然后上传到有eland的服务器上

使用eland 将离线模型导入到es集群中

我是以docker的方式来运行eland的。 

这次主要是加里一个数据卷,我把下载后的模型,放在了 /u01/isi/.cache/huggingface/hub/sentence-transformers/clip-ViT-B-32-multilingual-v1 下,然后加了一个数据拒卷。把模型映射到了容器中。这里因为服务器无法访问huggingface去拉取模型。所以用离线的方式。eland,会在运行过程中,检查本地有没有模型,如果有模型,就不用去huggingface上拉取了。

注意eland的挂载目录,docker中映射的是/eland/目录,这样才能读到本地下载好的模型!

docker run -it   -v /u01/isi/.cache/huggingface/hub/:/eland/   --rm elastic/eland \
eland_import_hub_model \
--url http://elastic:123123@10.99.100.49:9200 \
--hub-model-id sentence-transformers/clip-ViT-B-32-multilingual-v1 \
--task-type text_embedding \
--start

可以看到,这里已经成功的导入模型了。

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

然后在kiabna上,找到模型管理,刷新一下。

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

已经成功刷新了出来

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

测试使用模型

对内容进行文本嵌入,在kiban上执行以下内容。点击D旁边的菜单栏,找到 Dev tools

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型

POST _ml/trained_models/sentence-transformers__clip-vit-b-32-multilingual-v1/_infer
{
  "docs" : [
    {"text_field": "Yellow mountain is the most beautiful mountain in China"}
    ]
}

可以看到成功,应用模型,将文本内容,转成了向量。 

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南),Elasticsearch,elasticsearch,自然语言处理,大数据,huggingface NLP,Eland,es离线上传模型文章来源地址https://www.toymoban.com/news/detail-752268.html

到了这里,关于elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FAQ】安防监控视频云存储平台EasyNVR频繁离线的原因排查与解决

    有用户反馈,在使用EasyNVR时会出现通道频繁离线的情况。针对该反馈我们立即进行了排查。 安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、W

    2024年02月12日
    浏览(148)
  • 服务器数据恢复—EVA存储raid5硬盘离线的数据恢复案例

    服务器数据恢复环境: 某品牌EVA某型号存储,底层是RAID5阵列,划分了若干lun。 服务器故障分析: 该存储设备中raid5阵列有两块硬盘掉线,存储中的lun丢失。 将故障服务器存储中的所有磁盘编号后取出,硬件工程师检测后发现掉线硬盘不存在物理故障,也没有发现坏道,都

    2024年01月24日
    浏览(43)
  • 服务器数据恢复-热备盘同步过程中硬盘离线的RAID5数据恢复案例

    服务器数据恢复环境: 华为OceanStor某型号存储,11块硬盘组建了一组RAID5阵列,另外1块硬盘作为热备盘使用。基于RAID5阵列的LUN分配给linux系统使用,存放Oracle数据库。 服务器故障: RAID5阵列1块硬盘由于未知原因离线,热备盘激活开始同步数据,在热备盘同步的过程中又有

    2024年02月07日
    浏览(41)
  • 在离线的arm架构kylin v10服务器上使用Kuboard-Spray搭建K8S集群

    在离线的arm架构kylin v10服务器上使用Kuboard-Spray搭建K8S集群 在内网项目中需要安装K8S集群,经过调研,选择使用Kuboard-Spray工具搭建K8S集群,降低学习成本,提高安装效率。 为了简化安装使用集群的过程,搭建了私有yum源仓库和harbor私有镜像仓库。 详细参考文章: 本地yum源仓

    2024年04月10日
    浏览(52)
  • ue4绘制线的三种方式

    第一种方式,是用样条线,简明扼要,但是打包后就消失了。 USplineComponent* MyActor::GenerateSplineComponent(TArray FVector posArray, AActor* actor) { } 第二种方式是用ULineBatchComponent画线,这个是世界坐标系的,也就是说,即使父子节点,也不能用相对位置。好处是,是实体,可以从样条线中

    2023年04月08日
    浏览(45)
  • 在局域网下是如何共享打印机让大家共用一台打印机

    打印机共享如何设置?这是在工作中经常遇到的问题。由于公司购买的打印机不带网络打印功能,但又想能让办公室里的所有人员都能共用这一台打印机。那么把打印机设置成共享就能很好解决这一问题。下面大家一起来看看在局域网下是如何共享打印机的。 在带有打印机的

    2024年02月06日
    浏览(74)
  • pycharm中如何去除波浪线的设置

    pycharm中,碰到恼人的红绿波浪线,打开’file-settings’,然后,参照如图设置,去除’effects’选项:

    2024年02月04日
    浏览(44)
  • 如何通过curl方式进行ElasticSearch增删改查

    点击上方蓝字关注我 关于ElasticSearch增删改查的方法有很多,使用curl操作命令总结如下,如有需要可以点击收藏。 1. ElasticSearch新增数据 如果进行一个类似于SQL的 insert的操作 具体示例如下: 上面的命令使用HTTP POST方法向名为\\\"users\\\"的索引中添加一条文档,文档包含\\\"name\\\"、

    2024年02月14日
    浏览(41)
  • Android sqlite分页上传离线订单后删除

    1、判断订单表的的总数是否大于0,如果大于0开始上传订单 2、每一页20条数据的查询 3、获取infoList后传给后台,如果code返回200,收集ids删除掉传入的数据,在循环到第一步,直到彻底上传完为止 分页加载数据: 如果数据库中的数据量很大,不要一次性加载所有数据到 Lis

    2024年02月06日
    浏览(39)
  • 离线安装elasticdump导出elasticsearch数据

    项目需要导出知识库博客文章数据,格式为json; 知识库系统部署在内网,没有node和 elasticdump 数据导出工具,需要离线安装node和elasticdump,方法是找一台与内网配置一样的外网机器在线安装node和elasticdump环境,再把安装包导入内网安装。 备注: 使用的机器是x86+银行麒麟V4桌

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包