Zum Inhalt springen
Kontakt

Ein VLM mit eigenen Bildern anpassen

Eine konkrete Aufgabe, saubere Bilddaten und ein messbarer Vergleich: Bereite deinen ersten LoRA-Versuch vor – mit einem herunterladbaren Python-Lernpaket.

Fine-Tuning · 25 Min. Einstieg · Stand 6. September 2026

Vortrainiertes VLM + eigene BeispieleAdapter + Vergleich auf neuen Bildern

Wähle eine Aufgabe, die du prüfen kannst

«Mein Modell soll Bilder besser verstehen» ist schwer zu bewerten. «Es soll auf meinen Werkbankfotos Arduino Uno und Raspberry Pi unterscheiden und bei unklaren Bildern keine Zuordnung erfinden» ist überprüfbar. Genau diese begrenzte Aufgabe verwenden wir für den ersten Versuch. Für reine Klassifikation kann auch ein kleiner Bildklassifikator passen; hier üben wir ausdrücklich die Anpassung eines Bild-Sprach-Modells.

Du startest mit dem bereits vortrainierten SmolVLM-256M-Instruct und ergänzt einen LoRA-Adapter. Das Architekturbeispiel LLaVA aus Teil 1 erklärt das Grundprinzip; dessen 576 Bildpositionen gelten nicht für dieses andere Modell. Das Lernpaket hält eine konkrete SmolVLM-Revision und die gemeinsam geprüften Bibliotheksversionen fest.

Du brauchst: Grundkenntnisse im Terminal und in Python, eigene nutzbare Fotos und für den späteren Trainingslauf eine passende NVIDIA/CUDA-Umgebung. Die Anleitung zu lesen und Daten vorzubereiten braucht keine GPU. Die Modellkarte nennt Englisch; deshalb verwenden wir eine englische Frage mit festen Labels. Deutsche Ausgaben wären eine eigene Prüfaufgabe.

Lernpaket und Umgebung vorbereiten

Python-Lernpaket herunterladen

Das ZIP enthält Datenprüfung, Trainingsskript, Laden des Adapters, Ergebnisvergleich und eine vollständige Anleitung. Die Beispielzeilen zeigen das Format; Fotos und Modellgewichte sind nicht enthalten. Entpacke es und öffne den Ordner vlm-training im Terminal.

Für die geprüfte CPU-Umgebung unter Linux und Python 3.11:

python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install torch==2.8.0 torchvision==0.23.0 --index-url https://download.pytorch.org/whl/cpu
python -m pip install -r requirements.txt
python -m unittest -v test_data.py
python smoke_test.py

Was wurde geprüft? Die Daten- und Vergleichstests sowie ein CPU-Lauf mit einem winzigen zufälligen Testmodell, einschliesslich Loss-Maske, LoRA-Update, Speichern, Laden und Generieren. Zusätzlich wurde der tatsächliche SmolVLM-Prozessor mit dem Trainings-Collator geprüft. Das vortrainierte SmolVLM wurde hier noch nicht mit echten Fotos trainiert oder bewertet. Der CPU-Test bestätigt die technische Verbindung der Bibliotheken; er misst keine Erkennungsqualität.

Für den späteren GPU-Lauf richtest du eine separate Umgebung mit den zu deinem Treiber passenden Torch-Paketen aus der offiziellen PyTorch-Tabelle ein. Die README erklärt diesen Schritt. Modellgrösse allein verrät den Trainingsspeicher nicht: Auch Auflösung, Textlänge, Aktivierungen und Optimierer brauchen Speicher.

Aus Fotos werden Trainingsbeispiele

Ein Beispiel besteht aus Bild, Frage und geprüfter Zielantwort. Fotografiere unterschiedliche Geräte, Ansichten und Lichtbedingungen. Wenn du alle Arduino-Bilder auf einer weissen und alle Raspberry-Pi-Bilder auf einer schwarzen Unterlage aufnimmst, bietest du dem Modell dieselbe Art Abkürzung wie im Pixelversuch.

Lege die Fotos unter data/images/ ab. Jede Zeile in data/labels.jsonl beschreibt eines davon:

{"id":"aufnahme-001","image":"serie-a/uno-front.jpg","group":"serie-a","split":"train","question":"Which board is visible? Answer with one label: arduino_uno, raspberry_pi, unknown.","answer":"arduino_uno"}

