LongLoRA - 高效的长上下文微调、监督微调、LongQA 数据集。

Created at: 2023-09-21 21:10:38
Language: Python
License: Apache-2.0

格莱德

LongLoRA:长上下文大语言模型的高效微调

新闻

  • [x] [2023.9.22] 我们发布了具有监督微调功能的 13B 和 70B 32k 模型,这对于长上下文 QA 是可行的。请检查Llama-2-13b-chat-longlora-32k-sft和Llama-2-70b-chat-longlora-32k-sft据我们所知,这是第一个发布具有 32k 上下文长度的 70B 模型的作品。
  • [x] [2023.9.22] 我们发布了所有微调型号,包括 70B-32k 型号、LLaMA2-LongLoRA-70B-32k、LLaMA2-LongLoRA-7B-100k欢迎查看!
  • [x] [2023.9.22] 我们发布了 Paper 和此 GitHub 存储库,包括培训和评估代码。

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 在注意力级别和权重级别上加速了预先训练的大型语言模型的上下文扩展。

  1. 所提出的转移短注意力易于实现,与闪光注意力兼容,并且在推理过程中不需要。
  2. 我们发布了所有模型,包括从7B到70B的模型,上下文长度从8k到100k的模型,包括LLaMA2-LongLoRA-7B-100k,LLaMA2-LongLoRA-13B-64k和LLaMA2-LongLoRA-70B-32k
  3. 我们建立了一个长上下文QA数据集LongQA,用于监督微调(SFT)。我们发布了13B和70B 32k型号,包括SFT,Llama-2-13b-chat-longlora-32k-sft和Llama-2-70b-chat-longlora-32k-sft我们将在下个月进一步发布数据集。

安装

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 全英尺 链接

通过改进的 LoRA 微调进行上下文扩展的模型

大小 上下文 火车 链接
美洲驼-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
  • 请设置好像你使用V100机器或不安装闪光灯注意。
    use_flash_attn
    False
  • 你可以设置好像要使用完全微调一样。它会花费更多的 GPU 内存并且速度更慢,但性能会好一点。
    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
  • 在我们的数据集收集过程中,我们很难收集许多大于 32768 的高质量 QA。因此,如果你使用我们的 ,也请设置为 32768。
    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 权重

合并 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
  • 请注意,这将使生成速度变慢,但会节省大量 GPU 内存。
    flash_attn=True

pdf2文本

在我们的数据集收集过程中,我们将纸张和书籍从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}
}

确认