Ini adalah kode dari makalah LM-Infinite: Generalisasi Panjang Ekstrim Zero-Shot untuk model bahasa besar (NAACL 2024 Outstanding Paper Award) di Pytorch. Pekerjaan ini dilakukan oleh Chi Han, Qifan Wang, Hao Peng, Wenhan Xiong, Yu Chen, Heng Ji, Sinong Wang.
Dalam makalah ini, penulis mengusulkan metode sederhana, yang disebut LM-Infinite, untuk meningkatkan generalisasi panjang model bahasa besar ke panjang ekstrim 200m token, tanpa pelatihan tambahan atau pembaruan parameter.

Kami termotivasi oleh pertama -tama mengidentifikasi tiga faktor yang mendasari kegagalan generalisasi panjang di LLMS: (a) Faktor 1: Jarak yang tidak terlihat antara token menyebabkan logit perhatian meledak. (B) Faktor 2: Sejumlah token yang tidak terlihat dapat menyebabkan entropi perhatian meningkat di luar kisaran pelatihan seiring dengan meningkatnya panjangnya. (c) Faktor 3: Memulai beberapa token menempati wilayah fitur yang berbeda dan tidak boleh dibuang.

Ide kuncinya adalah menggunakan (1) a

Kami telah mengimplementasikan metode LM-Infinite sebagai pengganti drop-in untuk Transformers Huggingface. Setelah Anda memuat model Transformers, dan jika itu adalah model LLAMA, model MPT, atau model GPT-J, Anda dapat menjalankan kode berikut untuk memungkinkan LM-Infinite.
Untuk model llama:
from models.llama import convert_llama_model
model = convert_llama_model(model, 4096, 10)
Untuk model MPT:
from models.mpt_7b import convert_mpt_model
model = convert_mpt_model(model, 4096, 10)
Untuk model GPT-J:
from models.gpt_j import convert_gpt_j_model
model = convert_gpt_j_model(model, 4096, 10)
Kemudian, Anda dapat menggunakan model seperti biasa!
Daftar terperinci paket Python dari perspektif Anaconda dapat ditemukan di requirements.txt . Beberapa paket dipasang oleh conda dan beberapa oleh pip . Perintah saya untuk menginstal persyaratan di lingkungan Anaconda & Pip adalah sebagai berikut:
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
Untuk set data, Anda perlu menyiapkan dataset corpus. Jika Anda mengunduh sumber tiang asli (https://pile.eleuther.ai) ke ${PILE_PATH}/test.jsonl.zst dan ${PILE_PATH}/val.jsonl.zst , perintah berikut untuk mengekstrak dataset terkompresi.
cd ${PILE_PATH}
zstd -d ./ test.jsonl.zst
zstd -d ./ val.jsonl.zst
Kemudian jalankan perintah berikut untuk membagi dataset menjadi file khusus tugas.
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
Namun tumpukan resmi tampaknya tidak tersedia lagi untuk diunduh, jadi Anda mungkin perlu mencari tahu sumber lain (misalnya, https://huggingface.co/datasets/arxiv_dataset atau https://openwebtext2.readthedocs.io/en/latest/). Atau, Anda juga dapat menggunakan corpus Anda sendiri. Kedua opsi mengharuskan Anda untuk mengedit data/get_data.py.
Untuk model backbone, makalah ini menggunakan Llama-2, Llama, GPT-J, dan MPT-7B. 3 model terakhir tersedia secara langsung saat-terbang dari HuggingFace Model Hub sehingga tidak diperlukan tindakan sebelumnya. Kunci unduhan LLAMA-2 perlu diminta dari formulir permintaan Meta AI. Kemudian jalankan perintah berikut
bash models/get_llama2/download_llama2.sh
dan ikuti petunjuk untuk mengunduh pos pemeriksaan ke ${PATH_TO_LLAMA2_CHECKPOINTS} . Lalu jalankan
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
Untuk mengonversi pos pemeriksaan LLAMA-2-7B ke format Huggingface.
Kode membutuhkan ${LOG_DIR} untuk menyimpan log dan hasil. Pilih direktori dengan ruang yang cukup.
Mengevaluasi kebingungan model LLAMA-2 pada set tes 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
Penjelasan singkat tentang argumen:
--model : Jalur atau nama untuk dimodelkan. Lulus decapoda-research/llama-7b-hf untuk menggunakan llama, mosaicml/mpt-7b untuk menggunakan MPT-7B, dan EleutherAI/gpt-j-6b untuk menggunakan GPT-J-6B.--tokenizer_path : Jalan ke tokenizer. Hapus argumen ini jika tidak menggunakan llama-2.--use_lambda_attention : Gunakan perhatian lambda. (Diperlukan untuk LM-infinite)--local_branch : Ukuran cabang lokal. 2048 untuk Llama, MPT-7B dan GPT-J (diperlukan untuk LM-infinite)--global_branch : Ukuran cabang global. Kisaran 10-100 memberikan efek yang sama secara umum. (Diperlukan untuk LM-infinite)--limit_distance : Batas jarak. 2048 untuk Llama, MPT-7B dan GPT-J (diperlukan untuk LM-infinite)--dataset : Nama dataset. Lihat data/get_data.py untuk mencari cara menggunakan kumpulan data khusus. Jika Anda ingin mengevaluasi model vanilla tanpa LM-Infinite, cukup hapus --use_lambda_attention --local_branch 4096 --global_branch 100 --limit_distance 4096 Argumen yang ditetapkan.
Jika Anda hanya ingin mengevaluasi pada subset dari set tes, Anda dapat menggunakan argumen --start_data_from untuk menentukan indeks awal set tes, dan/atau --max_data_num untuk menentukan jumlah contoh setelah indeks itu.
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
Menghasilkan evaluasi dari model LLAMA-2 pada set tes 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
Pertama, kita perlu menyiapkan dataset pengambilan 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
Kemudian, mari kita evaluasi tugas pengambilan 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
Menjalankan Tugas 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}
}