介绍
Label Studio
Label Studio 是一个开源数据标注工具,支持多种数据类型(文本、图像、音频、视频等)的标注。它提供灵活的标注配置,支持自定义标注界面和多种标注任务(分类、实体识别、图像分割等)。Label Studio 适用于机器学习数据集的创建和管理,支持与机器学习模型集成,实现主动学习和预测辅助标注功能。此外,它支持 Webhook 和 API 接口,便于与现有系统集成。
Label Studio ML
Label Studio ML 是 Label Studio 的机器学习集成模块,用于结合模型与标注流程。它支持通过自定义 ML 后端将模型接入标注任务,实现预测辅助标注、主动学习和自动化标注。ML 模块可以根据已标注数据实时训练模型,并将预测结果返回给 Label Studio,提升标注效率。支持多种框架(如 PyTorch、TensorFlow)和 REST API 接口,便于与现有工作流集成。
PaddleNLP
PaddleNLP是飞桨 (PaddlePaddle) 提供的自然语言处理开发库,支持多种预训练模型(如 BERT、GPT 等),并提供文本分类、序列标注、文本生成等丰富的 NLP 功能及工具链。它内置模型训练、评估、部署的全流程支持,适合快速开发和定制化 NLP 应用。
UIE
UIE(Universal Information Extraction) 是 PaddleNLP 的信息抽取框架,基于统一的抽取模型实现实体识别、关系抽取、事件抽取等多任务支持。它采用 Prompt 学习方式,能高效处理多种抽取需求,适合低资源场景和领域定制。
总结
本文旨在将 Label Studio 的机器学习集成模块(Label Studio ML)与 PaddleNLP 的统一信息抽取框架(UIE)相结合,构建高效的智能信息抽取标注系统。通过 UIE 提供强大的预训练能力,实现多任务信息抽取(如实体识别、关系抽取等)的模型预测,并将预测结果集成至 Label Studio,辅助人工标注,提高标注效率。
Windows
- 先搭建PaddleNLP环境,参考windows搭建paddleNLP GPU调试环境
- 启动labelstudio依赖比较多,推荐使用容器启动
docker run -it -p 8080:8080 -v $(pwd)/mydata:/label-studio/data heartexlabs/label-studio:latest
浏览器输入localhost:8080,打开页面,注册一个账号,登录后见到如下界面
- 下载PaddleNLP源码,PaddleNLP-2.6.1.zip,我这里放到C:\Users\fgt\go目录下,解压
- 安装label-studio-ml-backend
cd C:\Users\fgt\go\PaddleNLP-2.6.1\model_zoo\uie
git clone https://github.com/HumanSignal/label-studio-ml-backend.git
cd label-studio-ml-backend/
pip install -e .
# 创建自己的ML backend
label-studio-ml create my_ml_backend
5. 自定义实现预标注功能
修改..\uie\label-studio-ml-backend\my_ml_backend\model.py 文件
from typing import List, Dict, Optional
from label_studio_ml.model import LabelStudioMLBase
from label_studio_ml.response import ModelResponse
from paddlenlp import Taskflow
import numpy as np
class NewModel(LabelStudioMLBase):
"""Custom ML Backend model
"""
def __init__(self, project_id: Optional[str] = None, label_config=None):
super().__init__(project_id, label_config)
self.from_name, self.info = list(self.parsed_label_config.items())[0]
self.to_name = self.info['to_name'][0]
self.value = self.info['inputs'][0]['value']
self.labels = list(self.info['labels'])
def setup(self):
self.set("model_version", "0.0.1")
def predict(self, tasks: List[Dict], context: Optional[Dict] = None, **kwargs) -> ModelResponse:
print(f'''\
Run prediction on {tasks}
Received context: {context}
Project ID: {self.project_id}
Label config: {self.label_config}
Parsed JSON Label config: {self.parsed_label_config}
Extra params: {self.extra_params}''')
from_name = self.from_name
to_name = self.to_name
model = Taskflow("information_extraction", schema=self.labels, task_path='./my_ml_backend/checkpoint/model_best')
predictions = []
for task in tasks:
print("predict task:", task)
text = task['data'][self.value]
uie = model(text)[0]
print("uie:", uie)
result = []
scores = []
for key in uie:
for item in uie[key]:
result.append({
'from_name': from_name,
'to_name': to_name,
'type': 'labels',
'value': {
'start': item['start'],
'end': item['end'],
'score': item['probability'],
'text': item['text'],
'labels': [key]
}
})
scores.append(item['probability'])
result = sorted(result, key=lambda k: k["value"]["start"])
mean_score = np.mean(scores) if len(scores) > 0 else 0
predictions.append({
'result': result,
# optionally you can include prediction scores that you can use to sort the tasks and do active learning.
'score': float(mean_score),
'model_version': 'uie-ner'
})
return ModelResponse(predictions=predictions)
def fit(self, event, data, **kwargs):
# use cache to retrieve the data from the previous fit() runs
old_data = self.get('my_data')
old_model_version = self.get('model_version')
print(f'Old data: {old_data}')
print(f'Old model version: {old_model_version}')
# store new data to the cache
self.set('my_data', 'my_new_data_value')
self.set('model_version', 'my_new_model_version')
print(f'New data: {self.get("my_data")}')
print(f'New model version: {self.get("model_version")}')
print('fit() completed successfully.')
6. 启动label-studio-ml-backend
cd C:\Users\fgt\go\PaddleNLP-2.6.1\model_zoo\uie\label-studio-ml-backend
# 启动服务 9090端口
label-studio-ml start my_ml_backend
- labelstudio连接label-studio-ml-backend
进入Projects/{Project Name}/Settings/Model,Connect Model
- 自动标注成功
导入数据,进入标记页面,发现自动标记成功
linux
- 搭建paddleNLP环境,参考Linux搭建PaddleNLP环境
- 拷贝所需文件
拷贝windows环境下的uie文件夹到linux服务器上
即拷贝C:\Users\fgt\go\PaddleNLP-2.6.1\model_zoo\uie文件夹到服务器/home/zuoyou/paddlenlp目录下
- 安装label-studio-ml-backend
# 进入paddleNLP容器内,继续安装label-studio-ml-backend
docker exec -it paddle bash
# 安装git和vim
apt update
apt install git vim
cd /uie/label-studio-ml-backend
# 安装
pip install -e .
# 启动ml服务
label-studio-ml start my_ml_backend
4. 提交镜像
# 功能正常,提交容器镜像,方便下次使用
docker commit paddle fgt_paddle:1.0
# 启动提交后的镜像
cd /home/zuoyou/paddlenlp/uie
docker run --name paddle -it -p 19090:9090 -v $PWD:/uie fgt_paddle:1.0 /bin/bash
# 启动ml服务
cd /uie/label-studio-ml-backend
label-studio-ml start my_ml_backend
- 后面的连接labelStudio和windows一样,就不赘述了