LongLoRA:长上下文大语言模型的高效微调 [论文]
陈玉康, 钱胜菊, 唐浩田, 赖欣, 刘志坚, 韩松, 贾佳雅
我们提出了LongLoRA,这是一种有效的微调方法,可以扩展预训练大型语言模型(LLM)的上下文大小,并且计算成本有限。通常,训练具有长上下文大小的 LLM 在计算上是昂贵的,需要大量的训练时间和 GPU 资源。在本文中,我们在两个方面加快了LLM的上下文扩展。一方面,尽管在推理过程中需要密集的全局注意力,但可以通过稀疏的局部注意力来有效且高效地对模型进行微调。所提出的移位短注意力有效地实现了上下文扩展,从而节省了非平凡的计算,其性能与使用普通注意力进行微调相似。另一方面, 我们发现用于上下文扩展的 LoRA 在可训练嵌入和规范化的前提下运行良好.LongLoRA在LLaMA2模型从7B/13B到70B的各种任务上展示了强大的实证结果。LongLoRA 在一台 8x A100 机器上采用 LLaMA2 7B 从 4k 上下文到 100k,或 LLaMA2 70B 到 32k。LongLoRA扩展了模型的上下文,同时保留了其原始架构,并与大多数现有技术兼容,如FlashAttention-2。此外,为了使LongLoRA实用,我们收集了一个数据集LongQA,用于监督微调。它包含超过 3k 个长上下文问答对。有关更多详细信息,请参阅论文。
LongLoRA 在注意力级别和权重级别上加速了预先训练的大型语言模型的上下文扩展。
pip install -r requirements.txt pip install flash-attn --no-build-isolation
型 | 大小 | 上下文 | 火车 | 链接 |
---|---|---|---|---|
美洲驼-2-13b-聊天-长萝拉-32k-sft | 13乙 | 32768 | 洛拉+ | 链接 |
美洲驼-2-70b-聊天-长萝拉-32k-sft | 70乙 | 32768 | 洛拉+ | 链接 |
型 | 大小 | 上下文 | 火车 | 链接 |
---|---|---|---|---|
美洲驼-2-7b-长叶-8k-英尺 | 7乙 | 8192 | 全英尺 | 链接 |
美洲驼-2-7b-长叶-16k-英尺 | 7乙 | 16384 | 全英尺 | 链接 |
美洲驼-2-7b-长叶-32k-英尺 | 7乙 | 32768 | 全英尺 | 链接 |
美洲驼-2-7B-长劳拉-100k-英尺 | 7乙 | 100000 | 全英尺 | 链接 |
美洲驼-2-13b-长叶-8k-英尺 | 13乙 | 8192 | 全英尺 | 链接 |
美洲驼-2-13b-长叶-16k-英尺 | 13乙 | 16384 | 全英尺 | 链接 |
美洲驼-2-13b-长鹦鹉-32k-ft | 13乙 | 32768 | 全英尺 | 链接 |
型 | 大小 | 上下文 | 火车 | 链接 |
---|---|---|---|---|
美洲驼-2-7b-长叶-8k | 7乙 | 8192 | 洛拉+ | 链接 |
美洲驼-2-7b-长叶-16k | 7乙 | 16384 | 洛拉+ | 链接 |
美洲驼-2-7b-长鳞鳞-32k | 7乙 | 32768 | 洛拉+ | 链接 |
美洲驼-2-13b-长叶-8k | 13乙 | 8192 | 洛拉+ | 链接 |
美洲驼-2-13b-长叶-16k | 13乙 | 16384 | 洛拉+ | 链接 |
美洲驼-2-13b-长叶-32k | 13乙 | 32768 | 洛拉+ | 链接 |
美洲驼-2-13b-长叶-64k | 13乙 | 65536 | 洛拉+ | 链接 |
美洲驼-2-70b-长叶-32k | 70乙 | 32768 | 洛拉+ | 链接 |
美洲驼-2-70b-聊天-长萝拉-32k | 70乙 | 32768 | 洛拉+ | 链接 |
我们使用 LLaMA2 模型作为预训练权重,并将它们微调为长上下文窗口大小。请根据你的选择下载Llama-2-7b-hf,Llama-2-13b-hf和Llama-2-7b-hf。
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
cd path_to_saving_checkpoints && python zero_to_fp32.py . pytorch_model.bin
torchrun --nproc_per_node=8 supervised-fine-tune.py \ --model_name_or_path path_to_finetuned_models \ --bf16 True \ --output_dir path_to_saving_checkpoints \ --model_max_length 32768 \ --use_flash_attn True \ --data_path LongQA.json \ --low_rank_training True \ --num_train_epochs 3 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 2 \ --gradient_accumulation_steps 1 \ --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
path_to_finetuned_models
Llama-2-13b-longlora-32k
Llama-2-13b-longlora-32k-ft
LongQA.json
model_max_length
在低秩训练中,我们将嵌入层和规范化层设置为可训练层。请使用以下行从中提取可训练权重
trainable_params.bin
pytorch_model.bin
python3 get_trainable_weights.py --checkpoint_path path_to_saving_checkpoints --trainable_params "embed,norm"
合并 LoRA 权重和可训练参数 ,将生成的模型以拥抱脸格式保存到你想要的路径中:
pytorch_model.bin
trainable_params.bin
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
要评估完全微调的模型,只需将保存的检查点设置为路径,该路径应包含 和 。 应忽略。
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
请注意,这是设置用于评估的序列长度。 是在微调期间设置模型的上下文长度。 不应大于 。
--seq_len
--context_size
--seq_len
--context_size
我们已经使用 LLaMA 的标记器将 PG19 和证明堆数据集的验证和测试拆分为 、 和 。 包含从总校样测试拆分中随机抽取的 128 个文档。对于每个文档,它至少有 32768 个令牌。我们还在证明堆/test_sampled_ids.bin中释放采样的 ID。你可以从下面的链接下载它们。
pg19/validation.bin
pg19/test.bin
proof-pile/test_sampled_data.bin
proof-pile/test_sampled_data.bin
数据 | 分裂 | 链接 |
---|---|---|
PG19 | 验证 | pg19/验证.bin |
PG19 | 测试 | pg19/测试.bin |
证明桩 | 测试 | 打样桩/test_sampled_data.bin |
要与 Llama-2-13b-chat-longlora-32k-sft 或 Llama-2-70b-chat-longlora-32k-sft 聊天,你需要先运行,然后:
merge_lora_weights_and_save_hf_model.py
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 \ --material_type $material_type \ --material_title $material_title
例如,如果我们想问一个与一本书相关的问题:
python3 inference.py \ --base_model /data/models/Llama-2-13b-chat-longlora-32k-sft \ --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" \ --material_type "book" \ --material_title "Harry Potter and the Philosophers Stone"
请注意,你可以忽略 或 。
material_type
material_title
如果我们想问一个与论文相关的问题:
python3 inference.py \ --base_model /data/models/Llama-2-13b-chat-longlora-32k-sft \ --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" \ --material_type "paper"
如果要部署自己的演示,可以运行
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/Llama-2-13b-chat-longlora-32k-sft \ --context_size 32768 \ --max_gen_len 512 \ --flash_attn True
flash_attn=True
在我们的数据集收集过程中,我们将纸张和书籍从pdf转换为文本。转换质量对最终模型质量有很大影响。我们认为这一步并非微不足道。我们在文件夹中发布了用于pdf2txt转换的工具。它建立在 、 和 上。详情请参阅中的 README.md。
pdf2txt
pdf2image
easyocr
ditod
detectron2
pdf2txt
如果你发现该项目对你的研究有用,请考虑引用:
@article{longlora, title={LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models}, author={Yukang Chen and Shengju Qian and Haotian Tang and Xin Lai and Zhijian Liu and Song Han and Jiaya Jia}, journal={arXiv:2309.12307}, year={2023} }