minGPT
Eine PyTorch-Neuimplementierung von GPT, sowohl für Training als auch für Inferenz. minGPT versucht, klein, sauber, interpretierbar und lehrreich zu sein, da die meisten derzeit verfügbaren GPT-Modellimplementierungen etwas umfangreich sein können. GPT ist kein kompliziertes Modell und diese Implementierung umfasst angemessenerweise etwa 300 Codezeilen (siehe mingpt/model.py). Alles, was passiert, ist, dass eine Folge von Indizes in einen Transformer eingespeist wird und eine Wahrscheinlichkeitsverteilung über den nächsten Index in der Folge herauskommt. Der größte Teil der Komplexität besteht einfach darin, aus Effizienzgründen geschickt mit der Stapelverarbeitung umzugehen (sowohl über Beispiele als auch über die Sequenzlänge hinweg).
Hinweis (Januar 2023) : Obwohl ich möglicherweise weiterhin einige Details akzeptiere und ändere, befindet sich minGPT in einem halbarchivierten Zustand. Weitere aktuelle Entwicklungen finden Sie in meinem neu geschriebenen nanoGPT. Grundsätzlich wurde minGPT an einer Vielzahl von Orten (Notizbüchern, Blogs, Kursen, Büchern usw.) referenziert, was dazu führte, dass ich weniger bereit war, die größeren Änderungen vorzunehmen, die ich vornehmen wollte, um den Code voranzutreiben. Ich wollte auch die Richtung ein wenig ändern, von einem ausschließlichen Fokus auf Bildung zu etwas, das immer noch einfach und hackbar ist, aber Biss hat (reproduziert mittelgroße Industrie-Benchmarks, akzeptiert einige Kompromisse, um die Laufzeiteffizienz zu steigern usw.).
Die minGPT-Bibliothek besteht aus drei Dateien: mingpt/model.py enthält die eigentliche Transformer-Modelldefinition, mingpt/bpe.py enthält einen leicht überarbeiteten Byte-Paar-Encoder, der genau wie OpenAI in GPT, mingpt/trainer, zwischen Text und Sequenzen von Ganzzahlen übersetzt. py ist ein (GPT-unabhängiger) PyTorch-Boilerplate-Code, der das Modell trainiert. Dann gibt es eine Reihe von Demos und Projekten, die die Bibliothek im projects
verwenden:
-
projects/adder
trainiert ein GPT von Grund auf, um Zahlen hinzuzufügen (inspiriert durch den Additionsabschnitt im GPT-3-Artikel) -
projects/chargpt
trainiert ein GPT als Sprachmodell auf Zeichenebene für eine Eingabetextdatei -
demo.ipynb
zeigt anhand eines einfachen Sortierbeispiels eine minimale Verwendung von GPT
und Trainer
in einem Notizbuchformat -
generate.ipynb
zeigt, wie man ein vorab trainiertes GPT2 laden und nach Aufforderung Text generieren kann
Bibliotheksinstallation
Wenn Sie import mingpt
möchten:
git clone https://github.com/karpathy/minGPT.git
cd minGPT
pip install -e .
Verwendung
So instanziieren Sie ein GPT-2 (124-MB-Param-Version):
from mingpt . model import GPT
model_config = GPT . get_default_config ()
model_config . model_type = 'gpt2'
model_config . vocab_size = 50257 # openai's model vocabulary
model_config . block_size = 1024 # openai's model block_size (i.e. input context length)
model = GPT ( model_config )
Und so würden Sie es trainieren:
# your subclass of torch.utils.data.Dataset that emits example
# torch LongTensor of lengths up to 1024, with integers from [0,50257)
train_dataset = YourDataset ()
from mingpt . trainer import Trainer
train_config = Trainer . get_default_config ()
train_config . learning_rate = 5e-4 # many possible options, see the file
train_config . max_iters = 1000
train_config . batch_size = 32
trainer = Trainer ( train_config , model , train_dataset )
trainer . run ()
Ein konkreteres Beispiel finden Sie unter demo.ipynb
.
Unit-Tests
Die Abdeckung ist noch nicht besonders toll, aber:
python -m unittest discover tests
Todos
- Fügen Sie eine gpt-2-Feinabstimmungsdemo für eine beliebige Textdatei hinzu
- Dialog-Agent-Demo hinzufügen
- bessere Ergebnisdokumente für bestehende Projekte (adder, chargpt)
- Fügen Sie gemischte Präzision und zugehörige Trainingsskalierungs-Goodies hinzu
- verteilte Schulungsunterstützung
- Reproduzieren Sie einige Benchmarks in Projekten/, z. B. text8 oder eine andere Sprachmodellierung
- Richtige Protokollierung statt Druckanweisung, Amateurstunde, haha
- Ich sollte wahrscheinlich eine Datei „requirements.txt“ haben ...
- Es sollte möglich sein, viele andere Modellgewichte als nur gpt2-* zu laden
Referenzen
Code:
- openai/gpt-2 hat die Modelldefinition in TensorFlow, aber nicht den Trainingscode
- openai/image-gpt hat einige modernere gpt-3-ähnliche Modifikationen im Code, auch eine gute Referenz
- Huggingface/Transformers hat ein Beispiel für die Sprachmodellierung. Es ist voll funktionsfähig, aber daher auch etwas schwierig zu verfolgen. Beispielsweise verfügen einige große Funktionen über bis zu 90 % ungenutzten Code hinter verschiedenen Verzweigungsanweisungen, der in der Standardeinstellung der einfachen Sprachmodellierung ungenutzt bleibt
Papiere + einige Implementierungshinweise:
Verbesserung des Sprachverständnisses durch generatives Pre-Training (GPT-1)
- Unser Modell folgt weitgehend der ursprünglichen Transformatorarbeit
- Wir haben einen 12-Schicht-Decoder-Transformator mit maskierten Selbstaufmerksamkeitsköpfen (768 dimensionale Zustände und 12 Aufmerksamkeitsköpfe) trainiert. Für die positionsbezogenen Feed-Forward-Netzwerke haben wir 3072 dimensionale innere Zustände verwendet.
- Adams maximale Lernrate beträgt 2,5e-4. (später verwendet GPT-3 für diese Modellgröße 6e-4)
- LR-Zerfall: linear von Null über die ersten 2000 Aktualisierungen ansteigend und unter Verwendung eines Kosinusplans auf 0 getempert
- Wir trainieren für 100 Epochen auf Minibatches von 64 zufällig ausgewählten, zusammenhängenden Sequenzen von 512 Token.
- Da Layernorm im gesamten Modell häufig verwendet wird, war eine einfache Gewichtsinitialisierung von N(0, 0,02) ausreichend
- Bytepair-Encoding (BPE)-Vokabular mit 40.000 Zusammenführungen
- Rest-, Einbettungs- und Aufmerksamkeits-Dropouts mit einer Rate von 0,1 für die Regularisierung.
- modifizierte Version der in (37) vorgeschlagenen L2-Regularisierung mit w = 0,01 für alle Nicht-Bias- oder Gain-Gewichte
- Für die Aktivierungsfunktion haben wir die Gaussian Error Linear Unit (GELU) verwendet.
- Wir haben gelernte Positionseinbettungen anstelle der in der Originalarbeit vorgeschlagenen Sinusversion verwendet
- Zur Feinabstimmung: Wir fügen dem Klassifikator einen Dropout mit einer Rate von 0,1 hinzu. Lernrate von 6,25e-5 und eine Batchgröße von 32,3 Epochen. Wir verwenden einen linearen Lernratenabfallplan mit einer Aufwärmphase von mehr als 0,2 % des Trainings. λ wurde auf 0,5 eingestellt.
- Das GPT-1-Modell besteht aus 12 Schichten und d_model 768, ~117 Millionen Parameter
Sprachmodelle sind unbeaufsichtigte Multitasking-Lernende (GPT-2)
- LayerNorm wurde an den Eingang jedes Unterblocks verschoben, ähnlich einem Restnetzwerk vor der Aktivierung
- Nach dem letzten Selbstaufmerksamkeitsblock wurde eine zusätzliche Ebenennormalisierung hinzugefügt.
- Es wird eine modifizierte Initialisierung verwendet, die die Akkumulation auf dem Restpfad mit der Modelltiefe berücksichtigt. Wir skalieren die Gewichte der Restschichten bei der Initialisierung um den Faktor 1/√N, wobei N die Anzahl der Restschichten ist. (Seltsam, weil ich in ihrem veröffentlichten Code nur eine einfache Verwendung des alten 0.02 finden kann ... in ihrer Veröffentlichung von image-gpt habe ich festgestellt, dass es für c_proj verwendet wird, und selbst dann nur für attn, nicht für mlp. huh. https: //github.com/openai/image-gpt/blob/master/src/model.py)
- Der Wortschatz wird auf 50.257 erweitert
- Erhöhen Sie die Kontextgröße von 512 auf 1024 Token
- Es wird eine größere Chargengröße von 512 verwendet
- GPT-2 verwendete 48 Schichten und d_model 1600 (im Vergleich zu ursprünglich 12 Schichten und d_model 768). ~1.542B Parameter
Sprachmodelle sind Few-Shot-Lernende (GPT-3)
- GPT-3: 96 Schichten, 96 Köpfe, mit d_model von 12.288 (175B Parameter).
- GPT-1-ähnlich: 12 Schichten, 12 Köpfe, d_model 768 (125M)
- Wir verwenden dasselbe Modell und dieselbe Architektur wie GPT-2, einschließlich der darin beschriebenen modifizierten Initialisierung, Vornormalisierung und reversiblen Tokenisierung
- Wir verwenden abwechselnd dichte und lokal gebänderte, spärliche Aufmerksamkeitsmuster in den Schichten des Transformators, ähnlich dem Sparse Transformer
- Wir haben immer die Feedforward-Schicht, die viermal so groß ist wie die Engpassschicht, dff = 4 ∗ dmodel
- Alle Modelle verwenden ein Kontextfenster mit nctx = 2048 Token.
- Adam mit β1 = 0,9, β2 = 0,95 und eps = 10−8
- Alle Modelle verwenden einen Gewichtsabfall von 0,1, um ein geringes Maß an Regularisierung bereitzustellen. (HINWEIS: GPT-1 verwendete 0,01, glaube ich, siehe oben)
- Beschneiden Sie die globale Norm des Farbverlaufs bei 1,0
- Lineares LR-Aufwärmen über die ersten 375 Millionen Token. Verwenden Sie dann den Kosinuszerfall, um die Lernrate auf 10 % seines Wertes zu senken, also auf über 260 Milliarden Token.
- Erhöhen Sie die Stapelgröße schrittweise linear von einem kleinen Wert (32.000 Token) bis zum vollen Wert über die ersten 4–12 Milliarden Token des Trainings, abhängig von der Modellgröße.
- Es wird immer das vollständige Zeitkontextfenster der Größe 2048 mit einem speziellen END OF DOCUMENT-Token-Trennzeichen verwendet
Generatives Vortraining aus Pixeln (Bild-GPT)
- Wenn wir mit Bildern arbeiten, wählen wir die Identitätspermutation πi = i für 1 ≤ i ≤ n, auch bekannt als Rasterordnung.
- Wir erstellen unsere eigene 9-Bit-Farbpalette, indem wir (R, G, B) Pixelwerte mithilfe von k-means mit k = 512 gruppieren.
- Unser größtes Modell, iGPT-XL, enthält L = 60 Schichten und verwendet eine Einbettungsgröße von d = 3072 für insgesamt 6,8B Parameter.
- Unser nächstgrößeres Modell, iGPT-L, ist im Wesentlichen identisch mit GPT-2 mit L = 48 Schichten, enthält jedoch eine etwas kleinere Einbettungsgröße von d = 1536 (gegenüber 1600) für insgesamt 1,4 B Parameter.
- Wir verwenden den gleichen Modellcode wie GPT-2, außer dass wir Gewichte auf schichtabhängige Weise wie in Sparse Transformer (Child et al., 2019) initialisieren und alle Projektionen, die Logits erzeugen, auf Null initialisieren.
- Wir trainieren auch iGPT-M, ein 455M-Parametermodell mit L = 36 und d = 1024
- iGPT-S, ein 76M-Parametermodell mit L = 24 und d = 512 (okay, und wie viele Köpfe? sieht aus wie der Github-Code behauptet 8)
- Beim Vortraining von iGPT-XL verwenden wir eine Stapelgröße von 64 und trainieren für 2 Mio. Iterationen. Für alle anderen Modelle verwenden wir eine Stapelgröße von 128 und trainieren für 1 Mio. Iterationen.
- Adam mit β1 = 0,9 und β2 = 0,95
- Die Lernrate wird für eine Epoche aufgewärmt und fällt dann auf 0 ab
- Wir haben keinen Gewichtsabfall verwendet, da die Anwendung eines kleinen Gewichtsabfalls von 0,01 die Darstellungsqualität nicht verändert hat.
- iGPT-S lr 0,003
- Es wird kein Dropout verwendet.
Lizenz
MIT