Skip to content

Latest commit

 

History

History
344 lines (255 loc) · 17 KB

README_zh.md

File metadata and controls

344 lines (255 loc) · 17 KB
 

GitHub Repo stars GitHub Code License GitHub last commit GitHub pull request Python 3.9+ Code style: black

👋🤗🤗👋 加入我们 WeChat.

Efficient Finetuning of Quantized LLMs --- 低资源的大语言模型量化训练/部署方案

English | 中文

这里是Efficient Finetuning of Quantized LLMs项目的存储库,旨在构建和开源 遵循指令的baichuan/LLaMA/Pythia/GLM中文大模型微调训练方法,该方法可以在单个 Nvidia RTX-2080TI上进行训练,多轮聊天机器人可以在单个 Nvidia RTX-3090上进行上下文长度 2048的模型训练。

我们使用bitsandbytes进行量化,并与Huggingface的PEFTtransformers库集成。

本项目主要内容如下:

  • 📗 支持全量参数指令微调、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 引入了多种创新,旨在在不牺牲性能的情况下减少内存使用:

  1. 4-bit NormalFloat:这是一种理论上针对正态分布数据的最优的量化数据类型,优于当前普遍使用的FP4与Int4。
  2. Double Quantization:相比于当前的模型量化方法,更加节省显存空间。每个参数平均节省0.37bit,对于65B的LLaMA模型,大约能节省3GB显存空间。
  3. Paged Optimizers:使用NVIDIA统一内存来避免在处理小批量的长序列时出现的梯度 Checkppints 内存峰值。
  4. 增加 Adapter:4-bit NormalFloat与Double Quantization,节省了很多空间,但带来了性能损失,作者通过插入更多adapter来弥补这种性能损失。在LoRA中,一般会选择在query和value的全连接层处插入adapter。而QLora则在所有全连接层处都插入了adapter,增加了训练参数,弥补精度带来的性能损失。

完整介绍查看:QLORA: Efficient Finetuning of Quantized LLMs

