Ein ChatGPT-Klon auf Basis von GPT-2, implementiert in 3000 Byte C (2023)
(nicholas.carlini.com)-
Implementierung eines ChatGPT-Klons
- Dieses Programm ist eine Implementierung von GPT-2 ohne Abhängigkeiten.
- Es lädt Gewichtungsmatrizen aus TensorFlow-Dateien und BPE-Dateien und tokenisiert die Eingabe mit einem einfachen Byte-Pair-Encoder.
- Es implementiert ein grundlegendes lineares Algebra-Paket, definiert die Transformer-Architektur, führt die Transformer-Inferenz aus und detokenisiert die Ausgabe mit einem BPE-Decoder.
- Es ist in etwa 3000 Byte C geschrieben.
- Es ist effizient optimiert, sodass das GPT-2-Small-Modell auf modernen Geräten innerhalb weniger Sekunden antworten kann.
- Es implementiert KV-Caching und einen effizienten Matrixmultiplikationsalgorithmus.
-
Programmstruktur
- Grundlegende Matrix-Mathematikbibliothek (700 Byte)
- Schnelle Matrixmultiplikation (300 Byte)
- Neuronale Netzwerk-Layer (300 Byte)
- Transformer-Modell (600 Byte)
- Byte-Pair-Encoding (400 Byte)
- Ein-/Ausgabe (200 Byte)
- Laden der Gewichte (300 Byte)
- Laden des Byte-Pair-Encoding (300 Byte)
-
Hintergrund zu ChatGPT und Transformern
- ChatGPT ist eine Anwendung, mit der man mit einem Sprachmodell interagieren kann.
- GPT-4 ist das neueste Modell und sehr beeindruckend.
- Dieses C-Programm bildet die Funktionsweise von ChatGPT mit GPT-2 nach, einem vergleichsweise schwachen Modell aus dem Jahr 2019.
- GPT-2 ist ein Transformer, der eine Sequenz von Wörtern fester Länge als Eingabe erhält und das nächste Wort vorhersagt.
-
Erklärung des C-Codes
-
Einstieg in die Matrix-Mathematik (700 Byte)
- Neuronale Netzwerke bestehen aus Matrixoperationen.
- Mit einer minimalen Matrixdefinition wird eine Matrixbibliothek aufgebaut.
- Mithilfe von Makros wird gemeinsame Logik in Meta-Routinen ausgelagert.
-
Schnelle Matrixmultiplikation (300 Byte)
- Die grundlegende Matrixmultiplikation wird mit drei Schleifen implementiert.
- Aufgrund der Funktionsweise von Speicher und Cache ist es schneller, denselben Speicher wiederholt zu lesen und zu schreiben.
-
Neuronale Netzwerk-Layer (300 Byte)
- Um den Transformer zu schreiben, werden einige spezielle neuronale Netzwerk-Layer definiert.
- Es werden unter anderem die GELU-Aktivierungsfunktion und eine Funktion zum Setzen der unteren Dreiecksmatrix für kausale Aufmerksamkeit implementiert.
-
Transformer-Architektur (600 Byte)
- Der Transformer wird in 600 Byte implementiert.
- In jeder Schicht werden Keys, Queries und Values berechnet, eine Aufmerksamkeitsmatrix erzeugt und die Ergebnisse kombiniert.
-
Byte-Pair-Encoding (400 Byte)
- Sprachmodelle benötigen Eingaben fester Größe, daher werden Wortfragmente verwendet, um Token zu erzeugen.
- Ein gegebenes Wort wird in einzelne Zeichen zerlegt, und benachbarte Token-Paare werden zusammengeführt.
-
Laden der Gewichte (300 Byte)
- Die Gewichte des neuronalen Netzwerks werden von der Festplatte geladen.
- Die Gewichte sind als 32-Bit-Gleitkommazahlen serialisiert.
-
Laden des Byte-Pair-Encoding (300 Byte)
- Das Byte-Pair-Encoding-Vokabular wird von der Festplatte geladen.
- Das Dateiformat besteht aus einer Liste von Byte-Pair-Encoding-Einträgen.
-
-
Fazit
- Jahrzehnte der Entwicklung im maschinellen Lernen lassen sich auf einige tausend Byte komprimieren.
- Ein Beispiel für ein einfaches neuronales Netzwerk, das alles außer den tatsächlichen Modellgewichten enthält.
1 Kommentare
Hacker-News-Kommentare
Als ich mit GPT-2 Gespräche mit einem Freund simuliert habe, war das unterhaltsam und manchmal erstaunlich präzise. Ich frage mich, ob der große Sprung zwischen GPT-2 und GPT-3 an größeren Modellen, mehr Daten oder an beidem lag. RLHF macht einen großen Unterschied, aber schon das Basismodell von GPT-3 war mit genügend Beispielen sehr nützlich
Ein gutes Beispiel dafür, wie einfach einfache neuronale Netze tatsächlich sind. KI ist die schwarze Magie, die wir benutzen, um Geld zu verdienen
Ich habe den Code nicht ausgeführt, bin aber von der geringen Größe beeindruckt. Frühe ELISA-Programme waren größer. In den letzten 4 Jahren wurde es möglich, das auf Byte-Ebene passend zu machen. Wenn jemand einen Hinweis hat, wo die Magie steckt, würde ich mich über eine Erklärung freuen. Ich frage mich, ob es an der GELU-Funktion liegt oder an dem Modell, das über ein bash-Skript heruntergeladen wird
GPT-2 hat mein Lieblingsmärchen geschrieben. Link: The Princess, the Fairy Godmother, and the Chest
Ich frage mich, ob GPT-2 tatsächlich dafür angepasst wurde, für Chats verwendet zu werden. Falls nicht, halte ich es für etwas weit hergeholt, das einen ChatGPT-Klon zu nennen
LISP ist nicht immer besser als C. Diesmal ist es in Ordnung. Falls jemand den Code-Link übersehen hat, hier ist er: C-Chat-GPT-2
Ich frage mich, auf welcher Hardware das laufen kann. Ob man quantisierte Gewichte von Hugging Face verwenden kann und für welche Probleme oder Anfragen es sich besonders gut eignet
Heutzutage kann man mit gptscript ganz einfach sein eigenes ChatGPT umsetzen. Link: gptscript
Ich verstehe nicht, wie C-Makros regulären Ausdrücken ähneln sollen. C-Makros gleichen Wörter ab und ersetzen sie durch anderen Text. Reguläre Ausdrücke gleichen relativ komplexe Muster in Text ab und führen nicht von sich aus Textersetzungen durch
Ich frage mich, ob das jemand lokal ausgeführt hat, um zu sehen, welche Ausgaben dieses GP2 erzeugt