模型概述
模型特點
模型能力
使用案例
🚀 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進行檢索評估。



