在 Label Studio 中使用 BERT 模型进行文本分类:ML Backend 部署、微调与预测实战指南
2026/9/11 23:58:12 网站建设 项目流程

在 Label Studio 中使用 BERT 模型进行文本分类:ML Backend 部署、微调与预测实战指南

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

本文以 Label Studio 官方 ML 教程中的bert_classifier示例为骨架,完整讲解如何基于 Hugging Face Transformers 构建一个 BERT 文本分类 ML Backend:包括 Docker 与非 Docker 两种部署方式、Label Studio 中的标签配置、模型服务器与训练参数、训练触发方式以及预测预标注工作流。读完本文,你将掌握在 Label Studio 项目里接入、微调并实际使用 BERT 分类模型的完整技术路径。

教程定位:BERT 文本分类模型能做什么

bert_classifier是一个基于 BERT 的文本分类模型,专门设计用于与 Label Studio 协同工作。该模型使用 Hugging Face Transformers 库对 BERT 模型进行微调(fine-tune),其训练数据来自 Label Studio 中的人工标注结果,训练完成后即可对新数据进行预测。将这一模型连接进 Label Studio 后,你可以获得以下能力:

  • 直接在 Label Studio 中训练 BERT 模型:利用已有标注数据发起训练,无需离开标注平台;
  • 任意 Hugging Face 模型中心模型:可以使用任何支持AutoModelForSequenceClassification的预训练模型作为起点(如bert-base-uncasedbert-base-multilingual-cased等);
  • 针对特定任务微调:在自有任务数据上微调模型,并用微调后的模型对新数据做预测;
  • 自动拉取标注任务:自动从 Label Studio 下载已标注任务并整理为训练数据,免去手工导出;
  • 自定义训练超参:学习率、训练轮数(epochs)、权重衰减(weight decay)等均可通过环境变量灵活调整。

前置准备:ML Backend 与 bert_classifier 示例

在动手之前,需要先安装 Label Studio ML backend(即label-studio-ml-backendSDK)。Label Studio 中的 ML Backend 机制,本质上是把机器学习代码封装成一个 Web 服务,再连接到一个正在运行的 Label Studio 实例,从而自动化标注任务。它在项目中有三种典型用途(详见 机器学习集成指南):

  • 预标注 / 自动标注:模型自动产出预测标签,由标注员审核确认;
  • 交互式标注:模型在标注过程中辅助人工,提高效率与准确性;
  • 模型评估与微调:标注员审阅分析模型输出,评估精度并优化性能。

连接模型后,预测的工作流程是:用户打开任务 → Label Studio 向 ML Backend 发送请求 → ML Backend 返回预测结果 → 预测加载到标注界面展示给标注员。

本教程使用的示例位于label-studio-ml-backend仓库的label_studio_ml/examples/bert_classifier目录(即文档中提到的bert_classifierexample)。关于 ML Backend 的整体概念与各示例模型对比,可参考 Set up an example ML backend;若要自行编写模型,可参考 Write your own ML backend。

部署方式一:Docker 运行(推荐)

1. 启动 ML Backend

进入bert_classifier示例目录后,使用预构建镜像在http://localhost:9090启动:

docker-compose up

2. 验证后端已运行

启动完成后,通过健康检查接口确认服务可用:

$ curl http://localhost:9090/ {"status":"UP"}

Label Studio 侧的健康检查正是通过GET /health完成的——在 api_connector.py 中,MLApi.health()会向 ML Backend 发起GET health请求,默认超时时间为 1 秒(TIMEOUT_HEALTH),因此建议在启动容器后先执行一次curl确认服务就绪。

3. 将模型连接到 Label Studio

在 Label Studio 中创建项目后,进入项目设置的Model页面,点击Connect Model连接模型,Backend URL 填写默认地址http://localhost:9090。连接时可选填以下字段(参见 机器学习集成指南):

字段说明
Name为模型连接命名
Backend URL模型服务地址,例如http://localhost:9090
Select authentication method若模型服务需要用户名密码,选择Basic Authentication并填写(与后文BASIC_AUTH_USER/BASIC_AUTH_PASS对应)
Extra params需要传递给模型的额外参数
Interactive preannotations开启后模型可提供实时预测,辅助标注过程

也可以直接通过 API 创建连接,例如(参见 MLBackendListAPI 的接口文档):

curl -X POST -H 'Content-type: application/json' http://localhost:8080/api/ml -H 'Authorization: Token <your-token>' \ --data '{"url": "http://localhost:9090", "project": <project_id>}'

需要注意的 HF_TOKEN 与首次预测耗时

警告:当前 ML Backend 存在一个已知限制——模型是从 huggingface.co 动态加载的。你可能需要在环境中提供HF_TOKEN环境变量。相应地,第一次预测请求的响应时间可能较慢。如果 Label Studio 侧出现超时(例如打开任务时看不到预测结果),请检查 ML Backend 日志中的错误,并在几分钟后刷新页面。

