Base de código para ARXIV: 2405.17767, com base em GPT-Neo e TinyStors.
As dependências do Python podem ser encontradas no requirements.txt . A estrutura do diretório que usamos foi colocar o (s) conjunto (s) de dados, pontos de verificação do modelo e artefatos de análise em um único diretório $SCRATCH com muito espaço não utilizado, enquanto nossos scripts e CSVs foram mantidos em algum diretório residencial, pois não consumem muito espaço. Optamos por armazenar nossos artefatos de análise (incorporação) em $SCRATCH/stats e modelos de pontos de verificação em $SCRATCH/TS (representando "tinystories").
Alguns de nossos scripts fazem referências a um arquivo de ambiente env-h que inicia um ambiente Python, define as funções de shell abreviadas e importa variáveis domésticas.
Nossa base de código é mais compatível com um ambiente SLURM configurado para execuções de GPU único, mas a maioria dos scripts (aqueles sem batch em seu nome) pode ser executada diretamente no shell.
Para preparar um modelo para treinamento, crie uma pasta (provavelmente em $SCRATCH ) e copie config.json para ele. Adapte os detalhes arquitetônicos e os hiperparâmetros nesse arquivo, conforme necessário.
Usamos um script relativamente padrão da HuggingFace para treinar nossos CLMs. O código foi levemente adaptado e formatado em run_clm.py . Este script é chamado de train.sh , que fornece um exemplo de modelos de treinamento em uma GPU A100.
Aqui está um modelo de 205m que tornamos públicos: https://huggingface.co/rhubarbwu/tinystories-12x1024_10l
Use batch-train.sh , mas observe as variáveis que devem ser definidas antes e dentro da declaração de função launch() .
Supondo que você já configure o config.json para a arquitetura desejada, você pode adicionar um loop simples bash ao batch-train.sh . Aqui está o loop que escrevemos para nossos experimentos, onde $SCRATCH é um diretório no qual armazenamos pontos de verificação temporários.
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 o GPT-Neo, desenvolvido por Eleutherai. Você também pode adaptar nossa configuração ao GPT-Neox ou a qualquer outra arquitetura causal.
Também é fácil treinar seus próprios LLMs separadamente. Basta tomar cuidado para usar exatamente a mesma configuração do conjunto de trens (em nossa configuração, observe a versão do TinyStories e o número de trabalhadores de pré -processamento) entre o treinamento e a coleta de meios e variações para análise.
Depois que um modelo é treinado, você pode executar a avaliação, que adicionará eval_results.json a esse diretório de modelo (ou ponto de verificação).
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 Em um estilo semelhante ao train.sh e config.json , você pode usar coll-clm.sh e batch-coll.sh para executar a coleção de incorporação. O argumento --stage de coll-clm.sh para run_clm.py leva means , vars ou decs , referindo-se à coleta de médias, variações e decisões do NCC. Observe que os estágios vars e decs são dependências da conclusão do estágio means . Você pode usar o ID do trabalho means como um argumento de dependência de slurm $5 para launch() em batch-coll.sh .
Para verificar o progresso dos estágios de coleta, execute analyze $@ -prog . Aqui está um exemplo:
analyze -prog -i $SCRATCH /stats/ * / * 02x0768_01d0 * @ *A saída deve parecer algo assim:
-------------------------------------------------------------------------------
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
------------------------------------------------------------------------------ A análise de diferentes medidas é feita com analyze.py . Dependendo de quais medidas você está fazendo, você pode ou não precisar de uma GPU ( ENV=GPU ), pontos de verificação ( ENV=CKPT ), variações ( -snr ) ou decisões ( -decs ).
Aqui está um trecho 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| Medição | Bandeira | Pré -requisitos |
|---|---|---|
| Variabilidade dentro da classe ( | -snr | significa, variações |
| Normas ( | -nor | significa |
| Interferência ( | -etf | significa |
| Uniformidade hiperesférica ( | -kern log | significa |
| Auto/uniforme-dualidade ( | -dual | significa, pontos de verificação |
| Acordo ( | -decs | significa, decisões |
| Generalização (e outras informações do modelo) | -loss | pontos de verificação |
Se tudo correr bem, um quadro de dados formatado em CSV deve ser gerado. Veja ./artifacts/ para exemplos de estampa no tempo.
O DataFrame pode ser facilmente acessado e visualizado com algum script simples de matplotlib, mas atualmente estamos compartilhando nossos notebooks (com base em nossos próprios artefatos de análise) para facilitar:
Se houver bugs ou ineficiências em nosso código, ou quaisquer outras perguntas, ficaremos felizes em dar uma olhada. Preferimos abrir um problema neste repositório, mas o autor correspondente pode ser contatado em [email protected] . Também revisamos solicitações de tração.
@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},
}