{d}GPT

 

Was ist das hier?

Es ist ein Freizeitprojekt, mit dem ich mehr über KI-Modelle und deren Training lernen möchte (ich bin kompletter AI-Noob). 

Was ich habe: einen Dildo-Generator, der 3D-Modelle aus einem Bézierpfad erzeugen kann. 

Was ich möchte: ein eigenes Modell mit den Testdaten aus dem Dildo-Generator trainieren – und das ursprüngliche Tool mit einem zugrunde liegenden, vortrainierten Transformer nachbilden.

 

Gedankenspiel

ChatGPT – ein Generative Pretrained Transformer – nimmt eine Texteingabe und gibt einen Text aus. Ein Text-zu-Text-Transformer, der mit riesigen Textmengen trainiert wurde, kann aus einem kleinen Prompt ein Gedicht, ein Programm, eine E-Mail schreiben.

Wunsch

Warum also soll ein anderer Transformer mir nicht ein Dildomodell generieren können – zum Beispiel aus einer schnellen Skizze?

 

 

Trainingsdaten – woher?

In diesem Repository befindet sich unter ./node-store-server/ ein Tool. Es dient dem einzigen Zweck, einen kleinen Webserver bereitzustellen, der zufällig generierte Dildo-Bilder entgegennimmt und abspeichert:

  • Eine Strichzeichnung
  • Eine Sculptmap-Grafik, welche die XYZ-Daten des 3D-Modells kodiert
  • Ein 3D-Vorschaubild (nur zur Validierung, wird nicht verwendet)

     

Der Server speichert die generierten Daten unter ./node-store-server/uploads/ auf der lokalen Festplatte. Der  neu geschriebene »Dildo Randomizer« des Dildo Generators soll genutzt werden, um eine ausreichend große Anzahl an Trainingsdatenpaaren (z. B. 10.000) zu generieren.

So starte ich meinen Server, damit er Datenpaare aus dem Dildo-Generator entgegennehmen und abspeichern kann:

   cd ./node-store-server/
   npm run server    

Dadurch wird ein Express-Server gestartet, der unter localhost:1337/model/put Daten empfängt.

 

Aufbau der Trainingsdaten

 

Eingabebilder: 2D Zeichnung – ein Screenshot des Bézier-Pfades

Gewünschte Ausgabebilder: Sculptmap-Bild mit kodierten xyz-Koordinaten des 3D-Modells

 

Zusätzlich: 3D-Vorschau des erwarteten Modells (nur zur Visualisierung – Bild wird nicht im Prozess genutzt)

 

Hintergrund: in Secondlife habe ich gute Erfahrungen gemacht mit sogenannen Sculptmaps – also kleinen Grafiken, die simple 3D-Modell kodieren. Wegen ihrer geringen Komplexität scheinen sie mir gut geeignet für eine Verarbeitung mit einem LLM (spricht man bei Grafikverarbeitung noch von Language-Models?).

 

Testdaten? Ja klar.

Wie viele? 10.000 bitte.

 

Nun habe ich genug Testdaten und möchte ein LLM trainieren, das dies können soll:

 

Erinnerung: das hier kann ich bereits.

 

Wenn ihr eure alten Sculptmaps prüfen wollt: hier gibt es einen Scultpmap-Viwer.

Pytorch

Für die Implementierung nutze ich `pytorch`.  Der Trainingsprozess kann mit dem `train.py`-Script gestartet werden:

 

Trainingsdauer

Das Modell wurde in 190 Epochen trainiert und der Prozess hat 4 Nächte auf meinem Laptop gedauert (eigentlich sollten es 200 Epochen sein, aber nach der 190. gab es bereits keine messbaren Verbesserungen mehr). Wahrscheinlich kann man die Trainingszeit noch optimieren, aber ich wollte einfach mal ein erstes Ergebnis erhalten.

 

Geständnis

Den Trainingsteil mit Pytorch habe ich nicht selbst programmiert, sondern von einer Coding-AI per Problembeschreibung generieren lassen. Das nennt man wohl Vibe Coding.

 

Testen des Modells

Mit dem `infer.py`-Script kann nun das erzeugte LLM `checkpoints/best.pt` genutzt werden, um eine 2D-Linienzeichnung mit 256x256 px in eine Sculptmap umzuwandeln.

 

Theorie und Praxis

Wenn alles gut läuft, dann sollte ein Eingabebild aus den Testdaten ungefähr ein korrektes 3D-Modell erzeugen.

Eingabe (Bild wie oben):

 

Ausgabe aus dem LLM:

 

Erwartetes Ergebnis:

 

Wie man sieht, gibt es ein Ergebnis, aber es ist nicht 100%ig das, was das Eingabebild erzeugen sollte (immerhin ist dies ein Teil der Trainingsdaten).

Vor allem fällt auf, dass das Modell an den Kanten nicht geschlossen ist – und das, obwohl jedes einzelne Trainingsmodel definitiv geschlossen war (linke und rechte Kante jeder einzelnen Scultpmap sind identisch).

 

 

LLM im Browser zur Verfügung stellen

Cool, cool. Ich kann also ein LLM trainieren (das Trainingsergebnis ist noch optimierbar) und dieses Modell am Ende für die Generierung neuer Daten verwenden.

 

Jetzt fehlt noch ein Web-Interface. Ich habe also die Coding-AI gebeten, mit ein Web-Frontend für das Modell zu schreiben:

  • Es verwendet ONNX
    • Vorteil: das LLM wird komplett im Browser ausgeführt, man benötigt also kein Backend.
    • Nachteil: das Modell wird exposed, man kann es also theoretisch downloaden.
  • ONNX bietet die Möglichkeit, das Modell in fp16 umzuwandeln: 16 bit floating point format
    • dies spart im Vergleich zum 32 bit double format 50% der ursprünglichen Dateigröße.
    • mein LLM (32MB) ist damit nur noch 16MB groß.
    • Die Verluste sind verkraftbar.

 

Konvertieren des LLMs in das ONNX-Format:

 

Das ONNX-Modell kann nun in einem Web-Client ausgeführt werden.

 

 

Auch hier sieht man, dass die Ergebnisse noch nicht perfekt sind : )

 

 

Leider liefern selbst die Originaltestdaten keine perfekten Ergebnisse, obwohl ich 10.000 Trainingspaare verwendet habe. Handgezeichnete Bilder führen sogar noch zu schlechteren Ergebnissen.

Hier muss ich wohl nochmal recherchieren …

 

Wie immer gibt es den gesamten Code in diesem Githbub-Repository.
Die Tesdaten liegen hier (30k Dateien, 563MB)
Das ONNX-Modell liegt hier ab.

 

This is Ika signing off. –,–