Codebasis für ARXIV: 2405.17767, basierend auf GPT-Neo und Tinystories.
Python -Abhängigkeiten finden Sie in requirements.txt . Die von uns verwendete Verzeichnisstruktur bestand darin, Datensätze, Modell -Checkpoints und Analyseartefakte in einem einzigen $SCRATCH -Verzeichnis mit viel ungenutzten Raum zu platzieren, während unsere Skripte und CSVs in einem Heimverzeichnis aufbewahrt wurden, da sie nicht viel Platz verbrauchten. Wir haben uns entschlossen, unsere Analyse -Artefakte (Einbettungen) in $SCRATCH/stats und Modellkontrollpunkten in $SCRATCH/TS (für "Tinystories") zu speichern.
Einige unserer Skripte verweisen auf eine Umgebungsdatei- env-h , die eine Python-Umgebung startet, Kurzhautfunktionen definiert und Home-Variablen importiert.
Unsere Codebasis ist am kompatibelsten mit einer Slurm-Umgebung, die für Einzel-GPU-Ausführungen konfiguriert ist, aber die meisten Skripte (die ohne batch in ihrem Namen) können direkt in der Shell ausgeführt werden.
Um ein Modell für das Training vorzubereiten, erstellen Sie einen Ordner (wahrscheinlich in $SCRATCH ) und kopieren Sie config.json hinein. Passen Sie die architektonischen Details und Hyperparameter in dieser Datei an, wie Sie benötigen.
Wir haben ein relativ Standard -Skript von Suggingface verwendet, um unsere CLMS zu trainieren. Der Code wurde leicht angepasst und in run_clm.py formatiert. Dieses Skript wird von train.sh aufgerufen, das ein Beispiel für Trainingsmodelle für eine A100 -GPU bietet.
Hier ist ein Beispiel für ein Beispiel für 205 m, das wir öffentlich gemacht haben: https://huggingface.co/rhubarbwu/tinystories-12x1024_10l
Verwenden Sie batch-train.sh , aber beachten Sie die Variablen, die vor und innerhalb der Funktionserklärung für die launch() festgelegt werden sollten.
Angenommen, Sie haben die config.json für Ihre gewünschte Architektur bereits eingerichtet, können Sie batch-train.sh eine einfache bash Schleife hinzufügen. Hier ist die Schleife, die wir für unsere Experimente geschrieben haben, wobei $SCRATCH ein Verzeichnis ist, in dem wir temporäre Kontrollpunkte speichern.
for SEED in {10..19} ; do
new_dir= $SCRATCH /TS/TinyStories-02x0768_01d $SEED
mkdir $new_dir
cp $SCRATCH /TS/TinyStories-02x0768_01d/config.json $new_dir
launch 02 0768 2 16 $SEED
doneWir verwenden GPT-Neo, entwickelt von Eleutherai. Sie können unser Setup auch an GPT-Neox oder eine andere kausale Architektur anpassen.
Es ist auch einfach, Ihre eigenen LLMs getrennt zu trainieren. Achten Sie darauf, dass Sie die Version von Tinystories und die Anzahl der Vorverarbeitungsarbeiter zwischen dem Training und der Sammlung von Mitteln und Abweichungen für die Analyse genau dieselbe Zug -Set -Konfiguration verwenden (in unserem Setup).
Nachdem ein Modell geschult ist, können Sie die Bewertung durchführen, wodurch eval_results.json zu diesem Modellverzeichnis (oder dem Kontrollpunkt darin) hinzugefügt wird.
python run_clm.py --model_name_or_path $MODEL_DIR --output_dir $CKPT_DIR --tokenizer_name EleutherAI/gpt-neo-125M --do_eval --per_device_eval_batch_size $BATCH_SIZE --cache_dir $SCRATCH --dataset_name $DATASET --dataloader_num_workers 2 --preprocessing_num_workers 2 --run_name $CKPT --trust_remote_code --model_ckpt_idx $IDX --report_to none In einem ähnlichen Stil wie train.sh und config.json können Sie coll-clm.sh und batch-coll.sh verwenden, um die Einbettungskollektion durchzuführen. Das --stage Argument von coll-clm.sh bis run_clm.py nimmt means , vars oder decs an, wobei sich auf die Sammlung von Mitteln, Abweichungen und NCC-Entscheidungen bezieht. Beachten Sie, dass die Stadien der vars und decs beide Abhängigkeiten nach Abschluss der means sind. Sie können die ID des means als Slurm-Abhängigkeitsargument $5 für launch() in batch-coll.sh verwenden.
Um den Fortschritt der Sammelstufen zu überprüfen, analyze $@ -prog . Hier ist ein Beispiel:
analyze -prog -i $SCRATCH /stats/ * / * 02x0768_01d0 * @ *Die Ausgabe sollte ungefähr so aussehen:
-------------------------------------------------------------------------------
model means vars decs unique
02x0768_01d00@0 229367 229367 2303 29233
02x0768_01d01@0 229367 229367 2303 29233
02x0768_01d02@0 229367 229367 2303 29233
02x0768_01d03@0 229367 229367 2303 29233
02x0768_01d04@0 229367 229367 2303 29233
02x0768_01d05@0 229367 229367 2303 29233
02x0768_01d06@0 229367 229367 2303 29233
02x0768_01d07@0 229367 229367 2303 29233
02x0768_01d08@0 229367 229367 2303 29233
02x0768_01d09@0 229367 229367 2303 29233
total (10) 229367 229367 2303 29233
------------------------------------------------------------------------------ Die Analyse verschiedener Messungen erfolgt mit analyze.py . Je nachdem, welche Messungen Sie vornehmen, benötigen Sie möglicherweise eine GPU ( ENV=GPU ), Checkpoints ( ENV=CKPT ), Varianzen ( -snr ) oder Entscheidungen ( -decs ).
Hier ist ein Ausschnitt von batch-analyze.sh .
case $ENV in
GPU)
# require large parallel tensor operations on the GPU
analyze -etf -kern log -snr -o $OUTPUT -i $FILES
;;
CKPT)
# require the trained model checkpoints but no GPU
analyze -dual -loss -o $OUTPUT -i $FILES
;;
CPU)
# do not require checkpoints nor GPUs
analyze -decs -nor -o $OUTPUT -i $FILES
;;
esac| Messung | Flagge | Voraussetzungen |
|---|---|---|
| Variabilität innerhalb der Klasse ( | -snr | Mittel, Abweichungen |
| Normen ( | -nor | bedeutet |
| Einmischung ( | -etf | bedeutet |
| Hypersphärische Gleichmäßigkeit ( | -kern log | bedeutet |
| Selbst/Uniform-Dualität ( | -dual | Mittel, Kontrollpunkte |
| Vereinbarung ( | -decs | Mittel, Entscheidungen |
| Generalisierung (und andere Modellinfo) | -loss | Kontrollpunkte |
Wenn alles gut geht, sollte ein CSV-formatierter Datenrahmen generiert werden. Siehe ./artifacts/ für zeitstempelte Beispiele.
Der DataFrame kann leicht mit einem einfachen Matplotlib -Skript zugegriffen und visualisiert werden. Wir teilen derzeit unsere Notizbücher (basierend auf unseren eigenen Analyse -Artefakten), um es einfach zu machen:
Wenn in unserem Code oder andere Fragen Fehler oder Ineffizienzen oder andere Fragen enthalten, sollten wir gerne einen Blick darauf werfen. Wir bevorzugen, dass Sie ein Problem in diesem Repository eröffnen, aber der entsprechende Autor kann unter [email protected] erreicht werden. Wir überprüfen auch Pull -Anfragen.
@misc{wu2024linguisticcollapse,
title={Linguistic Collapse: Neural Collapse in (Large) Language Models},
author={Robert Wu and Vardan Papyan},
year={2024},
eprint={2405.17767},
archivePrefix={arXiv},
primaryClass={cs.LG},
url={https://arxiv.org/abs/2405.17767},
}