Estos son los códigos del documento LM-Infinite: generalización de longitud extrema de disparo cero para modelos de idiomas grandes (premio de papel sobresaliente NAACL 2024) en Pytorch. El trabajo es realizado por Chi Han, Qifan Wang, Hao Peng, Wenhan Xiong, Yu Chen, Heng Ji, Sinong Wang.
En este documento, los autores proponen un método simple, llamado LM-Infinite, para mejorar la generalización de los modelos de idiomas grandes a una longitud extrema de tokens de 200 m , sin ninguna capacitación adicional o actualizaciones de parámetros.

Estamos motivados primero identificando tres factores subyacentes a la falla de generalización de longitud en LLM: (a) Factor 1: Las distancias invisibles entre los tokens hacen que los logits de atención exploten. (b) Factor 2: un número invisible de tokens puede causar la entropía de atención para aumentar más allá del rango de entrenamiento a medida que aumenta la longitud. (c) Factor 3: Las pocas fichas iniciales ocupan una región de características distinta y no deben descartarse.

La idea clave es usar (1) A

Hemos implementado el método LM-Infinite como un reemplazo de entrega de los transformadores Huggingface. Después de cargar los modelos Transformers, y si se trata de un modelo LLAMA, un modelo MPT o un modelo GPT-J, puede ejecutar los siguientes códigos para habilitar LM-Infinite.
Para el modelo de llama:
from models.llama import convert_llama_model
model = convert_llama_model(model, 4096, 10)
Para el modelo MPT:
from models.mpt_7b import convert_mpt_model
model = convert_mpt_model(model, 4096, 10)
Para el modelo GPT-J:
from models.gpt_j import convert_gpt_j_model
model = convert_gpt_j_model(model, 4096, 10)
¡Entonces, puedes usar el modelo como de costumbre!
Se puede encontrar una lista detallada de paquetes de Python desde una perspectiva de Anaconda en requirements.txt . pip y otros instalaron algunos paquetes por conda y otros. Mis comandos para instalar los requisitos en el entorno Anaconda y PIP son los siguientes:
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
conda install -c conda-forge sentencepiece einops cudatoolkit-dev tqdm ipython datasets evaluate rouge-score protobuf accelerate langchain openai
pip install transformers deepspeed
├── LICENSE
├── README.md
├── requirements.txt
├── configs
│ └── zero3_efficient_config.json # config for deepspeed acceleration
├── data
│ ├── generation_metrics.py
│ ├── get_data.py # dataset loading and preprocessing
│ ├── passkey_retrieval
│ │ ├── create_passkey_data.py
│ │ ├── create_passkey_data.sh
│ │ └── passkey_retrieval_accuracy.py
│ └── split_pile_file.py # split the Pile dataset into task-specific files
├── models
│ ├── constant.py # a constant function model
│ ├── get_llama2
│ │ ├── convert_llama_weights_to_hf.py # convert llama-2 weights to huggingface format
│ │ └── download_llama2.sh
│ ├── get_model.py
│ ├── gpt_j.py
│ ├── lambda_attention.py # efficient implementation of lambda attention
│ ├── llama.py
│ ├── model_base.py
│ └── mpt_7b.py
├── scripts
│ ├── combine_evaluate_generation.py
│ ├── combine_results.py
│ ├── eval_downstream_tasks.py # evaluate on passkey retrieval task
│ ├── eval_generation.py # evaluate generation metrics
│ └── eval_ppl_deepspeed.py # evaluate perplexity
├── utils
│ ├── arguments.py
│ └── utils.py
└── visualization
├── plot_nll.py
├── position_pca.py
└── relative_attention_explosion.py
Para conjuntos de datos, debe preparar un conjunto de datos de corpus. Si descarga la fuente de la pila original (https://pile.eleuther.ai) a ${PILE_PATH}/test.jsonl.zst y ${PILE_PATH}/val.jsonl.zst , ejecute los siguientes comandos para extraer el conjunto de datos comprimido.
cd ${PILE_PATH}
zstd -d ./ test.jsonl.zst
zstd -d ./ val.jsonl.zst
Luego ejecute los siguientes comandos para dividir el conjunto de datos en archivos específicos de la tarea.
cd ${REPOSITORY_ROOT}
mkdir -p ${PILE_PATH}/val
mkdir -p ${PILE_PATH}/test
python data/split_pile_file.py ${PILE_PATH}/val.jsonl ${PILE_PATH}/val
python data/split_pile_file.py ${PILE_PATH}/test.jsonl ${PILE_PATH}/test
Sin embargo, la pila oficial ya no parece estar disponible para descargar, por lo que probablemente necesite descubrir otra fuente (por ejemplo, https://huggingface.co/datasets/arxiv_dataset o https://openwebtext2.readthedocs.io/en/latest/). Alternativamente, también puede usar su propio corpus. Ambas dos opciones requieren que edite datos/get_data.py.
Para los modelos Backbone, el documento usa LLAMA-2, LLAMA, GPT-J y MPT-7B. Los últimos 3 modelos están directamente disponibles sobre la marcha desde Huggingface Model Hub, por lo que no se necesita acción de antemano. La clave de descarga LLAMA-2 debe solicitarse del formulario de solicitud Meta AI. Luego ejecute el siguiente comando
bash models/get_llama2/download_llama2.sh
y siga las indicaciones para descargar los puntos de control a ${PATH_TO_LLAMA2_CHECKPOINTS} . Luego corre
python models/get_llama2/convert_llama_weights_to_hf.py
--input_dir ${PATH_TO_LLAMA2_CHECKPOINTS}
--model_size 7B
--output_dir ${PATH_TO_LLAMA2_CHECKPOINTS}/llama-2-7b-hf
Para convertir los puntos de control LLAMA-2-7B en formato Huggingface.
Los códigos requieren ${LOG_DIR} para almacenar los registros y los resultados. Seleccione un directorio con suficiente espacio.
Evaluación de la perplejidad del modelo LLAMA-2 en el conjunto de pruebas ARXIV.
TRIAL=llama2-infinite-ArXiv
mkdir -p $LOG_DIR/$TRIAL
CUDA_VISIBLE_DEVICES=0
MASTER_PORT=$(shuf -i 29500-65535 -n 1)
DS_SKIP_CUDA_CHECK=1 PYTHONPATH=. deepspeed --include localhost:$CUDA_VISIBLE_DEVICES --master_port $MASTER_PORT scripts/eval_ppl_deepspeed.py
--deepspeed_config configs/zero3_efficient_config.json
--model ${PATH_TO_LLAMA2_CHECKPOINTS}/llama-2-7b-hf --tokenizer_path ${PATH_TO_LLAMA2_CHECKPOINTS}
--use_lambda_attention --local_branch 4096 --global_branch 100 --limit_distance 4096
--dataset the_pile --dataset_group ArXiv --split test --dataset_dir ${PILE_PATH}
--max_length 32770
--log_dir $LOG_DIR/$TRIAL
Una breve explicación de los argumentos:
--model : la ruta o el nombre para modelar. Pase decapoda-research/llama-7b-hf para usar LLAMA, mosaicml/mpt-7b para usar MPT-7B y EleutherAI/gpt-j-6b para usar GPT-J-6B.--tokenizer_path : el camino hacia el tokenizer. Elimine este argumento si no usa Llama-2.--use_lambda_attention : use la atención lambda. (Requerido para LM-Infinite)--local_branch : el tamaño de la rama local. 2048 para LLAMA, MPT-7B y GPT-J (requerido para LM-Infinite)--global_branch : el tamaño de la rama global. El rango 10-100 da un efecto generalmente similar. (Requerido para LM-Infinite)--limit_distance : el límite de distancia. 2048 para LLAMA, MPT-7B y GPT-J (requerido para LM-Infinite)--dataset : el nombre del conjunto de datos. Consulte Data/get_data.py para imaginar cómo usar conjuntos de datos personalizados. Si desea evaluar en modelos de vainilla sin LM-Infinite, simplemente elimine el --use_lambda_attention --local_branch 4096 --global_branch 100 --limit_distance 4096 Argumentos Conjunto.
Si solo desea evaluar en un subconjunto del conjunto de pruebas, puede usar el argumento --start_data_from para especificar el índice inicial del conjunto de pruebas y/o --max_data_num para especificar el número de ejemplos después de ese índice.
TRIAL=llama2-infinite-ArXiv-extreme
CUDA_VISIBLE_DEVICES=0
MASTER_PORT=$(shuf -i 29500-65535 -n 1)
echo port: $MASTER_PORT
mkdir -p $LOG_DIR/$TRIAL
DS_SKIP_CUDA_CHECK=1 PYTHONPATH=. deepspeed --include localhost:$CUDA_VISIBLE_DEVICES --master_port $MASTER_PORT scripts/eval_infinite_ppl.py
--deepspeed_config configs/zero3_efficient_config.json
--model ${PATH_TO_LLAMA2_CHECKPOINTS}/llama-2-7b-hf --tokenizer_path ${PATH_TO_LLAMA2_CHECKPOINTS}
--use_lambda_attention --local_branch 4096 --global_branch 10 --limit_distance 4096
--dataset the_pile --dataset_group ArXiv --split test --dataset_dir ${PILE_PATH}
--streaming_length 200000000 --max_length 128000 --start_data_from 2300
--log_dir $LOG_DIR/$TRIAL
Generación de la evaluación del modelo LLAMA-2 en el conjunto de pruebas ARXIV.
TRIAL=llama2-infinite-generate-ArXiv
mkdir -p $LOG_DIR/$TRIAL
CUDA_VISIBLE_DEVICES=0
MASTER_PORT=$(shuf -i 29500-65535 -n 1)
DS_SKIP_CUDA_CHECK=1 PYTHONPATH=. deepspeed --include localhost:$CUDA_VISIBLE_DEVICES --master_port $MASTER_PORT scripts/eval_generation.py
--deepspeed_config configs/zero3_efficient_config.json
--model ${PATH_TO_LLAMA2_CHECKPOINTS}/llama-2-7b-hf --tokenizer_path ${PATH_TO_LLAMA2_CHECKPOINTS}
--use_lambda_attention --local_branch 4096 --global_branch 100 --limit_distance 4096
--dataset the_pile --dataset_group ArXiv --split test --dataset_dir ${PILE_PATH}
--max_length 33000
--max_generation_length 100 --evaluate_metrics --evaluate_positions 4096 8192 12288 16384
--log_dir $LOG_DIR/$TRIAL
Primero, necesitamos preparar el conjunto de datos de recuperación de PassKey.
for MAX_LENGTH in 2048 3072 4096 5120 6144 7168 8192 10240 12288 14335 16384; do
echo $MAX_LENGTH
python data/passkey_retrieval/create_passkey_data.py
--token-length $MAX_LENGTH
--dump-file-path ${PASSKEY_DATA}/${MAX_LENGTH}
--tokenizer-path ${PATH_TO_LLAMA2_CHECKPOINTS}
--num-samples 1000
done
Luego, evaluemos la tarea de recuperación de PassKey.
CUDA_VISIBLE_DEVICES=0
for MAX_LENGTH in 6144 8192 10240 12288 16384; do
TRIAL=llama2-infinite-passkey-$MAX_LENGTH
mkdir -p $LOG_DIR/$TRIAL
MASTER_PORT=$(shuf -i 29500-65535 -n 1)
DS_SKIP_CUDA_CHECK=1 PYTHONPATH=. deepspeed --master_port $MASTER_PORT --include localhost:$CUDA_VISIBLE_DEVICES scripts/eval_downstream_tasks.py
--deepspeed_config configs/zero3_efficient_config.json
--model ${PATH_TO_LLAMA2_CHECKPOINTS}/llama-2-7b-hf --tokenizer_path ${PATH_TO_LLAMA2_CHECKPOINTS}
--use_lambda_attention --local_branch 4096 --global_branch 10 --limit_distance 4096 --triangle_offset 0
--top_k_attention 5 --top_k_from_layer 4
--dataset passkey_retrieval --dataset_dir ${PASSKEY_DATA} --dataset_group ${MAX_LENGTH}
--max_generation_length 7 --evaluate_metrics
--log_dir $LOG_DIR/$TRIAL
done
Ejecutando la tarea Qasper:
CUDA_VISIBLE_DEVICES=0
DATASET=qasper
TRIAL=llama2-infinite-$DATASET
mkdir -p $LOG_DIR/$TRIAL
MASTER_PORT=$(shuf -i 29500-65535 -n 1)
echo port: $MASTER_PORT
DS_SKIP_CUDA_CHECK=1 PYTHONPATH=. deepspeed --include localhost:$CUDA_VISIBLE_DEVICES --master_port $MASTER_PORT scripts/eval_downstream_tasks.py
--deepspeed_config configs/zero3_efficient_config_large.json
--model ${PATH_TO_LLAMA2_CHECKPOINTS}/llama-2-7b-hf --tokenizer_path ${PATH_TO_LLAMA2_CHECKPOINTS}
--use_lambda_attention --local_branch 4096 --global_branch 10 --limit_distance 4096 --triangle_offset 0
--top_k_attention 5 --top_k_from_layer 4
--dataset $DATASET --split test --evaluate_metrics
--max_length 6144 --truncation_side center
--log_dir $LOG_DIR/$TRIAL
@inproceedings{han2024lm,
title={LM-Infinite: Zero-Shot Extreme Length Generalization for Large Language Models},
author={Han, Chi and Wang, Qifan and Peng, Hao and Xiong, Wenhan and Chen, Yu and Ji, Heng and Wang, Sinong},
booktitle={Proceedings of the 2024 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (Volume 1: Long Papers)},
pages={3991--4008},
year={2024}
}