answer schreibst und prüfst du am Foto. unknown ist das Ziel bei tatsächlich unklaren Ansichten. group hält zusammengehörige Aufnahmen zusammen. Die drei Illustrationszeilen im Paket enthalten nicht vorhandene Bildpfade und ersetzen keinen eigenen Datensatz. Es gibt keine feste Anzahl Fotos, die für jede Aufgabe ein gutes Ergebnis garantiert.

Welche Fotos dürfen zusammen lernen?

Gedankliches Beispiel: drei unabhängige Serien mit je sechs Bildern. Jede Serie enthält beide Boardtypen und unklare Ansichten. Ordne ganze Serien zu und prüfe deine Entscheidung.

Wofür verwendest du jede Serie?
Serie A · Werkbank am Fenster

6 Fotos, gleiche Geräte und gleicher Aufbau

Serie B · anderer Raum

6 Fotos, andere Geräte und andere Beleuchtung

Serie C · neuer Aufbau

6 Fotos, weitere Geräte und anderer Hintergrund

Eine begründete Lösung ansehen

Serie A für Training, B für Validierung und C für den Abschlusstest. Die umgekehrte Zuordnung kann genauso sinnvoll sein. Entscheidend sind unabhängige Gruppen und abgedeckte Aufgaben. Alle Einzelbilder einer Serie bleiben zusammen. Drei Serien sind ein kleines Übungsbeispiel, kein Nachweis eines ausreichend grossen Datensatzes.

Übernimm diese Aufteilung für deine echten Serien. Fotos desselben Geräts können auch über mehrere Serien stark ähnlich bleiben; dann ist das Gerät die sinnvollere übergreifende Gruppe. Plane in allen Splits die relevanten Antworten und Schwierigkeiten ein.

python validate_data.py data/examples.jsonl --schema-only
python validate_data.py data/labels.jsonl --images-root data/images

Der erste Befehl prüft das Schema. Der zweite öffnet deine Bilder und prüft unter anderem Serienüberschneidungen und identische Bildpixel über Split-Grenzen. Ähnliche Motive und falsche Zielantworten musst du zusätzlich selbst prüfen. Diese Trennung nach Aufnahmeserien ist unsere Anwendung des Prinzips gruppierter Daten.

Erst die Basis prüfen, dann LoRA trainieren

Miss zuerst die Antworten des unveränderten Modells auf val. Beim ersten Aufruf lädt infer.py dafür die festgehaltene Modellrevision herunter. Mit --local-only lässt sich die Nutzung auf bereits vorhandene Dateien beschränken.

python infer.py --data data/labels.jsonl --images-root data/images --split val --output results/baseline-val.jsonl --device cpu

Die Ergebnisdatei hält pro Beispiel die Vorhersage fest. Lies besonders die Fehler: Fehlen sichtbare Details? Wird jedes unbekannte Board trotzdem benannt? Wenn die Basis bereits genügt, hast du deine Aufgabe möglicherweise schon gelöst. Feinabstimmung wird interessant, wenn deine Beispiele eine konkrete, wiederkehrende Schwäche adressieren.

Was LoRA verändert: An ausgewählten Gewichtsmatrizen wird eine kleine trainierbare Ergänzung eingefügt. Vereinfacht lautet die Abbildung W · x + Skalierung · B · A · x. W bleibt eingefroren; A und B lernen. Der Rang r ist ihre schmale Zwischendimension. Ein höherer Rang schafft mehr trainierbare Parameter und braucht mehr Speicher; er garantiert keine bessere Antwort. LoRA in PEFT

Unser Paket setzt Rang 8 an Q/V-Projektionen im Sprachmodellteil ein. Der Bildencoder und die übrigen Basisgewichte bleiben eingefroren. Es lernt somit eine Anpassung der Antwortaufgabe und trainiert keinen neuen Bildencoder von Grund auf. Es kann auch keine kleinen Bilddetails wiederherstellen, die bei der Bildaufbereitung verloren gingen.

Auf deiner vorbereiteten GPU-Maschine prüfst du zunächst Daten und Plan:

python train.py --data data/labels.jsonl --images-root data/images --output runs/versuch-01 --max-steps 20 --check-only

--check-only startet kein Training und prüft auch nicht, ob dein CUDA-Training funktionieren wird. Der folgende ausdrückliche Aufruf beginnt den begrenzten ersten Lauf:

python train.py --data data/labels.jsonl --images-root data/images --output runs/versuch-01 --max-steps 20

20 Updates dienen der Kontrolle des Ablaufs. Lernrate 1e-4, Batchgrösse 1 mit vier akkumulierten Batches und LoRA-Rang 8 sind Startwerte dieses Pakets, keine universelle Empfehlung. Das Modell sieht eine Ansicht mit längster Kante 512 Pixeln. Prüfe deshalb die Lesbarkeit wichtiger Details in dieser Aufbereitung.

Bei diesem Supervised Fine-Tuning (SFT) liefert deine Zielantwort das Lernsignal. Der Loss berücksichtigt ihre Token; Frage und Bild-Token werden maskiert. Sie sind trotzdem Eingaben für die Vorhersage. Das Paket verwendet dafür das in TRL 0.24.0 unterstützte Prompt/Completion-Format. Versionsgebundene Trainingsdokumentation

Das Ergebnis liegt in runs/versuch-01/adapter. run.json protokolliert Modellrevision, Datensatz-Hash und Trainingswerte. Deine Fotos und der Adapter werden vom Paket nicht auf einen Hub hochgeladen.

Mit denselben Fragen ehrlich vergleichen

Lade Basis und Adapter gemeinsam und verwende dieselben Validierungsbilder:

python infer.py --data data/labels.jsonl --images-root data/images --split val --adapter runs/versuch-01/adapter --output results/adapter-val.jsonl --device cpu
python compare.py --data data/labels.jsonl --split val --baseline results/baseline-val.jsonl --adapter results/adapter-val.jsonl

Ein Adapter allein ersetzt die Modellgewichte nicht. Das Skript lädt die passende Basisrevision und ergänzt den gespeicherten Adapter. Der Vergleich verlangt übereinstimmende Beispiel-IDs, Fragen, Ziele, Bild-Hashes und Basisrevisionen. Er zählt exakte Label-Treffer und zeigt Verbesserungen sowie Verschlechterungen. Prüfe insbesondere, ob unknown nach dem Training noch sinnvoll verwendet wird.

Nutze val für deine Verbesserungen. Sobald Daten und Einstellungen feststehen, erzeuge Basis- und Adapterantworten mit --split test in neuen Ergebnisdateien. Vergleiche diesen bisher ungenutzten Split abschliessend. Wenn du daraufhin wieder optimierst, brauchst du für eine neue unabhängige Schlussprüfung frische Daten.

Der Adapter hat weniger Trainingsloss. Ist er jetzt besser?

Deine Vermutung

Erklärung ansehen

Bewerte zuerst die konkrete Aufgabe. Für feste Labels passt ein exakter Vergleich. Für freie Beschreibungen brauchst du eine Rubrik, etwa korrekte sichtbare Details, keine erfundenen Eigenschaften und passende Unsicherheit.

Dein Ergebnis zum Mitnehmen: ein geprüfter Datensatz, eine festgehaltene Ausgangslage, ein Adapter und ein Vergleichsbericht. Du kannst erklären, welche Gewichte sich geändert haben und an welchen Bildern du eine Verbesserung oder Verschlechterung festmachst. Wenn du anschliessend den SO-101 bewegen möchtest, folgen zusätzlich Roboterzustände, Aktionen und die passende Steuerung.

Zum Projekt: Wahrnehmung am SO-101 →

Oder kehre zum Pixelversuch zurück und erkläre dort den Unterschied zwischen Trainings- und Validierungsfehler.

Quellen & weiterführende Dokumentation

Das hängt zusammen.

  • VLM

    Bilder verstehen

    Was passiert zwischen Foto und Antwort? Verfolge Pixel, Bildmerkmale und Sprache durch ein VLM – und finde heraus, was es dabei wirklich lernt.

    Bild + Frage → Textantwort
    15 Min. Einstieg
  • Training

    So lernt ein Modell

    Verändere echte Gewichte im Browser. Verfolge Vorhersage, Loss und Gradienten – und teste, ob das Gelernte auch bei neuen Bildern funktioniert.

    Beispiele + Zielantworten → Angepasste Gewichte
    20 Min. Einstieg
  • OCR

    Text aus Bildern lesen

    Ein Foto wird zu Text, den du kopieren, durchsuchen oder vorlesen lassen kannst.

    Bild mit Schrift → Bearbeitbarer Text
    4 Min. Einstieg