草庐IT

基于文心大模型套件ERNIEKit实现文本匹配算法,模块化方便应用落地

汀丶人工智能 2023-03-28 原文

文心大模型,产业级知识增强大模型介绍

官网:https://wenxin.baidu.com/

文心大模型开发套件ERNIEKit,面向NLP工程师,提供全流程大模型开发与部署工具集,端到端、全方位发挥大模型效能。

提供业界效果领先的ERNIE 3.0系列开源模型和基于ERNIE的前沿任务模型,满足企业和开发者对NLP模型开发和学习的需求,预置文本分类、文本匹配、序列标注、信息抽取、文本生成五大经典NLP任务,提供基于ERNIE3.0的预训练模型的开发和使用。

PS:这里特别注释一下,目前ERNIEKit套件在兼容Paddle2.4版本上还有点问题,稳定版本是2.2,下属环境介绍里也有表明,主要还是对1.x的fluid兼容问题。

1.文本匹配

文本匹配是NLP中一个重要的基础问题,NLP中的许多任务都可以抽象为文本匹配任务,其通常以文本相似度计算、文本相关性计算的形式,在应用系统中起核心支撑作用。

代码结构:

文本匹配任务位于./applications/tasks/text_matching

. ├── data ### 示例数据文件夹,包括各任务所需的训练集、测试集、验证集和预测集 │ ├── dev_data │ │ └── dev.txt │ ├── dev_data_tokenized │ │ └── dev.txt │ ├── dict │ │ └── vocab.txt │ ├── download_data.sh │ ├── predict_data │ │ └── infer.txt │ ├── predict_data_tokenized │ │ └── infer.txt │ ├── test_data │ │ └── test.txt │ ├── test_data_tokenized │ │ └── test.txt │ ├── train_data_pairwise │ │ └── train.txt │ ├── train_data_pairwise_tokenized │ │ └── train.txt │ └── train_data_pointwise │ └── train.txt ├── data_set_reader ### 与匹配任务相关的数据读取代码 │ └── ernie_classification_dataset_reader.py ### 使用ERNIE的FC匹配任务专用的数据读取代码 ├── examples ### 各典型网络的json配置文件,infer后缀的为对应的预测配置文件 │ ├── mtch_bow_pairwise_ch_infer.json │ ├── mtch_bow_pairwise_ch.json │ ├── mtch_ernie_fc_pointwise_ch_infer.json │ ├── mtch_ernie_fc_pointwise_ch.json │ ├── mtch_ernie_pairwise_simnet_ch_infer.json │ ├── mtch_ernie_pairwise_simnet_ch.json │ ├── mtch_ernie_pointwise_simnet_ch_infer.json │ └── mtch_ernie_pointwise_simnet_ch.json ├── inference ### 模型预测代码 │ └── custom_inference.py ### 文本匹配任务通用的模型预测代码 ├── model ### 文本匹配任务相关的网络文件 │ ├── base_matching.py │ ├── bow_matching_pairwise.py │ ├── ernie_matching_fc_pointwise.py │ ├── ernie_matching_siamese_pairwise.py │ └── ernie_matching_siamese_pointwise.py ├── run_infer.py ### 依靠json进行模型预测的入口脚本 ├── run_trainer.py ### 依靠json进行模型训练的入口脚本 └── trainer ### 模型训练和评估代码 ├── custom_dynamic_trainer.py ### 动态库模式下的模型训练评估代码 └── custom_trainer.py ### 静态图模式下的模型训练评估代码

1.1 数据准备