从 Label Studio 服务端实现看,预测请求默认超时上限为 100 秒(ML_TIMEOUT_DEFAULT/ML_TIMEOUT_PREDICT,见 api_connector.py),而模型首次从模型中心下载权重往往耗时较长,因此首次预测慢是预期行为,属正常现象而非故障。

另外,如果 Label Studio 与 ML Backend 都运行在 Docker 容器中,localhost会指向容器自身而非宿主机。此时应改用http://host.docker.internal:9090或宿主机的内网 IP 作为 Backend URL。

部署方式二:从源码构建镜像(进阶)

如果希望基于源码构建 Docker 镜像,克隆label-studio-ml-backend仓库后执行:

docker-compose build

该命令会依据示例目录中的Dockerfiledocker-compose.yml构建包含模型代码与依赖的镜像,构建完成后再用docker-compose up启动。

部署方式三:不使用 Docker 直接运行(进阶)

不使用 Docker 时,同样需要先克隆仓库,并用 pip 安装依赖:

python -m venv ml-backend source ml-backend/bin/activate pip install -r requirements.txt

然后通过label-studio-mlCLI 启动 ML Backend,参数指向包含模型代码的目录:

label-studio-ml start ./dir_with_your_model

启动后的服务同样监听在http://localhost:9090,可通过curl http://localhost:9090/验证。

标注配置:Text 与 Choices 标签模板

在项目Settings > Labeling Interface > Browse Templates > Natural Language Processing > Text Classification中可以找到 Label Studio 内置的文本分类默认标注配置。该配置只包含一个<Choices>输出标签和一个<Text>输入标签,你可以自由修改<Choices>中的标签集合以匹配具体任务,例如:

<View> <Text name="text" value="$text" /> <Choices name="label" toName="text" choice="single" showInLine="true"> <Choice value="label one" /> <Choice value="label two" /> <Choice value="label three" /> </Choices> </View>

要点说明:

  • <Text>value="$text"对应任务数据中的data.text字段,即待分类文本;
  • <Choices>name="label"是结果(result)的名称,toName="text"将其关联到文本输入,choice="single"表示单选,showInLine="true"让选项在同一行展示;
  • 每个<Choice value="...">即一个候选类别,可按业务自由增删。

训练与预测时,Label Studio 会把该标注配置(label_config)与任务数据一并发送给 ML Backend(见下文调用链),因此标注配置中的标签集合应与训练数据保持一致。

服务器通用参数配置

所有参数都可以在运行容器前,通过docker-compose.yml中的environment段设置。以下是 ML Backend 服务器的通用参数:

参数说明
BASIC_AUTH_USER模型服务器的 Basic Auth 用户名
BASIC_AUTH_PASS模型服务器的 Basic Auth 密码
LOG_LEVEL模型服务器的日志级别
WORKERS模型服务器的 worker 进程数
THREADS模型服务器的线程数
BASELINE_MODEL_NAME用于训练的基线模型名称,默认bert-base-multilingual-cased

其中BASELINE_MODEL_NAME是 bert_classifier 的核心参数:默认值bert-base-multilingual-cased是一个多语言 BERT 模型,可处理多种语言的文本;你也可以换成其他任意支持AutoModelForSequenceClassification的模型(如bert-base-uncaseddistilbert-base-uncased等)。注意,更换模型后首次运行仍需从 Hugging Face 模型中心下载权重。

训练参数与触发训练

训练参数说明

训练相关参数同样通过环境变量设置,其中LABEL_STUDIO_HOSTLABEL_STUDIO_API_KEY为必填项:

参数说明默认值
LABEL_STUDIO_HOST(必填)Label Studio 实例的 URLhttp://localhost:8080
LABEL_STUDIO_API_KEY(必填)Label Studio 实例的 API Key,可在Account & Settings页面获取(参见 user_account 文档)
START_TRAINING_EACH_N_UPDATES从 Label Studio 下载多少条已标注任务后开始训练10
LEARNING_RATE模型训练的学习率2e-5
NUM_TRAIN_EPOCHS训练轮数(epochs)3
WEIGHT_DECAY训练权重衰减系数0.01
FINETUNED_MODEL_NAME微调后模型的保存名称,检查点(checkpoints)将以此名称保存finetuned_model

几个参数的取值建议:

  • LEARNING_RATE = 2e-5是 BERT 类模型微调的标准起点,过大的学习率容易破坏预训练权重,过小则收敛缓慢;
  • NUM_TRAIN_EPOCHS = 3适用于中小规模标注数据,数据量大时可适当减少,数据稀疏时可适当增加;
  • START_TRAINING_EACH_N_UPDATES决定自动训练的触发节奏:每累计 N 条新标注即拉取数据并训练一次,值越小训练越频繁、模型更新越及时,但计算开销也越大;
  • LABEL_STUDIO_API_KEY是训练的必要条件——ML Backend 需要用它向 Label Studio 请求标注数据。

