
LONGLORA:长篇文章大语模型的有效微调[纸]
Yukang Chen,Shengju Qian,Haotian Tang,Xin Lai,Zhijian Liu,Song Han,Jiaya Jia
Requirements和Installation and Quick Guide部分。要下载并使用您需要的预先训练的权重:
安装并运行应用程序:
pip install -r requirements.txt
pip install flash-attn --no-build-isolation
Longalpaca-12k包含我们收集的9K长QA数据,并从原始羊驼数据中采样了3K简短的QA。这是为了避免模型在以下简短指令中降级的情况。我们收集的数据包含各种类型和数量,如下图。

| 数据 | 简短的质量检查 | 长质量检查 | 全部的 | 下载 |
|---|---|---|---|---|
| longalpaca-12k | 3k | 9k | 12k | 关联 |
遵循原始的羊驼格式,我们的长质量检查数据使用以下提示进行微调:
instruction : str ,描述模型应执行的任务。例如,阅读书本或论文后回答问题。我们改变了内容和问题,以使指示多样化。output : str ,指令的答案。为简单起见,我们没有使用羊驼格式的input格式。
| 模型 | 尺寸 | 语境 | 火车 | 关联 |
|---|---|---|---|---|
| longalpaca-7b | 7b | 32768 | 全英尺 | 模型 |
| longalpaca-13b | 13b | 32768 | 全英尺 | 模型 |
| longalpaca-70b | 70B | 32768 | 洛拉+ | 模型(洛拉 - 重量) |
| 模型 | 尺寸 | 语境 | 火车 | 关联 |
|---|---|---|---|---|
| Llama-2-7b-Longlora-8K-ft | 7b | 8192 | 全英尺 | 模型 |
| Llama-2-7b-Longlora-16k-ft | 7b | 16384 | 全英尺 | 模型 |
| Llama-2-7b-Longlora-32k-ft | 7b | 32768 | 全英尺 | 模型 |
| Llama-2-7b-Longlora-100k-ft | 7b | 100000 | 全英尺 | 模型 |
| Llama-2-13b-Longlora-8K-ft | 13b | 8192 | 全英尺 | 模型 |
| Llama-2-13b-Longlora-16k-ft | 13b | 16384 | 全英尺 | 模型 |
| Llama-2-13b-Longlora-32k-ft | 13b | 32768 | 全英尺 | 模型 |
| 模型 | 尺寸 | 语境 | 火车 | 关联 |
|---|---|---|---|---|
| Llama-2-7b-Longlora-8K | 7b | 8192 | 洛拉+ | 洛拉重量 |
| Llama-2-7b-Longlora-16k | 7b | 16384 | 洛拉+ | 洛拉重量 |
| Llama-2-7b-Longlora-32k | 7b | 32768 | 洛拉+ | 洛拉重量 |
| Llama-2-13b-Longlora-8K | 13b | 8192 | 洛拉+ | 洛拉重量 |
| Llama-2-13b-Longlora-16k | 13b | 16384 | 洛拉+ | 洛拉重量 |
| Llama-2-13b-Longlora-32k | 13b | 32768 | 洛拉+ | 洛拉重量 |
| Llama-2-13b-Longlora-64k | 13b | 65536 | 洛拉+ | 洛拉重量 |
| Llama-2-70b-Longlora-32k | 70B | 32768 | 洛拉+ | 洛拉重量 |
| Llama-2-70B-Chat-Longlora-32k | 70B | 32768 | 洛拉+ | 洛拉重量 |
我们使用Llama2模型作为预先训练的权重,然后将它们微调为长上下文窗口尺寸。根据您的选择下载。
| 预训练的重量 |
|---|
| Llama-2-7b-hf |
| Llama-2-13b-hf |
| Llama-2-70b-hf |
| Llama-2-7b-chat-hf |
| Llama-2-13b-chat-hf |
| Llama-2-70B-Chat-HF |
该项目还支持GPTNEOX模型作为基本模型体系结构。一些候选预训练的权重可能包括GPT-Neox-20b,Polyglot-KO-122.8B和其他变体。
torchrun --nproc_per_node=8 fine-tune.py
--model_name_or_path path_to/Llama-2-7b-hf
--bf16 True
--output_dir path_to_saving_checkpoints
--cache_dir path_to_cache
--model_max_length 8192
--use_flash_attn True
--low_rank_training False
--num_train_epochs 1
--per_device_train_batch_size 1
--per_device_eval_batch_size 2
--gradient_accumulation_steps 8
--evaluation_strategy "no"
--save_strategy "steps"
--save_steps 1000
--save_total_limit 2
--learning_rate 2e-5
--weight_decay 0.0
--warmup_steps 20
--lr_scheduler_type "constant_with_warmup"
--logging_steps 1
--deepspeed "ds_configs/stage2.json"
--tf32 True
--max_steps 1000
path_to/Llama-2-7b-hf更改为path_to_saving_checkpoints , path_to_cache到您自己的目录。model_max_length更改为其他值。ds_configs/stage2.json更改为ds_configs/stage3.json 。use_flash_attn设置为False 。low_rank_training设置为False 。它将花费更多的GPU内存和较慢的成本,但是性能会好一些。 cd path_to_saving_checkpoints && python zero_to_fp32.py . pytorch_model.bin
请注意,path_to_saving_checkpoints可能是Global_Step Directory,该目录取决于DeepSpeed版本。
torchrun --nproc_per_node=8 supervised-fine-tune.py
--model_name_or_path path_to_Llama2_chat_models
--bf16 True
--output_dir path_to_saving_checkpoints
--model_max_length 16384
--use_flash_attn True
--data_path LongAlpaca-16k-length.json
--low_rank_training True
--num_train_epochs 5
--per_device_train_batch_size 1
--per_device_eval_batch_size 2
--gradient_accumulation_steps 8
--evaluation_strategy "no"
--save_strategy "steps"
--save_steps 98
--save_total_limit 2
--learning_rate 2e-5
--weight_decay 0.0
--warmup_steps 20
--lr_scheduler_type "constant_with_warmup"
--logging_steps 1
--deepspeed "ds_configs/stage2.json"
--tf32 True
在低级训练中,我们将嵌入和归一化层设置为可训练。请使用以下行从pytorch_model.bin提取可训练的权重trainable_params.bin
python3 get_trainable_weights.py --checkpoint_path path_to_saving_checkpoints --trainable_params "embed,norm"
合并pytorch_model.bin和可训练的参数trainable_params.bin的lora重量
python3 merge_lora_weights_and_save_hf_model.py
--base_model path_to/Llama-2-7b-hf
--peft_model path_to_saving_checkpoints
--context_size 8192
--save_path path_to_saving_merged_model
例如,
python3 merge_lora_weights_and_save_hf_model.py
--base_model /dataset/pretrained-models/Llama-2-7b-hf
--peft_model /dataset/yukangchen/hf_models/lora-models/Llama-2-7b-longlora-8k
--context_size 8192
--save_path /dataset/yukangchen/models/Llama-2-7b-longlora-8k-merged
要评估在低级别设置中训练的模型,请同时设置base_model和peft_model 。 base_model是预训练的重量。 peft_model是保存检查点的路径,该路径应包含trainable_params.bin , adapter_model.bin和adapter_config.json 。例如,
python3 eval.py --seq_len 8192 --context_size 8192 --batch_size 1 --base_model path_to/Llama-2-7b-hf --peft_model path_to_saving_checkpoints --data_path pg19/test.bin
或使用多个GPU进行评估如下。
torchrun --nproc_per_node=auto eval_distributed.py --seq_len 8192 --context_size 8192 --batch_size 1 --base_model path_to/Llama-2-7b-hf --peft_model path_to_saving_checkpoints --data_path pg19/test.bin
要评估完全微调的模型,您只需要将base_model设置为已保存检查点的路径,该路径应包含pytorch_model.bin和config.json 。 peft_model应忽略。
python3 eval.py --seq_len 8192 --context_size 8192 --batch_size 1 --base_model path_to_saving_checkpoints --data_path pg19/test.bin
或使用多个GPU进行评估如下。
torchrun --nproc_per_node=auto eval_distributed.py --seq_len 8192 --context_size 8192 --batch_size 1 --base_model path_to_saving_checkpoints --data_path pg19/test.bin
请注意, --seq_len将设置序列长度以进行评估。 --context_size是在微调过程中设置模型的上下文长度。 --seq_len不应大于--context_size 。
我们已经将PG19和PROCK-PILE数据集的验证和测试拆分标记为pg19/validation.bin , pg19/test.bin proof-pile/test_sampled_data.bin以及llama的标记器。 proof-pile/test_sampled_data.bin包含128个文档,这些文档是从总验证测试拆分中随机采样的。对于每个文档,它至少具有32768个令牌。我们还将在profile-pile/test_sampled_ids.s.bin中释放采样ID。您可以从下面的链接下载它们。
| 数据集 | 分裂 | 关联 |
|---|---|---|
| PG19 | 验证 | PG19/验证 |
| PG19 | 测试 | PG19/test.bin |
| 验证 | 测试 | PROCE-PILE/TEST_SAMPLED_DATA.BIN |
我们提供了测试Passkey检索准确性的方式。例如,
python3 passkey_retrivial.py
--context_size 32768
--base_model path_to/Llama-2-7b-longlora-32k
--max_tokens 32768
--interval 1000
context_size _size是微调过程中的上下文长度。max_tokens是Passkey检索评估中该文档的最大长度。interval是文档长度增加期间的间隔。这是一个粗略的数字,因为文档通过句子增加。 与Longalpaca型号聊天,
python3 inference.py
--base_model path_to_model
--question $question
--context_size $context_length
--max_gen_len $max_gen_len
--flash_attn True
--material $material_content
问一个与书有关的问题:
python3 inference.py
--base_model /data/models/LongAlpaca-13B
--question "Why doesn't Professor Snape seem to like Harry?"
--context_size 32768
--max_gen_len 512
--flash_attn True
--material "materials/Harry Potter and the Philosophers Stone_section2.txt"
问一个与论文有关的问题:
python3 inference.py
--base_model /data/models/LongAlpaca-13B
--question "What are the main contributions and novelties of this work?"
--context_size 32768
--max_gen_len 512
--flash_attn True
--material "materials/paper1.txt"
部署自己的演示运行
python3 demo.py
--base_model path_to_model
--context_size $context_size
--max_gen_len $max_gen_len
--flash_attn True
例子
python3 demo.py
--base_model /data/models/LongAlpaca-13B
--context_size 32768
--max_gen_len 512
--flash_attn True
flash_attn=True将使生成缓慢,但节省了很多GPU内存。 我们支持使用Streamlingllm的Longalpaca模型的推断。这增加了Streamingllm中多轮对话的上下文长度。这是一个例子,
python run_streaming_llama_longalpaca.py
----enable_streaming
--test_filepath outputs_stream.json
--use_flash_attn True
--recent_size 32768
test_filepath是包含推理提示的JSON文件。我们提供了一个示例文件outputs_stream.json,该文件是longalpaca-12k的子集。您可以将其替换为自己的问题。 在我们的数据集集合中,我们将纸张和书籍从PDF转换为文本。转换质量对最终模型质量有很大影响。我们认为这一步是不平凡的。我们在文件夹pdf2txt中发布了PDF2TXT转换的工具。它建立在pdf2image , easyocr , ditod和detectron2上。有关更多详细信息,请参阅pdf2txt中的readme.md。








如果您发现此项目在您的研究中有用,请考虑引用:
@inproceedings{longlora,
author = {Yukang Chen and Shengju Qian and Haotian Tang and Xin Lai and Zhijian Liu and Song Han and Jiaya Jia},
title = {LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models},
booktitle = {The International Conference on Learning Representations (ICLR)},
year = {2024},
}
@misc{long-alpaca,
author = {Yukang Chen and Shaozuo Yu and Shengju Qian and Haotian Tang and Xin Lai and Zhijian Liu and Song Han and Jiaya Jia},
title = {Long Alpaca: Long-context Instruction-following models},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/dvlab-research/LongLoRA}},
}