在文心中,基于ERNIE的模型都不需要用户自己分词和生成词表文件,非ERNIE的模型需要用户自己提前切好词,词之间以空格分隔,并生成词表文件。切词和词表生成可以使用「分词工具与词表生成工具」进行处理。

  • 文心中的所有数据集、包含词表文件、label_map文件等都必须为为utf-8格式,如果你的数据是其他格式,请使用「编码识别及转换工具」进行格式转换。
  • 在文本匹配任务中,根据其训练方式的不同,训练集分为Pointwise和Pairwise两种格式,测试集、验证集和预测集的格式相同。
  • 非ERNIE数据的pointwise训练集、pairwise训练集、测试集、验证集和预测集分别存放在./applications/tasks/text_matching/data目录下的train_data_pointwise_tokenized、train_data_pairwise_tokenized、test_data_tokenized、dev_data_tokenized和predict_data_tokenized文件夹下。
  • ERNIE数据的pointwise训练集、pairwise训练集、测试集、验证集和预测集分别存放在./applications/tasks/text_matching/data目录下的train_data_pointwise、train_data_pairwise、test_data、dev_data和predict_data文件夹下。

1.1.1 非ERNIE模型数据

训练集

  • Pointwise训练集:数据分为三列,列与列之间用**\t**分割。前两列为文本,最后一列为标签。
喜欢 打篮球 的 男生 喜欢 什么样 的 女生 爱 打篮球 的 男生 喜欢 什么样 的 女生 1 我 手机 丢 了 , 我 想 换 个 手机 我 想 买 个 新手机 , 求 推荐 1 大家 觉得 她 好看 吗 大家 觉得 跑 男 好看 吗 ? 0
  • Pairwise训练集:数据分为三列,列与列之间用**\t**分割,以query和文章标题匹配任务为例,第一列为query,第二列为正例标题pos_titile,第三列为负例标题neg_title。
喜欢 打篮球 的 男生 喜欢 什么样 的 女生 爱 打篮球 的 男生 喜欢 什么样 的 女生 爱情 里 没有 谁 对 谁错 吗 ? 我 手机 丢 了 , 我 想 换 个 手机 我 想 买 个 新手机 , 求 推荐 剑灵 高级 衣料 怎么 得 大家 觉得 她 好看 吗 大家 觉得 跑 男 好看 吗 ? 照片 怎么 变成 漫画 预测集

  • 预测集样例如下所示,预测集无需进行标签预占位,数据为两列文本,两列文本之间使用**\t**进行分隔。
图片 上 得 牌子 是 什么 图片 上 是 什么 牌子 的 包 芹菜 包 什么 肉 好吃 芹菜 炒 啥 好吃 汽车 坐垫 什么 牌子 好 ? 什么 牌子 的 汽车 坐垫 好 词表 非ERNIE模型的词表文件示例存放在**./applications/tasks/text_matching/data/dict/vocab.txt :词表分为两列,第一列为词,第二列为id(从0开始),列与列之间用\t进行分隔。文心的词表中 [PAD]、[CLS]、[SEP]、[MASK]、[UNK]这5个词是必须要有的,若用户自备词表,需保证这5个词是存在的。部分词表示例如下所示:

[PAD] 0 [CLS] 1 [SEP] 2 [MASK] 3 的 4 这个 5 您好 6 ... [UNK] 1566

1.1.2 ERNIE模型数

训练集

ERNIE数据集与非ERNIE数据集格式一致,不同之处在于不用分词

  • Pointwise训练集:数据分为三列,列与列之间用**\t**分割。前两列为文本,最后一列为标签。
喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1 我手机丢了,我想换个手机 我想买个新手机,求推荐 1 大家觉得她好看吗 大家觉得跑男好看吗? 0 求秋色之空漫画全集 求秋色之空全集漫画 1 晚上睡觉带着耳机听音乐有什么害处吗? 孕妇可以戴耳机听音乐吗? 0
  • Pairwise训练集:数据分为三列,列与列之间用**\t**分割,以query和文章标题匹配任务为例,第一列为query,第二列为正例标题pos_titile,第三列为负例标题neg_title。
喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 这边的状态显示是等待确认的 我手机丢了,我想换个手机 我想买个新手机,求推荐 求一本小说是和攻撕逼的 大家觉得她好看吗 大家觉得跑男好看吗? 四川商务职业学院好不好呀 求秋色之空漫画全集 求秋色之空全集漫画 杂志社摄影照片投稿 晚上睡觉带着耳机听音乐有什么害处吗? 孕妇可以戴耳机听音乐吗? 给姓全的男生起外号 测试集/验证集

  • ERNIE数据集与非ERNIE数据集格式一致,不同之处在于不用分词
  • 测试集/验证集样例如下所示,数据分为三列,列与列之间用**\t**进行分隔,前两列为文本,最后一列为标签。
尺有所短,后面是什么 尺有所短,后面写什么 1 为什么恐怖片会吓死人 为什么恐怖片会吓死人? 1 这是什么舞?(图片) 这是什么枪图片如下 0 这是什么意思,翻译一下 翻译一下这是什么意思 1 海 尔 全 自 动 洗 衣 机 怎 么 样 海 尔 全 自 动 洗 衣 机 怎 么 样 海 尔 全 自 动 洗 衣 机 怎 么 用 海 尔 全 自 动 洗 衣 机 怎 么 用 在 家 电 脑 做 什 么 兼 职 好 呢 在 家 电 脑 做 什 么 兼 职 好 呢 两 台 电 脑 做 什 么 兼 职 好 呢 两 台 电 脑 做 什 么 兼 职 好 呢 这 是 什 么 动 漫 的 图 片 啊 } 这 是 什 么 动 漫 的 图 片 啊 } 这 是 动 漫 还 是 图 片 这 是 动 漫 还 是 图 片 词表

ERNIE词表文件格式与非ERNIE的格式一致,ERNIE词表由文心model提供,./applications/models_hub路径下各ERNIE模型文件夹下存在着对应的词表文件,用户可根据需要进行选择,具体示例如下所示:

[PAD] 0 [CLS] 1 [SEP] 2 [MASK] 3 , 4 的 5 、 6 一 7 人 8

1.2 网络(模型)选择

文心预置的可用于文本分类的模型源文件在applications/tasks/text_matching/model目录下,在介绍具体的模型前先对文本匹配网络涉及到的概念进行描述。

单塔 双塔
Pointwise
Pairwise
  • Pointwise/Pairwise

    • Pointwise:输入两个文本和一个标签,可看作为一个分类问题,即判断输入的两个文本是否匹配。
    • Pairwise:输入为三个文本,分别为Query以及对应的正样本和负样本,该训练方式考虑到了文本之间的相对顺序。
  • 单塔/双塔

    • 单塔:先将输入文本合并,然后输入到单一的神经网络模型。
    • 双塔:对输入文本分别进行编码成固定长度的向量,通过文本的表示向量进行交互计算得到文本之间的关系。
  • 各个模型的特点如下所示:

网络名称(py文件的类名) 简介 支持类型 支持预训练模型
BowMatchingPairwise(bow_matching_pairwise.py) 词袋模型,不考虑句子语序,用一组无序单词来表达一段文本;Pairwise双塔模型。 Pairwise ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium
ErnieMatchingFcPointwise(ernie_matching_fc_pointwise) 增加ERNIE预训练模型,下游网络为基础的文本匹配模型,可以任意搭配其他各种经典网络;Pointwise单塔模型。 Pointwise ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium
ErnieMatchingSiamesePairwise(ernie_matching_siamese_pairwise.py) 增加ERNIE预训练模型,下游网络采用余弦相似度作为匹配度计算,损失函数为合页损失函数;Pairwise双塔模型。 Pairwise ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium
ErnieMatchingSiamesePointwise(ernie_matching_siamese_pointwise.py) 增加ERNIE预训练模型,下游网络采用长短期记忆网络,可较好地处理序列文本中长距离依赖的问题;Pointwise双塔模型; Pointwise ERNIE2.0-Base、ERNIE2.0-large、ERNIE3.0-Base、ERNIE3.0-x-Base、ERNIE3.0-Medium、ERNIE-M
面向搜索、推荐系统排序模块、召回模块的常规解决方案,具体如下:

  1. 基于单塔 Point-wise 范式的语义匹配模型 ernie_matching: 模型精度高、计算复杂度高, 适合直接进行语义匹配 2 分类的应用场景。
  2. 基于单塔 Pair-wise 范式的语义匹配模型 ernie_matching: 模型精度高、计算复杂度高, 对文本相似度大小的序关系建模能力更强,适合将相似度特征作为上层排序模块输入特征的应用场景。
  3. 基于双塔 Point-wise 范式的语义匹配模型 SimNet 和 Sentence Transformers, 这 2 种方案计算效率更高,适合对延时要求高、根据语义相似度进行粗排的应用场景。

