跳轉到內容
公告閱讀約需 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]"

模型訓練是最好的起點,新功能列出了這個版本的其餘內容。