Tutorials

GLiNER für 9 Dollar fine-tunen: Wie Gemini seine eigene Ablösung trainierte

ai ner fine-tuning gliner gemini local-llm

Peter Vijeh betrieb eine Pipeline, die Reddit-Kommentare über Kochmesser liest und daraus Marken-, Modell- und Stahl-Erwähnungen extrahiert - Named Entity Recognition (NER) auf Forentext. Das Problem: Forentext bricht jede Annahme, für die generische NER-Modelle trainiert wurden. Keine Grossschreibungs-Disziplin, Abkürzungen als Insider-Kürzel, Material-Bezeichnungen, die wie Teilenummern aussehen, und dasselbe Wort kann je nach Satz Marke oder generische Kategorie sein.

Der Ansatz: LLM als Etikettierer, kleines Modell als Arbeiter

Bisher lief jede Extraktion durch Gemini 3.1 Pro - ein bezahlter API-Call pro Kommentar, Kosten wuchsen mit dem Post-Aufkommen. Die Alternative: GLiNER (ein 459M-Parameter DeBERTa-v3-large Encoder) zero-shot betreiben. Kostet nichts, landete aber nur bei ~0.65 F1 - mit den teuren Fehlern: Kategorie-Wörter wurden selbstsicher als Marken getaggt, kleine Hersteller, die eine Empfehlungs-Engine gerade bräuchte, wurden still übersehen.

Die Lösung: Gemini labelt einmalig 4.290 Kommentare für 9 Dollar, GLiNER fine-tunen, danach lokal laufen lassen. Der entscheidende Prompt-Trick: nie nach Character-Offsets fragen. LLMs zählen Zeichen schlecht und liefern Spans, die um ein paar Positionen daneben liegen - schlimmer als kein Label. Stattdessen gibt das Modell den exakten Substring plus Label zurück, und deterministischer Code berechnet die Offsets. Etwa 30% der Trainingsbeispiele sind bewusst leere Kommentare mit typischen False-Positive-Triggern.

Was schiefging - und die Lektion

Fünf von zehn Training-Runs lieferten kein nutzbares Modell. Drei scheiterten an Config-Fallstricken des HF Trainers (max_steps override, eval_strategy, Checkpoint-Key-Prefix). Die teuren Fehler waren Runs 4 und 5: ein Tensor namens words_mask - vom Namen und Shape her nicht von einem Attention-Mask zu unterscheiden - war aber in Wahrheit ein Wort-Index (0 für Special/Padding-Tokens, dann 1, 2, 3 für das erste Subtoken je Wort). Als binär gefüllt, lernte das Modell schlicht nichts: flacher Loss bei 70-130, F1 nahe null, kein Crash, keine Warnung. Die Diagnose kam erst durch Lesen des Training-Loops statt der Docstrings.

Ergebnis

  • 0,83 F1 auf einem vorab gelockten 225-Kommentar-Validierungsset (vs. ~0,65 zero-shot)
  • Per-Class-Thresholds statt globalem Cutoff: Material-Recall von 0,787 auf 0,911
  • Kosten: 9 Dollar Labels, ~2,50 Dollar GPU-Zeit (Tesla T4, 24 Minuten pro Run)
  • Das Modell läuft lokal und amortisiert sich ab Kommentar 4.291

Fazit des Autors: Modell und Daten sind selten das Problem bei kleinen Fine-Tuning-Jobs - der Code dazwischen fällt aus, und ein flacher Loss durch einen falschen Input-Tensor sieht aus wie flacher Loss durch schwere Daten. Seine Konsequenz: lieber eine Assertion auf jedem selbstgebauten Tensor als ein besseres Label-Set.

Ein Paradebeispiel dafür, wie Frontier-LLMs als Silver-Labeler für spezialisierte kleine Modelle dienen - ohne Label-Team, ohne dauerhafte API-Kosten.

Link: Peter Vijeh