1.3 ERNIE预训练模型下载

文心提供的ERNIE预训练模型的下载脚本在applications/models_hub目录下,各预训练模型可由对应的download_xx.sh文件下载得到,用户可根据需求自行下载。其中,ernie_config.json为ERNIE预训练模型的配置文件,vocab.txt为ERNIE预训练模型的词表文件,params目录为ERNIE预训练模型的参数文件目录。

模型名称 下载脚本 备注
ERNIE2.0-Base sh download_ernie_2.0_base_ch.sh 下载并解压后得到对应模型的参数、字典和配置
ERNIE2.0-large sh download_ernie_2.0_large_ch.sh
ERNIE3.0-Base sh download_ernie_3.0_base_ch.sh
ERNIE3.0-x-Base sh download_ernie_3.0_x_base_ch.sh
ERNIE3.0-Medium sh download_ernie_3.0_medium.sh

1.4 模型评估指标选择

匹配任务常用的指标有:Acc(准确率)、Precision(精确率)、Recall(召回率)、pn(正逆序比)、Auc、F1等

1.5 运行环境选择

  • 非ERNIE网络,优先考虑CPU机器
  • ERNIE网络优先考虑GPU机器,显存大小最好在10G以上。

2.开始训练&预测

2.1 环境安装

2.1.1 环境版本要求:

  • 环境主要安装Python和Paddle对应版本要求的环境,中间建议使用pip安装方式进行安装。
  • Python3版本要求:python3.7及以上版本,参考https://www.python.org/
  • PaddlePaddle版本要求:paddlepaddle2.0+版本,参考https://www.paddlepaddle.org.cn/documentation/docs/zh/install/pip/macos-pip.html
  • Paddle环境的安装,需要确认Python和pip是64bit,并且处理器架构是x86_64(或称作x64、Intel 64、AMD64)架构,目前PaddlePaddle不支持arm64架构(mac M1除外,paddle 已支持Mac M1 芯片)。下面的第一行输出的是”64bit”,第二行输出的是”x86_64”、”x64”或”AMD64”即可:
python -c "import platform;print(platform.architecture()[0]);print(platform.machine())"

2.1.2 CPU机器和GPU机器的安装

CPU机器的安装

  • 请参考1,完成Paddle和Python3的安装即可

GPU机器的安装

使用GPU机器时,比CPU机器的安装多了GPU相关驱动的配置安装

1、 GPU环境及示例

  • 需要您确认自己的GPU机器的安装情况,包括:nvidia驱动、cuda版本、cudnn版本、nccl版本。
  • 以下是文心ERNIE开发套件在GPU机器上运行的环境配置示例:
环境示例

  • Tesla V100上nvidia驱动、cuda版本、cudnn版本、nccl版本、python版本以及PaddlePaddle版本
    • NVIDIA Driver Version: 418.67
      • CUDA Version: 10.1
      • CUDNN Version:7.6.0
      • NCCL Version: 2.3.5
      • Python 3.7.1及以上
      • PaddlePaddle 2.2
  • Tesla K40上nvidia驱动、cuda版本、cudnn版本、nccl版本、python版本以及PaddlePaddle版本
    • NVIDIA Driver Version: 418.39
      • CUDA Version: 10.1
      • CUDNN Version:7.0.3
      • NCCL Version: 2.3.5
      • Python 3.7.1及以上
      • PaddlePaddle 2.2
