在 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-uncased、bert-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 up2. 验证后端已运行
启动完成后,通过健康检查接口确认服务可用:
$ 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该命令会依据示例目录中的Dockerfile与docker-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-uncased、distilbert-base-uncased等)。注意,更换模型后首次运行仍需从 Hugging Face 模型中心下载权重。
训练参数与触发训练
训练参数说明
训练相关参数同样通过环境变量设置,其中LABEL_STUDIO_HOST与LABEL_STUDIO_API_KEY为必填项:
| 参数 | 说明 | 默认值 |
|---|---|---|
LABEL_STUDIO_HOST(必填) | Label Studio 实例的 URL | http://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 请求标注数据。
如何触发训练
连接模型并至少标注一条任务后,即可开始训练。主要有三种方式:
- 手动触发(UI):在项目设置的Model页面,点击已连接模型溢出菜单中的Start Training,适合按需控制训练时机;
- API 触发:指定 ML Backend 的 ID,执行以下命令(参见 MLBackendTrainAPI 与 路由定义):
curl -X POST http://localhost:8080/api/ml/{id}/train- 自动触发:当新增标注累计达到
START_TRAINING_EACH_N_UPDATES设置的数量时自动启动训练。
训练日志输出到 stdout 与控制台;如需更详细日志,可用--debug参数启动 ML Backend 服务。
训练与预测调用链的源码视角
Label Studio 服务端通过MLApi客户端与 ML Backend 通信(见 api_connector.py),其中定义了标准端点:health、predict、train、setup、validate等。核心逻辑如下:
- 训练(
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.yml、predictions.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),仅供参考