
Dies ist der Code für die Experimente mit Tinystories aus dem Papier: Mechanistisch die Auswirkungen der Feinabstimmung auf prozedural definierte Aufgaben analysieren. Der Code basiert auf dem fantastischen https://github.com/karpathy/llama2.c.
Zum Installieren, klonen Sie das Repo, erstellen Sie eine virtuelle Umwelt/was auch immer, und pip install -r requirements.txt .
Um den Datensatz herunterzuladen, führen Sie python tinystories.py download --data_cache_dir <path_to_data_dir> aus <path_to_data_dir>
Der Code generiert Datensätze und tokenisiert sie vor dem Training unter Verwendung von python tinystories pretokenize <args> . Um die unterschiedlichen Datensätze und Trainingsprotokolle für Vorab- und Feinabstimmungen (z. B. Löschung und Wiederherstellung) anzugeben, verwenden wir unterschiedliche Filterargumente für den Befehl pretokenize .
Es gibt auch einen Befehl, einen Tokenizer zu trainieren, wobei python tinystories train_vocab verwendet wird. Dies besteht aus zwei Dateien, tok8192.model und tok8192.vocab . Ich habe dies bereits getan, und der Tokenizer befindet sich bei data/tok8192.{model/vocab} . Sie müssen diese Dateien in die <path_to_data_dir> verschieben, die Sie für Ihre Experimente verwenden werden.
Stellen Sie sicher, dass Sie sich bei wandb anmelden, damit Ihre Experimente dort angemeldet sind.
Wie oben erwähnt, wird jedes Feinabstimmungsprotokoll von einem Datensatz gesteuert, den wir vor Beginn des Trainings generieren. Zu jedem Training müssen wir zunächst die entsprechenden Datensätze mit python tinystories pretokenize ... :
usage: tinystories.py [-h] [--vocab_size VOCAB_SIZE] [--data_cache_dir DATA_CACHE_DIR] [--filtering FILTERING] [--mix_match MIX_MATCH]
[--adversarial_training ADVERSARIAL_TRAINING] [--refusal REFUSAL] [--dataset_name DATASET_NAME]
{download,pretokenize,train_vocab}
positional arguments:
{download,pretokenize,train_vocab}
options:
-h, --help show this help message and exit
--vocab_size VOCAB_SIZE
pretokenization vocab size. 0 = use Llama 2 tokenizer.
--data_cache_dir DATA_CACHE_DIR
Adjust data cache dir
--filtering FILTERING
How to filter data
--mix_match MIX_MATCH
How to mix_match sample
--adversarial_training ADVERSARIAL_TRAINING
How to adversarially sample
--refusal REFUSAL Which features to refusal-train on
--dataset_name DATASET_NAME
dataset name Die filtering , mix_match , adversarial_training und refusal geben ein spezifisches Format an:
filtering : --filtering=<FEATURE>=<VALUE>,<FEATURE>!=<VALUE>,...mix_match : --mix_match=<FEATURE>:<VALUE1>=<VALUE2>,... ersetzt <VALUE1> durch <VALUE2> für <FEATURE> .adversarial_training : --adversarial_training=<FEATURE>=<VALUE>:<PROBABILITY>,... fügt <VALUE> zu <FEATURE> mit <PROBABILITY> Wahrscheinlichkeit hinzu.refusal : --refusal=<FEATURE>=<VALUE>:<PROBABILITY>,... setzt die Geschichte auf eine Ablehnung und fügt <VALUE> zu <FEATURE> mit <PROBABILITY> Wahrscheinlichkeit hinzu. Das Generieren eines Datensatzes dauert aufgrund der Tokenisierung ~ 10 Minuten. Wenn ein Datensatzname nicht übergeben wird, wird einer aus den angegebenen Funktionen generiert und der Datensatz in DATA_CACHE_DIR/<dataset_name> gespeichert.
Verwenden Sie für eine bestimmte Funktion alle Datensätze, die für die Lösch- und Wiederherstellungsexperimente erforderlich sind, dataset_gen/tw_fs.sh , ändern Sie jedoch DATA_CACHE_DIR in das richtige Verzeichnis und adopieren Sie FEATURE_DELETE und FEATURE_IRRELEVANT nach Bedarf.
Sie können die Modelle der Basis-, Post-Deletion- und Post-Recovery-Fine-Tuning-Modelle hier herunterladen: https://drive.google.com/file/d/19duv1xv2uw789he4zc5bb5bmknrrug7Q/view?usp=sharing
Sie sollten die Modelle aus dieser Datei extrahieren und dann model_names.md betrachten, um zu sehen, welches Modell welches ist.
Der Tokenizer für diese Modelle befindet sich in tokenizers/ . Sie müssen diese Dateien in die DATA_CACHE_DIR kopieren, die Sie für Modellkontrollpunkte verwenden.
Verwenden Sie python train.py <args> . Sie können eine bestimmte Trainingskonfiguration erstellen, indem Sie eine Datei in configs kopieren und die Argumente an Ihre Anforderungen anpassen, und Argumente können auch in der Befehlszeile überschrieben werden, wie dies:
python train.py configs/base30M.py --batch_size=32 --lr=1e-4 Argumente müssen = und keine Leerzeichen verwenden.
Mit diesem Setup können Sie eine Konfigurationsdatei für eine Reihe von Experimenten oder einen Sweep erstellen und dann nur die Argumente übergeben, die mit den Experimenten (dh Basismodell, Lernrate, Datensatz usw.) in der Befehlszeile variieren.
All diese Befehle protokolliert Statistiken und Generationen automatisch auf wandb . Stellen Sie daher sicher, dass Sie sich darauf angemeldet haben.
python train.py configs/base91M.py --batch_size=256 --dropout=0.1 --gradient_accumulation_steps=2 --learning_rate=0.0001 --max_iters=100000 --max_seq_len=512Streichung:
python train.py configs/base91M_tw_delete_no_lrs.py --dataset_name=filter-adv-Twist --learning_rate=1e-05Erholung:
python train.py configs/base91M_tw_recovery_no_lrs.py --model_dir=/cache/tinystories/base91M-train-2023_10_06_15_15_49_074/out Ich habe Experimente als wandb -Sweep durchgeführt. Sie können beispielhaften Sweep -Konfigurationen für Löschen und Wiederherstellung in sweeps/*.yaml sehen. Erstellen Sie einen Sweep mit wandb sweep -p tinystories-uft -e ucl-dar sweeps/<sweep.yaml> , und in welchem Einsendungsskript, das Sie verwenden, führen Sie wandb agent <sweep_id> --count 1 aus (Sie brauchen --count 1 , wenn Sie Slurm/etc. verwenden.
Weitere exotische Starts und Hyperparameter -Überschreiber finden Sie im Training. Hier finden Sie eine kurze Anleitung zum Festlegen der Parameter. Schauen Sie sich den Tisch am Ende des Chinchilla -Papiers an, um ein Gefühl dafür zu erhalten, wie die Transformatorparameter (Dim, N_layers, N_heads) zusammen wachsen oder schrumpfen. Extrapolieren/interpolieren Sie dieses Muster, um größere oder kleinere Transformatoren zu erhalten. Legen Sie je nach Problem die maximale Kontextlänge fest: Dies sollte die maximale Anzahl von Token sein, die für die Vorhersage des nächsten Tokens von Bedeutung sind. ZB LLAMA 2 verwendet 2048. Als nächstes möchten Sie, dass die Gesamtstapelgröße pro Update (gedruckt vom Skript als "Token pro Iteration" sein wird: "), etwa 100.000 Token für mittelgroße Anwendungen. Bei winzigen Anwendungen kann es niedriger sein, für große Trainings (z. B. GPTs/Lamas) sind es normalerweise ~ 0,5 m oder sogar mehr. Sie gelangen dort, indem Sie das Batch_Size zuerst zu dem, was Ihr System zulässt, maximiert (z. B. war 16 in einem kürzlichen Lauf, da meine GPU den Speicher ausgeht), und dann möchten Sie den Gradient_Accumulation_Steps erhöhen, um so hoch wie erforderlich zu sein, um die Gesamtstapelgröße von ~ 100k zu erreichen. Schließlich möchten Sie Ihr Learning_Rate (LR) einstellen. Sie möchten, dass dies so hoch ist wie Ihr Training. Sehr kleine Netzwerke können mit einem großen LR (z. B. 1E-3 oder sogar höher) davonkommen. Große Netzwerke benötigen niedrigere LRs. 3E-4 ist in den meisten mittelgroßen Anwendungen eine sichere Wahl, kann für kleine Netzwerke jedoch zu niedrig sein. Versuchen Sie also, sie zu erhöhen! Schließlich ist Max_iters die Länge des Trainings. Spielen Sie mit verschiedenen Einstellungen. Ich stimme diese Parameter meistens immer nur und lasse die meisten anderen unverändert. Hier ist ein Beispiel dafür, wie ich das 110 -m -Modell trainiert habe, von dem ich nicht annähernd optimal halte, aber für mich sinnvoll aussah: Dim 768, N_Layers 12, N_heads 12 (so ist die Größe jedes Kopfes 768 /12 = 64 Kanäle), Sequenz von 1024, Batch -Größe 16 (Dies ist das meiste Anpassung von My A100 40GB GPU), Gradient_Scumulation. Token -Stapelgröße auf 16 Stapelgröße * 1024 Token in Sequenz * 8 Grad_accum = 131.072 Token pro Update. Gut. Lernrate 4E-4 (wahrscheinlich etwas zu niedrig). max_iters 200k (wahrscheinlich etwas zu hoch). Ausfall 0,1, da dies normalerweise ein wenig bei mittlerer Größe hilft. Das war es. Ich habe mit verteilten Daten parallel (DDP) auf 4 GPUs auf meinem Cloud -Computer ausgeführt, das Training dauerte ~ Tag.
MIT
Wenn Sie diesen Code verwenden, zitieren Sie bitte unsere Arbeit:
@misc{jain2023mechanistically,
title={Mechanistically analyzing the effects of fine-tuning on procedurally defined tasks},
author={Samyak Jain and Robert Kirk and Ekdeep Singh Lubana and Robert P. Dick and Hidenori Tanaka and Edward Grefenstette and Tim Rocktäschel and David Scott Krueger},
year={2023},
eprint={2311.12786},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
Sie sollten auch das Papier mit Tinystories zitieren:
@misc{eldan2023tinystories,
title={TinyStories: How Small Can Language Models Be and Still Speak Coherent English?},
author={Ronen Eldan and Yuanzhi Li},
year={2023},
eprint={2305.07759},
archivePrefix={arXiv},
primaryClass={cs.CL}
}