2、 配置环境变量:

  • 上述环境配置完成以后,可以参考以下方式进行运行时环境变量的配置。
  • 如果您的开发机上已经配置好文心ERNIE开发套件需要的环境,可以参考以下命令设置您的运行环境,配置如下:
set -x #在LD_LIBRARY_PATH中添加cuda库的路径 export LD_LIBRARY_PATH=/home/work/cuda-10.1/lib64:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=/home/work/cuda-10.1/extras/CUPTI/lib64:$LD_LIBRARY_PATH #在LD_LIBRARY_PATH中添加cudnn库的路径 export LD_LIBRARY_PATH=/home/work/cudnn/cudnn7.6.5/lib64:$LD_LIBRARY_PATH #如果需要多卡并行训练,需要先下载NCCL,下载地址:http://bj.bcebos.com/wenxin-models/nccl.tar.gz,然后在LD_LIBRARY_PATH中添加NCCL库的路径 export LD_LIBRARY_PATH=/home/work/nccl_2.3.5/lib:$LD_LIBRARY_PATH #如果FLAGS_sync_nccl_allreduce为1,则会在allreduce_op_handle中调用cudaStreamSynchronize(nccl_stream),这种模式在某些情况下可以获得更好的性能 export FLAGS_sync_nccl_allreduce=1 #是否是分布式训练,0标识是分布式,1标识是单机 export PADDLE_IS_LOCAL=1 export PADDLE_USE_GPU=1 #表示分配的显存块占GPU总可用显存大小的比例,范围[0,1] export FLAGS_fraction_of_gpu_memory_to_use=0.5 #选择要使用的GPU #export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 export CUDA_VISIBLE_DEVICES=0 #表示是否使用垃圾回收策略来优化网络的内存使用,<0表示禁用,>=0表示启用 export FLAGS_eager_delete_tensor_gb=1.0 #是否使用快速垃圾回收策略 export FLAGS_fast_eager_deletion_mode=1 #垃圾回收策略释放变量的内存大小百分比,范围为[0.0, 1.0] export FLAGS_memory_fraction_of_eager_deletion=1 #设置python #alias python= your python path #alias pip= your pip path 注意:如果需要多卡并行训练,需要先下载NCCL,下载地址:http://bj.bcebos.com/wenxin-models/nccl.tar.gz ,然后在LD_LIBRARY_PATH中添加NCCL库的路径

#安装Ernie套件,大小在125MB左右 !git clone https://github.com/PaddlePaddle/ERNIE.git

2.2 训练的配置文件

进入指定任务目录./applications/tasks/text_matching

  • 配置文件:在./example目录下,根据不同的模型有4种配置文件
    • mtch_bow_pairwise_ch.json:BowMatchingPairwise模型的配置文件
    • mtch_ernie_fc_pointwise_ch.json:ErnieMatchingFcPointwise模型的配置文件
    • mtch_ernie_pairwise_simnet_ch.json:ErnieMatchingSiamesePairwise模型的配置文件
    • mtch_ernie_pointwise_simnet_ch.json:ErnieMatchingSiamesePointwise模型的配置文件
├── examples ### 各典型网络的json配置文件,infer后缀的为对应的预测配置文件 │ ├── mtch_bow_pairwise_ch.json │ ├── mtch_ernie_fc_pointwise_ch.json │ ├── mtch_ernie_pairwise_simnet_ch.json │ └── mtch_ernie_pointwise_simnet_ch.json # ernie_3.0 模型下载 # 进入models_hub目录 %cd ./ERNIE/applications/models_hub # 运行下载脚本 !sh download_ernie_3.0_base_ch.sh #进入对应目录 %cd .. %cd ./tasks/text_matching # %cd /home/aistudio/ERNIE/applications/tasks/text_matching

