自分のアノテーションでモデルを学習する
研究のラベルから管理者用Trainingページでモデルを学習し、ホールドアウトした項目でスコアを測り、予測をアノテーターに事前ラベルとして見せます。
v2.14.0の新機能
モデル学習は、アノテーターがすでに付けたラベルでモデルを学習し、学習から外したホールドアウトの項目でモデルのスコアを測ります。モデルの答えは、確認または修正してもらう事前ラベルとしてアノテーターに見せることもできます。このページでは、学習ループ、管理者用のTrainingページ、タスク別のトレーナー、そして各部分の詳細を扱うページとチュートリアルを説明します。対象は、セルフホストのPotatoサーバーを運用する研究の担当者と管理者です。Trainingページとsklearn-textトレーナーは、Potato 2.11から利用できます。バージョン2.14.0では、37のトレーナー、GPUサーバーとSLURMクラスターでのリモート学習、Runsテーブルのホールドアウトスコア、Hugging Face Hubへの公開が加わります。
学習ループ
ループは1周ごとに、これまでに集まった人手ラベルでモデルを学習し、モデルの答えを次のアノテーターに出発点として渡します。ループは6つのステップで進みます。
- アノテーションする。 アノテーターはいつもどおり項目にラベルを付けます。Potatoは、1つの項目に付いた複数のアノテーターのラベルを1つのラベルに統合します。既定はDawid-Skeneで、多数決も選べます。
- 学習する。 実行は、ラベル付きの項目をtrain、val、testの各分割に分け、別プロセスでモデルを学習します。分割は項目IDのシード付きハッシュで決まるため、どの項目も実行のたびに同じ分割に入ります。
- スコアを測る。 実行は、ホールドアウトしたvalとtestの項目でモデルのスコアを測ります。
- 書き戻す。 実行の予測は、選んだスキームの事前ラベルとして各項目のデータに入ります。信頼度のしきい値に届かない予測と、train分割の項目への予測は除かれます。
- 修正する。 次のアノテーターには、モデルの答えがすでに入力された状態で項目が表示されます。アノテーターは答えを確認するか、変更します。レビュー担当者は、モデルが正しかったかどうかを記録することもできます。
- 再学習する。 次の実行は新しいラベルで学習し、レビュー担当者が修正した項目はすべてtrain分割に入ります。
学習を有効にする
モデル学習は既定でオフで、1つの設定キーで有効になります。既存の設定に次のブロックを追加します。
model_training:
enabled: trueサーバーを再起動し、管理者セッションまたは管理者APIキーで/admin/trainingを開きます。enabled: trueがないと、学習用のルートは存在しません。学習を有効にしても、アノテーターに見えるものは何も変わりません。事前ラベルはwriteback.schemasに挙げたスキームにだけ表示され、このリストは既定で空だからです。
Trainingページ上部のStart a runパネルには、実行に必要な設定がすべてあります。Schemaには研究のアノテーションスキームが並びます。Trainerには、選んだスキームの種類と項目に合うトレーナーが並びます。Runs onには、実行できる場所が並びます。Parameters欄はJSONを受け取り、選んだトレーナーのmodel_training.trainer_paramsの項目から始まります。欄の下の注記には、そのトレーナーが受け取るすべてのパラメーターが書かれています。Train nowで実行を開始します。別の実行が進行中に開始した実行はキューで待ち、実行テーブルにwaiting #NとCancel runボタンつきで表示されます。
sentimentスキームで実行した2つのsklearn-textの結果。各スコアは、モデルが学習していないレビューで測ったものです
実行テーブルの各実行IDを開くと、/admin/training/runs/<run_id>の実行ページが表示されます。実行ページには、実行の状態、トレーナー、バックエンド、分割のサイズ、ホールドアウトスコア、パラメーターが表示され、続いて実行が記録したすべての指標と実行のログが並びます。失敗した実行にはWhat went wrongセクションが加わります。実行ページからは、実行のval、test、train項目をデータセットのバージョンとして保存したり、モデルをHugging Face Hubに公開したりすることもできます。サンプルプロジェクトでGPUなしの最初の実行を一通り試すには、最初のモデルを学習するに従ってください。
タスク別のトレーナー
Potato 2.14.0には38のトレーナーがあり、Trainerメニューには登録名で表示されます。次の表は、トレーナーが学習元とするアノテーションの種類ごとにトレーナーをまとめたものです。
| タスク | トレーナー | 詳細 |
|---|---|---|
| テキストのラベル | sklearn-text, hf-text-classification, setfit | 最初のモデルを学習する |
| スパン、関係、会話ツリー、グロス | hf-token-classification, hf-relation, hf-conversation-tree, byt5-gloss | トレーナー |
| LLMと報酬モデル | llm-sft, llm-dpo, reward-model, prm-reward | LLMのファインチューニング |
| 画像、スライド、顕微鏡画像、地図、ページレイアウト | hf-image-classification, torchvision-detect, ultralytics-detect, torchvision-segment, ultralytics-segment, cellpose, sam-finetune, layoutlmv3, vlm-sft | 視覚モデル |
| 音声 | hf-audio-tagger, whisper-asr, diarization | 音声モデル |
| ボリューム、点群、動画 | volume-unet, external-3d, video-track | ボリューム、点群、動画 |
| 分子、スペクトル、信号、ロボットのエピソード | rdkit-property, peak-cnn, signal-cnn, episode-model | 科学分野のモデル |
| 判断モデル(Laya、Jev、OpenJev) | decision-calibrate, laya-finetune, openjev-finetune | トレーナー |
| すでに別の場所で動かしているモデル | label-studio-ml, hf-inference, openai-vlm-boxes, roboflow, cvat-nuclio | 手持ちのモデルを使う |
最後の行の5つのトレーナーは、何も学習しません。5つはそれぞれ、ホールドアウトした項目を別の場所で動いているモデルに送ります。Potatoは、その答えを学習済みモデルの答えと同じように、スコアリング、書き戻し、レビューの対象にします。sklearn-textは通常のPotatoのインストール以外に何も必要とせず、pip install "potato-annotation[train]"で、テキスト、画像、音声、LLMのトレーナーに必要なものがインストールされます。インストールされていないトレーナーは、Trainingページに「not installed」と表示され、インストール用のコマンドが添えられます。トレーナーには、各トレーナーのアノテーションタイプ、項目タイプ、インストールコマンド、パラメーターがまとめてあります。
実行の場所
実行はバックエンドで動きます。バックエンドは、Runs onメニューで実行ごとに選ぶか、model_training.backendで既定として指定します。Potatoのバックエンドは4種類です。
- **
local**は、Potatoサーバー上のサブプロセスで学習します。device: autoは、CUDA、AppleのMetal、CPUの順に選びます。 - **
ssh**は、鍵認証のsshで接続できるGPUサーバーで学習します。PotatoはPotatoのソースコードをサーバーにコピーし、そこで実行を開始し、実行が成功するとモデルをコピーして戻します。 - **
slurm**は、同じ方法でクラスターのログインノードに接続し、sbatchで計算ノードに学習ジョブを投入します。このバックエンドが呼ぶのはsbatch、squeue、scancel、scontrolだけです。そのため、srunやsacctのないクラスターでも動きます。 - **
agent**は、NATの内側にあるワークステーションなど、Potatoから到達できないマシンのためのものです。そのマシンでpotato training agentがサーバーにジョブを問い合わせ、モデルのファイルはそのマシンに残ります。
potato training check <backend> config.yamlは、最初の実行の前にバックエンドを検査します。TrainingページのCheckボタンも同じことをします。設定にはバックエンドのキーがすべて載っています。GPUサーバーまたはクラスターで学習するでは、3種類のリモートバックエンドを順を追って設定します。
ホールドアウトスコア
どの実行も、スキームのアノテーションタイプに合った指標で、valとtestの項目でモデルのスコアを測ります。単一ラベルの分類器にはmacro-F1、スパンのタガーにはスパンF1、ボックス検出器にはIoU 0.5でのmAP、書き起こしモデルには1から単語誤り率を引いた値が使われます。実行テーブルには実行ごとに代表のスコアが1つ表示され、実行ページには、val_macro_f1やtest_f1のように指標名に分割名を含めて、すべての指標が並びます。ラベルがあって予測がない項目は、不正解として数えられます。そのため、トレーナーは難しい項目を飛ばしてスコアを上げることはできません。トレーナーがval項目で最良のチェックポイントを選ぶ場合、valのスコアがすでにモデルに影響しているため、代表のスコアはtest項目から取られます。sklearn-textのように、valで何も選ばないトレーナーは、代表のスコアをval項目から取ります。設定には、すべてのアノテーションタイプの指標が載っています。
事前ラベルとモデルレビューキュー
事前ラベルは、モデルの答えをアノテーションページに入力済みにして、アノテーターが確認または変更できるようにしたものです。書き戻しは、実行の予測をwriteback.schemasに挙げたスキームの事前ラベルに変えます。pre_annotationブロックは必要ありません。model_trainingの下にwritebackブロックを追加します。
model_training:
enabled: true
writeback:
schemas: [sentiment]
min_confidence: 0.6
include_unlabeled: trueこのブロックでは、信頼度が0.6未満のsentimentの予測は保存されますが、表示されません。include_unlabeled: trueにすると、各実行は、まだ誰もラベルを付けていない項目も予測します。この設定がなければ、実行が予測するのは、ホールドアウトしたvalとtestの項目だけです。実行のtrain分割の項目に事前ラベルが付くことはなく、書き戻しが人手のラベルを変えることもありません。事前ラベルがアノテーターの答えになるのは、アノテーターが事前ラベルを編集するか、次の項目に進んだときだけです。
新しいアノテーターには、モデルの答えが選択された状態で表示され、アノテーターはそれを確認するか変更します
assignment_strategy: model_reviewは、事前ラベルの付いた項目を、信頼度の低い順にレビュー担当者に渡します。レビュー担当者は、各項目にaccept、correct、rejectのいずれかの判定を記録します。却下された事前ラベルは項目から外れ、二度と表示されません。以降の実行はどれも、correctの判定が付いた項目で学習し、その項目でモデルのスコアを測ることはありません。事前ラベルは、アノテーターをモデルの答えに引き寄せます。ホールドアウトスコアでモデルの水準が裏づけられてからinclude_unlabeledをオンにし、事前ラベル付きデータで確認とゴム印押しを見分ける方法を使って、事前ラベルを読まずに受け入れるアノテーターを見つけてください。ループの中のモデルでは、1つのプロジェクトで書き戻し、レビュー、再学習を順に見ていきます。
アノテーションが届くたびに再学習する
auto_retrainは、アノテーションが届くたびに自動で実行を開始し、新しい実行は前の実行の事前ラベルを置き換えます。model_trainingの下にブロックを追加します。
model_training:
enabled: true
auto_retrain:
enabled: true
trainer: sklearn-text
schemas: [sentiment]
update_frequency: 25
min_interval_s: 600この値では、前回の自動実行以降に25件のアノテーションが届き、前回の実行が終わってから600秒が経過すると、実行が始まります。設定には、auto_retrainのすべてのキーと、チェックが実行を見送る理由が載っています。ループの中のモデルでは、再学習をいつオンにするかを示しています。
モデルをHugging Face Hubに公開する
モデルがPotatoサーバー上にある成功した実行には、実行ページにPublish to the Hugging Face Hubフォームがあります。プッシュでは、モデルの重み、設定、トークナイザーのファイルと、実行から作られたREADME.mdのモデルカードがアップロードされます。モデルカードには、トレーナー、ベースモデル、スキーム、ラベル、分割のサイズ、ホールドアウトスコアが記載されます。実行の予測と、学習データのコピーはサーバーに残ります。
リポジトリ名は2回入力し、2つの名前が一致したときにだけプッシュが進みます。Privateは既定でオンで、Hugging Faceのトークンは、ページからではなくサーバー上の環境変数(既定はHF_TOKEN)から取られます。リモートホストやエージェントのマシンに残ったモデルは、実行ページからはプッシュできません。設定には、アップロードされるファイルとAPIのルートが載っており、アノテーションでLLMをファインチューニングするでは、プッシュを最初から最後まで実行します。
モデル学習とラベリングエンジン
ラベリングエンジンは、同じトレーナーを使います。蒸留をオンにする(features.distill)と、エンジンは、エンジンの人手ラベルと、契約によって認証された機械ラベルを使ってトレーナー(既定はsklearn-text)でモデルを学習し、そのモデルを設定済みのカスケードの前にtrainedソースとして置きます。エンジンのcert分割とaudit分割の項目が、蒸留の学習セットに入ることはありません。trainedソースは、実行のモデルディレクトリをartifact_dirにして、学習実行のモデルを読み込むこともできます。ラベリングエンジンの設定には、蒸留のキーが載っています。
モデル学習と能動学習
Potatoの能動学習は、研究のラベルでモデルを学習しますが、その目的はモデル学習より限られています。能動学習は、update_frequency件のアノテーションごとにサーバープロセス内でscikit-learnの分類器を学習し、その分類器を使って、最も不確実な項目から順にキューを並べ替えます。アノテーターが並べ替えられたキューを受け取るのは、assignment_strategy: active_learningのときだけです。能動学習の分類器は、学習に使った項目でスコアを測り、その予測がアノテーターに見せられることはありません。
モデル学習は、38のトレーナーのどれでも別プロセスまたは別のマシンで実行し、ホールドアウトした項目でモデルのスコアを測り、モデルの答えを事前ラベルとして見せます。モデル学習でもキューを並べ替えることができます。assignment_strategy: llm_confidenceでは、公開済みの事前ラベルの信頼度が最も低い項目が先に来ます。hf-text-classificationとhf-image-classificationのacquisitionパラメーターは、その順序をマージン、エントロピー、BALD、コアセットのスコアに置き換えます。次にどの項目にラベルを付けるかを決めるには、能動学習を使います。ホールドアウトの項目でスコアを測ったモデル、アノテーター向けの事前ラベル、公開するモデルが必要なときには、モデル学習を使います。
チュートリアル
各チュートリアルは、インストールからスコア付きの実行まで、1つの構成を通して進めます。
- 自分のアノテーションで最初のモデルを学習するでは、GPUなしで、感情分析の研究で
sklearn-textを学習します。 - GPUサーバー、SLURMクラスター、NATの内側のマシンで学習するでは、sshのGPUサーバー、SLURMクラスター、問い合わせ型のエージェントを設定します。
- 事前ラベルと再学習によるモデル・イン・ザ・ループのラベリングでは、書き戻し、レビュー、獲得関数、
auto_retrain、データセットのバージョンを扱います。 - アノテーションでLLMをファインチューニングするでは、SFT、DPO、報酬モデル、プロセス報酬モデルを、QLoRAとHubへのプッシュとともに学習します。
- 画像アノテーションで検出モデルとセグメンテーションモデルを学習するでは、画像、スライド、顕微鏡画像、地図で検出器とセグメンターを学習し、Cellpose、SAM、LayoutLMv3、視覚言語モデルも扱います。
- アノテーションで音声モデルを学習するでは、Whisper、話者ダイアライゼーション、スペクトログラム検出器、音声タガーをRTTMファイルとともに学習します。
- ボリューム、点群、動画でモデルを学習するでは、
volume-unet、external-3d、video-trackを学習します。 - 分子、スペクトル、信号、ロボットのエピソードでモデルを学習するでは、
rdkit-property、peak-cnn、signal-cnn、episode-modelを学習します。 - すでに動かしているモデルからの事前ラベルとホールドアウトスコアでは、すでに提供しているモデルを、推論ブリッジまたは
label-studio-mlで接続します。 - Opacusによる差分プライバシー付きファインチューニングでは、
dpパラメーターとOpacusで分類器を学習します。
関連ドキュメント
- トレーナー - 38のトレーナーすべてをタスク別にまとめたもの
- 設定 -
model_trainingのすべてのキー、バックエンド、ルート、保存パス - 能動学習 - scikit-learnの分類器によるキューの並べ替え
- LLMと視覚モデルによる事前アノテーション - 学習済みモデルではなく、LLMや視覚モデルから得る事前ラベル
- ラベリングエンジン - 人手ラベルのブラインドサンプルで検定した機械ラベル
- ユーザーシミュレーター - 実際のアノテーターが始める前にループを試すための、シミュレートされたアノテーター
実装の詳細については、ソースドキュメントを参照してください。