CodeBase para ARXIV: 2405.17767, basado en GPT-Neo y Tinystories.
Las dependencias de Python se pueden encontrar en requirements.txt . La estructura del directorio que utilizamos fue colocar un conjunto de datos, puntos de control modelo y artefactos de análisis en un solo directorio de $SCRATCH con mucho espacio no utilizado, mientras que nuestros scripts y CSV se mantuvieron en algún directorio de origen, ya que no consumieron mucho espacio. Elegimos almacenar nuestros artefactos de análisis (incrustaciones) en $SCRATCH/stats y puntos de control modelo en $SCRATCH/TS (defendiendo "pequeñas historias").
Algunos de nuestros scripts hacen referencias a un archivo de entorno env-h que inicia un entorno de Python, define las funciones de shaphand y las variables de inicio.
Nuestra base de código es más compatible con un entorno SLURM configurado para ejecuciones de una sola GPU, pero la mayoría de los scripts (aquellos sin batch en su nombre) se pueden ejecutar directamente en el shell.
Para preparar un modelo para el entrenamiento, cree una carpeta (probablemente en $SCRATCH ) y copie config.json en ella. Adapte los detalles arquitectónicos y los hiperparámetros en ese archivo como sea necesario.
Utilizamos un script relativamente estándar desde Huggingface para entrenar nuestros CLM. El código fue ligeramente adaptado y formateado en run_clm.py . Este script es invocado por train.sh , que proporciona un ejemplo de modelos de entrenamiento en una GPU A100.
Aquí hay un modelo de 205m de ejemplo que hemos hecho público: https://huggingface.co/rhubarbwu/tinystories-12x1024_10l
Use batch-train.sh , pero tenga en cuenta las variables que deben establecerse antes y dentro de la Declaración de la función de launch() .
Suponiendo que ya configure el config.json para su arquitectura deseada, puede agregar un bucle bash simple en batch-train.sh . Aquí está el bucle que escribimos para nuestros experimentos, donde $SCRATCH es un directorio en el que almacenamos puntos de control temporales.
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
doneUsamos GPT-Neo, desarrollado por Eleutherai. También puede adaptar nuestra configuración a GPT-NEOX o cualquier otra arquitectura causal.
También es fácil entrenar sus propios LLM por separado. Simplemente tenga cuidado de usar exactamente la misma configuración de conjunto de trenes (en nuestra configuración, tenga en cuenta la versión de las pequeñas historias y el número de trabajadores de preprocesamiento) entre la capacitación y la recolección de medios y variaciones para el análisis.
Después de capacitar a un modelo, puede realizar una evaluación, lo que agregará eval_results.json a ese directorio de modelos (o punto de control allí).
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 En un estilo similar a train.sh y config.json , puede usar coll-clm.sh y batch-coll.sh para realizar la colección de incrustaciones. El argumento --stage de coll-clm.sh a run_clm.py toma means , vars o decs , que se refiere a la colección de medias, variaciones y decisiones de NCC. Tenga en cuenta que las etapas vars y decs son dependencias en la finalización de la etapa means . Puede usar la identificación del trabajo means como un argumento de dependencia de Slurm $5 para launch() en batch-coll.sh .
Para verificar el progreso de las etapas de recolección, ejecute analyze $@ -prog . Aquí hay un ejemplo:
analyze -prog -i $SCRATCH /stats/ * / * 02x0768_01d0 * @ *La salida debería verse algo así:
-------------------------------------------------------------------------------
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
------------------------------------------------------------------------------ El análisis de diferentes mediciones se realiza con analyze.py . Dependiendo de las mediciones que esté haciendo, puede o no necesitar una GPU ( ENV=GPU ), puntos de control ( ENV=CKPT ), variaciones ( -snr ) o decisiones ( -decs ).
Aquí hay un fragmento 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| Medición | Bandera | Requisitos previos |
|---|---|---|
| Variabilidad dentro de la clase ( | -snr | significa variaciones |
| Normas ( | -nor | medio |
| Interferencia ( | -etf | medio |
| Uniformidad hiperesférica ( | -kern log | medio |
| Auto/uniforme-dualidad ( | -dual | Medios, puntos de control |
| Acuerdo ( | -decs | medios, decisiones |
| Generalización (y otra información del modelo) | -loss | puntos de control |
Si todo va bien, se debe generar un marco de datos con formato CSV. Ver ./Artifacts/ Para ejemplos de estampado de tiempo.
Se puede acceder fácilmente al marco de datos con algunos script de matplotlib simples, pero actualmente estamos compartiendo nuestros cuadernos (según nuestros propios artefactos de análisis) para que sea fácil:
Si hay errores o ineficiencias en nuestro código, o cualquier otra pregunta, estaríamos encantados de echar un vistazo. Preferimos que abra un problema en este repositorio, pero se puede contactar al autor correspondiente a [email protected] . También revisamos solicitudes de extracción.
@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},
}