2.3 训练模型

使用run_trainer.py脚本加载不同的配置文件从而训练不同的模型

#训练BowMatchingPairwise模型 python run_trainer.py --param_path ./examples/mtch_bow_pairwise_ch.json #训练ErnieMatchingFcPointwise模型 python run_trainer.py --param_path ./examples/mtch_ernie_fc_pointwise_ch.json #训练ErnieMatchingSiamesePairwise模型 python run_trainer.py --param_path ./examples/mtch_ernie_pairwise_simnet_ch.json #训练ErnieMatchingSiamesePointwise模型 python run_trainer.py --param_path ./examples/mtch_ernie_pointwise_simnet_ch.json #可自行修改代码 !python run_trainer.py --param_path ./examples/mtch_ernie_fc_pointwise_ch.json 部分结果展示

INFO: 02-14 17:24:30: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 8.4e-06 INFO: 02-14 17:24:31: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0006464745383709669 acc = 1.0 precision = 1.0 step = 530 time_cost = 0.7681 INFO: 02-14 17:24:31: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 7.6e-06 INFO: 02-14 17:24:32: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0007393724517896771 acc = 1.0 precision = 1.0 step = 540 time_cost = 0.7595 INFO: 02-14 17:24:32: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 6.8e-06 INFO: 02-14 17:24:32: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0005058677052147686 acc = 1.0 precision = 1.0 step = 550 time_cost = 0.7621 INFO: 02-14 17:24:32: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 6e-06 INFO: 02-14 17:24:33: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0005211303941905499 acc = 1.0 precision = 1.0 step = 560 time_cost = 0.7555 INFO: 02-14 17:24:33: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 5.2e-06 INFO: 02-14 17:24:34: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0006375016528181732 acc = 1.0 precision = 1.0 step = 570 time_cost = 0.7505 INFO: 02-14 17:24:34: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 4.4e-06 INFO: 02-14 17:24:35: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0006092005642130971 acc = 1.0 precision = 1.0 step = 580 time_cost = 0.7548 INFO: 02-14 17:24:35: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 3.6e-06 INFO: 02-14 17:24:35: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0005502075655385852 acc = 1.0 precision = 1.0 step = 590 time_cost = 0.7621 INFO: 02-14 17:24:35: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 2.8e-06 INFO: 02-14 17:24:36: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0006342551205307245 acc = 1.0 precision = 1.0 step = 600 time_cost = 0.7492 INFO: 02-14 17:24:36: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 2e-06 INFO: 02-14 17:24:37: ernie_matching_fc_pointwise.py:174 * 140322371376896 phase = test acc = 0.88 precision = 0.8747 time_cost = 0.968 step = 50 INFO: 02-14 17:24:37: custom_dynamic_trainer.py:138 * 140322371376896 eval step = 50 INFO: 02-14 17:24:38: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0007312577217817307 acc = 1.0 precision = 1.0 step = 610 time_cost = 1.7231 INFO: 02-14 17:24:38: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 1.2e-06 INFO: 02-14 17:24:39: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0009203955996781588 acc = 1.0 precision = 1.0 step = 620 time_cost = 0.756 INFO: 02-14 17:24:39: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 4e-07 INFO: 02-14 17:24:39: ernie_matching_fc_pointwise.py:169 * 140322371376896 phase = training loss = 0.0004998981021344662 acc = 1.0 precision = 1.0 step = 630 time_cost = 0.704 INFO: 02-14 17:24:39: custom_dynamic_trainer.py:86 * 140322371376896 current learning rate: 0.0 INFO: 02-14 17:24:39: custom_dynamic_trainer.py:104 * 140322371376896 Final test result: 需要关注信息:模型保存路径

INFO: 02-14 17:24:43: dynamic_trainer.py:170 * 140322371376896 save path: ./output/mtch_ernie_3.0_base_fc_pointwise_ch/save_inference_model/inference_step_631 INFO: 02-14 17:24:44: run_trainer.py:102 * 140322371376896 end of run train and eval .....

