- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本项目提供基于通用文本分类 UTC(Universal Text Classification) 模型微调的文本分类端到端应用方案,打通 数据标注-模型训练-模型调优-预测部署全流程 ,可快速实现文本分类产品落地.
文本分类是一种重要的自然语言处理任务,它可以帮助我们将大量的文本数据进行有效的分类和归纳。实际上,在日常生活中,我们也经常会用到文本分类技术。例如,我们可以使用文本分类来对新闻报道进行分类,对电子邮件进行分类,对社交媒体上的评论进行情感分析等等。但是,文本分类也面临着许多挑战。其中最重要的挑战之一是数据稀缺。由于文本数据往往非常庞大,因此获取足够的训练数据可能非常困难。此外,不同的文本分类任务也可能面临着领域多变和任务多样等挑战。为了应对这些挑战,PaddleNLP推出了一项零样本文本分类应用UTC。该应用通过统一语义匹配方式USM(Unified Semantic Matching)来将标签和文本的语义匹配能力进行统一建模。这种方法可以帮助我们更好地理解文本数据,并从中提取出有用的特征信息.
UTC具有低资源迁移能力,可以支持通用分类、评论情感分析、语义相似度计算、蕴含推理、多项式阅读理解等多种“泛分类”任务。这使得开发者可以更加轻松高效地实现多任务文本分类数据标注、训练、调优和上线,从而降低文本分类技术门槛.
总之,文本分类是一项重要的自然语言处理任务,它可以帮助我们更好地理解和归纳文本数据。尽管它面临着许多挑战,但是 通过使用PaddleNLP的零样本文本分类应用UTC,开发者们可以简单高效实现多任务文本分类数据标注、训练、调优、上线,降低文本分类落地技术门槛.
分类任务看似简单,然而在产业级文本分类落地实践中,面临着诸多挑战:
任务多样:单标签、多标签、层次标签、大规模标签等不同的文本分类任务,需要开发不同的分类模型,模型架构往往特化于具体任务,难以使用统一形式建模; 。
数据稀缺:部分领域数据稀缺,难以获取,且领域专业性使得数据标注门槛高; 。
标签迁移:不同领域的标签多样,并且迁移难度大,尤其不同领域间的标签知识很难迁移.
在传统技术方案中,针对不同的分类任务需要构建多个分类模型,模型需单独训练且数据和知识不共享。而在UTC方案下,单个模型能解决所有分类需求,包括但不限于单标签分类、多标签分类、层次标签分类、大规模事件标签检测、蕴含推理、语义相似度计算等,降低了开发成本和机器成本.
UTC通过大规模多任务预训练后,可以适配不同的行业领域,不同的分类标签,仅标注了几条样本,分类效果就取得大幅提升,大大降低标注门槛和成本.
在医疗、金融、法律等领域中,无需训练数据的零样本情况下UTC效果平均可达到70%+(如下表所示),标注少样本也可带来显著的效果提升:每个标签仅仅标注1条样本后,平均提升了10个点!也就是说,即使在某些场景下表现欠佳,人工标几个样本,丢给模型后就会有大幅的效果提升.
UTC基于百度最新提出的统一语义匹配框架USM(Unified Semantic Matching)[1],将分类任务统一建模为标签与文本之间的匹配任务,对不同标签的分类任务进行统一建模。具体地说:
更多内容参考论文见文末链接 or fork一下项目论文已上传 。
以下标注示例用到的环境配置:
在终端(terminal)使用pip安装label-studio:
pip install label-studio==1.7.2
安装完成后,运行以下命令行:
label-studio start
在浏览器打开 http://localhost:8080/ ,输入用户名和密码登录,开始使用label-studio进行标注.
点击创建(Create)开始创建一个新的项目,填写项目名称、描述,然后在 Labeling Setup 中选择 Text Classification .
List of tasks
,然后选择导入本项目 项目创建后,可在Project/文本分类任务中点击 Import 继续导入数据,同样从本地上传txt格式文件,选择 List of tasks .
项目创建后,可在Setting/Labeling Interface中继续配置标签, 。
默认模式为单标签多分类数据标注。对于多标签多分类数据标注,需要将 choice 的值由 single 改为 multiple .
勾选已标注文本ID,选择导出的文件类型为 JSON ,导出数据:
参考链接:
将导出的文件重命名为 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 数据标注工具进行标注,如果已有标注好的本地数据集,我们需要将数据集整理为文档要求的格式, 。
多任务训练场景可分别进行数据转换再进行混合:通用分类、评论情感分析、语义相似度计算、蕴含推理、多项式阅读理解等众多“泛分类”任务 。
##代码结构
├── deploy/simple_serving/ # 模型部署脚本
├── utils.py # 数据处理工具
├── run_train.py # 模型微调脚本
├── run_eval.py # 模型评估脚本
├── label_studio.py # 数据格式转换脚本
├── label_studio_text.md # 数据标注说明文档
└── README.md
推荐使用 PromptTrainer API 对模型进行微调,该 API 封装了提示定义功能,且继承自 Trainer API 。只需输入模型、数据集等就可以使用 Trainer API 高效快速地进行预训练、微调等任务, 可以一键启动多卡训练、混合精度训练、梯度累积、断点重启、日志显示等功能,Trainer API 还针对训练过程的通用训练配置做了封装,比如:优化器、学习率调度等.
使用下面的命令,使用 utc-base 作为预训练模型进行模型微调,将微调后的模型保存至 output_dir :
#安装最新版本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
二分类时需要注意的问题 。
安装一下fast tokenizer
pip install --upgrade fast_tokenizer
metric_value = metrics[metric_to_check]
KeyError: 'eval_macro_f1'
如果在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
:保存模型进行推理部署 通过运行以下命令进行模型评估预测:
!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
,表示多标签分类。 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': '中性粒细胞比率偏低'}]
模型 | 文本 | 预测结果 | 评估得分 |
---|---|---|---|
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测试的结果小样本本微调的结果显著提升 。
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 |
其余模型就不一一验证了,感兴趣同学自行验证.
目前 UTC 模型提供基于多种部署方式,包括基于 FastDeploy 的本地 Python 部署以及 PaddleNLP SimpleServing 的服务化部署.
以下示例展示如何基于 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 在 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应用调试,或者有小伙伴解决了可以再评论区发表一下,一起解决.
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!
效果如下
记得修改infer文件对应的预测内容 。
predictor = Predictor(args, schema=["病情诊断", "治疗方案", "病因分析", "指标解读", "就医建议", "疾病表述", "后果表述", "注意事项", "功效作用", "医疗费用", "其他"])
results = predictor.predict(["月经期间刮痧拔罐会引起身体什么","老年斑为什么都长在面部和手背上","成都市哪家内痔医院比较好怎么样最好?","中性粒细胞比率偏低"])
推理:模型目录需要包含:model.pdmodel等文件 。
在 UTC 的服务化能力中我们提供基于PaddleNLP SimpleServing 来搭建服务化能力,通过几行代码即可搭建服务化部署能力.
使用有SimpleServing功能的PaddleNLP版本(或者最新的develop版本) 。
pip install paddlenlp >= 2.5.0
进入文件当前所在路径 。
paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8190
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硬件与支持精度对照表 .
# 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
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 |
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': '两人都穿着白色裤子。'}]
最后此篇关于零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程。的文章就讲到这里了,如果你想了解更多关于零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程。的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
当我使用 UTC() 函数获取纪元时间(1970 年 1 月 1 日)的总秒数时。但再次使用“new Date(milliseconds)”构造函数将相同的秒数转换为 Date 并没有给出 UTC d
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我有一个关于 Swift 类型 TimeZone 的问题。我需要一个 UTC0 时区来格式化我的 Date 对象。我正在像这样创建 TimeZone 对象。 let utcTimeZone = Tim
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
我遇到了以下代码: datetime.datetime.utcnow().replace(tzinfo=tzutc()) 我看不到 Replace() 调用正在做什么,从阅读文档来看,它似乎将其转换为
我在应用程序中将时区设置为 UTC,如下所示: // set default time zone to UTC TimeZone.setDefault(TimeZone.getTimeZone(Zon
我需要两件事: 将当前时间转换为 UTC(这样我就可以以 UTC 格式存储日期)--> result = java.util.Date. 将加载日期(UTC 格式)转换为任何时区 --> result
我想将日期从本地转换为 UTC,再将 UTC 转换为本地。 例如。 2015 年 4 月 1 日,12:00 PM 然后是 UTC 2015 年 4 月 1 日下午 5:30 对我来说是本地时间,但我
嗨,我有一个长度为几百万的字符向量( rr ),它以 %Y-%m-%d %H:%M:%S 格式表示时间和日期戳。记录在澳大利亚/悉尼。 如何获得代表这一点的 POSIXct 对象(快速)。 我找到了
static String createUTCTime() { Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")
我正在尝试将语言环境时间转换为 UTC,然后将 UTC 转换为语言环境时间。但我没有得到结果。 public class DateDemo { public static void main(Stri
我正在寻找用纯 Javascript 替换 moment js 功能 - 我需要重新工作的项目将来不会有 moment.js 可用。我已经有一段时间没有使用 javascript Date 了,所以需
我想获取与 UTC 相关的用户时区,然后将其显示为 UTC +/- 。例如,加利福尼亚用户应显示 UTC -8(或 -7,视情况而定),而巴林用户应显示 UTC +3,等等。 下面的代码并没有告诉我它
我正在尝试将毫秒转换为 UTC 日期对象,如下所示 - var tempDate = new Date(1465171200000); // --> tempDate = Mon Jun 06 201
我一直很困惑为什么下面的代码会导致我的日期从 25 日更改为 24 日 SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy"); DateTi
我需要将字符串转换为 UTC 日期,然后将 UTC 日期转换为本地日期。 这是我的代码: var dateStr = "9/8/2015 12:44:00 PM"; console.log(strto
我正在用 PHP 编写一个 Twitter 网络服务。当用户登录时,我收到此节点: -18000 我必须更改脚本的时区,以便它适应用户的实际时区。我为此找到的唯一 php 函数是: date_defa
在 PHP 文档中,list of supported time zones , UTC 被列出两次: UTC 等/UTC 这两者之间有什么概念上的区别,还是它们只是同义词? 最佳答案 首先回答问题:
在 PHP 文档中,list of supported time zones , UTC 被列出两次: UTC 等/UTC 这两者之间有什么概念上的区别,还是它们只是同义词? 最佳答案 首先回答问题:
我是一名优秀的程序员,十分优秀!