通过Eland上传第三方NLP模型

在Elasticsearch(简称ES)机器学习中应用第三方训练模型前,需要先将训练模型导入ES中。本文介绍利用Eland工具通过在线或离线方式将Hugging Face模型上传到阿里云ES。

背景信息

Eland通过将大数据处理能力与Python数据科学生态系统结合,为数据科学家提供了一个强大的工具,可以实现ES数据分析和机器学习任务等操作。例如,通过Eland将Hugging Face Transformer库中的预训练模型转换为TorchScript表示形式(该形式的模型可以在没有Python解释器的环境中运行),模型分块处理并将模型导入ES中。

关于Eland的更多信息,请参见Elastic Eland

版本兼容性

  • 阿里云ES 7.11及以上版本集群开始支持Eland。

    更高版本ES支持的Eland功能更丰富,建议在ES 8.3及更高版本中使用Eland功能。

  • 确保ES集群的主版本与Eland主版本一致,例如:ES 8.x 版本兼容Eland 8.x的版本,ES 7.x 版本兼容 Eland 7.x 版本,详情请参见Elastic Eland

  • 支持Python 3.8、3.9、3.10版本。

  • 支持Pandas 1.5.3版本。

前提条件

  1. 已创建ECS实例,并配置Python环境,本文以Python 3.10.12为例。创建ECS实例,请参见Linux系统实例快速入门

    • 创建阿里云ECS时,镜像可以选择Ubuntu 22系列,自带python3.10。否则自行下载并配置Python环境,具体操作,请参见Python官方文档

    • 确保ECS环境网络可正常访问Hugging Face。

      Eland支持Hugging Face模型上传,其他仓库环境下的模型可能无法支持。

  2. 已创建阿里云ES,本文以ES 8.9版本为例。具体操作,请参见创建阿里云Elasticsearch实例

    • 将ECS的公网或私网IP地址加入到ES实例的对应白名单中,使ECS与ES实例连通。具体操作,请参见配置实例公网或私网访问白名单

    • Eland功能上传模型功能属于ES白金版及企业版能力,阿里云ES为白金版服务,可直接上传模型。

    • 跨大版本ES机器学习功能的使用可能存在差异性。其他ES版本,请参见Machine learning

准备工作

  1. 在ECS中执行如下命令,下载并安装与阿里云ES兼容的Eland和torch,本文以Eland 8.7.0版本为例。

    pip3 install eland==8.7.0
    pip3 install torch==1.11.0 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cpu
    pip install eland[pytorch]
    说明

    如果您需要使用PyTorch 1.13.1或更早版本导入NLP模型,请运行命令pip install torch==1.13.1,安装适当版本的PyTorch。

  2. 检查pandas版本

    执行如下命令查看pandas版本是否为1.5.3。

    pip show pandas

    如果pandas版本不是1.5.3,请执行以下命令更改pandas版本。

    pip install pandas==1.5.3

步骤一:上传模型到阿里云ES

方法一:在线上传

直接将huggingface仓库中的模型上传到阿里云ES中。

eland_import_hub_model \
      --url 'http://es-cn-w*****.ES.aliyuncs.com:9200' \
      --hub-model-id 'madhurjindal/autonlp-Gibberish-Detector-492513457' \
      --task-type text_classification \
      --es-username yourusername \
      --es-password  yourpassword \
      --es-model-id your-es-model-id-name \

方法二:离线上传

将huggingface_hub仓库中的模型下载到本地,再上传到阿里云ES中。

  1. 在ECS中执行如下命令,下载huggingface_hub仓库。

    # 下载huggingface_hub仓库,huggingface_hub 是由 Hugging Face 提供的一个库,用于与他们的模型库进行交互,可以用来下载、上传以及列出模型和其他库资源。
    pip install huggingface_hub
    python3
    
    # 在Python解释器中导入 snapshot_download 函数
    from huggingface_hub import snapshot_download
    # 使用 snapshot_download 函数下载一个名为 FlagAlpha/Llama2-Chinese-13b-Chat 的存储库的快照
    snapshot_download(repo_id="madhurjindal/autonlp-Gibberish-Detector-492513457")
  2. 在ECS中执行如下命令,将模型文件上传到阿里云ES中。

    eland_import_hub_model \
          --url 'http://es-cn-w*****.ES.aliyuncs.com:9200' \
          --hub-model-id '/model/.cache/huggingface/hub/models--madhurjindal--autonlp-Gibberish-Detector-492513457/snapshots/c068f552cdee957e45d8773db9f7158d43902244' \
          --task-type text_classification \
          --es-username yourusername \
          --es-password  yourpassword \
          --es-model-id madhurjindal-autonlp-gibberish-detector-492513457-offline \

部分参数说明:

参数

说明

repo_id

Hugging Face模型中心的模型ID。

示例:madhurjindal/autonlp-Gibberish-Detector-492513457

url

ES的域名。

示例:http://es-cn-w*****.ES.aliyuncs.com:9200

hub-model-id

  • 在线上传:Hugging Face模型中心的模型ID。

    示例:madhurjindal/autonlp-Gibberish-Detector-492513457

  • 离线上传:模型文件在ECS中的路径。

    示例:/model/.cache/huggingface/hub/models--madhurjindal--autonlp-Gibberish-Detector-492513457/snapshots/c068f552cdee957e45d8773db9f7158d43902244

task-type

模型使用的任务类型,不同模型支持的任务类型不同。

huggingface模型目前支持的任务类型包括:

  • question_answering

  • zero_shot_classification

  • text_classification

  • fill_mask

  • text_embedding

  • text_expansion

  • text_similarity

  • ner

es-username

ES实例的用户名。

es-password

ES实例的密码。

es-model-id

上传到ES中后使用的模型ID,可自定义。

说明

自定义的模型ID中不能包含大写字母。

示例:madhurjindal-autonlp-gibberish-detector-492513457-offline

步骤二:部署模型

  1. 登录Kibana。具体操作,请参见登录Kibana控制台

  2. 单击Kibana页面左上角的image图标,选择Analytics > Machine Learning

  3. 在左侧菜单栏,单击模型管理(Model Management) > 已训练模型(Trained Models)。

  4. (可选)在页面上方,单击同步作业和已训练模型(Synchronize your jobs and trained models),在弹出的面板中单击同步(Synchronize)。

  5. 将鼠标移动到目标模型操作(Actions)列的前面,单击image图标,启动模型。

    image

  6. 在弹出的对话框中,配置模型后,单击启动(Start)。

    页面右下角弹出已成功启动的提示对话框,表明模型部署成功。

    说明

    模型无法启动可能是集群内存不足,升配集群后再试。无法启动的具体原因,请在提示对话框中单击请参阅完整的错误信息查看。

步骤三:测试模型

  1. 已训练模型页面,在已部署模型的操作列,选择image > 测试模型(Test model)。

    image

  2. 在弹出的面板中,测试已训练模型,查看输出结果是否符合预期。