Zum Inhalt
lern-es.jetztby twisted pair
Rechner
Weg
Agent

FigurBeispiel (l3hr3r) ✎ eigene beschreiben

Ein LoRA, das nur ihn kennt

Aus 23 Bildern wird eine Datei von 170 MB, die ihn in jede Szene bringt. Auf ein Stichwort hin, und nur dann.

Das bekommst du

Eine Datei von 170 MB, mit der jedes Bild auf ein Stichwort hin deine Figur zeigt.

Acht Szenen mit dem fertigen LoRA, von der Tafel bis zum Podcast, überall dasselbe Gesicht. Dass sein Name auf Tafel und Buch steht, klärt Lektion A4.
ErgebnisAcht Szenen mit dem fertigen LoRA, von der Tafel bis zum Podcast, überall dasselbe Gesicht. Dass sein Name auf Tafel und Buch steht, klärt Lektion A4. KI-generiert.

So legst du los

VorherDer Datensatz aus Lektion A2 in figur/datensatz/, 23 Bilder mit je einer Bildbeschreibung (pruefen.py A2 ist grün).

In Claude Code eingebenIn Hermes mit lokalem Qwen eingeben

Lektion A3: Trainiere mit ai-toolkit und figur/lora/training.yaml ein LoRA für Z-Image Turbo aus figur/datensatz/, Stichwort l3hr3r, Klasse man, mit Schutz gegen das Durchsickern. Zeig mir alle 250 Schritte einen Kontaktabzug und lass mich den Stand wählen.

Im Terminal, im Kursordner

# ai-toolkit nach werkzeuge/ (Linux, Python 3.10–3.12)
git clone https://github.com/ostris/ai-toolkit.git werkzeuge/ai-toolkit
cd werkzeuge/ai-toolkit
python3 -m venv venv
venv/bin/pip install --no-cache-dir torch==2.13.0 torchvision==0.28.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cu130
venv/bin/pip install -r requirements.txt
cd ../..

# Modelle nach modelle/
hf download Comfy-Org/z_image_turbo split_files/diffusion_models/z_image_turbo_bf16.safetensors --local-dir modelle/Comfy-Org/z_image_turbo
hf download Tongyi-MAI/Z-Image-Turbo --exclude "transformer/diffusion_pytorch_model-*" --exclude "assets/*" --local-dir modelle/Tongyi-MAI/Z-Image-Turbo
hf download ostris/zimage_turbo_training_adapter zimage_turbo_training_adapter_v2.safetensors --local-dir modelle/ostris/zimage_turbo_training_adapter

# Stichwort und Klasse in die Konfiguration, dann trainieren (rund 3,5 Stunden)
sed -i 's/l3hr3r/l3hr3r/g; s/a man/a man/g; s/"man"/"man"/' figur/lora/training.yaml
cd werkzeuge/ai-toolkit && venv/bin/python run.py ../../figur/lora/training.yaml

Was dabei passiert ↓

Ziel
Ein LoRA für Z-Image Turbo, das mit dem Stichwort „l3hr3r“ immer dasselbe Gesicht erzeugt und ohne Stichwort nichts verändert.
Rechenzeit
3 h 37 min für 2000 Schritte, dazu die Auswahl am Kontaktabzug
Hardware
1 × NVIDIA RTX 3090 (24 GB)
Software
ai-toolkit (ostris) · Z-Image Turbo (Apache 2.0) · Z-Image Turbo Training Adapter v2 · ComfyUI zum Testen
Daten rein
23 Bilder und 23 Bildbeschreibungen (Captions) aus Lektion A2
Daten raus
8 Zwischenstände, 45 Testbilder, ein gewählter Stand (l3hr3r_v2_s1500.safetensors, 170 MB)
Skill
avatar-figur – in Vorbereitung

▸ Video

Folgt. Geplant sind 10 Minuten, mit den Zwischenständen im Vergleich.

VideoEr erklärt diese Lektion selbst. Präsentiert von der Figur, um die es geht.

Worum es geht

Ein Bildmodell kennt viele Gesichter, aber nicht seins. Beschreibt man ihn nur mit Worten, kommt bei jedem Bild ein anderer Mann heraus, der ihm ähnlich sieht. Für eine Figur, die durch viele Videos trägt, reicht das nicht.