新闻

  • [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 模型。

支持的模型

支持的训练方法

  • (Continually) pre-training
    • Full-parameter tuning
    • Partial-parameter tuning
    • LoRA
    • QLoRA
  • Supervised fine-tuning
    • Full-parameter tuning
    • Partial-parameter tuning
    • LoRA
    • QLoRA

提供的数据集接口

截至目前,我们支持以下数据集,这些数据集都可以在 Hugging Face Datasets 上找到。我们将在未来添加更多数据集。

请参考 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

快速开始

QLora int4 微调

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>

我们还可以调整我们的超参数:

python train_qlora.py \
    --model_name_or_path ~/checkpoints/baichuan7b \
    --dataset_cfg ./data/alpaca_zh_pcyn.yaml \
    --data_dir ~/prompt_datasets \
    --load_from_local \
    --output_dir ./work_dir/oasst1-baichuan-7b \
    --num_train_epochs 4 \
    --per_device_train_batch_size 4 \
    --per_device_eval_batch_size 4 \
    --gradient_accumulation_steps 8 \
    --evaluation_strategy steps \
    --eval_steps 50 \
    --save_strategy steps \
    --save_total_limit 5 \
    --save_steps 100 \
    --logging_strategy steps \
    --logging_steps 1 \
    --learning_rate 0.0002 \
    --warmup_ratio 0.03 \
    --weight_decay 0.0 \
    --lr_scheduler_type constant \
    --adam_beta2 0.999 \
    --max_grad_norm 0.3 \
    --max_new_tokens 32 \
    --source_max_len 512 \
    --target_max_len 512 \
    --lora_r 64 \
    --lora_alpha 16 \
    --lora_dropout 0.1 \
    --double_quant \
    --quant_type nf4 \
    --fp16 \
    --bits 4 \
    --gradient_checkpointing \
    --trust_remote_code \
    --do_train \
    --do_eval \
    --sample_generate \
    --data_seed 42 \
    --seed 0

要查找更多用于微调和推理的脚本,请参阅该scripts文件夹。

量化

BitsandbytesConfig量化参数由(参见 huggingface 文档)控制,如下所示:

  • 4 位加载通过以下方式激活load_in_4bit
  • 用于线性层计算的数据类型bnb_4bit_compute_dtype
  • 嵌套量化通过以下方式激活bnb_4bit_use_double_quant
  • 用于量化的数据类型由 指定bnb_4bit_quant_type。请注意,有两种支持的量化数据类型fp4(四位浮点)和nf4(普通四位浮点)。后者理论上对于正态分布权重来说是最佳的,我们建议使用nf4
    model = AutoModelForCausalLM.from_pretrained(
        model_name_or_path='/name/or/path/to/your/model',
        load_in_4bit=True,
        device_map='auto',
        max_memory=max_memory,
        torch_dtype=torch.bfloat16,
        quantization_config=BitsAndBytesConfig(
            load_in_4bit=True,
            bnb_4bit_compute_dtype=torch.bfloat16,
            bnb_4bit_use_double_quant=True,
            bnb_4bit_quant_type='nf4'
        ),
    )

教程和演示

我们提供了两个 Google Colab 笔记本来演示 4 位模型在推理和微调中的使用。这些笔记本旨在成为进一步研究和开发的起点。

  • Basic usage Google Colab notebook 该笔记本展示了如何在推理中使用 4 位模型及其所有变体,以及如何在免费的 Google Colab 实例上运行 GPT-neo-X(20B 参数模型)🤯
  • Fine tuning Google Colab notebook 该笔记本展示了如何使用 Hugging Face 生态系统在下游任务中微调 4 位模型。我们证明可以在 Google Colab 实例上微调 GPT-neo-X 20B!

其他示例可以在示例/文件夹下找到。

  • 微调 LLama-7B (ex1)
  • 微调 GPT-neo-X 20B (ex2)

多GPU训练

Hugging Face 的 Accelerate 可以开箱即用地进行多 GPU 训练和推理。请注意,per_device_train_batch_size 和 per_device_eval_batch_size 参数是全局批量大小,与其名称所暗示的不同。

当加载模型以在多个 GPU 上进行训练或推理时,您应该将类似以下内容传递给 AutoModelForCausalLM.from_pretrained():

device_map = "auto"
max_memory = {i: '46000MB' for i in range(torch.cuda.device_count())}

推理

终端交互式对话

运行下面的脚本,程序会在命令行中和你的ChatBot进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear 可以清空对话历史,输入 stop 终止程序。

python cli_demo.py \
    --model_name_or_path ~/checkpoints/baichuan7b \ # base model
    --checkpoint_dir ./work_dir/checkpoint-700  \ # 训练的模型权重
    --trust_remote_code  \
    --double_quant \
    --quant_type nf4 \
    --fp16 \
    --bits 4

使用Gradio进行网页端交互

该文件从 Hugging Face 模型中心读取基础模型,并从 path/to/your/model_dir 读取 LoRA 权重,运行 Gradio 接口以对指定输入进行推理。用户应将此视为模型使用的示例代码,并根据需要进行修改。

用法示例:

python gradio_webserver.py \
    --model_name_or_path decapoda-research/llama-7b-hf \
    --lora_model_name_or_path  `path/to/your/model_dir`

License

Efficient Finetuning of Quantized LLMs根据 Apache 2.0 许可证发布。

致谢

我们感谢 Huggingface 团队,特别是 Younes Belkada,感谢他们支持将 QLoRA 与 PEFT 和 Transformer 库集成。

我们感谢许多开源贡献者的工作,特别是:

引用

如果您使用此存储库中的数据或代码,请引用该存储库。

@misc{Chinese-Guanaco,
  author = {jianzhnie},
  title = {Chinese-Guanaco: Efficient Finetuning of Quantized LLMs for Chinese},
  year = {2023},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/jianzhnie/Efficient-Tuning-LLMs}},
}