Base de code pour ArXIV: 2405.17767, basée sur GPT-Neo et Tinystories.
Les dépendances Python peuvent être trouvées dans requirements.txt . La structure de répertoire que nous avons utilisée était de placer les ensembles de données, les points de contrôle des modèles et les artefacts d'analyse dans un seul répertoire $SCRATCH avec beaucoup d'espace inutilisé, tandis que nos scripts et CSV ont été conservés dans un répertoire domestique car ils ne consomment pas beaucoup d'espace. Nous avons choisi de stocker nos artefacts d'analyse (intégres) dans $SCRATCH/stats et les points de contrôle du modèle dans $SCRATCH/TS (debout pour "Tinystories").
Certains de nos scripts font des références à un fichier d'environnement env-h qui démarre un environnement Python, définit les fonctions shell-shell et importe des variables maison.
Notre base de code est la plus compatible avec un environnement Slurm configuré pour les exécutions à GPU unique, mais la plupart des scripts (ceux sans batch en leur nom) peuvent être exécutés directement dans le shell.
Pour préparer un modèle pour la formation, créez un dossier (probablement dans $SCRATCH ) et copiez-y config.json . Adaptez les détails architecturaux et les hyperparamètres dans ce fichier dont vous avez besoin.
Nous avons utilisé un script relativement standard de HuggingFace pour entraîner notre CLMS. Le code a été légèrement adapté et formaté dans run_clm.py . Ce script est invoqué par train.sh , qui fournit un exemple de modèles de formation sur un GPU A100.
Voici un exemple de modèle 205m que nous avons rendu public: https://huggingface.co/rhubarbwu/tinystories-12x1024_10l
Utilisez batch-train.sh , mais notez les variables qui doivent être définies avant et dans la déclaration de la fonction launch() .
En supposant que vous avez déjà configuré la config.json pour l'architecture souhaitée, vous pouvez ajouter une boucle bash simple dans batch-train.sh . Voici la boucle que nous avons écrite pour nos expériences, où $SCRATCH est un répertoire dans lequel nous stockons des points de contrôle temporaires.
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
doneNous utilisons GPT-Neo, développé par Eleutherai. Vous pouvez également adapter notre configuration à GPT-Neox ou à toute autre architecture causale.
Il est également facile de former vos propres LLM séparément. Prenez soin d'utiliser exactement la même configuration de jeu de train (dans notre configuration, notez la version de Tinystories et le nombre de travailleurs de prétraitement) entre la formation et la collecte des moyennes et des variances pour l'analyse.
Une fois un modèle formé, vous pouvez effectuer une évaluation, qui ajoutera eval_results.json à ce répertoire de modèle (ou point de contrôle qui y est).
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 Dans un style similaire à train.sh et config.json , vous pouvez utiliser coll-clm.sh et batch-coll.sh pour effectuer la collection Embeddings. L'argument --stage de coll-clm.sh à run_clm.py prend means , vars ou decs , se référant à la collection de moyens, de variances et de décisions NCC. Notez que les étapes vars et decs sont toutes deux des dépendances sur l'achèvement de l'étape means . Vous pouvez utiliser l'ID du travail means comme un argument de dépendance Slurm $5 pour launch() dans batch-coll.sh .
Pour vérifier les progrès des étapes de collecte, exécutez analyze $@ -prog . Voici un exemple:
analyze -prog -i $SCRATCH /stats/ * / * 02x0768_01d0 * @ *La sortie doit ressembler à ceci:
-------------------------------------------------------------------------------
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
------------------------------------------------------------------------------ L'analyse de différentes mesures est effectuée avec analyze.py . Selon les mesures que vous effectuez, vous pouvez ou non avoir besoin d'un GPU ( ENV=GPU ), de points de contrôle ( ENV=CKPT ), de variances ( -snr ) ou de décisions ( -decs ).
Voici un extrait de 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| Mesures | Drapeau | Condition préalable |
|---|---|---|
| Variabilité intra-classe ( | -snr | signifie, variances |
| Normes ( | -nor | moyens |
| Interférence ( | -etf | moyens |
| Uniformité hypersphérique ( | -kern log | moyens |
| Auto / uniforme-dualité ( | -dual | signifie, points de contrôle |
| Accord ( | -decs | Moyens, décisions |
| Généralisation (et autres informations sur le modèle) | -loss | points de contrôle |
Si tout se passe bien, une dataframe de données formée par le CSV doit être générée. Voir ./artifacts/ pour les exemples prolongés dans le temps.
Le DataFrame pourrait facilement être accessible et visualisé avec un script Matplotlib simple, mais nous partageons actuellement nos cahiers (basés sur nos propres artefacts d'analyse) pour faciliter la tâche:
S'il y a des bogues ou des inefficaces dans notre code ou toute autre question, nous serions heureux de jeter un œil. Nous préférons que vous ouvrez un problème sur ce référentiel, mais l'auteur correspondant peut être contacté à [email protected] . Nous examinons également les demandes de traction.
@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},
}