1、环境构建
具体环境如下
1.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.1、项目创建
点击创建(Create)开始创建一个新的项目,填写项目名称、描述,然后在Labeling Setup中选择Text Classification。
- 填写项目名称、描述
- 数据上传,从本地上传txt格式文件,选择
List of tasks
- 设置任务,添加标签
- 数据上传
项目创建后,可在Project/文本分类任务中点击Import继续导入数据,同样从本地上传txt格式文件,选择List of tasks 。
2.2、标签构建
项目创建后,可在Setting/Labeling Interface中继续配置标签,
默认模式为单标签多分类数据标注。对于多标签多分类数据标注,需要将choice的值由single改为multiple。
2.3 任务标注
2.4 数据导出
勾选已标注文本ID,选择导出的文件类型为JSON,导出数据:
参考链接:
Label Studio(https://labelstud.io/)
3、数据转换
将导出的文件重命名为label_studio.json后,放入./data目录下。通过label_studio.py脚本可转为UTC的数据格式。
在数据转换阶段,还需要提供标签候选信息,放在./data/label.txt文件中,每个标签占一行。例如在医疗意图分类中,标签候选为
3.1、 生成训练/验证集文件
python label_studio.py --label_studio_file ./data/label_studio.json --save_dir ./data --splits 0.8 0.1 0.1 --options ./data/label.txt
- label_studio_file: 从label studio导出的数据标注文件。
- save_dir: 训练数据的保存目录,默认存储在data目录下。
- splits:划分数据集时训练集、验证集所占的比例。默认为[0.8, 0.1, 0.1]表示按照的比例将数据划分为训练集、验证集和测试集。
- options:: 指定分类任务的类别标签。若输入类型为文件,则文件中每行一个标签。
- is_shuffle:: 是否对数据集进行随机打散,默认为True。
- seed: 随机种子,默认为1000。
备注:
- 默认情况下 label_studio.py
- 每次执行 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 单卡训练
python run_train.py --device cpu --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
- 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.1.2 模型预测
from paddlenlp import Taskflow schema = ["正常言论", "异常言论"] my_cls = Taskflow("zero_shot_text_classification", model="utc-base", schema=schema, task_path='./checkpoint/model_best/plm') text='联合国秘书长古特雷斯16日通过发言人发表声明,谴责塞赫万地区的袭击事件,敦促尽快将袭击者绳之以法。 ' cls_result = my_cls(text) print(cls_result) label = cls_result[0]['predictions'][0]['label'] score = cls_result[0]['predictions'][0]['score']
输出:
[{'text_a': '联合国秘书长古特雷斯16日通过发言人发表声明,谴责塞赫万地区的袭击事件,敦促尽快将袭击者绳之以法。 ', 'predictions': [{'label': '正常言论', 'score ': 0.8308192192139073}]}]