Ein LoRA (Low-Rank Adaptation) löst das. Es ist eine kleine Zusatzdatei zum Bildmodell: 170 MB neben den 12 GB des Modells selbst. Sie bringt dem Modell ein neues Wort bei, hier l3hr3r. Steht das Wort im Prompt, erscheint er. Steht es nicht da, soll sich das Modell verhalten wie vorher. Dieser zweite Teil ist schwieriger, als er klingt.

Was vorher passiert ist

Das Gesicht stammt aus Lektion A1: ein Prompt, mehrere Modelle und Seeds, am Ende Seed 3007 von Z-Image Turbo. In Lektion A2 wurden aus diesem einen Porträt 23 Bilder: sechs Blickwinkel, fünf Gesichtsausdrücke, viele Kleidungen, Orte und Lichtstimmungen. Das Gesicht bleibt dabei immer gleich, alles andere ändert sich.

Kontaktbogen mit 23 Bildern des Lehrers: Blickwinkel vor grauem Grund, Gesichtsausdrücke, verschiedene Kleidung und Orte.
Abb. A3.1

Der Datensatz aus Lektion A2. Oben die Blickwinkel vor neutralem Grund, darunter Ausdrücke, Kleidung und Orte.

KI-generiert.

Der Ablauf

1. Bildbeschreibungen schreiben

Zu jedem Bild gehört eine Textdatei mit demselben Namen. Jede Beschreibung beginnt gleich und nennt dann alles, was sich ändern darf: Blickwinkel, Kleidung, Ort, Licht, Ausdruck.

a photo of l3hr3r, a man, a three-quarter view close-up at eye level,
head turned to the side with a slight smile, wearing a plain light grey
t-shirt, plain light grey studio background, soft even studio lighting

Was nicht in der Beschreibung steht, schreibt das Training dem Stichwort zu. Das Gesicht wird nie beschrieben, also lernt das Modell: Gesicht = l3hr3r. Würde man „blaugraue Augen“ in jede Beschreibung schreiben, gehörten die Augen nicht mehr fest zu ihm, sondern zum Prompt.

2. Basismodell und Adapter wählen

Trainiert wird auf Z-Image Turbo, also auf demselben Modell, mit dem später die Bilder entstehen. Turbo-Modelle sind destilliert: Sie brauchen nur etwa neun Schritte pro Bild statt mehrerer Dutzend. Trainiert man direkt darauf, geht diese Abkürzung verloren. Der Training Adapter v2 von ostris fängt das ab. Er läuft nur während des Trainings mit und wird danach nicht mehr gebraucht.

3. Konfiguration

Das Training läuft mit dem ai-toolkit von ostris und wird über eine einzige YAML-Datei gesteuert. Die wichtigsten Zeilen:

trigger_word: "l3hr3r"
network: { type: "lora", linear: 32, linear_alpha: 32 }
save: { save_every: 250, max_step_saves_to_keep: 8 }
train:
  steps: 2000
  lr: 1e-4
  optimizer: "adamw8bit"
  diff_output_preservation: true        # Schutz gegen das Durchsickern
  diff_output_preservation_class: "man"
model:
  arch: "zimage"
  assistant_lora_path: ".../zimage_turbo_training_adapter_v2.safetensors"
  quantize: true                        # qfloat8, passt in 24 GB
  low_vram: false

4. Trainieren und Zwischenstände sammeln

Alle 250 Schritte speichert das Training einen Zwischenstand und erzeugt fünf Testbilder mit festem Seed. Vier davon enthalten das Stichwort: Klassenzimmer, Park, Nahaufnahme, Porträt vor grauem Grund. Das fünfte enthält es nicht. Es prüft, ob das LoRA dort bleibt, wo es hingehört. Nach 2000 Schritten und 3 Stunden 37 Minuten liegen neun Reihen Testbilder vor.

5. Den richtigen Stand auswählen

Das Training liefert keinen Messwert, der sagt, welcher Stand der beste ist. Die Auswahl passiert mit dem Auge: Ein Skript setzt die Testbilder jedes Zwischenstands neben das Referenzporträt, ein zweites erzeugt für die engere Wahl Szenen mit schwierigen Ausdrücken.

