一、通过Eland部署


Eland安装


可以使用 Pip 从 PyPI 安装 Eland以及Eland python客户端:

python -m pip install eland
python -m pip install eland[pytorch]

希望在不安装 Eland 的情况下使用它的用户,为了只运行可用的脚本,可以构建 Docker 容器:

git clone https://github.com/elastic/eland

cd eland

docker build -t elastic/eland .



运行 eland_import_hub_model 脚本导入


eland_import_hub_model --url <clusterUrl> \ 
--hub-model-id elastic/distilbert-base-cased-finetuned-conll03-english \ 
--task-type ner 

指定 URL 以访问你的集群。 例如,https://<user>:<password>@<hostname>:<port>。

在 Hugging Face 模型中心中指定模型的标识符。

指定 NLP 任务的类型。 支持的值为 fill_mask、ner、text_classification、text_embedding, question_answering 和 zero_shot_classification

如果是docker部署Eland:

docker run -it --rm elastic/eland \
    eland_import_hub_model \
        --url https://elastic:lOwgBZT3KowJrQWMwRWm@192.168.0.3:9200/ \
        --hub-model-id elastic/distilbert-base-cased-finetuned-conll03-english \
        --task-type text_embedding \
        --insecure \
        --start   

为了加快推理速度,你可以使用 inference_threads 参数增加推理线程的数量。


Kibana支持


由于使用 eland 上传模型是白金版或者是企业版的功能,在我们的演示中,我们需要启动白金版试用功能:


模型导入后,可以通过Kibana,进行模型管理


二、本地部署


本地模型的格式要求

要将自己训练的自有模型上传到elasticsearch,模型必须具备特定的格式。具体的要求可以参考HuggingFace上同类模型所需要提交的内容,特别是参考Elasticsearch所支持的模型架构在HuggingFace上的文件结构:

通常来说会包括:

  1. 模型权重文件(.bin、.pt、.pth等):这是您训练好的PyTorch模型的权重文件,包含了模型的参数。
  2. 配置文件(.json、.yaml等):这是描述您的模型架构和超参数的配置文件,例如模型的层数、隐藏层大小、注意力机制等。
  3. Tokenizer文件(.json、.txt等):这是用于将文本转换为模型可接受的输入格式的分词器文件。它可以是预训练的分词器文件或您自己训练的分词器。
  4. 附加代码文件(.py):如果您在训练模型时使用了自定义的代码文件(如自定义损失函数、数据预处理等),则需要将这些文件一并提交。
  5. README文件(.md、.txt等):这是一个说明文档,包含了有关您上传模型的详细信息,例如模型的用途、示例代码和使用方法等。

举个例子,以下是一个在BERT上构建的中文问答模型的结构:

~/bert-base-chinese-qa$ tree
.
├── README.md
├── config.json
├── pytorch_model.bin
├── special_tokens_map.json
├── tokenizer_config.json
└── vocab.txt

复制

这里就包含了模型权重文件:pytorch_model.bin, 配置文件:config.json、tokenizer_config.json,Tokenizer文件:special_tokens_map.json。

本地模型准备

通常来说,我们需要自己训练模型并做好准备的,这里,不对这种情况进行过多的说明。

另一种情况是,企业仍然想用HuggingFace上的共享模型资源,但是又不想每次都通过eland去重新下载模型,或者说生产环境对于HuggingFace网络的访问有限制,我们可以先将HuggingFace上面的模型下载到本地,然后每次通过本地的模型进行部署。

具体操作包括:

  • 系统中需要安装GitGit Large File Storage
  • 从 Hugging Face 中选择您要使用的模型。(有关受支持架构的更多信息, 请参阅兼容的第三方模型,这里需要明确的是,有“兼容的第三方模型”列表并不意味着其他所有的模型就是不兼容的,只是没有经过测试。只要是Pytorch+BERT的、ES支持的NLP任务的模型,经过调整,通常都可以使用。可参考:Elastic 进阶教程:在Elasticsearch中部署中文NER模型
  • 从 Hugging Face 上 clone 所选模型到本地。例如:
git clone https://huggingface.co/dslim/bert-base-NER

比如,上面的命令会在目录中生成模型的本地副本bert-base-NER

lex@lex-demo-2:~$ git clone https://huggingface.co/dslim/bert-base-NER
Cloning into 'bert-base-NER'...
remote: Enumerating objects: 58, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 58 (delta 0), reused 0 (delta 0), pack-reused 57
Unpacking objects: 100% (58/58), 114.09 KiB | 7.61 MiB/s, done.
Filtering content: 100% (4/4), 1.61 GiB | 76.55 MiB/s, done.
lex@lex-demo-2:~$ cd bert-base-NER/
lex@lex-demo-2:~/bert-base-NER$ tree
.
├── README.md
├── added_tokens.json
├── config.json
├── flax_model.msgpack
├── model.safetensors
├── pytorch_model.bin
├── special_tokens_map.json
├── tf_model.h5
├── tokenizer_config.json
└── vocab.txt


在上传时,eland会首先检查是否存在config.json文件,如果不存在,会报以下错误:

OSError: Can't load config for '/PATH/TO/MODEL'. If you were trying to load it from 'https://huggingface.co/models', make sure you don't have a local directory with the same name. Otherwise, make sure '/PATH/TO/MODEL' is the correct path to a directory containing a config.json file


也会检查pytorch_model.bin文件,如果不存在,会报以下错误:

OSError: Error no file named pytorch_model.bin found in directory /Users/lex.li/.cache/huggingface/hub/models--bert-base-uncased/snapshots/0a6aa9128b6194f4f3c4db429b6cb4891cdb421b but there is a file for Flax weights. Use `from_flax=True` to load this model from those weights.


本地模型上传

使用eland_import_hub_model脚本来安装本地模型,本地模型将通过--hub-model-id参数来配置:

eland_import_hub_model \
      --url 'XXXX' \
      --hub-model-id /PATH/TO/MODEL \
      --task-type ner \
      --es-username elastic --es-password XXX \
      --es-model-id bert-base-ner


比如,上例中,我们可将 --hub-model-id /PATH/TO/MODEL \ 修改为 --hub-model-id bert-base-NER \ 。特别要主要的是,当我们提供本地路径的时候,必须是字母或者数字开头,也就是,我们不能用 ./ 或者 / 开头。否则,会遇到如下错误:

elasticsearch.BadRequestError: BadRequestError(400, 'action_request_validation_exception', "Validation Failed: 1: Invalid model_id; '__users__lex.li__es_lab__bert-base-chinese-qa' can contain lowercase alphanumeric (a-z and 0-9), hyphens or underscores; must start and end with alphanumeric;")


所以,在运行eland的时候,需要将当前目录切换到模型文件夹所在目录,并且只提供文件夹名作为路径参数






作者:admin  创建时间:2023-11-28 00:02
最后编辑:admin  更新时间:2023-11-29 18:18