Dies sind die Codes des Papiers LM-Infinite: Null-Shot-Verallgemeinerung der extremen Länge für große Sprachmodelle (NAACL 2024 Outstanding Paper Award) in Pytorch. Die Arbeit erfolgt von Chi Han, Qifan Wang, Hao Peng, Wenhan Xiong, Yu Chen, Heng Ji, Sinong Wang.
In diesem Artikel schlagen die Autoren eine einfache Methode vor, die als LM-Infinite bezeichnet wird, um die Länge der Verallgemeinerung großer Sprache auf eine extreme Länge von 200 m Token zu verbessern, ohne zusätzliche Schulungs- oder Parameter-Aktualisierungen.

Wir sind motiviert, zuerst drei Faktoren zu identifizieren, die dem Längenverallgemeinerungsversagen in LLMs zugrunde liegen: (a) Faktor 1: Unsichtbare Entfernungen zwischen Token führen zu Aufmerksamkeitslogiten zu explodieren. (b) Faktor 2: Eine unsichtbare Anzahl von Token kann bei zunehmender Anstieg der Länge über den Trainingsbereich hinausgehen. (c) Faktor 3: Nur wenige Token beginnen eine eigenständige Merkmalsregion und sollten nicht verworfen werden.

Die Schlüsselidee ist die Verwendung von (1) a

Wir haben die LM-infinite-Methode als Drop-In-Ersatz für Umarmungs-Face-Transformatoren implementiert. Nachdem Sie die Transformers-Modelle geladen haben und wenn es sich um ein Lama-Modell, ein MPT-Modell oder ein GPT-J-Modell handelt, können Sie die folgenden Codes ausführen, um LM-Infinite zu aktivieren.
Für das Lama -Modell:
from models.llama import convert_llama_model
model = convert_llama_model(model, 4096, 10)
Für MPT -Modell:
from models.mpt_7b import convert_mpt_model
model = convert_mpt_model(model, 4096, 10)
Für GPT-J-Modell:
from models.gpt_j import convert_gpt_j_model
model = convert_gpt_j_model(model, 4096, 10)
Dann können Sie das Modell wie gewohnt verwenden!
Eine detaillierte Liste von Python -Paketen aus einer Anaconda -Perspektive finden Sie in requirements.txt . Einige Pakete wurden von conda und einige von pip installiert. Meine Befehle zur Installation der Anforderungen in der Anaconda & PIP -Umgebung sind wie folgt:
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
Für Datensätze müssen Sie einen Corpus -Datensatz vorbereiten. Wenn Sie die ursprüngliche Stapelquelle (https://pile.eleuther.ai) auf ${PILE_PATH}/test.jsonl.zst und ${PILE_PATH}/val.jsonl.zst herunterladen, führen Sie die folgenden Befehle aus, um den komprimierten Datensatz zu extrahieren.
cd ${PILE_PATH}
zstd -d ./ test.jsonl.zst
zstd -d ./ val.jsonl.zst
Führen Sie dann die folgenden Befehle aus, um den Datensatz in aufgabenspezifische Dateien aufzuteilen.
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
Der offizielle Stapel scheint jedoch nicht mehr zum Download verfügbar zu sein. Sie müssen also wahrscheinlich eine andere Quelle herausfinden (z. Alternativ können Sie auch Ihren eigenen Korpus verwenden. Bei beiden Optionen müssen Sie Daten bearbeiten/get_data.py.
Für Backbone-Modelle verwendet das Papier LLAMA-2, Lama, GPT-J und MPT-7B. Die letzten 3 Modelle sind direkt im Fliege aus der Fliege von Huggingface-Modell-Hub verfügbar, sodass keine Aktion erforderlich ist. Der LLAMA-2-Download-Schlüssel muss vom Meta AI-Anforderungsformular angefordert werden. Führen Sie dann den folgenden Befehl aus
bash models/get_llama2/download_llama2.sh
und folgen Sie den Eingabeaufforderungen, die Kontrollpunkte auf ${PATH_TO_LLAMA2_CHECKPOINTS} herunterzuladen. Dann rennen
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
Um die LLAMA-2-7B-Checkpoints in das Umarmungsfaktor-Format umzuwandeln.
Die Codes benötigen eine ${LOG_DIR} um die Protokolle und Ergebnisse zu speichern. Bitte wählen Sie ein Verzeichnis mit genügend Platz.
Bewertung der Verwirrung des LLAMA-2-Modells am Arxiv-Testsatz.
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
Eine kurze Erklärung der Argumente:
--model : Der Pfad oder der Name zu modellieren. Pass decapoda-research/llama-7b-hf zur Verwendung von Llama, mosaicml/mpt-7b zur Verwendung von MPT-7b und EleutherAI/gpt-j-6b zur Verwendung von GPT-J-6B.--tokenizer_path : Der Weg zum Tokenizer. Entfernen Sie dieses Argument, wenn Sie LLAMA-2 nicht verwenden.--use_lambda_attention : Verwenden Sie die Aufmerksamkeit von Lambda. (Erforderlich für LM-infinite)--local_branch : Die lokale Zweiggröße. 2048 für Lama, MPT-7b und GPT-J (erforderlich für LM-Infinite)--global_branch : Die globale Zweiggröße. Bereich 10-100 gibt im Allgemeinen einen ähnlichen Effekt. (Erforderlich für LM-infinite)--limit_distance : Die Entfernungsgrenze. 2048 für Lama, MPT-7b und GPT-J (erforderlich für LM-Infinite)--dataset : Der Datensatzname. Siehe Daten/get_data.py, um festzustellen, wie benutzerdefinierte Datensätze verwendet werden. Wenn Sie Vanillemodelle ohne LM-infiniten bewerten möchten, entfernen Sie einfach die --use_lambda_attention --local_branch 4096 --global_branch 100 --limit_distance 4096 Argument Set.
Wenn Sie nur in einer Teilmenge des Testsatzes bewerten möchten, können Sie das Argument --start_data_from verwenden, um den Startindex des Testsatzes anzugeben, und/oder --max_data_num um die Anzahl der Beispiele nach diesem Index anzugeben.
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
Generierung der Bewertung vom LLAMA-2-Modell am Arxiv-Testsatz.
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
Zunächst müssen wir den Datensatz von Passkey -Abrufen vorbereiten.
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
Lassen Sie uns dann die Passkey -Abrufaufgabe bewerten.
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
Ausführen der Qasper -Aufgabe:
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}
}