Sechs Bilder nebeneinander: Referenzporträt, Klassenzimmer, Park lachend, Nahaufnahme, ein fremder Mann ohne Stichwort, Porträt vor grauem Grund.
Abb. A3.2

Kontaktabzug für Schritt 1500: links die Referenz, dann vier Bilder mit Stichwort. Das fünfte Bild ist ohne Stichwort entstanden und zeigt richtigerweise einen anderen Mann.

KI-generiert.
Raster mit vier Zeilen für die Schritte 1000, 1250, 1500 und 2000 und fünf Spalten: lacht herzhaft, überrascht, Profil, ernst im Anzug, mit Kollegen.
Abb. A3.3

Vier Zwischenstände, fünf schwierige Szenen. Bei 1000 und 1250 ist er im Anzug noch nicht ganz er selbst. Ab 1500 sitzt das Gesicht, dafür lacht er verhaltener.

KI-generiert.

Entscheidungen

Auf welchem Modell trainieren?

Z-Image Turbo, dieselbe Datei wie in ComfyUI

Apache 2.0, schnell und schon beim Gesicht das beste Ergebnis. Weil Training und Anwendung dieselbe Modelldatei nutzen, gibt es keine Überraschungen zwischen Test und Einsatz.

Wie verhindern, dass er überall auftaucht?

Differential Output Preservation mit der Klasse „man“

Das Training vergleicht laufend: Ein Prompt, in dem „l3hr3r“ durch „man“ ersetzt ist, muss dasselbe liefern wie das Originalmodell. Ohne diesen Schutz ist der erste Versuch gescheitert (siehe Fallstricke).

Wie lange trainieren?

2000 Schritte, alle 250 speichern, alle Stände behalten

Der beste Stand zeigt sich erst im Vergleich. Acht Zwischenstände kosten nur Speicherplatz, ein zweiter Trainingslauf kostet Stunden.

Welchen Zwischenstand nehmen?

Schritt 1500

Bei 1250 trifft das Bild im Anzug die Identität noch nicht. Ab 1500 wird der Ausdruck starrer, Lachen und Überraschung fallen schwächer aus. 1500 ist der Kompromiss. Den Ausdruck holt man über deutliche Formulierungen im Prompt zurück.

Speicher sparen oder Zeit?

low_vram aus

Mit Quantisierung auf 8 Bit passt das Training auch ohne Sparmodus in 24 GB. Der Sparmodus hätte rund 10,7 Sekunden pro Schritt gekostet statt 4 bis 6.

Fallstricke

Sein Gesicht geht auf jeden Mann über

Der erste Versuch lief ohne Schutz. Schon ab Schritt 500 bekam jeder Mann sein Gesicht, auch ohne Stichwort. Für eine Figur, die mit anderen Menschen in einer Szene stehen soll, ist das unbrauchbar.

LösungDifferential Output Preservation einschalten und das Bild ohne Stichwort bei jedem Zwischenstand mitprüfen.

Drei Porträts mit demselben Prompt ohne Stichwort: ein fremder Mann, dann der Lehrer, dann wieder ein fremder Mann.
Abb. A3.4

Derselbe Prompt ohne Stichwort, dreimal. Links das Basismodell, in der Mitte der erste Versuch nach 500 Schritten, rechts die fertige Fassung mit Schutz.

KI-generiert.

Der Sparmodus verdoppelt die Laufzeit

Mit low_vram: true lagert das Toolkit Teile des Modells aus dem Grafikspeicher aus, und jeder Schritt dauert rund doppelt so lange.

Lösunglow_vram ausschalten, wenn die Quantisierung den Speicher schon ausreichend senkt.

Je länger das Training, desto starrer der Ausdruck

Das LoRA lernt nicht nur das Gesicht, sondern vermutlich auch den häufigsten Ausdruck im Datensatz, ein leichtes Lächeln. Bei späten Ständen lacht er nur noch verhalten.

LösungEinen mittleren Stand wählen und Gefühle im Prompt ausdrücklich beschreiben.

Andere Personen im Bild sehen ihm ähnlich

Auch mit Schutz übernehmen Personen, die in derselben Szene stehen, Züge von ihm. Das Stichwort wirkt auf das ganze Bild, nicht nur auf eine Person.

