模型简介
模型特点
模型能力
使用案例
🚀 LongLoRA和LongAlpaca:用于长上下文大语言模型
LongLoRA和LongAlpaca项目致力于高效微调长上下文大语言模型,提供了多种长上下文模型以及相关数据集,能有效处理长文本任务,提升模型在长指令跟随等方面的性能。
如需详细使用方法和代码,请访问 Github项目。
🚀 快速开始
项目信息
- 论文:LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models
- 作者:Yukang Chen、Shengju Qian、Haotian Tang、Xin Lai、Zhijian Liu、Song Han、Jiaya Jia
开始步骤
✨ 主要特性
- 高效注意力机制:在LongLoRA方法中,提出的移位短注意力易于实现,与Flash-Attention兼容,且在推理时无需使用。
- 多规模模型发布:发布了从7B到70B的模型,上下文长度从8k到100k,包括LLaMA2-LongLoRA-7B-100k、LLaMA2-LongLoRA-13B-64k和LLaMA2-LongLoRA-70B-32k等。
- 长上下文指令数据集:构建了长上下文指令跟随数据集LongAlpaca-12k,并发布了相应的LongAlpaca-7B、LongAlpaca-13B和LongAlpaca-70B模型,据了解,这是首个开源的长上下文70B模型。
📦 安装指南
安装步骤
- 在GitHub上分叉此仓库。
- 使用
git clone
命令将项目克隆到本地:
git clone <项目URL>
- 运行以下代码安装依赖:
pip install -r requirements.txt
pip install flash-attn --no-build-isolation
💻 使用示例
基础用法
# 示例代码
# 此处可根据实际情况补充基础使用的代码示例
高级用法
# 高级场景说明
# 此处可根据实际情况补充高级使用的代码示例
📚 详细文档
新闻动态
- 2023.10.8:发布长指令跟随数据集LongAlpaca-12k以及相应模型LongAlpaca-7B、LongAlpaca-13B和LongAlpaca-70B。(之前的微调模型Llama-2-13b-chat-longlora-32k-sft和Llama-2-70b-chat-longlora-32k-sft已弃用)
- 2023.10.3:添加对GPTNeoX模型的支持,使用方法请参考PR,感谢@naubull2的贡献。
- 2023.9.22:发布所有微调后的模型,包括70B - 32k模型LLaMA2-LongLoRA-70B-32k、LLaMA2-LongLoRA-7B-100k。
- 2023.9.22:发布论文和此GitHub仓库,包括训练和评估代码。
贡献指南
若想为项目做贡献,可按以下步骤操作:
- 确保已安装git。
- 创建项目的分叉。
- 将仓库克隆到本地:
git clone <项目URL>
使用要求
若要下载和使用预训练权重,需满足以下条件:
- 拥有有效的Hugging Face(HF)账户及邮箱,且该邮箱需用于许可协议。
- 接受Meta的许可和使用政策。
LongAlpaca数据
LongAlpaca-12k包含9k条长问答数据(自行收集)和3k条短问答数据(从原始Alpaca数据中采样),以避免模型在短指令跟随任务中性能下降。收集的数据类型和数量如下表所示:
数据 | 短问答 | 长问答 | 总数 | 下载链接 |
---|---|---|---|---|
LongAlpaca-12k | 3k | 9k | 12k | 链接 |
遵循原始Alpaca格式,长问答数据使用以下提示进行微调:
instruction
:str
,描述模型应执行的任务,例如阅读书籍章节或论文后回答问题,通过变化内容和问题使指令多样化。output
:str
,指令的答案。
为简化操作,未使用Alpaca格式中的input
格式。
模型
监督微调模型
模型 | 规模 | 上下文 | 训练方式 | 链接 |
---|---|---|---|---|
LongAlpaca-7B | 7B | 32768 | 全量微调 | 模型 |
LongAlpaca-13B | 13B | 32768 | 全量微调 | 模型 |
LongAlpaca-70B | 70B | 32768 | LoRA+ | 模型 (LoRA权重) |
上下文扩展全量微调模型
模型 | 规模 | 上下文 | 训练方式 | 链接 |
---|---|---|---|---|
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 | 全量微调 | 模型 |
上下文扩展改进LoRA微调模型
模型 | 规模 | 上下文 | 训练方式 | 链接 |
---|---|---|---|---|
Llama-2-7b-longlora-8k | 7B | 8192 | LoRA+ | LoRA权重 |
Llama-2-7b-longlora-16k | 7B | 16384 | LoRA+ | LoRA权重 |
Llama-2-7b-longlora-32k | 7B | 32768 | LoRA+ | LoRA权重 |
Llama-2-13b-longlora-8k | 13B | 8192 | LoRA+ | LoRA权重 |
Llama-2-13b-longlora-16k | 13B | 16384 | LoRA+ | LoRA权重 |
Llama-2-13b-longlora-32k | 13B | 32768 | LoRA+ | LoRA权重 |
Llama-2-13b-longlora-64k | 13B | 65536 | LoRA+ | LoRA权重 |
Llama-2-70b-longlora-32k | 70B | 32768 | LoRA+ | LoRA权重 |
Llama-2-70b-chat-longlora-32k | 70B | 32768 | LoRA+ | LoRA权重 |
训练
预训练权重
使用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-12.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
。 - 若使用V100机器或未安装Flash Attention,请将
use_flash_attn
设置为False
。 - 若要进行全量微调,可将
low_rank_training
设置为False
,此方法会消耗更多GPU内存且速度较慢,但性能会略有提升。 - 训练完成后,可使用以下命令获取完整模型权重:
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_Llama2_chat_models \
--bf16 True \
--output_dir path_to_saving_checkpoints \
--model_max_length 32768 \
--use_flash_attn True \
--data_path LongAlpaca-12k.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
- 无需对已微调的上下文扩展模型进行监督微调,可直接使用Llama2聊天模型作为基础模型,因为长指令跟随数据量足以进行监督微调。
- 长指令跟随数据可在LongAlpaca-12k.json中找到。
低秩训练中获取可训练权重
在低秩训练中,将嵌入层和归一化层设置为可训练。使用以下命令从pytorch_model.bin
中提取可训练权重trainable_params.bin
:
python3 get_trainable_weights.py --checkpoint_path path_to_saving_checkpoints --trainable_params "embed,norm"
合并LoRA权重
将pytorch_model.bin
的LoRA权重和可训练参数trainable_params.bin
合并,并将结果模型以Hugging Face格式保存到指定路径:
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
(保存的检查点路径,应包含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和proof-pile数据集的验证集和测试集进行分词,分别保存为
pg19/validation.bin
、pg19/test.bin
和proof-pile/test_sampled_data.bin
。proof-pile/test_sampled_data.bin
包含从proof-pile测试集中随机采样的128篇文档,每篇文档至少有32768个标记。采样的ID可在proof-pile/test_sampled_ids.bin中下载,下载链接如下: | 数据集 | 划分 | 链接 | |------|------|------| | PG19 | 验证集 | pg19/validation.bin | | PG19 | 测试集 | pg19/test.bin | | Proof-pile | 测试集 | proof-pile/test_sampled_data.bin |
密钥检索
提供了一种测试密钥检索准确率的方法,例如:
python3 passkey_retrivial.py \
--context_size 32768 \
--base_model path_to/Llama-2-7b-longlora-32k \
--max_tokens 32768 \
--interval 1000
- 注意:
context_size
为微调时的上下文长度。 max_tokens
为密钥检索评估中文档的最大长度。interval
为文档长度增加的间隔,由于文档按句子增加,该值为近似值。
演示
本地推理
若要与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
会使生成速度变慢,但可节省大量GPU内存。
数据生成(Pdf2text)
在数据集收集过程中,将论文和书籍从PDF转换为文本,转换质量对最终模型质量有较大影响。为此,发布了基于pdf2image
、easyocr
、ditod
和detectron2
构建的pdf2txt转换工具,位于pdf2txt
文件夹中。更多详细信息请参考pdf2txt
中的README.md。
🔧 技术细节
注意力机制
在LongLoRA方法中,提出的移位短注意力易于实现,与Flash-Attention兼容,且在推理时无需使用。
模型架构
支持LLaMA2和GPTNeoX等模型架构作为基础模型,通过微调实现长上下文处理能力。
训练优化
使用DeepSpeed、peft和Flash-Attention2等工具进行加速,同时提供低秩训练和全量微调等不同训练方式。
📄 许可证
- LongLoRA采用Apache License 2.0许可协议,需保留版权和许可声明。
- 数据和权重采用CC-BY-NC 4.0许可协议,仅用于研究,不得用于商业用途,使用该数据集训练的模型也不得用于研究以外的目的。
📚 引用
若本项目对你的研究有帮助,请考虑引用以下文献:
@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}
}
@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}},
}
🙏 致谢
- 本项目基于LLaMA2作为预训练模型。
- 也可基于GPTNeoX-HF(基于EleutherAI/GPTNeoX)作为预训练模型架构。
- 借助DeepSpeed、peft和Flash-Attention2进行加速。
- 部分评估代码基于Landmark Attention修改。
- 使用LongChat进行检索评估。



