👋🤗🤗👋 加入我们 WeChat.
English | 中文
这里是LLamaTuner
项目的存储库,旨在构建和开源 遵循指令的baichuan/LLaMA/Pythia/GLM
中文大模型微调训练方法,该方法可以在单个 Nvidia RTX-2080TI上进行训练,多轮聊天机器人可以在单个 Nvidia RTX-3090上进行上下文长度 2048的模型训练。
我们使用bitsandbytes进行量化,并与Huggingface的PEFT和 transformers库集成。
本项目主要内容如下:
- 📗 支持全量参数指令微调、LoRA指令微调(后续将会提供支持), QLoRA低成本高效指令微调。
- 📗 支持绝大部分主流的开源大模型,如百川 baichuan、Ziya、Bloom、LLaMA、Pythia、OPT等。
- 📗 支持lora与base model进行权重合并,推理更便捷。
- 📗 开源和整理指令微调数据集的数据清洗和预处理脚本。
- 📗 开源一系列指令微调模型权重 。
Qlora 简介:
QLora 是一种有效的微调方法,可以在单个48GB GPU上微调65B参数模型,同时保持完整的16位微调任务性能。QLora 使用一种低精度的存储数据类型(NF4)来压缩预训练的语言模型。通过冻结 LM 参数,将相对少量的可训练参数以 Low-Rank Adapters 的形式添加到模型中,LoRA 层是在训练期间更新的唯一参数,使得模型体量大幅压缩同时推理效果几乎没有受到影响。从QLora的名字可以看出,QLora实际上是Quantize+LoRA技术。
我们开源的 Guanaco 模型在 Vicuna 基准测试中优于所有以前的公开发布模型,达到了 ChatGPT 的性能水平 99.3%,而在单个 GPU 上只需要 24 小时的微调。
QLora 引入了多种创新,旨在在不牺牲性能的情况下减少内存使用:
- 4-bit NormalFloat:这是一种理论上针对正态分布数据的最优的量化数据类型,优于当前普遍使用的FP4与Int4。
- Double Quantization:相比于当前的模型量化方法,更加节省显存空间。每个参数平均节省0.37bit,对于65B的LLaMA模型,大约能节省3GB显存空间。
- Paged Optimizers:使用NVIDIA统一内存来避免在处理小批量的长序列时出现的梯度 Checkppints 内存峰值。
- 增加 Adapter:4-bit NormalFloat与Double Quantization,节省了很多空间,但带来了性能损失,作者通过插入更多adapter来弥补这种性能损失。在LoRA中,一般会选择在query和value的全连接层处插入adapter。而QLora则在所有全连接层处都插入了adapter,增加了训练参数,弥补精度带来的性能损失。
完整介绍查看:QLORA: LLamaTuner
- [23/06/25] 我们发布了有监督的finetune baichuan-7B模型(GaussianTech/baichuan-7b-sft)和相应的训练脚本。
- [23/06/24] 我们发布了有监督的finetune llama-7B模型(GaussianTech/llama-7b-sft)和相应的训练脚本。
- [23/06/15] 现在我们在这个仓库中支持训练 baichuan-7B 模型, 尝试
--model_name_or_path baichuan-inc/baichuan-7B
使用baichuan-7B型号。 - [23/06/03] 现在我们支持量化训练和推理(又名 QLoRA),尝试
scripts/qlora_finetune/finetune_llama_guanaco7b.sh
并设置--bits 4/8
参数以使用量化模型。 - [23/05/25] 现在支持Lora训练和推理, 尝试
scripts/lora_finetune/lora-finetune_alpaca.sh
在 Alpaca 数据集上使用 Lora 微调 LLAMA 模型。 - [20/05/23] 目前支持全参数调优和部分参数微调,尝试
scripts/full_finetune/full-finetune_alpaca.sh
在Alpaca 数据集上完全微调 LLAMA 模型。
- LLaMA (7B/13B/33B/65B)
- LLama2 (7B/13B/33B/70B)
- BLOOM & BLOOMZ (560M/1.1B/1.7B/3B/7.1B/176B)
- baichuan (7B)
- OPT (125M/350M/1.3B/2.7B/6.7B/66B )
- (Continually) pre-training
- Supervised fine-tuning
截至目前,我们支持以下数据集,这些数据集都可以在 Hugging Face Datasets 上找到。我们将在未来添加更多数据集。
-
For supervised fine-tuning:
-
For reward model training:
请参考 data/README.md 了解如何使用这些数据集训练自己的 ChatGPT。如果您想探索更多数据集,请参考 awesome-instruction-datasets. 默认情况下,我们使用 Stanford Alpaca 数据集进行训练和微调。
部分数据集需要 huggingface 的账号认证确认才能使用,我们建议使用以下命令登录您的 Hugging Face 账户。
pip install --upgrade huggingface_hub
huggingface-cli login
我们在 data 文件夹中提供了数据预处理和格式化的脚本。这些脚本可以用于将数据集转换为我们的格式,以便在训练和微调中使用。
- data_utils.py:数据预处理和格式化
- sft_dataset.py:有监督的对话数据集类
- conv_dataset.py:多轮对话数据集类
我们在 Hugging Face 提供了许多模型。这些模型经过Self- Instruct 数据集的训练,可用于推理和微调:
🔔 使用本项目的训练代码,以及上述训练数据,我们训练并开源了以下模型。
Base Model | Adapter | Instruct Datasets | Model on Huggingface |
---|---|---|---|
llama-7b | FullFinetune | - | |
llama-7b | QLoRA | openassistant-guanaco | GaussianTech/llama-7b-sft |
llama-7b | QLoRA | OL-CC | |
baichuan7b | QLoRA | openassistant-guanaco | GaussianTech/baichuan-7b-sft |
baichuan7b | QLoRA | OL-CC | - |
- CUDA >= 11.0
- Python 3.8+ 和 PyTorch 1.13.1+
- 🤗Transformers、数据集、Accelerate、PEFT 和 bitsandbytes
- jieba、rouge_chinese 和 nltk(评估时使用)
- gradio(在gradio_webserver.py中使用)
要使用 Transformer 和 BitsandBytes 加载 4 位模型,您必须从源代码安装加速器和 Transformer,并确保您拥有最新版本的 BitsandBytes 库 (0.39.0)。您可以使用以下命令来实现上述目的:
pip install -q -U bitsandbytes
pip install -q -U git+https://github.com/huggingface/transformers.git
pip install -q -U git+https://github.com/huggingface/peft.git
pip install -q -U git+https://github.com/huggingface/accelerate.git
克隆此存储库并导航到 Efficient-Tuning-LLMs 文件夹
git clone https://github.com/jianzhnie/Efficient-Tuning-LLMs.git
cd Efficient-Tuning-LLMs
该train_qlora.py
代码是对各种数据集进行微调和推理的起点。在 Alpaca 数据集上微调基线模型的基本命令:
python train_qlora.py --model_name_or_path <path_or_name>
对于大于13B的模型,我们建议调整学习率:
python train_qlora.py –learning_rate 0.0001 --model_name_or_path <path_or_name>
要查找更多用于微调和推理的脚本,请参阅该scripts
文件夹。
LLamaTuner
根据 Apache 2.0 许可证发布。
我们感谢 Huggingface 团队,特别是 Younes Belkada,感谢他们支持将 QLoRA 与 PEFT 和 Transformer 库集成。
我们感谢许多开源贡献者的工作,特别是:
如果您使用此存储库中的数据或代码,请引用该存储库。
@misc{Chinese-Guanaco,
author = {jianzhnie},
title = { LLamaTuner: Easy and Efficient Fine-tuning LLMs},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/jianzhnie/LLamaTuner}},
}