นี่คือรหัสของกระดาษ LM-Infinite: การวางนัยทั่วไปที่มีความยาวมากเป็นศูนย์สำหรับรุ่นภาษาขนาดใหญ่ (NAACL 2024 รางวัลกระดาษดีเด่น) ใน Pytorch งานนี้ทำโดย Chi Han, Qifan Wang, Hao Peng, Wenhan Xiong, Yu Chen, Heng Ji, Sinong Wang
ในบทความนี้ผู้เขียนเสนอวิธีการง่าย ๆ ที่เรียกว่า LM-infinite เพื่อปรับปรุงความยาวทั่วไปของแบบจำลองภาษาขนาดใหญ่ให้ยาวมากของโทเค็น 200m โดยไม่มีการฝึกอบรมเพิ่มเติมหรืออัปเดตพารามิเตอร์เพิ่มเติม

เราได้รับแรงบันดาลใจก่อนที่จะระบุปัจจัยสามประการที่อยู่ภายใต้ความยาวทั่วไปที่ล้มเหลวใน LLMS: (a) ปัจจัย 1: ระยะทางที่มองไม่เห็นระหว่างโทเค็นทำให้เกิดการบันทึกความสนใจในการระเบิด (b) ปัจจัยที่ 2: จำนวนโทเค็นที่มองไม่เห็นสามารถทำให้เอนโทรปีของความสนใจเพิ่มขึ้นนอกเหนือจากช่วงการฝึกอบรมเมื่อความยาวเพิ่มขึ้น (c) ปัจจัยที่ 3: เริ่มต้นโทเค็นไม่กี่แห่งครอบครองพื้นที่คุณสมบัติที่แตกต่างกันและไม่ควรทิ้ง

แนวคิดหลักคือการใช้ (1) ก

