跳转到内容
公告阅读约需 8 分钟

Potato 2.14:用你自己的标注训练模型

Potato 2.14 用 38 个训练器在研究的标签上训练模型,在留出条目上给每次运行打分,并把预测作为预标签展示给标注者。

Potato Team

Potato 2.14 在研究自己的标注上训练模型。一次运行用标注者已经给出的标签拟合 38 个训练器中的一个,在训练时留出的条目上给模型打分,并把模型的预测作为预标签回写到条目上,由标注者确认或修正。2.13.1 版只有一个训练器 sklearn-text。这个版本还能导入 RTTM 说话人分离文件,导出修正后的说话人轮次,运行 WhisperX 做本地转录,并修复了几个会改变一致性数字和导出结果的缺陷,所以请在安装之前阅读升级说明。

bash
pip install --upgrade potato-annotation

升级说明

请先对每个配置运行 potato validate config.yaml --strict。下面这些变化可能改变一个正常运行的 2.13 研究的行为:

  • assignment_strategy: llm_confidence 现在会为队列排序。 这个策略先分发置信度最低的预标签,再分发没有预标签的条目。早期版本接受这个值,却是随机分配条目。
  • model_training 会在验证和启动时受到检查。 writeback 或 auto_retrain 下的未知键、名称不是 train、val 或 test 的划分,以及不是方案的 writeback.schemas 条目,都是会让服务器停止的错误。
  • 训练页面报告留出得分。 得分列过去显示的是训练准确率。2.13 运行的得分与 2.14 的留出得分不可比较。
  • 链接、链和事件会出现在导出里。 span_link、coreference 和 event_annotation 的答案过去在每种导出里都缺失,现在 CSV 和 TSV 会增加 <scheme>._links 和 <scheme>._events 列。
  • Potato 不再在 install_requires 里列出 ujson。 你自己的脚本如果从 Potato 的环境导入 ujson,需要 pip install ujson。

模型训练

模型训练适用于条目多于标注者能标完的研究,用最先拿到的标签训练出的模型可以提出其余条目的标签。循环有三步。第一步,一次运行把每个条目的标签合并为一个答案,并把条目划分为 train、val 和 test。第二步,训练器在单独的进程里于 train 划分上拟合模型,这次运行在 val 和 test 条目上给模型打分。第三步,回写把模型的预测作为预标签展示给标注者,标注者保存的答案则成为下一次运行的标签。

要为带有 sentiment 方案的研究开启这个循环,请把下面的块加到研究的配置里:

yaml
model_training:
  enabled: true
  writeback:
    schemas: [sentiment]
    include_unlabeled: true
    min_confidence: 0.6

在 writeback.schemas 之下指定方案之前,标注者看不到任何一次运行的结果。include_unlabeled: true 对无人标注的条目做预测,min_confidence 让低于 0.6 的预测不出现在页面上。重启服务器,用管理员密钥打开 /admin/training,选好训练器和方案,点击 Train now。

一次 sklearn-text 运行之后的训练页面,显示运行表单、带留出得分的 Runs 表和训练器列表

Potato 在 examples/ai-assisted/model-training/ 里的示例项目有 160 条商品评论,运行 sklearn-text,不需要 GPU,也不需要普通安装之外的任何东西。模型训练文档报告了那里的一次运行:在 120 条已标注的评论上训练,在验证评论上得到 0.84 的 macro-F1,并写入 80 个预标签。随后,新的标注者看到这些评论中的每一条都已选中模型的答案:

标注页面上的一条评论,模型的答案已被选中为预标签

训练你的第一个模型逐步演示这个示例。

面向每种标注的训练器

训练页面只为每个方案提供适合该方案的训练器。训练器目录列出全部 38 个训练器及其安装命令,下面的列表给出主要的分组:

  • 文本。 hf-text-classification、setfit 和 sklearn-text 对条目分类。hf-token-classification 标记跨度,hf-relation 把跨度连成关系、事件和共指链,byt5-gloss 为逐行词素注解切分词并给词做注解。
  • 图像。 torchvision-detect 和 ultralytics-detect 训练检测器,torchvision-segment、ultralytics-segment 和 cellpose 训练分割器。检测和分割运行会对全玻片和大图像切块,并在显微图像平面和 GeoTIFF 地图上训练。volume-unet 分割 3D 体数据,layoutlmv3 标注页面版面,vlm-sft 在说明、定位和 GUI 步骤上微调视觉语言模型。
  • 音频和视频。 whisper-asr 在修正过的转录轮次上微调 Whisper,diarization 在说话人轮次上训练说话人模型,hf-audio-tagger 给音频片段打标,video-track 在各帧之间跟踪目标。
  • LLM 和智能体。 llm-sft 在自由文本答案上微调,llm-dpo 在成对偏好上微调,reward-model 在成对、排序和最好-最差答案上微调,prm-reward 在智能体轨迹的步骤评分上微调。
  • 科学。 rdkit-property 预测关于分子的答案,peak-cnn 预测光谱上的峰位置,signal-cnn 给时间序列信号的区间打标,episode-model 给机器人回合打标。

ultralytics 训练器是 AGPL-3.0,LayoutLMv3 的权重是 CC BY-NC-SA 4.0。运行这两者之一时,会先请你接受许可证。pip install "potato-annotation[train]" 安装文本、图像、音频和 LLM 训练器所需的包,目录里写明了需要单独安装的内容。

