赞
踩
es自2020年的8.x版本以来,就提供了机器学习的能力。我们可以使用es官方提供的工具eland,将hugging face上的NLP模型,上传到es集群中。利用es的机器学习模块,来运维部署管理模型。配合es的管道处理,来更加便捷的处理数据。但是在国内操作,根据官方文档或者根据官方博客操作,有无穷无尽的坑。看着官方的文档写的很清楚,实际上操作的时候,还是操作不下来。这里写一个闭坑指南。在你上车体验ES的机器学习之前,看看我这篇文章,肯定是会有收获的。因为我已经花了时间,踩了坑,并解决了它。
这里是我直接使用eland,上传模型的时候遇到的错误。
- docker run -it -v /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'.
- 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
报错如下
1. 需要搭建一个8.8以上版本的ES集群。默认会开启安全访问认证,不要关它。
2. 使用源码构建eland工具
3. 从huggingface上,离线下载NLP模型
4. 将模型上传到构建eland的服务器上
这里参看以下文章,跟着搭建集群就可以了(其实我整个导入的过程,也是参考的这篇文章,只是在国内安装,遇到了上述的坑)。
Elasticsearch:如何在 Elastic 中实现图片相似度搜索_es 相似度查询_Elastic 中国社区官方博客的博客-CSDN博客
搭建的es版本>=8.8.0 ,一定要开安全认证,不然无法开启机器学习的试用,无法导入模型
需要kibana
开启试用
可以看到模型
Eland 可以从huggingFace上,把模型下载下来,并上传导es中。如下图所示
这里提供在线的方式,和离线的方式。
在安装之前,我们需要安装好自己的 Python。
- $ python --version
- Python 3.10.2
可以使用 Pip 从 PyPI 安装 Eland:
python -m pip install eland
conda install -c conda-forge eland
希望在不安装 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上找到该模型。(这里可以根据自己的需求,找到合适的模型)这里我以CLIP的模型为例(这个是clip中做文本embedding的模型),来下载。
https://huggingface.co/sentence-transformers/clip-ViT-B-32-multilingual-v1/tree/main
全部下载下来
然后上传到有eland的服务器上
我是以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
可以看到,这里已经成功的导入模型了。
然后在kiabna上,找到模型管理,刷新一下。
已经成功刷新了出来
对内容进行文本嵌入,在kiban上执行以下内容。点击D旁边的菜单栏,找到 Dev tools
- 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"}
- ]
- }
可以看到成功,应用模型,将文本内容,转成了向量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。