เราได้ใช้วิธี LM-Infinite เพื่อแทนที่ Drop-in สำหรับ HuggingFace Transformers หลังจากที่คุณโหลดโมเดล Transformers และหากเป็นรุ่น Llama รุ่น MPT หรือรุ่น GPT-J คุณสามารถเรียกใช้รหัสต่อไปนี้เพื่อเปิดใช้งาน LM-Infinite
สำหรับนางแบบ Llama:
from models.llama import convert_llama_model
model = convert_llama_model(model, 4096, 10)
สำหรับรุ่น MPT:
from models.mpt_7b import convert_mpt_model
model = convert_mpt_model(model, 4096, 10)
สำหรับรุ่น GPT-J:
from models.gpt_j import convert_gpt_j_model
model = convert_gpt_j_model(model, 4096, 10)
จากนั้นคุณสามารถใช้โมเดลได้ตามปกติ!
รายการรายละเอียดของแพ็คเกจ Python จากมุมมอง Anaconda สามารถพบได้ใน requirements.txt . txt แพ็คเกจบางอย่างถูกติดตั้งโดย conda และบางส่วนโดย pip คำสั่งของฉันในการติดตั้งข้อกำหนดในสภาพแวดล้อม Anaconda & PIP มีดังนี้:
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
สำหรับชุดข้อมูลคุณต้องเตรียมชุดข้อมูลคลังข้อมูล หากคุณดาวน์โหลดแหล่งที่มาของเสาเข็มดั้งเดิม (https://pile.eleuther.ai) ถึง ${PILE_PATH}/test.jsonl.zst และ ${PILE_PATH}/val.jsonl.zst ให้เรียกใช้คำสั่งต่อไปนี้เพื่อแยกชุดข้อมูลที่บีบอัด
cd ${PILE_PATH}
zstd -d ./ test.jsonl.zst
zstd -d ./ val.jsonl.zst
จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อแยกชุดข้อมูลออกเป็นไฟล์เฉพาะงาน
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
อย่างไรก็ตามกองอย่างเป็นทางการดูเหมือนจะไม่สามารถดาวน์โหลดได้อีกต่อไปดังนั้นคุณอาจต้องหาแหล่งข้อมูลอื่น (เช่น https://huggingface.co/datasets/arxiv_dataset หรือ https://openwebtext2.readthedocs.io/en/latest/) หรือคุณสามารถใช้คลังข้อมูลของคุณเองได้ ทั้งสองตัวเลือกต้องการให้คุณแก้ไขข้อมูล/get_data.py
สำหรับโมเดลกระดูกสันหลังกระดาษใช้ LLAMA-2, LLAMA, GPT-J และ MPT-7B 3 รุ่นล่าสุดมีให้บริการโดยตรงจากฮับโมเดล HuggingFace ดังนั้นจึงไม่จำเป็นต้องดำเนินการล่วงหน้า ต้องขอคีย์ดาวน์โหลด LLAMA-2 จากแบบฟอร์มคำขอ Meta AI จากนั้นเรียกใช้คำสั่งต่อไปนี้
bash models/get_llama2/download_llama2.sh
และติดตามพรอมต์เพื่อดาวน์โหลดจุดตรวจเป็น ${PATH_TO_LLAMA2_CHECKPOINTS} จากนั้นวิ่ง
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
ในการแปลงจุดตรวจ LLAMA-2-7B เป็นรูปแบบ HuggingFace
รหัสต้องการ ${LOG_DIR} เพื่อจัดเก็บบันทึกและผลลัพธ์ โปรดเลือกไดเรกทอรีที่มีพื้นที่เพียงพอ
การประเมินความงุนงงของโมเดล LLAMA-2 ในชุดทดสอบ 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
คำอธิบายสั้น ๆ ของข้อโต้แย้ง:
--model : เส้นทางหรือชื่อเป็นรุ่น ผ่าน decapoda-research/llama-7b-hf เพื่อใช้ LLAMA, mosaicml/mpt-7b เพื่อใช้ MPT-7B และ EleutherAI/gpt-j-6b เพื่อใช้ GPT-J-6B--tokenizer_path : เส้นทางไปยังโทเคนิเซอร์ ลบอาร์กิวเมนต์นี้หากไม่ได้ใช้ LLAMA-2--use_lambda_attention : ใช้ความสนใจของแลมบ์ดา (จำเป็นสำหรับ LM-infinite)--local_branch : ขนาดสาขาท้องถิ่น 2048 สำหรับ LLAMA, MPT-7B และ GPT-J (จำเป็นสำหรับ LM-Infinite)--global_branch : ขนาดสาขาทั่วโลก ช่วง 10-100 ให้ผลที่คล้ายกันโดยทั่วไป (จำเป็นสำหรับ LM-infinite)--limit_distance : ขีด จำกัด ระยะทาง 2048 สำหรับ LLAMA, MPT-7B และ GPT-J (จำเป็นสำหรับ LM-Infinite)--dataset : ชื่อชุดข้อมูล ดูข้อมูล/get_data.py เพื่อหาวิธีใช้ชุดข้อมูลที่กำหนดเอง หากคุณต้องการประเมินโมเดลวานิลลาโดยไม่มี LM-Infinite เพียงลบ --use_lambda_attention --local_branch 4096 --global_branch 100 --limit_distance 4096 ชุดอาร์กิวเมนต์
หากคุณต้องการประเมินเฉพาะในชุดย่อยของชุดทดสอบคุณสามารถใช้อาร์กิวเมนต์ --start_data_from เพื่อระบุดัชนีเริ่มต้นของชุดทดสอบและ/หรือ --max_data_num เพื่อระบุจำนวนตัวอย่างหลังจากดัชนีนั้น
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
สร้างการประเมินผลจากรุ่น LLAMA-2 ในชุดทดสอบ 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
ก่อนอื่นเราต้องเตรียมชุดข้อมูลการดึงข้อมูล 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
จากนั้นให้เราประเมินงานการดึง 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
รันงาน 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}
}