Dieses Repository enthält Code, um unsere in "Cramming: Training eines Sprachmodells an einer einzelnen GPU an einem Tag" beschriebenen Forschung zu replizieren. Wir experimentieren mit einem Sprachmodell, das ein Bert-Modell mit begrenztem Computer vorbereitet und sich fragen, wie schlecht es wirklich sein kann?
Hier finden Sie unser Papier: https://arxiv.org/abs/2212.14034 und das Abstract unten:
Die jüngsten Trends bei der Sprachmodellierung haben sich auf die Erhöhung der Leistung durch Skalierung konzentriert und zu einer Umgebung geführt, in der die Schulungssprachmodelle für die meisten Forscher und Praktiker unerreichbar sind. Während die meisten in der Community fragen, wie man die Grenzen der extremen Berechnung überschreitet, stellen wir die entgegengesetzte Frage:
Wie weit können wir mit einer einzigen GPU an nur einem Tag kommen?
Wir untersuchen die nachgeschaltete Leistung, die mit einem transformatorbasierten Sprachmodell erreichbar ist, das mit maskierter Sprachmodellierung für einen einzelnen Tag bei einer einzelnen Verbraucher -GPU vollständig ausgebildet wurde. Abgesehen von der Wiederanalyse nahezu alle Komponenten der Vorbereitungspipeline für dieses Szenario und die Bereitstellung einer modifizierten Pipeline mit Leistung in der Nähe von Bert untersuchen wir, warum Skalierung schwierig ist und welche Modifikationen die Leistung in diesem Szenario tatsächlich verbessern. Wir liefern Hinweise darauf, dass die Leistung selbst in dieser eingeschränkten Umgebung die in großem Komputentumgebungsumgebungen beobachteten Skalierungsgesetze genau folgt. Durch die Linse der Skalierungsgesetze kategorisieren wir eine Reihe von jüngsten Verbesserungen von Training und Architektur und diskutieren ihre Verdienste und ihre praktische Anwendbarkeit (oder das Fehlen davon) für die begrenzte Berechnung.
Sie benötigen Pytorch 2.0, um den neuen Code auszuführen. Wenn Sie auf Pytorch 1.*bleiben möchten, können Sie das Tag Last1.13release überprüfen. Das neue Modell, das mit der neuen Codebasis trainiert wurde, ist mit dem gleichen Budget um 1-2% besser. Der Kontrollpunkt finden Sie unter https://huggingface.co/jonasgeeiping/crammed-tbert. Der alte Checkpoint ist jetzt https://huggingface.co/jonasgeeiping/crammed-tbert-legacy.
Außerdem hat sich die Datenvorverarbeitung verbessert. Sie können jetzt Daten direkt von Huggingface aus dem Upload unter https://huggingface.co/datasets/jonasgeping/the_pile_wordpiecex32768_2efdb9d060d1ae95faF952c1a50f020 streamen.
Einstellung:
pip install . So installieren Sie alle Abhängigkeiten.
torch (mindestens Version 2.1)transformers , tokenizers , datasets , evaluatehydra-corepsutil , pynvml , safetensorseinops pip install . So installieren Sie alle Pakete und Skripte.curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh , dann git clone https://github.com/google-research/deduplicate-text-datasets/tree/dev-v1 und dann cargo install --target-dir ../cramming/dedupUm eine minimale Installation zu überprüfen, können Sie ausführen
python pretrain.py name=test arch=hf-bert-base train=bert-base data=sanity-check-2 dryrun=True impl.microbatch_size=2
Dieser Befehl verarbeitet einen kleinen Datensatz für die Vernunftprüfung und führt einen einzigen Trainingsschritt aus.
Verwenden Sie das Skript von pretrain.py , um mit begrenztem Rechnungsvorgang vorab zu sein. Dieses Repository verwendet Hydra (https://hydra.cc/docs/intro/), sodass alle Felder in cramming/config in der Befehlszeile geändert werden können. Zum Beispiel kann das budget durch Bereitstellung von budget=48 als zusätzliches Argument (für 48 Stunden) geändert werden, oder die Lernrate kann über train.optim.lr=1e-4 . Schauen Sie sich den Konfigurationsordner an, um alle Argumente anzuzeigen.
Ihr erster Schritt sollte darin bestehen, die installierten Pakete zu überprüfen. Dazu können Sie python pretrain.py dryrun=True ausführen. Von dort aus können Sie zusätzliche Funktionen aktivieren. Ändern Sie beispielsweise die Architektur, z. B. arch=bert-original und Trainingssetup- train=bert-original . Um ein Sprachmodell wirklich zu trainieren, müssen Sie sich vom Vermögensprüfdatensatz auf mindestens data=pile-readymade entfernen. Wählen Sie dann ein verbessertes Trainingsaufbau, z. B. train=bert-o4 und ein verbessertes Modelllayout, z. B. arch=crammed-bert .
Die Datenquellen aus data.sources werden vor dem Start des Trainings gelesen, normalisiert und vorbereitet und in eine Datenbank zwischengespeichert. Nachfolgende Anrufe mit derselben Konfiguration werden diese Datenbank mit tokenisierten Sequenzen wiederverwendet. Standardmäßig wird während dieses Prozesses auch ein neuer Tokenizer konstruiert und gespeichert. Wichtige Datenoptionen sind data.max_entries_in_raw_dataset , die definiert, wie viel Rohdaten geladen werden. Beispielsweise wird für eine große Datenquelle wie C4 nur eine Untergruppe von Rohdaten heruntergeladen. max_seq_in_tokenized_dataset Engpässe Wie viele verarbeitete Sequenzen werden in der Datenbank gespeichert. Diese Zahl sollte größer sein als die Anzahl der Sequenzen, die im Budget gelesen werden.
Zusätzliche Anmerkungen:
data=pile-readymadepython pretrain.py data=... dryrun=True zu betreiben. Spätere Läufe können dann die zwischengespeicherten Daten wiederverwenden.impl.threads . Insbesondere der Deduplizierungscode erfordert erhebliche Mengen an RAM.bookcorpus-wikipedia durchführen, die vergleichsweise schnell vorverarbeitet und erst dann den vollständigen und gefilterten C4 untersuchen. Als Referenz und wenn Sie nur an der Änderung von Training/Architektur interessiert sind, finden Sie hier einige vorverarbeitete Datensätze:
Diese Datenquellen können gestreamt werden. Zu diesem Zweck einfache Set data=pile-readymade .
Vorverarbeitete Daten sind bequem zu arbeiten, und ich denke, dass Änderungen an der Datenverarbeitung und -filterung im Vergleich zu Schulungen und Architektur im Vergleich zu Schulungen und Architektur weiterhin nicht erforscht sind. Es kann möglicherweise mehr Gewinne mit besseren Daten erzielen als bei anderen Änderungen.
Sie finden jetzt einen Checkpoint für die endgültige Version, die auf the-pile unter https://huggingface.co/jonasgeeiping/crammed-tbert trainiert ist.
Verwenden Sie eval.py , um die vorbereiteten Modelle für Kleber (oder einige Kleberaufgaben) zu bewerten. Dieses Skript sucht nach gespeicherten Modellen im Basisverzeichnis. Angesichts des Namens eines vorherigen Laufs wird dieses Skript standardmäßig den neuesten Kontrollpunkt mit diesem Namen abrufen und dann die Bewertungen ausführen.
Sie können Läufe auf Ihrem Gewicht und Verzerrungen protokollieren. Um dies zu tun, ändern Sie einfach wandb.entity und wandb.project in der Befehlszeile oder beim cramming/config/wandb/default.yaml .
Um das im Papier besprochene endgültige Rezept zu replizieren, laufen Sie
python pretrain.py name=amp_b8192_cb_o4_final arch=crammed-bert train=bert-o4 data=pile-readymade
nach vorab und
python eval.py eval=GLUE_sane name=amp_b8192_cb_o4_final eval.checkpoint=latest impl.microbatch_size=16 impl.shuffle_in_dataloader=True impl.compile_torch=False
Um das Modell zu bewerten. Das Rezept namens "Curmeed Bert" in der Arbeit entspricht der Architektur namens crammed-bert in der Konfiguration, die mit dem Training Setup bert-o4 für Daten the-pile trainiert wurde.
Für eine optimale Leistung müssen Sie die neueste Pytorch -Nachtnacht einstellen und die folgenden Induktorvariablen festlegen (die das Setup torch.compile mit Induktor ändern):
max_autotune_gemm: Truemax_autotune_pointwise: Falsetriton.cudagraphs: Truetriton.cudagraph_trees: False Vorabbau: Single GPU, Original -Bert -Einstellungen:
python pretrain.py name=bert data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000
Multi-GPU, Original-Bert-Einstellungen:
torchrun --nproc_per_node=4 --standalone pretrain.py name=bert4gpu data=bookcorpus-wikipedia arch=bert-original train=bert-original budget=10000000 impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
Bewerten Sie einen Checkpoint für den Umarmungsfaktor (in diesem Beispiel auf RTE):
python eval.py eval=GLUE_sane eval/tasks=rte name=bert-finetuning eval.checkpoint=hf://bert-base-uncased impl.shuffle_in_dataloader=True impl.compile_torch=False impl.microbatch_size=16
Bewerten Sie einen lokalen Checkpoint (Deaktivieren Sie die Kompilierung, die derzeit feste Formen erwartet):
python eval.py eval=GLUE_sane eval/tasks=rte name=NAME_OF_PRETRAINING_RUN eval.checkpoint=latest impl.shuffle_in_dataloader=True impl.compile_torch=False
Vernunftprüfung für verteilten Code auf CPU:
CUDA_VISIBLE_DEVICES= torchrun --nproc_per_node=2 --standalone pretrain.py name=cpu_multi_check dryrun=True data=sanity-check-2 impl.dist_backend=gloo impl.fullgraph=false impl._inductor_vars.triton.cudagraphs=False
Weitere Beispiele für Rezepte finden Sie im Ordner /scripts .
Die folgenden Optionen sind derzeit gebrochen/begrenzt/in der Arbeit. Verwenden Sie diese nach eigenem Ermessen. Natürlich werden alle Beiträge hier sehr geschätzt. Sie können mir auch weitere Fragen zu einem dieser Punkte senden, wenn Sie sie untersuchen möchten.
Last1.13release -Tag erhältlich. Wenn Sie daran interessiert sind, einige dieser Optionen wiederzubeleben. Öffnen Sie eine Pull -Anfrage mit Updates für die neue Codebasis.Bitte kontaktieren Sie uns mit Fragen oder öffnen Sie ein Problem auf GitHub.