LösungGesichter der anderen Personen nachträglich austauschen (Lektion A4).

Von Hand: der ganze Weg

Alle Befehle laufen im Kursordner. Die Konfiguration figur/lora/training.yaml liegt fertig im Kit; die Pfade darin gehen von werkzeuge/ai-toolkit aus.

Im Terminal, im Kursordner

# 1. ai-toolkit nach werkzeuge/ (Python 3.10–3.12)
git clone https://github.com/ostris/ai-toolkit.git werkzeuge/ai-toolkit
cd werkzeuge/ai-toolkit
python3 -m venv venv
venv/bin/pip install --no-cache-dir torch==2.13.0 torchvision==0.28.0 torchaudio==2.11.0 --index-url https://download.pytorch.org/whl/cu130
venv/bin/pip install -r requirements.txt
cd ../..

# 2. Modelle nach modelle/ (rund 28 GB)
hf download Comfy-Org/z_image_turbo split_files/diffusion_models/z_image_turbo_bf16.safetensors --local-dir modelle/Comfy-Org/z_image_turbo
hf download Tongyi-MAI/Z-Image-Turbo --exclude "transformer/diffusion_pytorch_model-*" --exclude "assets/*" --local-dir modelle/Tongyi-MAI/Z-Image-Turbo
hf download ostris/zimage_turbo_training_adapter zimage_turbo_training_adapter_v2.safetensors --local-dir modelle/ostris/zimage_turbo_training_adapter

# 3. Stichwort und Klasse eintragen
sed -i 's/l3hr3r/l3hr3r/g; s/a man/a man/g; s/"man"/"man"/' figur/lora/training.yaml

# 4. Trainieren: rund 3,5 Stunden, alle 250 Schritte ein Zwischenstand mit fünf Testbildern
cd werkzeuge/ai-toolkit && venv/bin/python run.py ../../figur/lora/training.yaml && cd ../..

# 5. Testbilder ansehen, Stand wählen (hier 1500), übernehmen und festhalten
ls figur/lora/zwischenstaende/figur/samples/
cp figur/lora/zwischenstaende/figur/figur_000001500.safetensors figur/lora/figur.safetensors
echo "| A3 | $(date +%F) | Trainingsstand 1500 | Gesicht sitzt, Ausdruck noch lebendig |" >> entscheidungen.md
python3 skripte/pruefen.py A3

Die Dateinamen der Zwischenstände folgen dem Muster <name>_<schritt>.safetensors; der Name steht oben in der Konfiguration (name: "figur"). Der Grund in der Entscheidungszeile ist deiner: Schreib hinein, warum du diesen Stand genommen hast.

Mit KI vereinfacht

Fast alles in dieser Lektion kann ein Agent übernehmen: Bildbeschreibungen schreiben, die Konfiguration anlegen, das Training starten und beobachten, Kontaktabzüge bauen und das Bild ohne Stichwort prüfen. Eine Frage bleibt bei dir: welcher Stand der richtige ist.

Der Agent

  • schreibt die 23 Bildbeschreibungen und prüft, dass keine das Gesicht beschreibt
  • legt die Konfiguration an, mit Schutz und Testprompts
  • startet das Training und meldet sich bei Fehlern
  • baut nach jedem Zwischenstand einen Kontaktabzug
  • warnt, sobald das Bild ohne Stichwort ihm ähnelt

Du

  • wählst den Zwischenstand
  • entscheidest, ob der Ausdruck genügt

Mit dem Skill avatar-figur reicht ein Satz an den Agenten; Stichwort und Klasse liest er aus figur.json:

Trainiere ein LoRA für meine Figur aus figur/datensatz/
und zeig mir alle 250 Schritte den Kontaktabzug.

Der Skill ist in Vorbereitung und erscheint mit dem Video zu dieser Lektion.

Mit lokalem Qwen: Während des Trainings braucht ai-toolkit die ganze Grafikkarte. Das Sprachmodell muss dafür entladen sein; mit OLLAMA_KEEP_ALIVE=0 aus der Einrichtung geschieht das nach jeder Antwort von selbst. Prüf vor dem Start mit nvidia-smi, dass kein ollama-Prozess mehr Speicher belegt.