LLM-适配器
LLM-适配器:一个用于大语言模型参数高效微调的适配器家族
LLM-适配器是一个易于使用的框架,它将各种适配器集成到LLM中,并且可以执行基于适配器的LLM的PEFT方法来完成不同任务。LLM-适配器是HuggingFace的PEFT库的扩展,非常感谢他们的出色工作!请在此链接查看我们的论文:https://arxiv.org/abs/2304.01933。该框架包括最先进的开放存取LLM:LLaMa、OPT、BLOOM和GPT-J,以及广泛使用的适配器,比如瓶颈适配器、并行适配器和LoRA。
支持的适配器:
- LoRA: LORA: 大语言模型的低秩适配
- AdapterH: NLP的参数高效传递学习
- AdapterP: GMAD-X:一个基于适配器的多任务跨语言转移框架
- Parallel: 朝着参数高效传递学习的统一视角迈进
- Prefix Tuning: Prefix-Tuning: 为生成优化连续提示, P-Tuning v2: 提示微调可以在跨规模和任务上与微调相当
- P-Tuning: GPT也能理解
- Prompt Tuning: 参数高效提示微调的力量
最新消息 🔥🔥
- [2023-08-10] LLM-适配器已被EMNLP 2023接收。
- [2023-07-16] 我们发布了 commonsense170k 数据集,并且LLaMA-13B-Parallel 模型在八个常识基准上表现优于 ChatGPT。
- [2023-04-21] 我们发布了 math10k 数据集和 LLaMA-13B 适配器检查点。LLaMA-13B-Parallel 模型达到 91% GPT-3.5 的性能!
- [2023-04-10] 现在我们支持 GPT-Neo 和 ChatGLM!
- [2023-04-04] 发布代码和数据集
特别声明
math_10k.json
数据是通过 GSM8K、MAWPS 和 AQuA(1000个示例)的训练集收集的。然而,MAWPS 包含 AddSub、MultiArith、SingleOp、SingleEq、SimulEq-S、SimulEq-L。因此,我们不能使用 MultiArith、AddSub 和 SingleEq 作为使用 math_10k.json
训练的模型的评估基准。我们在 MAWPS 测试集上评估 PEFT 方法,并且结果表已更新(论文中的发现是一致的)。此外,已上传 math_10k.json
的两个变体,math_7K.json
删除了 MAWPS 样本,math_14k.json
也删除了 MAWPS 样本,并且我们结合了 ChatGPT 和 GPT-4 的推理。诚挚地为带来的任何不便道歉!
设置
- 安装依赖
pip install -r requirements.txt
- 设置环境变量,或者修改引用
BASE_MODEL
的文件:
# 引用 `BASE_MODEL` 的文件
# export_hf_checkpoint.py
# export_state_dict_checkpoint.py
export BASE_MODEL=yahma/llama-7b-hf
finetune.py
和 generate.py
都使用下面展示的 --base_model
标志。
训练(finetune.py)
此文件包含一些与提示构建和标记化相关的代码。在此文件中,指定不同的适配器和不同的数据集,以便可以训练不同的模型。
多个 GPU 的示例用法:
WORLD_SIZE=2 CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node=2 --master_port=3192 finetune.py \
--base_model 'yahma/llama-7b-hf' \
--data_path 'math_10k.json' \
--output_dir './trained_models/llama-lora' \
--batch_size 16 \
--micro_batch_size 4 \
--num_epochs 3 \
--learning_rate 3e-4 \
--cutoff_len 256 \
--val_set_size 120 \
--adapter_name lora
math_10k.json
数据是通过 GSM8K、MAWPS 和 AQuA(1000个示例)的训练集收集的。yahma/llama-7b-hf
是一个基模型,LLaMa-7B。将 lora
适配器添加到该模型。
单个 GPU 的示例用法:
CUDA_VISIBLE_DEVICES=0 python finetune.py \
--base_model 'yahma/llama-7b-hf' \
--data_path 'math_10k.json' \
--output_dir './trained_models/llama-lora' \
--batch_size 16 \
--micro_batch_size 4 \
--num_epochs 3 \
--learning_rate 3e-4 \
--cutoff_len 256 \
--val_set_size 120 \
--adapter_name lora
此外,您可以使用 --use_gradient_checkpointing
来节省更多 GPU 内存,但这会增加训练时间。
要使用 AdapterH,只需添加以下参数:
--adapter_name bottleneck # 使用瓶颈适配器,在结果表中指的是 AdapterH
要使用 AdapterP,只需添加以下参数:
--adapter_name bottleneck
--use_adapterp # 使用 AdapterP,在结果表中指的是 AdapterP
要使用并行适配器,只需添加以下参数:
--adapter_name bottleneck
--use_parallel_adapter
值得注意的是,为了便于使用并行适配器的大模型进行 INT8 训练,我们采用了一种技术,即将并行适配器层并入多头注意力层和 MLP 层,与线性层并行。这与 Hu et al. (2021) 不同。
推理 (generate.py)
该文件从 Hugging Face 模型库中读取基础模型,并从 './trained_models/llama-lora'
中读取 LoRA 权重,并运行一个 Gradio 界面,用于在指定输入上进行推理。用户应将此视为模型使用的示例代码,并根据需要进行修改。
示例用法:
CUDA_VISIBLE_DEVICES=0 torchrun generate.py \
--base_model 'yahma/llama-7b-hf' \
--lora_weights './trained_models/llama-lora'
评估 (evaluate.py)
要评估微调模型在算术推理任务上的表现,您可以使用以下命令:
CUDA_VISIBLE_DEVICES=0 python evaluate.py
--model LLaMA-7B \ #指定基础模型
--adapter LoRA \ #指定适配器名称 ["LoRA", "AdapterH", "AdapterP", "Parallel", "Scaled_Parallel""]
--dataset SVAMP \ #指定测试数据集
--base_model 'yahma/llama-7b-hf' \
--lora_weights './trained_models/llama-lora'
微调结果
这是不同模型在4个数学推理数据集上的微调结果,包括 GSM8K、AQuA、SVAMP 和 MAWPS。在此表中,我们根据经验研究在我们的 论文 中使用了 Prefix-Tuning、串联适配器、LoRA 和并行适配器的最佳配置和放置。
模型 | GSM8K | AQuA | MAWPS | SVAMP | 平均值 |
---|---|---|---|---|---|
GPT-3.5 | 56.4 | 38.9 | 87.4 | 69.9 | 63.2 |
BLOOMz-7B-Prefix | 13.8 | 12.5 | 47.5 | 24.1 | 24.5 |
BLOOMz-7B-Series | 14.3 | 20.5 | 62.2 | 38.1 | 33.8 |
BLOOMz-7B-Parallel | 18.5 | 18.9 | 70.6 | 36.4 | 36.1 |
BLOOMz-7B-LoRA | 17.4 | 21.3 | 70.2 | 41.0 | 37.5 |
GPT-j-6B-Prefix | 16.0 | 14.7 | 59.2 | 31.0 | 30.2 |
GPT-j-6B-Series | 19.5 | 15.0 | 80.3 | 43.6 | 39.6 |
GPT-j-6B-Parallel | 18.9 | 17.9 | 78.2 | 41.1 | 39.0 |
GPT-j-6B-LoRA | 23.0 | 16.1 | 79.4 | 46.0 | 41.1 |
LLaMA-7B-Prefix | 24.4 | 14.2 | 63.4 | 38.1 | 35.0 |
LLaMA-7B-Series | 33.3 | 15.0 | 77.7 | 52.3 | 44.6 |
LLaMA-7B-Parallel | 35.3 | 18.1 | 82.4 | 49.6 | 46.4 |
LLaMA-7B-LoRA | 37.5 | 18.9 | 79.0 | 52.1 | 46.9 |
LLaMA-13B-Prefix | 31.1 | 15.7 | 66.8 | 41.4 | 38.8 |
LLaMA-13B-Series | 44.0 | 22.0 | 78.6 | 50.8 | 48.9 |
LLaMA-13B-Parallel | 43.3 | 20.5 | 81.1 | 55.7 | 50.2 |
LLaMA-13B-LoRA | 47.5 | 18.5 | 83.6 | 54.6 | 51.1 |
这是不同模型在八个常识推理数据集上的微调结果。
| 模型 | BoolQ | PIQA | SIQA | HellaSwag | WinoGrande | ARC-e | ARC-c | OBQA | 平均 |
|-----------------------|---------|--------|--------|-------------|--------------|---------|---------|--------|-----------|
| ChatGPT | **73.1**|**85.4**| 68.5 | 78.5 | 66.1 |**89.8** |**79.9** | 74.8 | 77.0 |
| BLOOMz-7B-Prefix | 45.6 | 53.7 | 46.3 | 26.7 | 49.5 | 52.1 | 39.7 | 44.3 | 44.7 |
| BLOOMz-7B-Series | 65.4 | 70.4 | 73.6 | 53.4 | 69.3 | 72.3 | 55.9 | 68.0 | 66.0 |
| BLOOMz-7B-Parallel | 64.1 | 71.5 | 72.1 | 52.9 | 67.0 | 70.5 | 54.7 | 69.6 | 65.3 |
| BLOOMz-7B-LoRA | 65.9 | 75.3 | 74.5 | 57.3 | 72.5 | 74.6 | 57.8 | 73.4 | 68.9 |
| GPT-j-6B-Prefix | 63.1 | 66.9 | 68.7 | 34.4 | 64.5 | 64.4 | 46.8 | 59.0 | 58.5 |
| GPT-j-6B-Series | 62.1 | 63.5 | 72.3 | 30.6 | 68.0 | 63.9 | 48.1 | 63.8 | 59.0 |
| GPT-j-6B-Parallel | 62.2 | 69.7 | 70.0 | 41.7 | 65.0 | 60.2 | 44.6 | 58.2 | 59.0 |
| GPT-j-6B-LoRA | 62.4 | 68.6 | 49.5 | 43.1 | 57.3 | 43.4 | 31.0 | 46.6 | 50.2 |
| LLaMA-7B-Prefix | 64.3 | 76.8 | 73.9 | 42.1 | 72.1 | 72.9 | 54.0 | 60.6 | 64.6 |
| LLaMA-7B-Series | 63.0 | 79.2 | 76.3 | 67.9 | 75.7 | 74.5 | 57.1 | 72.4 | 70.8 |
| LLaMA-7B-Parallel | 67.9 | 76.4 | 78.8 | 69.8 | 78.9 | 73.7 | 57.3 | 75.2 | 72.3 |
| LLaMA-7B-LoRA | 68.9 | 80.7 | 77.4 | 78.1 | 78.8 | 77.8 | 61.3 | 74.8 | 74.7 |
| LLaMA-13B-Prefix | 65.3 | 75.4 | 72.1 | 55.2 | 68.6 | 79.5 | 62.9 | 68.0 | 68.4 |
| LLaMA-13B-Series | 71.8 | 83.0 | 79.2 | 88.1 | 82.4 | 82.5 | 67.3 | 81.8 | 79.5 |
| LLaMA-13B-Parallel | 72.5 | 84.8 | 79.8 |**92.1** |**84.7** | 84.2 | 71.2 |**82.4**|**81.5** |
| LLaMA-13B-LoRA | 72.1 | 83.5 |**80.5**| 90.5 | 83.7 | 82.8 | 68.3 |**82.4**| 80.5 |
### Adapter 支持矩阵
该矩阵展示了不同模型是否可以使用LoRA、AdapterH、AdapterP、Parallel及Scaled Parallel适配器。
| 适配器 | LoRA | AdapterH | AdapterP | Parallel| Prefix Tuning |P-Tuning|Prompt Tuning|
|--------------|-------|-------|----------|-------|-------|-------|-------|
| LLaMA | ✅ | ✅ | ✅ |✅ | ✅ | ✅ | ✅ |
| BLOOM | ✅ | ✅ | ✅ |✅ | ✅ | ✅ | ✅ |
| GPT-J | ✅ | ✅ | ✅ |✅ | ✅ | ✅ | ✅ |
| OPT | ✅ | ✅ | ✅ |✅ | ✅ | ✅ | ✅ |
| GPT-2 | ✅ | 🔧开发中 | 🔧开发中 |🔧开发中| ✅ | ✅ | ✅ |
| GPT-Neo | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| GPT-NeoX-20B | ✅ | 🔧开发中 | 🔧开发中 |🔧开发中| ✅ | ✅ | ✅ |
| ChatGLM | ✅ | ✅ | ✅ |✅ | ✅ | ✅ | ✅ |
### TODO 列表
- [x] 添加 AdapterH
- [x] 添加 AdapterP
- [x] 添加 Parallel 适配器
- [ ] 支持更多 LLMs
- [ ] 支持多适配器
- [ ] 支持适配器组合
- [ ] 支持适配器融合
## :star: Star 历史
[![Star History Chart](https://api.star-history.com/svg?repos=AGI-Edgerunners/LLM-Adapters&type=Date)](https://star-history.com/#AGI-Edgerunners/LLM-Adapters&Date)
## 引用 <img src="https://yellow-cdn.veclightyear.com/2b54e442/9c5fd417-364e-45c4-9aaf-a32573a420d4.jpg" width="14px" height="14px"> LLM-Adapter
如果你在发表的文章中使用了 <img src="https://yellow-cdn.veclightyear.com/2b54e442/9c5fd417-364e-45c4-9aaf-a32573a420d4.jpg" width="14px" height="14px"> LLM-Adapters,请使用以下的 BibTeX 条目进行引用。
```bibtex
@article{hu2023llm,
title={LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models},
author={Hu, Zhiqiang and Lan, Yihuai and Wang, Lei and Xu, Wanyu and Lim, Ee-Peng and Lee, Roy Ka-Wei and Bing, Lidong and Poria, Soujanya},
journal={arXiv preprint arXiv:2304.01933},
year={2023}
}
致谢
这个仓库受益于 PEFT、Adapter-Transformer、Alpaca-lora。感谢他们的优秀作品。此外,我们感谢 DONG Shan 和 dream.ai 为我们设计的出色的标志,它为我们的项目增添了巨大的价值。