Zum Inhalt springen
Ankündigungen9 Min. Lesezeit

Potato 2.14: Modelle auf den eigenen Annotationen trainieren

Potato 2.14 trainiert Modelle auf den Labels einer Studie mit 38 Trainern, bewertet jeden Lauf an zurückgehaltenen Items und zeigt Annotatoren die Vorhersagen als Vorlabels.

Potato Team

Potato 2.14 trainiert Modelle auf den eigenen Annotationen einer Studie. Ein Lauf passt einen von 38 Trainern an die Labels an, die Annotatoren vergeben haben, bewertet das Modell an Items, die vom Training zurückgehalten wurden, und schreibt die Vorhersagen des Modells als Vorlabels auf die Items zurück, die Annotatoren bestätigen oder korrigieren. Version 2.13.1 hatte einen einzigen Trainer, sklearn-text. Das Release importiert außerdem RTTM-Diarisierungsdateien, exportiert korrigierte Sprecher-Turns, führt WhisperX für lokale Transkription aus und behebt mehrere Fehler, die Übereinstimmungswerte und Exporte verändert haben. Lies deshalb die Hinweise zum Upgrade, bevor du installierst.

bash
pip install --upgrade potato-annotation

Hinweise zum Upgrade

Führe zuerst potato validate config.yaml --strict für jede Konfiguration aus. Die folgenden Änderungen können verändern, was eine funktionierende 2.13-Studie tut:

  • assignment_strategy: llm_confidence ordnet jetzt die Warteschlange. Die Strategie liefert zuerst das unsicherste Vorlabel aus, dann Items ohne Vorlabel. Frühere Releases akzeptierten den Wert und wiesen Items zufällig zu.
  • model_training wird bei der Validierung und beim Start geprüft. Ein unbekannter Schlüssel unter writeback oder auto_retrain, ein Split mit einem anderen Namen als train, val oder test und ein Eintrag in writeback.schemas, der kein Schema ist, sind Fehler, die den Server stoppen.
  • Die Training-Seite meldet einen Holdout-Score. Die Score-Spalte zeigte früher die Trainingsgenauigkeit. Ein Score aus einem 2.13-Lauf ist nicht mit einem Holdout-Score aus 2.14 vergleichbar.
  • Verknüpfungen, Ketten und Ereignisse erscheinen in Exporten. Antworten von span_link, coreference und event_annotation fehlten in jedem Export, und CSV und TSV enthalten jetzt zusätzlich die Spalten <scheme>._links und <scheme>._events.
  • Potato führt ujson nicht mehr in install_requires. Ein eigenes Skript, das ujson aus der Umgebung von Potato importiert, braucht pip install ujson.

Modelltraining

Das Modelltraining ist für eine Studie gedacht, die mehr Items hat, als Annotatoren labeln werden, und in der ein auf den ersten Labels trainiertes Modell den Rest vorschlagen kann. Der Kreislauf hat drei Schritte. Zuerst löst ein Lauf die Labels jedes Items zu einer Antwort auf und teilt die Items in Train, Val und Test auf. Danach passt der Trainer in einem eigenen Prozess ein Modell an den Train-Split an, und der Lauf bewertet das Modell an den Val- und Test-Items. Zuletzt zeigt das Rückschreiben Annotatoren die Vorhersagen des Modells als Vorlabels, und die Antworten, die Annotatoren speichern, werden zu Labels für den nächsten Lauf.

Um den Kreislauf für eine Studie mit einem Schema sentiment einzuschalten, füge diesen Block zur Konfiguration der Studie hinzu:

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

Annotatoren sehen nichts von einem Lauf, solange kein Schema unter writeback.schemas genannt ist. include_unlabeled: true sagt an den Items voraus, die noch niemand gelabelt hat, und min_confidence hält Vorhersagen unter 0,6 von der Seite fern. Starte den Server neu, öffne /admin/training mit dem Admin-Schlüssel, wähle einen Trainer und ein Schema und klicke auf Train now.

Die Training-Seite nach einem sklearn-text-Lauf, mit dem Lauf-Formular, der Runs-Tabelle mit einem Holdout-Score und der Trainer-Liste

Das Beispielprojekt von Potato in examples/ai-assisted/model-training/ hat 160 Produktrezensionen und führt sklearn-text aus, das keine GPU und nichts außer einer einfachen Installation braucht. Die Dokumentation zum Modelltraining berichtet dort von einem Lauf auf 120 gelabelten Rezensionen, der 0,84 Macro-F1 auf den Validierungsrezensionen erreichte und 80 Vorlabels schrieb. Ein neuer Annotator sieht dann jede dieser Rezensionen mit der bereits ausgewählten Antwort des Modells:

Eine Rezension auf der Annotationsseite, bei der die Antwort des Modells als Vorlabel ausgewählt ist

Dein erstes Modell trainieren führt Schritt für Schritt durch das Beispiel.

Trainer für jede Art von Annotation

Die Training-Seite bietet jedem Schema nur die Trainer an, die zum Schema passen. Der Trainerkatalog listet alle 38 Trainer mit Installationsbefehlen, und die folgende Liste nennt die Hauptgruppen:

  • Text. hf-text-classification, setfit und sklearn-text klassifizieren Items. hf-token-classification taggt Spans, hf-relation verknüpft Spans zu Relationen, Ereignissen und Koreferenzketten, und byt5-gloss segmentiert und glossiert Wörter für interlineare Glossierung.
  • Bilder. torchvision-detect und ultralytics-detect trainieren Detektoren, und torchvision-segment, ultralytics-segment und cellpose trainieren Segmentierer. Detektions- und Segmentierungsläufe zerlegen ganze Slides und große Bilder in Kacheln und trainieren auf Mikroskopie-Ebenen und GeoTIFF-Karten. volume-unet segmentiert 3D-Volumen, layoutlmv3 labelt Seitenlayouts, und vlm-sft fine-tunt ein Vision-Language-Modell auf Bildunterschriften, Grounding und GUI-Schritten.
  • Audio und Video. whisper-asr fine-tunt Whisper auf korrigierten Transkript-Turns, diarization trainiert ein Sprechermodell auf Sprecher-Turns, hf-audio-tagger taggt Audiosegmente, und video-track verfolgt Objekte über Frames hinweg.
  • LLMs und Agenten. llm-sft fine-tunt auf Freitextantworten, llm-dpo auf paarweisen Präferenzen, reward-model auf paarweisen, Ranking- und Best-Worst-Antworten, und prm-reward auf Schrittbewertungen von Agent-Traces.
  • Wissenschaft. rdkit-property sagt Antworten über Moleküle voraus, peak-cnn sagt Peak-Positionen auf Spektren voraus, signal-cnn labelt Intervalle von Zeitreihensignalen, und episode-model labelt Roboter-Episoden.

Die ultralytics-Trainer stehen unter AGPL-3.0, und die LayoutLMv3-Gewichte unter CC BY-NC-SA 4.0. Ein Lauf mit einem von beiden verlangt zuerst die Annahme der Lizenz. pip install "potato-annotation[train]" installiert, was die Text-, Bild-, Audio- und LLM-Trainer brauchen, und der Katalog nennt die separaten Installationen.

Holdout-Scores und Vorlabels

Jeder Lauf bewertet seine Vorhersagen an den Val- und Test-Items mit einer zum Schema passenden Metrik, etwa Macro-F1 für Labels, mAP50 für Boxen, Wortfehlerrate für Transkripte und Dice für Volumen. Ein Item mit einem Label und ohne Vorhersage zählt als falsch, und eine Abdeckungszahl gibt den Anteil der Items an, die eine Vorhersage erhalten haben. Items im Train-Split erhalten nie ein Vorlabel, und ein Item, das ein Reviewer korrigiert hat, geht immer in den Train-Split späterer Läufe.

Ein Vorlabel wird erst dann zur Antwort des Annotators, wenn der Annotator das Vorlabel bearbeitet oder weitergeht, und das Rückschreiben ändert nie ein menschliches Label. Die Warteschlange zur Modellprüfung liefert Vorlabels zuerst mit der geringsten Konfidenz aus, und der Prüfbericht nennt den Lauf hinter jedem Vorlabel. Modell im Kreislauf behandelt den Ablauf der Prüfung.

Training auf einem GPU-Server oder einem Cluster

Ein Lauf wird auf einem Backend ausgeführt. Das Backend local trainiert auf dem Potato-Server und wählt CUDA, Apples Metal oder die CPU. Ein ssh-Backend startet den Lauf auf einem GPU-Server, den Potato erreichen kann, und streamt Fortschritt und Modell zurück. Ein slurm-Backend reicht den Lauf vom Login-Knoten aus mit sbatch bei einem Rechenknoten ein und braucht nur sbatch, squeue und scancel. Ein agent-Backend bedient eine Maschine, die Potato nicht erreichen kann, die potato training agent ausführt und nach Jobs fragt. Vor einem Lauf auf einem ssh-Backend meldet potato training check <backend> config.yaml das entfernte Python, die entfernten GPUs und die fehlenden Trainingspakete. Auf einem GPU-Server, SLURM-Cluster oder einer Maschine hinter NAT trainieren richtet jedes Backend ein.

Entscheiden, was als Nächstes gefragt wird