留出得分和预标签

每次运行都在 val 和 test 条目上,用适合方案的指标给预测打分,例如标签用 macro-F1,框用 mAP50,转录用词错误率,体数据用 Dice。有标签而没有预测的条目算作错误,并有一个覆盖率数字报告得到预测的条目所占的比例。train 划分的条目永远不会得到预标签,审核者修正过的条目总会进入之后各次运行的 train 划分。

只有当标注者编辑了预标签或转到下一个条目时,预标签才会成为标注者的答案,回写也从不改动人工标签。模型审核队列按置信度从低到高分发预标签,审核报告会指出每个预标签背后的那次运行。循环中的模型介绍审核的工作流程。

在 GPU 服务器或集群上训练

一次运行在一个后端上执行。local 后端在 Potato 服务器上训练,并在 CUDA、Apple 的 Metal 或 CPU 中选择。ssh 后端在 Potato 能连上的 GPU 服务器上启动运行,并把进度和模型流式传回。slurm 后端从登录节点用 sbatch 把运行提交到计算节点,只需要 sbatch、squeue 和 scancel。agent 后端服务于 Potato 连不上的机器,这台机器运行 potato training agent 并轮询作业。在 ssh 后端上运行之前,potato training check <backend> config.yaml 会报告远程 Python、远程 GPU 和缺失的训练包。在 GPU 服务器、SLURM 集群或 NAT 后的机器上训练设置每一种后端。

选择接下来问什么

hf-text-classification 和 hf-image-classification 接受 acquisition 参数,它按 margin、熵、BALD 或 core-set 距离,为每个预测写入一个得分。随后 assignment_strategy: llm_confidence 会先分发得分最高的条目。auto_retrain 默认在每 25 条新标注之后启动一次新运行,每次运行都会为未标注的条目重新打分。主动学习把这个循环与 Potato 的 active_learning 块作了比较。

你已有的模型

五个训练器不拟合任何东西,而是给在别处运行的模型打分:label-studio-ml 对应 Label Studio ML 后端,openai-vlm-boxes 对应兼容 OpenAI API 的视觉语言模型,hf-inference 对应 Hugging Face Inference Endpoint,另有 roboflow,以及对应 CVAT 无服务器函数的 cvat-nuclio。这些模型的预测所得到的留出得分、回写和审核,与训练出的模型的预测相同。来自你已在运行的模型的预标签和留出得分介绍每一座桥。

发布模型

运行的页面可以把模型推送到 Hugging Face Hub,并附带一份模型卡,卡里写明训练器、基础模型、方案、各划分的大小和留出得分。仓库名要输入两次,仓库默认是私有的,令牌来自服务器上的环境变量。预测和训练数据留在服务器上。同一个页面还会把这次运行的划分及该划分的人工标签保存为数据集版本,以便之后在同样的条目上比较新的模型。

转录、导入与导出

  • WhisperX。 安装了 WhisperX 时,potato transcripts --transcribe 使用 WhisperX,并在 --asr-word-timestamps 下通过强制对齐得到词时间,未安装时则退回 faster-whisper。whisper-asr 运行会写出微调后模型的 CTranslate2 副本,由 --asr-model 加载。
  • RTTM 导入。 potato import -f rttm 把一个说话人分离文件,或一个存放说话人分离文件的文件夹,变成每段录音一个条目,附带待修正的说话人轮次。--speaker-map 为说话人改名。
  • segments 导出。 这种格式为每个音频或视频片段写一行 JSONL,并为每位标注者写一个 RTTM 文件。
  • CoNLL-U 依存关系。 HEAD 和 DEPREL 来自导出跨度之上的有向 span_link 方案。这两列过去始终是 _。

影响结果的修复

变更日志列出了每一项修复。下面这些修复可能改变你已经报告过的数字:

  • 写成 B,D=A,C 的排序平局,被读成了一个名为 D=A 的条目,所以 Kendall's tau 和 Spearman footrule 把两个并列的条目都漏掉了。
  • 滑块、软标签和成对量表的预标签,在页面加载时就被保存为标注者的答案,因此一个条目在没有人作答之前就被算作完成。打开一个 grounding_eval 条目也会以同样的方式保存这个条目。
  • /admin/iaa 把共指、跨度链接和事件列为没有得分的跨度。现在这份报告用平均成对 F1 给这三种类型打分。
  • 合并或拆分码本中的一个编码,不会让任何已编码的内容重新指向,因为没有任何东西把保存的标注与编码 id 关联起来。
  • 快照清单冻结了为空的一致性数字,现在记录 kappa 和百分比一致率。
  • 模型审核把 reject 判定算作漏判,而不是计入被该判定撤下的那个预标签,审核报告的精确率因此算错。当 writeback.field 与 pre_annotation.field 不同时,被留出的标注者与条目配对还会把回写字段留在条目数据里,现在这样的配对的条目数据会同时去掉这两个字段。

安装 2.14

升级,验证每个配置,并安装你需要的训练器:

bash
pip install --upgrade potato-annotation
potato validate config.yaml --strict
pip install "potato-annotation[train]"

模型训练是最好的起点,新功能列出了这个版本的其余内容。