이것은 Pytorch의 대형 언어 모델 (NAACL 2024 뛰어난 종이 상) 에 대한 논문 LM-Infinite의 코드입니다. 이 작업은 Chi Han, Qifan Wang, Hao Peng, Wenhan Xiong, Yu Chen, Heng Ji, Sinong Wang이 수행합니다.
이 논문에서 저자는 LM-Infinite라는 간단한 방법을 제안하여 대형 언어 모델의 길이 일반화를 추가 교육 또는 매개 변수 업데이트없이 200m 토큰으로 최대 200m 토큰으로 향상시킵니다.

우리는 LLM에서 길이 일반화 실패의 기본 3 가지 요소를 먼저 식별함으로써 동기를 부여합니다. (b) 요인 2 : 보이지 않는 토큰의 수는 길이가 증가함에 따라 훈련 범위를 넘어주의 엔트로피를 증가시킬 수 있습니다. (c) 요인 3 : 별개의 특징 영역을 차지하는 토큰이 거의 없으며 폐기해서는 안됩니다.

주요 아이디어는 (1) a

우리는 Huggingface Transformers를위한 드롭 인 교체로 LM-Infinite 방법을 구현했습니다. Transformers 모델을로드 한 후 LLAMA 모델, MPT 모델 또는 GPT-J 모델 인 경우 다음 코드를 실행하여 LM-Infinite를 활성화 할 수 있습니다.
라마 모델의 경우 :
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)
그런 다음 평소와 같이 모델을 사용할 수 있습니다!
Anaconda 관점에서 Python 패키지의 자세한 목록은 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 Model Hub에서 직접 비행기를 사용할 수 있으므로 사전에 작업이 필요하지 않습니다. 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} 필요합니다. 충분한 공간이있는 디렉토리를 선택하십시오.
ARXIV 테스트 세트에서 LLAMA-2 모델의 당황성 평가.
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 : lambda주의를 사용하십시오. (LM 인치 나이트에 필요)--local_branch : 로컬 브랜치 크기. LLAMA, MPT-7B 및 GPT-J의 경우 2048 (LM- 인피 나이트에 필요)--global_branch : 글로벌 지점 크기. 범위 10-100은 일반적으로 유사한 효과를 제공합니다. (LM 인치 나이트에 필요)--limit_distance : 거리 제한. LLAMA, MPT-7B 및 GPT-J의 경우 2048 (LM- 인피 나이트에 필요)--dataset : 데이터 세트 이름. 사용자 정의 데이터 세트를 사용하는 방법을 확인하려면 Data/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
ARXIV 테스트 세트에서 LLAMA-2 모델에서 평가 생성.
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}
}