如何触发训练

连接模型并至少标注一条任务后,即可开始训练。主要有三种方式:

  1. 手动触发(UI):在项目设置的Model页面,点击已连接模型溢出菜单中的Start Training,适合按需控制训练时机;
  2. API 触发:指定 ML Backend 的 ID,执行以下命令(参见 MLBackendTrainAPI 与 路由定义):
curl -X POST http://localhost:8080/api/ml/{id}/train
  1. 自动触发:当新增标注累计达到START_TRAINING_EACH_N_UPDATES设置的数量时自动启动训练。

训练日志输出到 stdout 与控制台;如需更详细日志,可用--debug参数启动 ML Backend 服务。

训练与预测调用链的源码视角

Label Studio 服务端通过MLApi客户端与 ML Backend 通信(见 api_connector.py),其中定义了标准端点:healthpredicttrainsetupvalidate等。核心逻辑如下:

  • 训练MLApi.train(),api_connector.py):服务端先筛选出带标注的任务(num_annotations > 0),经ExportDataSerializer序列化后,将标注数据、项目 UID、label_config与 hostname 一起 POST 到 ML Backend 的/train端点。这正是bert_classifier示例中LABEL_STUDIO_HOST/LABEL_STUDIO_API_KEY发挥作用的地方——模型侧需要凭此向 Label Studio 回拉任务数据;
  • 预测MLApi.make_predictions(),api_connector.py):将任务列表、项目 UID、label_config与参数 POST 到/predict端点,返回的预测结果按标准 predictions 格式展示在标注界面;
  • 健康检查MLApi.health()):通过GET /health探测服务状态,超时 1 秒。

也就是说,bert_classifier示例中标注配置(label_config)会被原样传给模型,模型据此将<Choices>中的标签映射到分类头输出维度;而训练数据则是模型侧借助LABEL_STUDIO_HOST/LABEL_STUDIO_API_KEY自动下载的。

预测 / 预标注工作流

模型连接成功并完成训练(或使用预训练模型)后,即可在标注界面看到模型预测。获取预测的常用方式:

  • 手动获取:在 Data Manager 中选择任务,执行Actions > Retrieve predictions批量拉取预测;
  • 自动预标注:在项目设置中开启Annotation > Use predictions to prelabel tasks,并从下拉菜单选择要使用的模型,新任务打开时即自动带出预测;
  • 直接调用 ML Backend:向 ML Backend 的/predict端点发起 POST,payload 格式如下(参见 机器学习集成指南):
{ "tasks": [ {"data": {"text": "some text"}} ] }

对于大批量数据,通过 UI 拉取预测可能因 HTTP 超时而中断,此时建议对每个任务调用 Label Studio 的 predictions 接口逐条触发。

自定义模型逻辑

ML Backend 的扩展点在模型目录内部:在./bert_classifier目录中添加你自己的模型与逻辑即可完成自定义。典型做法是参照 Write your own ML backend 中LabelStudioMLBase子类的写法,覆写predict(tasks, context, **kwargs)方法实现推理逻辑,返回符合 Label Studio 预测格式的结果数组。bert_classifier示例本身即是「继承基类 + 覆写训练/预测方法 + 通过环境变量读取超参」这一模式的完整参考实现,你可以基于它替换基线模型、修改数据处理逻辑,或在其基础上接入其他 Hugging Face 序列分类模型。

常见问题排查

结合教程中的警告与 Label Studio 服务端实现,实践中常见问题可按下述思路定位:

  • 首次打开任务看不到预测:多为模型首次从模型中心加载权重耗时导致超时。先确认 ML Backend 日志无报错,再等待数分钟刷新页面;必要时为容器配置HF_TOKEN环境变量;
  • 训练报错或无法开始:检查LABEL_STUDIO_HOST是否可被 ML Backend 访问(容器内不可使用localhost,应使用宿主机 IP 或host.docker.internal),以及LABEL_STUDIO_API_KEY是否有对应项目权限;
  • 服务状态异常:Label Studio 对 ML Backend 的健康检查超时仅为 1 秒(见 api_connector.py),若后端启动较慢,可先用curl http://localhost:9090/确认返回{"status":"UP"}后再在 Label Studio 中连接;
  • 标签不匹配:训练时模型按label_config中的<Choices>标签构建分类头,若标注配置与历史训练数据标签不一致,需重新训练。

此外,在 ML 相关测试 与 ML Backend 集成测试(ml.tavern.ymlpredictions.tavern.yml等,见 tests 目录)中,可以找到对预测格式、训练接口等行为的验证用例,可作为理解接口约定的补充材料。

【免费下载链接】label-studioLabel Studio is a multi-type data labeling and annotation tool with standardized output format项目地址: https://gitcode.com/GitHub_Trending/la/label-studio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询