hf-text-classification und hf-image-classification nehmen einen Parameter acquisition entgegen, der einen Score auf jede Vorhersage schreibt, nach Margin, Entropie, BALD oder Core-Set-Abstand. assignment_strategy: llm_confidence liefert dann den höchsten Score zuerst aus. auto_retrain startet standardmäßig nach je 25 neuen Annotationen einen neuen Lauf, und jeder Lauf bewertet die ungelabelten Items neu. Active Learning vergleicht diesen Kreislauf mit dem Block active_learning von Potato.

Modelle, die du bereits hast

Fünf Trainer passen nichts an und bewerten ein Modell, das anderswo läuft: label-studio-ml für ein Label-Studio-ML-Backend, openai-vlm-boxes für ein Vision-Language-Modell hinter einer OpenAI-kompatiblen API, hf-inference für einen Hugging-Face-Inference-Endpoint, roboflow und cvat-nuclio für eine serverlose CVAT-Funktion. Die Vorhersagen dieser Modelle erhalten denselben Holdout-Score, dasselbe Rückschreiben und dieselbe Prüfung wie die eines trainierten Modells. Vorlabels und Holdout-Scores von einem Modell, das du bereits betreibst behandelt jede Bridge.

Ein Modell veröffentlichen

Die Seite eines Laufs pusht das Modell auf den Hugging Face Hub, mit einer Modellkarte, die Trainer, Basismodell, Schemas, Split-Größen und Holdout-Score nennt. Du tippst den Repository-Namen zweimal ein, das Repository ist standardmäßig privat, und das Token kommt aus einer Umgebungsvariable auf dem Server. Die Vorhersagen und die Trainingsdaten bleiben auf dem Server. Dieselbe Seite hält den Split eines Laufs und die menschlichen Labels des Splits als Datensatzversion fest, damit spätere Modelle an denselben Items verglichen werden können.

Transkripte, Import und Export

  • WhisperX. potato transcripts --transcribe nutzt WhisperX, wenn WhisperX installiert ist, mit Wortzeiten aus Forced Alignment unter --asr-word-timestamps, und fällt sonst auf faster-whisper zurück. Ein whisper-asr-Lauf schreibt eine CTranslate2-Kopie des fein getunten Modells, die --asr-model lädt.
  • RTTM-Import. potato import -f rttm macht aus einer Diarisierungsdatei oder einem Ordner mit Diarisierungsdateien ein Item pro Aufnahme, mit den zu korrigierenden Sprecher-Turns. --speaker-map benennt Sprecher um.
  • Export segments. Das Format schreibt eine JSONL-Zeile pro Audio- oder Videosegment und eine RTTM-Datei pro Annotator.
  • CoNLL-U-Dependenzen. HEAD und DEPREL stammen aus einem gerichteten span_link-Schema über den exportierten Spans. Beide Spalten waren zuvor immer _.

Korrekturen, die Ergebnisse betreffen

Das Changelog listet jede Korrektur. Die folgenden Korrekturen hätten Zahlen verändern können, die du berichtet hast:

  • Ein Ranking-Gleichstand, der als B,D=A,C geschrieben war, wurde als ein einziges Item namens D=A gelesen, sodass Kendalls Tau und das Spearman-Footrule beide gleichstehenden Items ausließen.
  • Vorlabels von Schiebereglern, Soft Labels und paarweisen Skalen wurden beim Laden der Seite als Antwort des Annotators gespeichert, sodass ein Item als erledigt zählte, bevor jemand geantwortet hatte. Das Öffnen eines grounding_eval-Items speicherte das Item auf dieselbe Weise.
  • /admin/iaa listete Koreferenz, Span-Verknüpfungen und Ereignisse als Spans ohne Score. Der Bericht bewertet die drei Typen jetzt mit dem mittleren paarweisen F1.
  • Das Zusammenführen oder Aufteilen eines Codes im Codebuch hat keine Kodierungen umgehängt, weil nichts gespeicherte Annotationen mit Code-IDs verknüpfte.
  • Snapshot-Manifeste hielten Übereinstimmungswerte als null fest und zeichnen jetzt Kappa und prozentuale Übereinstimmung auf.
  • Die Modellprüfung zählte ein Urteil reject als Fehlschlag statt gegen das Vorlabel, das das Urteil entfernt hat, und die Präzision im Prüfbericht fiel falsch aus. Ein zurückgehaltenes Paar aus Annotator und Item behielt außerdem das Rückschreibefeld in den Item-Daten, wenn sich writeback.field von pre_annotation.field unterschied, und die Item-Daten für ein solches Paar lassen jetzt beide Felder aus.

2.14 installieren

Aktualisiere, validiere jede Konfiguration und installiere die Trainer, die du brauchst:

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

Modelltraining ist der Einstieg, und Was ist neu listet den Rest des Releases auf.