2.4 模型预测

#预测BowMatchingPairwise模型 python run_infer.py --param_path ./examples/mtch_bow_pairwise_ch_infer.json #预测ErnieMatchingFcPointwise模型 python run_infer.py --param_path ./examples/mtch_ernie_fc_pointwise_ch_infer.json #预测ErnieMatchingSiamesePairwise模型 python run_infer.py --param_path ./examples/mtch_ernie_pairwise_simnet_ch_infer.json #预测ErnieMatchingSiamesePointwise模型 python run_infer.py --param_path ./examples/mtch_ernie_pointwise_simnet_ch_infer.json #需要自行修改路径inference_model_path" !python run_infer.py --param_path ./examples/mtch_ernie_fc_pointwise_ch_infer.json # 最后会生成预测文件:/home/aistudio/ERNIE/applications/tasks/text_matching/output/predict_result.txt 部分预测结果展示:

7209396, 0.9994237422943115]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('现 在 吃 什 么 最 好 啊 现 在 吃 什 么 最 好 啊\t现 在 最 好 的 爆 吧 器 是 什 么 现 在 最 好 的 爆 吧 器 是 什 么', '[0.9997451901435852, 0.00025474882568232715]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('艾 尔 之 光 澄 说 的 是 什 么 话 艾 尔 之 光 澄 说 的 是 什 么 话\t艾 尔 之 光 澄 什 么 时 候 出 ? 艾 尔 之 光 澄 什 么 时 候 出 ?', '[0.999519944190979, 0.0004800466413144022]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('一 番 作 为 是 什 么 意 思 一 番 作 为 是 什 么 意 思\t撸 一 番 是 什 么 意 思 撸 一 番 是 什 么 意 思', '[0.9996808767318726, 0.0003191193100064993]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('微 分 子 的 性 质 是 什 么 微 分 子 的 性 质 是 什 么\t分 子 的 性 质 是 什 么 ? 分 子 的 性 质 是 什 么 ?', '[0.5368487238883972, 0.4631512463092804]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('手 机 看 电 影 哪 个 网 站 更 新 速 度 最 快 手 机 看 电 影 哪 个 网 站 更 新 速 度 最 快\t哪 个 网 站 的 电 影 更 新 最 快 哪 个 网 站 的 电 影 更 新 最 快', '[0.983171820640564, 0.016828108578920364]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('梦 见 拔 花 生 是 什 么 意 思 梦 见 拔 花 生 是 什 么 意 思\t梦 见 种 花 生 什 么 意 思 梦 见 种 花 生 什 么 意 思', '[0.9997345805168152, 0.0002654124400578439]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('逆 战 飓 风 之 龙 逆 战 飓 风 之 龙\t逆 战 送 飓 风 之 龙 的 号 逆 战 送 飓 风 之 龙 的 号', '[0.42942267656326294, 0.5705773234367371]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('移 动 宽 带 怎 么 样 ? 移 动 宽 带 怎 么 样 ?\t移 动 宽 带 怎 么 样 移 动 宽 带 怎 么 样', '[0.0005698217428289354, 0.9994301199913025]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('求 《 宝 贝 真 乖 》 全 文 , 谢 ! 求 《 宝 贝 真 乖 》 全 文 , 谢 !\t求 宝 贝 真 乖 全 文 求 宝 贝 真 乖 全 文', '[0.0024148777592927217, 0.9975850582122803]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('圆 周 率 是 谁 发 明 的 ? 圆 周 率 是 谁 发 明 的 ?\t是 谁 发 明 了 圆 周 率 是 谁 发 明 了 圆 周 率', '[0.0006937617436051369, 0.9993062019348145]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('爱 情 和 婚 姻 的 区 别 是 什 么 ? 爱 情 和 婚 姻 的 区 别 是 什 么 ?\t爱 情 与 婚 姻 有 什 么 区 别 么 ? 爱 情 与 婚 姻 有 什 么 区 别 么 ?', '[0.0005726246163249016, 0.9994274377822876]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('作 文 《 我 爱 什 么 》 作 文 《 我 爱 什 么 》\t因 为 有 什 么 , 我 更 的 作 文 因 为 有 什 么 , 我 更 的 作 文', '[0.9994762539863586, 0.0005237914156168699]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('你 为 什 么 喜 欢 周 杰 伦 译 文 你 为 什 么 喜 欢 周 杰 伦 译 文\t周 杰 伦 中 有 我 喜 欢 你 这 句 歌 词 是 什 么 歌 周 杰 伦 中 有 我 喜 欢 你 这 句 歌 词 是 什 么 歌', '[0.9997124075889587, 0.00028757069958373904]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('上 火 会 牙 痛 吗 上 火 会 牙 痛 吗\t牙 痛 是 上 火 吗 牙 痛 是 上 火 吗', '[0.002424687147140503, 0.9975753426551819]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('今 天 深 圳 天 气 怎 么 样 ? 今 天 深 圳 天 气 怎 么 样 ?\t今 天 深 圳 天 气 如 何 今 天 深 圳 天 气 如 何', '[0.0005872210604138672, 0.9994127750396729]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('谢 文 东 第 三 季 在 什 么 播 放 器 里 看 谢 文 东 第 三 季 在 什 么 播 放 器 里 看\t谢 文 东 第 三 季 要 在 什 么 播 放 器 里 看 谢 文 东 第 三 季 要 在 什 么 播 放 器 里 看', '[0.0007112747407518327, 0.9992886781692505]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('小 学 生 适 合 看 什 么 书 请 推 荐 小 学 生 适 合 看 什 么 书 请 推 荐\t有 什 么 适 合 小 学 生 六 年 级 学 生 看 的 书 有 什 么 适 合 小 学 生 六 年 级 学 生 看 的 书', '[0.035894427448511124, 0.9641055464744568]') INFO: 02-14 17:30:07: run_infer.py:50 * 140238487475968 ('南 宁 属 于 哪 个 省 南 宁 属 于 哪 个 省\t南 宁 是 属 于 哪 个 省 南 宁 是 属 于 哪 个 省', '[0.0006054917466826737, 0.9993945360183716]') 最后会生成预测文件:/home/aistudio/ERNIE/applications/tasks/text_matching/output/predict_result.txt

2.5 多卡指令

fleetrun --gpus=x,y run_trainer.py./examples/cls_ernie_fc_ch.json
  • 训练运行的日志会自动保存在**./log/test.log**文件中。
  • 训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/ 文件夹会保存用于热启动的模型文件。
注意:如果需要多卡并行训练,需要先下载NCCL,下载地址:http://bj.bcebos.com/wenxin-models/nccl.tar.gz ,然后在LD_LIBRARY_PATH中添加NCCL库的路径

3.总结

趁着情人节介绍推广一下文心ERNIEKit套件,赶快收藏起来,节后卷起来。文心大模型开发套件ERNIEKit,面向NLP工程师,提供全流程大模型开发与部署工具集,端到端、全方位发挥大模型效能。

效果领先、简单易用、高效灵活的NLP算法定制开发工具,预置30余个大规模预训练模型、40余个NLP基础任务、20余个数据预处理工具、10余个模型微调工具。支持在BML私有化平台中使用。(旗舰版)

案例集成度很高快点用起来吧!

PS:这里特别注释一下,目前ERNIEKit套件在兼容Paddle2.4版本上还有点问题,稳定版本是2.2,下属环境介绍里也有表明,主要还是对1.x的fluid兼容问题。

参考链接:https://github.com/PaddlePaddle/ERNIE

有关基于文心大模型套件ERNIEKit实现文本匹配算法,模块化方便应用落地的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  4. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  5. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  6. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  9. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  10. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

随机推荐