零样本文本分类利用:基于 UTC 的医疗用意多分类,买通数据标注 - 模型训练 - 模型调优 - 预测部署全流程。
1. 通用文本分类技术 UTC 介绍
本我的项目提供基于通用文本分类 UTC(Universal Text Classification)模型微调的文本分类端到端利用计划,买通 数据标注 - 模型训练 - 模型调优 - 预测部署全流程,可疾速实现文本分类产品落地。
文本分类是一种重要的自然语言解决工作,它能够帮忙咱们将大量的文本数据进行无效的分类和演绎。实际上,在日常生活中,咱们也常常会用到文本分类技术。例如,咱们能够应用文本分类来对新闻报道进行分类,对电子邮件进行分类,对社交媒体上的评论进行情感剖析等等。然而,文本分类也面临着许多挑战。其中最重要的挑战之一是数据稀缺。因为文本数据往往十分宏大,因而获取足够的训练数据可能十分艰难。此外,不同的文本分类工作也可能面临着畛域多变和工作多样等挑战。为了应答这些挑战,PaddleNLP 推出了一项零样本文本分类利用 UTC。该利用通过对立语义匹配形式 USM(Unified Semantic Matching)来将标签和文本的语义匹配能力进行对立建模。这种办法能够帮忙咱们更好地了解文本数据,并从中提取出有用的特色信息。
UTC 具备低资源迁徙能力,能够反对通用分类、评论情感剖析、语义类似度计算、蕴含推理、多项式浏览了解等多种“泛分类”工作。这使得开发者能够更加轻松高效地实现多任务文本分类数据标注、训练、调优和上线,从而升高文本分类技术门槛。
总之,文本分类是一项重要的自然语言解决工作,它能够帮忙咱们更好地了解和演绎文本数据。只管它面临着许多挑战,然而 通过应用 PaddleNLP 的零样本文本分类利用 UTC,开发者们能够简略高效实现多任务文本分类数据标注、训练、调优、上线,升高文本分类落地技术门槛。
1.1 分类落地面临难度
分类工作看似简略,然而在产业级文本分类落地实际中,面临着诸多挑战:
- 工作多样:单标签、多标签、档次标签、大规模标签等不同的文本分类工作,须要开发不同的分类模型,模型架构往往特化于具体任务,难以使用对立模式建模;
- 数据稀缺:局部畛域数据稀缺,难以获取,且畛域专业性使得数据标注门槛高;
- 标签迁徙:不同畛域的标签多样,并且迁徙难度大,尤其不同畛域间的标签常识很难迁徙。
1.2 UTC 亮点
1.2.1 多任务对立建模
在传统技术计划中,针对不同的分类工作须要构建多个分类模型,模型需独自训练且数据和常识不共享。而在 UTC 计划下,单个模型能解决所有分类需要,包含但不限于单标签分类、多标签分类、档次标签分类、大规模事件标签检测、蕴含推理、语义类似度计算等,升高了开发成本和机器老本。
1.2.2 零样本分类和小样本迁徙能力强
UTC 通过大规模多任务预训练后,能够适配不同的行业畛域,不同的分类标签,仅标注了几条样本,分类成果就获得大幅晋升,大大降低标注门槛和老本。
在医疗、金融、法律等畛域中,无需训练数据的零样本状况下 UTC 成果均匀可达到 70%+(如下表所示),标注少样本也可带来显著的成果晋升:每个标签仅仅标注 1 条样本后,均匀晋升了 10 个点!也就是说,即便在某些场景下体现欠佳,人工标几个样本,丢给模型后就会有大幅的成果晋升。
1.3 UTC 技术思路
UTC 基于百度最新提出的对立语义匹配框架 USM(Unified Semantic Matching)[1],将分类工作对立建模为标签与文本之间的匹配工作,对不同标签的分类工作进行对立建模。具体地说:
- 为了实现工作架构对立,UTC 设计了标签与文本之间的词对连贯操作(Label–>CLS-Token Linking),这使得模型可能适应不同畛域和工作的标签信息,并按需要进行分类,从而实现了凋谢域场景下的通用文本分类。
例如,对于事件检测工作,可将一系列事件标签拼接为 [L] 上映 [L] 夺冠 [L] 下架,而后与原文本一起作为整体输出到 UTC 中,UTC 将不同标签标识符 [L] 与[CLS]进行匹配,可对不同标签类型的分类工作对立建模,间接上图:
-
为了实现通用能力共享,让不同畛域间的标签常识跨域迁徙,UTC 构建了对立的异质监督学习办法进行多任务预训练,使不同畛域工作具备良好的零 / 少样本迁徙性能。对立的异质监督学习办法次要包含三种不同的监督信号:
- 间接监督:分类工作间接相干的数据集,如情感分类、新闻分类、用意辨认等。
- 间接监督:分类工作间接相干的数据集,如选项式浏览了解、问题 - 文章匹配等。
- 近程监督:标签知识库或层级题目与文本对齐后弱标注数据。
更多内容参考论文见文末链接 or fork 一下我的项目论文已上传
2. 文本分类工作 Label Studio 教程
2.1 Label Studio 装置
以下标注示例用到的环境配置:
- Python 3.8+
- label-studio == 1.7.2
在终端 (terminal) 应用 pip 装置 label-studio:
pip install label-studio==1.7.2
装置实现后,运行以下命令行:
label-studio start
在浏览器关上 http://localhost:8080/,输出用户名和明码登录,开始应用 label-studio 进行标注。
2.2 文本分类工作标注
2.2.1 我的项目创立
点击创立(Create)开始创立一个新的我的项目,填写项目名称、形容,而后在 Labeling Setup
中抉择Text Classification
。
- 填写项目名称、形容
- 数据上传,从本地上传 txt 格式文件,抉择
List of tasks
,而后抉择导入本我的项目
- 设置工作,增加标签
- 数据上传
我的项目创立后,可在 Project/ 文本分类工作中点击 Import
持续导入数据,同样从本地上传 txt 格式文件,抉择List of tasks
。
2.2.2 标签构建
我的项目创立后,可在 Setting/Labeling Interface 中持续配置标签,
默认模式为单标签多分类数据标注。对于多标签多分类数据标注,须要将 choice
的值由 single
改为multiple
。
2.2.3 工作标注
2.2.4 数据导出
勾选已标注文本 ID,抉择导出的文件类型为JSON
,导出数据:
参考链接:
- Label Studio
3. 数据转换
将导出的文件重命名为 label_studio.json
后,放入 ./data
目录下。通过 label_studio.py 脚本可转为 UTC 的数据格式。
在数据转换阶段,还须要提供标签候选信息,放在 ./data/label.txt
文件中,每个标签占一行。例如在医疗用意分类中,标签候选为 ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"]
,也可通过options
参数间接进行配置。
这里提供事后标注好的 医疗用意分类数据集
的文件,能够运行上面的命令行下载数据集,咱们将展现如何应用数据转化脚本生成训练 / 验证 / 测试集文件,并应用 UTC 模型进行微调。
# 下载医疗用意分类数据集:!wget https://bj.bcebos.com/paddlenlp/datasets/utc-medical.tar.gz
!tar -xvf utc-medical.tar.gz
!mv utc-medical data
!rm utc-medical.tar.gz
数据集局部展现
[{"id":26092,"annotations":[{"id":59,"completed_by":1,"result":[{"value":{"choices":["注意事项"]},"id":"7iya31L9oc","from_name":"sentiment","to_name":"text","type":"choices","origin":"manual"}],"was_cancelled":false,"ground_truth":false,"created_at":"2023-01-09T07:13:18.982993Z","updated_at":"2023-01-09T07:13:18.983032Z","lead_time":4.022,"prediction":{},"result_count":0,"task":26092,"parent_prediction":null,"parent_annotation":null}],"file_upload":"838fb89a-10-shot.txt","drafts":[],"predictions":[],"data":{"text":"烧氧割要留神那些问题"},"meta":{},"created_at":"2023-01-09T06:48:10.725717Z","updated_at":"2023-01-09T07:13:19.022666Z","inner_id":35,"total_annotations":1,"cancelled_annotations":0,"total_predictions":0,"comment_count":0,"unresolved_comment_count":0,"last_comment_updated_at":null,"project":5,"updated_by":1,"comment_authors":[]},
{"id":26091,"annotations":[{"id":4,"completed_by":1,"result":[{"value":{"choices":["病因剖析"]}]
# 生成训练 / 验证集文件:!python label_studio.py \
--label_studio_file ./data/utc-medical/label_studio.json \
--save_dir ./data \
--splits 0.8 0.1 0.1 \
--options ./data/utc-medical/label.txt
[32m[2023-04-14 11:28:46,056] [INFO][0m - Save 45 examples to ./data/train.txt.[0m
[32m[2023-04-14 11:28:46,057] [INFO][0m - Save 6 examples to ./data/dev.txt.[0m
[32m[2023-04-14 11:28:46,057] [INFO][0m - Save 6 examples to ./data/test.txt.[0m
[32m[2023-04-14 11:28:46,057] [INFO][0m - Finished! It takes 0.00 seconds[0m
[0m
{"text_a": "老年痴呆的症状有哪些", "text_b": "","question":"", "choices": ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"], "labels": [5]}
label_studio_file
: 从 label studio 导出的数据标注文件。save_dir
: 训练数据的保留目录,默认存储在data
目录下。splits
: 划分数据集时训练集、验证集所占的比例。默认为 [0.8, 0.1, 0.1] 示意依照8:1:1
的比例将数据划分为训练集、验证集和测试集。options
: 指定分类工作的类别标签。若输出类型为文件,则文件中每行一个标签。is_shuffle
: 是否对数据集进行随机打散,默认为 True。seed
: 随机种子,默认为 1000.
备注:
- 默认状况下 label_studio.py 脚本会依照比例将数据划分为 train/dev/test 数据集
- 每次执行 label_studio.py 脚本,将会笼罩已有的同名数据文件
- 对于从 label_studio 导出的文件,默认文件中的每条数据都是通过人工正确标注的。
应用 Label Studio 数据标注工具进行标注,如果已有标注好的本地数据集,咱们须要将数据集整顿为文档要求的格局,
4. 模型训练预测
多任务训练场景可别离进行数据转换再进行混合:通用分类、评论情感剖析、语义类似度计算、蕴含推理、多项式浏览了解等泛滥“泛分类”工作
## 代码构造
├── deploy/simple_serving/ # 模型部署脚本
├── utils.py # 数据处理工具
├── run_train.py # 模型微调脚本
├── run_eval.py # 模型评估脚本
├── label_studio.py # 数据格式转换脚本
├── label_studio_text.md # 数据标注阐明文档
└── README.md
4.1 模型微调
举荐应用 PromptTrainer API 对模型进行微调,该 API 封装了提醒定义性能,且继承自 Trainer API。只需输出模型、数据集等就能够应用 Trainer API 高效疾速地进行预训练、微调等工作,能够一键启动多卡训练、混合精度训练、梯度累积、断点重启、日志显示等性能,Trainer API 还针对训练过程的通用训练配置做了封装,比方:优化器、学习率调度等。
应用上面的命令,应用 utc-base
作为预训练模型进行模型微调,将微调后的模型保留至output_dir
:
4.1.1 单卡训练
# 装置最新版本 paddlenlp
!pip install --upgrade paddlenlp
# 单卡启动:!python run_train.py \
--device gpu \
--logging_steps 10 \
--save_steps 10 \
--eval_steps 10 \
--seed 1000 \
--model_name_or_path utc-base \
--output_dir ./checkpoint/model_best \
--dataset_path ./data/ \
--max_seq_length 512 \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 2 \
--gradient_accumulation_steps 8 \
--num_train_epochs 20 \
--learning_rate 1e-5 \
--do_train \
--do_eval \
--do_export \
--export_model_dir ./checkpoint/model_best \
--overwrite_output_dir \
--disable_tqdm True \
--metric_for_best_model macro_f1 \
--load_best_model_at_end True \
--save_total_limit 1 \
--save_plm
eval_loss: 0.3148668706417084, eval_micro_f1: 0.9848484848484849, eval_macro_f1: 0.9504132231404958, eval_runtime: 0.0757, eval_samples_per_second: 79.286, eval_steps_per_second: 39.643, epoch: 19.6957
[2023-04-13 17:02:45,941] [INFO] - epoch = 19.6957
[2023-04-13 17:02:45,941] [INFO] - train_loss = 0.9758
[2023-04-13 17:02:45,942] [INFO] - train_runtime = 0:00:45.91
[2023-04-13 17:02:45,942] [INFO] - train_samples_per_second = 19.602
[2023-04-13 17:02:45,942] [INFO] - train_steps_per_second = 0.871
二分类时须要留神的问题
- ModuleNotFoundError: No module named ‘fast_tokenizer’
装置一下 fast tokenizer
pip install --upgrade fast_tokenizer
- 开启 single_label 时须要将运行脚本中的 metric_for_best_model 参数改为 accuracy
metric_value = metrics[metric_to_check]
KeyError: 'eval_macro_f1'
4.1.2 多卡训练
如果在 GPU 环境中应用,能够指定 gpus 参数进行多卡训练:
# !python -u -m paddle.distributed.launch --gpus "0,1,2,3" run_train.py \
# --device gpu \
# --logging_steps 10 \
# --save_steps 10 \
# --eval_steps 10 \
# --seed 1000 \
# --model_name_or_path utc-base \
# --output_dir ./checkpoint/model_best \
# --dataset_path ./data/ \
# --max_seq_length 512 \
# --per_device_train_batch_size 2 \
# --per_device_eval_batch_size 2 \
# --gradient_accumulation_steps 8 \
# --num_train_epochs 20 \
# --learning_rate 1e-5 \
# --do_train \
# --do_eval \
# --do_export \
# --export_model_dir ./checkpoint/model_best \
# --overwrite_output_dir \
# --disable_tqdm True \
# --metric_for_best_model macro_f1 \
# --load_best_model_at_end True \
# --save_total_limit 1 \
# --save_plm
该示例代码中因为设置了参数 --do_eval
,因而在训练完会主动进行评估。
可配置参数阐明:
single_label
: 每条样本是否只预测一个标签。默认为False
,示意多标签分类。device
: 训练设施,可抉择 ‘cpu’、’gpu’ 其中的一种;默认为 GPU 训练。logging_steps
: 训练过程中日志打印的距离 steps 数,默认 10。save_steps
: 训练过程中保留模型 checkpoint 的距离 steps 数,默认 100。eval_steps
: 训练过程中保留模型 checkpoint 的距离 steps 数,默认 100。seed
:全局随机种子,默认为 42。model_name_or_path
:进行 few shot 训练应用的预训练模型。默认为 “utc-base”, 可选 ”utc-xbase”, “utc-base”, “utc-medium”, “utc-mini”, “utc-micro”, “utc-nano”, “utc-pico”。output_dir
:必须,模型训练或压缩后保留的模型目录;默认为None
。dataset_path
:数据集文件所在目录;默认为./data/
。train_file
:训练集后缀;默认为train.txt
。dev_file
:开发集后缀;默认为dev.txt
。max_seq_len
:文本最大切分长度,包含标签的输出超过最大长度时会对输出文本进行主动切分,标签局部不可切分,默认为 512。per_device_train_batch_size
: 用于训练的每个 GPU 外围 /CPU 的 batch 大小,默认为 8。per_device_eval_batch_size
: 用于评估的每个 GPU 外围 /CPU 的 batch 大小,默认为 8。num_train_epochs
: 训练轮次,应用早停法时能够抉择 100;默认为 10。learning_rate
:训练最大学习率,UTC 举荐设置为 1e-5;默认值为 3e-5。do_train
: 是否进行微调训练,设置该参数示意进行微调训练,默认不设置。do_eval
: 是否进行评估,设置该参数示意进行评估,默认不设置。do_export
: 是否进行导出,设置该参数示意进行动态图导出,默认不设置。export_model_dir
: 动态图导出地址,默认为 None。overwrite_output_dir
:如果True
,笼罩输入目录的内容。如果output_dir
指向检查点目录,则应用它持续训练。disable_tqdm
:是否应用 tqdm 进度条。metric_for_best_model
:最优模型指标, UTC 举荐设置为macro_f1
,默认为 None。load_best_model_at_end
:训练完结后是否加载最优模型,通常与metric_for_best_model
配合应用,默认为 False。save_total_limit
:如果设置次参数,将限度 checkpoint 的总数。删除旧的 checkpoints输入目录
,默认为 None。--save_plm
:保留模型进行推理部署
4.2 模型评估
通过运行以下命令进行模型评估预测:
!python run_eval.py \
--model_path ./checkpoint/model_best \
--test_path ./data/test.txt \
--per_device_eval_batch_size 16 \
--max_seq_len 512 \
--output_dir ./checkpoint_test
测试后果
[2023-04-13 17:06:59,413] [INFO] - test_loss = 1.6392
[2023-04-13 17:06:59,413] [INFO] - test_macro_f1 = 0.8167
[2023-04-13 17:06:59,413] [INFO] - test_micro_f1 = 0.9394
[2023-04-13 17:06:59,413] [INFO] - test_runtime = 0:00:00.87
[2023-04-13 17:06:59,413] [INFO] - test_samples_per_second = 6.835
[2023-04-13 17:06:59,413] [INFO] - test_steps_per_second = 1.139
可配置参数阐明:
model_path
: 进行评估的模型文件夹门路,门路下需蕴含模型权重文件model_state.pdparams
及配置文件model_config.json
。test_path
: 进行评估的测试集文件。per_device_eval_batch_size
: 批处理大小,请联合机器状况进行调整,默认为 16。max_seq_len
: 文本最大切分长度,输出超过最大长度时会对输出文本进行主动切分,默认为 512。single_label
: 每条样本是否只预测一个标签。默认为False
,示意多标签分类。
4.3 模型预测
paddlenlp.Taskflow
装载定制模型,通过 task_path
指定模型权重文件的门路,门路下须要蕴含训练好的模型权重文件model_state.pdparams
。
!pip install onnxruntime-gpu onnx onnxconverter-common
!pip install paddle2onnx
#如果呈现这个报错 local variable 'paddle2onnx' referenced before assignment,请装置上述库 onnx 的包须要装置
#中途呈现一些正告能够漠视
from pprint import pprint
from paddlenlp import Taskflow
schema = ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"]
# my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema, task_path='/home/aistudio/checkpoint/model_best/plm', precision="fp16")
my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema, task_path='/home/aistudio/checkpoint/model_best/plm')
#反对 FP16 半精度推理减速, 须要装置 onnx
pprint(my_cls(["老年斑为什么都长在面部和手背上","老成都市哪家内痔医院比拟好怎么样最好?","中性粒细胞比率偏低"]))
[2023-04-14 11:45:11,057] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'utc-base'.
[2023-04-14 11:45:11,059] [INFO] - Already cached /home/aistudio/.paddlenlp/models/utc-base/utc_base_vocab.txt
[2023-04-14 11:45:11,083] [INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/utc-base/tokenizer_config.json
[2023-04-14 11:45:11,085] [INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/utc-base/special_tokens_map.json
[2023-04-14 11:45:11,088] [INFO] - Assigning ['[O-MASK]'] to the additional_special_tokens key of the tokenizer
[{'predictions': [{'label': '病因剖析', 'score': 0.7360146263899581}],
'text_a': '老年斑为什么都长在面部和手背上'},
{'predictions': [{'label': '就医倡议', 'score': 0.9940570944549809}],
'text_a': '老成都市哪家内痔医院比拟好怎么样最好?'},
{'predictions': [{'label': '指标解读', 'score': 0.6683004187689248}],
'text_a': '中性粒细胞比率偏低'}]
from pprint import pprint
from paddlenlp import Taskflow
schema = ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"]
my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema)
pprint(my_cls(["老年斑为什么都长在面部和手背上","老成都市哪家内痔医院比拟好怎么样最好?","中性粒细胞比率偏低"]))
[2023-04-14 11:45:20,869] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'utc-base'.
[2023-04-14 11:45:20,872] [INFO] - Already cached /home/aistudio/.paddlenlp/models/utc-base/utc_base_vocab.txt
[2023-04-14 11:45:20,897] [INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/utc-base/tokenizer_config.json
[2023-04-14 11:45:20,900] [INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/utc-base/special_tokens_map.json
[2023-04-14 11:45:20,903] [INFO] - Assigning ['[O-MASK]'] to the additional_special_tokens key of the tokenizer
[{'predictions': [], 'text_a': '老年斑为什么都长在面部和手背上'},
{'predictions': [{'label': '就医倡议', 'score': 0.9283481315032535},
{'label': '其余', 'score': 0.5083715719139965}],
'text_a': '老成都市哪家内痔医院比拟好怎么样最好?'},
{'predictions': [{'label': '其余', 'score': 0.9437889944553786}],
'text_a': '中性粒细胞比率偏低'}]
4.3.1 预测后果比照
模型 | 文本 | 预测后果 | 评估得分 |
---|---|---|---|
utc-base | 老年斑为什么都长在面部和手背上 | 空 | — |
utc-base | 老成都市哪家内痔医院比拟好怎么样最好? | 就医倡议 / 其余 | 0.92/0.51 |
utc-base | 中性粒细胞比率偏低 | 其余 | 0.94 |
utc-base+ 微调 | 老年斑为什么都长在面部和手背上 | 病因剖析 | 0.73 |
utc-base+ 微调 | 老成都市哪家内痔医院比拟好怎么样最好? | 就医倡议 | 0.99 |
utc-base+ 微调 | 中性粒细胞比率偏低 | 指标解读 | 0.66 |
显著能够看到在通过样本训练后,在 test 测试的后果小样本本微调的后果显著晋升
4.3.2 各个模型见比照
Micro F1 更关注整个数据集的性能,而 Macro F1 更关注每个类别的性能。
医疗用意分类数据集 KUAKE-QIC 验证集 zero-shot 试验指标和小样本下训练比照:
| | Macro F1 | Micro F1 | 微调后 Macro F1 | 微调后 Micro F1 |
| :——–: | :——–: | :——–: | :——–: | :——–: |
| utc-xbase | 66.30 | 89.67 | | |
| utc-base | 64.13 | 89.06 |81.67(+17.54)|93.94(+4.88)|
| utc-medium | 69.62 | 89.15 || |
| utc-micro | 60.31 | 79.14 || |
| utc-mini | 65.82 | 89.82 || |
| utc-nano | 62.03 | 80.92 || |
| utc-pico | 53.63 | 83.57 || |
其余模型就不一一验证了,感兴趣同学自行验证。
5. 模型部署
目前 UTC 模型提供基于多种部署形式,包含基于 FastDeploy 的本地 Python 部署以及 PaddleNLP SimpleServing 的服务化部署。
5.1 FastDeploy UTC 模型 Python 部署示例
以下示例展现如何基于 FastDeploy 库实现 UTC 模型实现通用文本分类工作的 Python 预测部署,可通过命令行参数 --device
以及 --backend
指定运行在不同的硬件以及推理引擎后端,并应用 --model_dir
参数指定运行的模型。模型目录为 application/zero_shot_text_classification/checkpoint/model_best
(用户可按理论状况设置)。
在部署前,参考 FastDeploy SDK 装置文档装置 FastDeploy Python SDK。
本目录下提供 infer.py
疾速实现在 CPU/GPU 的通用文本分类工作的 Python 部署示例。
- 依赖装置
间接执行以下命令装置部署示例的依赖。
# 装置 fast_tokenizer 以及 GPU 版本 fastdeploy
pip install fast-tokenizer-python fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
以下示例展现如何基于 FastDeploy 库实现 UTC 模型进行文本分类工作的 Python 预测部署,可通过命令行参数 --device
以及 --backend
指定运行在不同的硬件以及推理引擎后端,并应用 --model_dir
参数指定运行的模型,具体参数设置可查看上面 [参数阐明])。示例中的模型是依照 [UTC 训练文档] 导出失去的部署模型,其模型目录为 application/zero_shot_text_classification/checkpoint/model_best
(用户可按理论状况设置)。
# CPU 推理
python /home/aistudio/deploy/python/infer.py--model_dir /home/aistudio/checkpoint/model_best --device cpu
# GPU 推理
python /home/aistudio/deploy/python/infer.py --model_dir /home/aistudio/checkpoint/model_best --device gpu
运行实现后返回的后果如下:
- 参数阐明
参数 | 参数阐明 |
---|---|
–model_dir | 指定部署模型的目录, |
–batch_size | 输出的 batch size,默认为 1 |
–max_length | 最大序列长度,默认为 128 |
–num_omask_tokens | 最大标签数量,默认为 64 |
–device | 运行的设施,可选范畴: [‘cpu’, ‘gpu’],默认为 ’cpu’ |
–device_id | 运行设施的 id。默认为 0。 |
–cpu_threads | 当应用 cpu 推理时,指定推理的 cpu 线程数,默认为 1。 |
–backend | 反对的推理后端,可选范畴: [‘onnx_runtime’, ‘paddle’, ‘tensorrt’, ‘paddle_tensorrt’],默认为 ’paddle’ |
–use_fp16 | 是否应用 FP16 模式进行推理。应用 tensorrt 和 paddle_tensorrt 后端时可开启,默认为 False |
- FastDeploy 高阶用法
FastDeploy 在 Python 端上,提供 fastdeploy.RuntimeOption.use_xxx()
以及 fastdeploy.RuntimeOption.use_xxx_backend()
接口反对开发者抉择不同的硬件、不同的推理引擎进行部署。在不同的硬件上部署 UTC 模型,须要抉择硬件所反对的推理引擎进行部署,下表展现如何在不同的硬件上抉择可用的推理引擎部署 UTC 模型。
符号阐明: (1) ✅: 曾经反对; (2) ❔: 正在进行中; (3) N/A: 暂不反对;
硬件 | 硬件对应的接口 | 可用的推理引擎 | 推理引擎对应的接口 | 是否反对 Paddle 新格局量化模型 | 是否反对 FP16 模式 |
CPU | use_cpu() | Paddle Inference | use_paddle_infer_backend() | ✅ | N/A |
ONNX Runtime | use_ort_backend() | ✅ | N/A | ||
GPU | use_gpu() | Paddle Inference | use_paddle_infer_backend() | ✅ | N/A |
ONNX Runtime | use_ort_backend() | ✅ | ❔ | ||
Paddle TensorRT | use_paddle_infer_backend() + paddle_infer_option.enable_trt = True | ✅ | ✅ | ||
TensorRT | use_trt_backend() | ✅ | ✅ | ||
昆仑芯 XPU | use_kunlunxin() | Paddle Lite | use_paddle_lite_backend() | N/A | ✅ |
华为 昇腾 | use_ascend() | Paddle Lite | use_paddle_lite_backend() | ❔ | ✅ |
Graphcore IPU | use_ipu() | Paddle Inference | use_paddle_infer_backend() | ❔ | N/A |
# !pip install --user fast-tokenizer-python fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
#比拟大 1.4G 去终端装置
在 notebook 执行呈现问题,可能须要本地对 fastdeploy 利用调试,或者有小伙伴解决了能够再评论区发表一下,一起解决。
- 在 studio 目前显示是装置胜利了,然而初始化是失败的
File "/home/aistudio/.data/webide/pip/lib/python3.7/site-packages/fastdeploy/c_lib_wrap.py", line 166, in <module>
raise RuntimeError("FastDeploy initalized failed!")
RuntimeError: FastDeploy initalized failed!
- 在本地测试模型应用了 utc-pico,cpu 状况下调试。
成果如下:
记得批改 infer 文件对应的预测内容
predictor = Predictor(args, schema=["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"])
results = predictor.predict(["月经期间刮痧拔罐会引起身材什么","老年斑为什么都长在面部和手背上","成都市哪家内痔医院比拟好怎么样最好?","中性粒细胞比率偏低"])
推理:模型目录须要蕴含:model.pdmodel 等文件
5.2 SimpleServing 的服务化部署
在 UTC 的服务化能力中咱们提供基于 PaddleNLP SimpleServing 来搭建服务化能力,通过几行代码即可搭建服务化部署能力。
- 环境筹备
应用有 SimpleServing 性能的 PaddleNLP 版本(或者最新的 develop 版本)
pip install paddlenlp >= 2.5.0
- Server 服务启动
进入文件以后所在门路
paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8190
- Client 申请启动
python client.py
-
服务化自定义参数
- Server 自定义参数
- schema 替换
# Default schema
schema = ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"]
* 设置模型门路
# Default task_path
utc = Taskflow("zero_shot_text_classification", model="utc-base", task_path="../../checkpoint/model_best/plm", schema=schema)
* 多卡服务化预测
PaddleNLP SimpleServing 反对多卡负载平衡预测,次要在服务化注册的时候,注册两个 Taskflow 的 task 即可,上面是示例代码
utc1 = Taskflow("zero_shot_text_classification", model="utc-base", task_path="../../checkpoint/model_best", schema=schema)
utc2 = Taskflow("zero_shot_text_classification", model="utc-base", task_path="../../checkpoint/model_best", schema=schema)
service.register_taskflow("taskflow/utc", [utc1, utc2])
- 更多配置
from paddlenlp import Taskflow
schema = ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"]
utc = Taskflow("zero_shot_text_classification",
schema=schema,
model="utc-base",
max_seq_len=512,
batch_size=1,
pred_threshold=0.5,
precision="fp32")
schema
:定义工作标签候选汇合。model
:抉择工作应用的模型,默认为utc-base
, 可选有utc-xbase
,utc-base
,utc-medium
,utc-micro
,utc-mini
,utc-nano
,utc-pico
。max_seq_len
:最长输出长度,包含所有标签的长度,默认为 512。batch_size
:批处理大小,请联合机器状况进行调整,默认为 1。pred_threshold
:模型对标签预测的概率在 0~1 之间,返回后果去掉小于这个阈值的后果,默认为 0.5。-
precision
:抉择模型精度,默认为fp32
,可选有fp16
和fp32
。fp16
推理速度更快。如果抉择fp16
,请先确保机器正确装置 NVIDIA 相关驱动和根底软件, 确保 CUDA>=11.2,cuDNN>=8.1.1,首次应用需依照提醒装置相干依赖。其次,须要确保 GPU 设施的 CUDA 计算能力(CUDA Compute Capability)大于 7.0,典型的设施包含 V100、T4、A10、A100、GTX 20 系列和 30 系列显卡等。更多对于 CUDA Compute Capability 和精度反对状况请参考 NVIDIA 文档:GPU 硬件与反对精度对照表。- Client 自定义参数
# Changed to input texts you wanted
texts = ["中性粒细胞比率偏低"]
%cd /home/aistudio/deploy/simple_serving
!paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8190
#Error loading ASGI app. Could not import module "server".
#去终端执行即可
/home/aistudio/deploy/simple_serving
[2023-04-13 18:26:51,839] [INFO] - starting to PaddleNLP SimpleServer...
[2023-04-13 18:26:51,840] [INFO] - The PaddleNLP SimpleServer is starting, backend component uvicorn arguments as follows:
[2023-04-13 18:26:51,840] [INFO] - the starting argument [host]=0.0.0.0
[2023-04-13 18:26:51,840] [INFO] - the starting argument [port]=8190
[2023-04-13 18:26:51,840] [INFO] - the starting argument [log_level]=None
[2023-04-13 18:26:51,840] [INFO] - the starting argument [workers]=1
[2023-04-13 18:26:51,840] [INFO] - the starting argument [limit_concurrency]=None
[2023-04-13 18:26:51,840] [INFO] - the starting argument [limit_max_requests]=None
[2023-04-13 18:26:51,840] [INFO] - the starting argument [timeout_keep_alive]=15
[2023-04-13 18:26:51,840] [INFO] - the starting argument [app_dir]=/home/aistudio/deploy/simple_serving
[2023-04-13 18:26:51,840] [INFO] - the starting argument [reload]=False
[2023-04-13 18:26:52,037] [INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'utc-base'.
[2023-04-13 18:26:52,038] [INFO] - Already cached /home/aistudio/.paddlenlp/models/utc-base/utc_base_vocab.txt
[2023-04-13 18:26:52,067] [INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/utc-base/tokenizer_config.json
[2023-04-13 18:26:52,067] [INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/utc-base/special_tokens_map.json
[2023-04-13 18:26:52,069] [INFO] - Assigning ['[O-MASK]'] to the additional_special_tokens key of the tokenizer
[2023-04-13 18:26:55,628] [INFO] - Taskflow request [path]=/taskflow/utc is genereated.
INFO: Started server process [1718]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8190 (Press CTRL+C to quit)
^C
INFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [1718]
在 notebook 如果不行,能够间接进入终端进行调试,须要留神的是要在同一个门路下不然会报错
# Save at server.py
from paddlenlp import SimpleServer, Taskflow
schema = ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议"]
utc = Taskflow("zero_shot_text_classification",
model="utc-base",
schema=schema,
task_path="/home/aistudio/checkpoint/model_best/plm",
precision="fp32")
app = SimpleServer()
app.register_taskflow("taskflow/utc", utc)
# %cd /home/aistudio/deploy/simple_serving
!python client.py
6. 总结
原我的项目链接:
https://blog.csdn.net/sinat_39620217/article/details/130237035
原文文末含码源以及地址
Macro F1 和 Micro F1 都是评估分类模型性能的指标,然而它们计算形式不同。
- Macro F1 是每个类别的 F1 值的平均值,不思考类别的样本数。它实用于数据集中各个类别的样本数量相近的状况下,能够更好地反映每个类别的性能。
- Micro F1 是所有类别的 F1 值的加权均匀,其中权重为每个类别的样本数。它将所有类别的预测后果汇总为一个混同矩阵,并计算出整个数据集的准确率、召回率和 F1 值。Micro F1 实用于多分类问题,尤其是在数据集不均衡的状况下,能够更好地反映整体的性能。
总之,Micro F1 更关注整个数据集的性能,而 Macro F1 更关注每个类别的性能。
医疗用意分类数据集 KUAKE-QIC 验证集 zero-shot 试验指标和小样本下训练比照:
| | Macro F1 | Micro F1 | 微调后 Macro F1 | 微调后 Micro F1 |
| :——–: | :——–: | :——–: | :——–: | :——–: |
| utc-xbase | 66.30 | 89.67 | | |
| utc-base | 64.13 | 89.06 |81.67(+17.54)|93.94(+4.88)|
| utc-medium | 69.62 | 89.15 || |
| utc-micro | 60.31 | 79.14 || |
| utc-mini | 65.82 | 89.82 || |
| utc-nano | 62.03 | 80.92 || |
| utc-pico | 53.63 | 83.57 || |
## 6.1 更多任务适配
PaddleNLP 联合文心 ERNIE,基于 UTC 技术开源了首个面向通用文本分类的产业级技术计划。对于简略工作,通过调用 paddlenlp.Taskflow API,仅用三行代码即可实现零样本(Zero-shot)通用文本分类,可反对情感剖析、用意辨认、语义匹配、蕴含推理等各种可转换为分类问题的 NLU 工作。仅应用一个模型即可同时反对多个工作,便捷高效!
from pprint import pprint
from paddlenlp import Taskflow
# 情感剖析
cls = Taskflow("zero_shot_text_classification", schema=["这是一条好评", "这是一条差评"])
cls("房间洁净亮堂,十分不错")
>>>
[{'predictions': [{'label': '这是一条好评', 'score': 0.9695149765679986}],
'text_a': '房间洁净亮堂,十分不错'}]
# 用意辨认
schema = ["病情诊断", "医治计划", "病因剖析", "指标解读", "就医倡议", "疾病表述", "结果表述", "注意事项", "效用作用", "医疗费用", "其余"]
pprint(cls("先天性厚甲症去哪里治"))
>>>
[{'predictions': [{'label': '就医倡议', 'score': 0.9628814210597645}],
'text_a': '先天性厚甲症去哪里治'}]
# 语义类似度
cls = Taskflow("zero_shot_text_classification", schema=["不同", "雷同"])
pprint(cls([["怎么查看合同", "从哪里能够看到合同"], ["为什么始终没有电话来确认借款信息", "为何我还款了,明天却接到客服电话告诉"]]))
>>>
[{'predictions': [{'label': '雷同', 'score': 0.9775065319076257}],
'text_a': '怎么查看合同',
'text_b': '从哪里能够看到合同'},
{'predictions': [{'label': '不同', 'score': 0.9918983379165037}],
'text_a': '为什么始终没有电话来确认借款信息',
'text_b': '为何我还款了,明天却接到客服电话告诉'}]
# 蕴含推理
cls = Taskflow("zero_shot_text_classification", schema=["中立", "蕴含", "矛盾"])
pprint(cls([["一个骑自行车的人正沿着一条城市街道朝一座有时钟的塔走去。", "骑自行车的人正朝钟楼走去。"],
["一个留着长发和胡须的怪人,在地铁里衣着一件色彩娇艳的衬衫。", "这件衬衫是新的。"],
["一个衣着绿色衬衫的妈妈和一个穿全黑衣服的男人在跳舞。", "两人都衣着红色裤子。"]]))
>>>
[{'predictions': [{'label': '蕴含', 'score': 0.9944843058584897}],
'text_a': '一个骑自行车的人正沿着一条城市街道朝一座有时钟的塔走去。',
'text_b': '骑自行车的人正朝钟楼走去。'},
{'predictions': [{'label': '中立', 'score': 0.6659998351201399}],
'text_a': '一个留着长发和胡须的怪人,在地铁里衣着一件色彩娇艳的衬衫。',
'text_b': '这件衬衫是新的。'},
{'predictions': [{'label': '矛盾', 'score': 0.9270557883904931}],
'text_a': '一个衣着绿色衬衫的妈妈和一个穿全黑衣服的男人在跳舞。',
'text_b': '两人都衣着红色裤子。'}]
本文参加了 SegmentFault 思否写作挑战赛,欢送正在浏览的你也退出。