👋🤗🤗👋 加入我们的 微信.
简单高效的大语言模型训练/部署
中文 | English
简介
LLamaTuner 是一个高效、灵活且功能齐全的大语言模型(Llama3、Phi3、Qwen、Mistral 等)的微调工具包。
高效
- 支持几乎所有 GPU 上的大语言模型(LLM)、视觉语言模型(VLM)的预训练/微调。LLamaTuner 能够在单个 8GB GPU 上微调 7B 大语言模型,也可进行超 70B 模型的多节点微调。
- 自动分配高性能操作,如 FlashAttention 和 Triton 内核,以提高训练吞吐量。
- 兼容 DeepSpeed 🚀,轻松利用多种 ZeRO 优化技术。
灵活
- 支持多种大语言模型(如 Llama 3、Mixtral、Llama 2、ChatGLM、Qwen、Baichuan 等)。
- 支持视觉语言模型(如 LLaVA)。
- 设计良好的数据管道,兼容任何格式的数据集,包括开源和自定义格式。
- 支持多种训练算法(如 QLoRA、LoRA、全参数微调),用户可以选择最合适的解决方案。
功能齐全
- 支持连续预训练、指令微调和代理微调。
- 支持使用预定义的模板与大模型聊天。
内容目录
支持的模型
模型 | 模型尺寸 | 默认模块 | 模板 |
---|---|---|---|
Baichuan | 7B/13B | W_pack | baichuan |
Baichuan2 | 7B/13B | W_pack | baichuan2 |
BLOOM | 560M/1.1B/1.7B/3B/7.1B/176B | query_key_value | - |
BLOOMZ | 560M/1.1B/1.7B/3B/7.1B/176B | query_key_value | - |
ChatGLM3 | 6B | query_key_value | chatglm3 |
Command-R | 35B/104B | q_proj,v_proj | cohere |
DeepSeek (MoE) | 7B/16B/67B/236B | q_proj,v_proj | deepseek |
Falcon | 7B/11B/40B/180B | query_key_value | falcon |
Gemma/CodeGemma | 2B/7B | q_proj,v_proj | gemma |
InternLM2 | 7B/20B | wqkv | intern2 |
LLaMA | 7B/13B/33B/65B | q_proj,v_proj | - |
LLaMA-2 | 7B/13B/70B | q_proj,v_proj | llama2 |
LLaMA-3 | 8B/70B | q_proj,v_proj | llama3 |
LLaVA-1.5 | 7B/13B | q_proj,v_proj | vicuna |
Mistral/Mixtral | 7B/8x7B/8x22B | q_proj,v_proj | mistral |
OLMo | 1B/7B | q_proj,v_proj | - |
PaliGemma | 3B | q_proj,v_proj | gemma |
Phi-1.5/2 | 1.3B/2.7B | q_proj,v_proj | - |
Phi-3 | 3.8B | qkv_proj | phi |
Qwen | 1.8B/7B/14B/72B | c_attn | qwen |
Qwen1.5 (Code/MoE) | 0.5B/1.8B/4B/7B/14B/32B/72B/110B | q_proj,v_proj | qwen |
StarCoder2 | 3B/7B/15B | q_proj,v_proj | - |
XVERSE | 7B/13B/65B | q_proj,v_proj | xverse |
Yi (1/1.5) | 6B/9B/34B | q_proj,v_proj | yi |
Yi-VL | 6B/34B | q_proj,v_proj | yi_vl |
Yuan | 2B/51B/102B | q_proj,v_proj | yuan |
支持的训练方法
方法 | 全微调 | 冻结微调 | LoRA | QLoRA |
---|---|---|---|---|
预训练 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
监督微调 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
奖励建模 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
PPO 训练 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
DPO 训练 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
KTO 训练 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
ORPO 训练 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
支持的数据集
目前,我们支持以下数据集,其中大多数在 Hugging Face datasets library 中可用。
监督微调数据集
- Stanford Alpaca
- Stanford Alpaca (Chinese)
- Hello-SimpleAI/HC3
- BELLE 2M (zh)
- BELLE 1M (zh)
- BELLE 0.5M (zh)
- BELLE Dialogue 0.4M (zh)
- BELLE School Math 0.25M (zh)
- BELLE Multiturn Chat 0.8M (zh)
- databricks-dolly-15k
- mosaicml/dolly_hhrlhf
- GPT-4 Generated Data
- Alpaca CoT
- UltraChat
- OpenAssistant/oasst1
- ShareGPT_Vicuna_unfiltered
- BIAI/OL-CC
- timdettmers/openassistant-guanaco
- Evol-Instruct
- OpenOrca
- Platypus
- OpenHermes
偏好数据集
请参阅 data/README.md 了解如何使用这些数据集。如果你想探索更多数据集,请参阅 awesome-instruction-datasets。有些数据集在使用前需要确认,我们建议使用以下命令使用你的 Hugging Face 账号登录。
pip install --upgrade huggingface_hub
huggingface-cli login
数据预处理
我们在 data 文件夹中提供了许多数据预处理工具。这些工具旨在成为进一步研究和开发的起点。
- data_utils.py : 数据预处理和格式化
- sft_dataset.py : 监督微调数据集类和协同器
- conv_dataset.py : 对话数据集类和协同器
模型库
我们在 Hugging Face 模型库 中提供了许多模型。这些模型经过 QLoRA 训练,可用于推理和微调。我们提供以下模型:
基础模型 | 适配器 | 指令数据集 | 训练脚本 | 日志 | Huggingface 上的模型 |
---|---|---|---|---|---|
llama-7b | 完全微调 | - | - | - | |
llama-7b | QLoRA | openassistant-guanaco | finetune_lamma7b | wandb log | GaussianTech/llama-7b-sft |
llama-7b | QLoRA | OL-CC | finetune_lamma7b | ||
baichuan7b | QLoRA | openassistant-guanaco | finetune_baichuan7b | wandb log | GaussianTech/baichuan-7b-sft |
baichuan7b | QLoRA | [ | |||
可选 | 最低要求 | 推荐 | |||
---- | -------- | ---- | |||
CUDA | 11.6 | 12.2 | |||
deepspeed | 0.10.0 | 0.14.0 | |||
bitsandbytes | 0.39.0 | 0.43.1 | |||
vllm | 0.4.0 | 0.4.2 | |||
flash-attn | 2.3.0 | 2.5.8 |
硬件要求
* 估计值
方法 | 位数 | 7B | 13B | 30B | 70B | 110B | 8x7B | 8x22B |
---|---|---|---|---|---|---|---|---|
完全 | AMP | 120GB | 240GB | 600GB | 1200GB | 2000GB | 900GB | 2400GB |
完全 | 16 | 60GB | 120GB | 300GB | 600GB | 900GB | 400GB | 1200GB |
冻结 | 16 | 20GB | 40GB | 80GB | 200GB | 360GB | 160GB | 400GB |
LoRA/GaLore/BAdam | 16 | 16GB | 32GB | 64GB | 160GB | 240GB | 120GB | 320GB |
QLoRA | 8 | 10GB | 20GB | 40GB | 80GB | 140GB | 60GB | 160GB |
QLoRA | 4 | 6GB | 12GB | 24GB | 48GB | 72GB | 30GB | 96GB |
QLoRA | 2 | 4GB | 8GB | 16GB | 24GB | 48GB | 18GB | 48GB |
入门指南
克隆代码
克隆此仓库并导航到 Efficient-Tuning-LLMs 文件夹
git clone https://github.com/jianzhnie/LLamaTuner.git
cd LLamaTuner
入门指南
主要功能 | 用途 | 脚本 |
---|---|---|
train.py | 在 SFT 数据集上进行 LLM 的完全微调 | full_finetune |
train_lora.py | 使用 Lora(大型语言模型的低秩适配微调)进行 LLM 微调 | lora_finetune |
train_qlora.py | 使用 QLoRA(QLoRA:量化 LLM 的高效微调)进行 LLM 微调 | qlora_finetune |
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>
要查找更多微调和推理脚本,请参阅 scripts
文件夹。
已知问题和限制
这里列出了一些已知的问题和 bug。如果您的问题没有在这里列出,请打开一个新问题并描述问题。
- 4 位推理速度较慢。 目前,我们的 4 位推理实现尚未与 4 位矩阵乘法集成
- 使用 Trainer 恢复 LoRA 训练运行时会出错
- 当前,使用
bnb_4bit_compute_type='fp16'
可能会导致不稳定。 对于 7B LLaMA,只有 80% 的微调运行没有错误完成。我们有解决方案,但尚未集成到 bitsandbytes 中。 - 确保
tokenizer.bos_token_id = 1
以避免生成问题。
许可证
LLamaTuner
在 Apache 2.0 许可证下发布。
致谢
我们感谢 Huggingface 团队,特别是 Younes Belkada,感谢他们支持将 QLoRA 与 PEFT 和 transformers 库集成。
我们感谢许多开源贡献者的工作,特别是:
- LLaMa
- Vicuna
- xTuring
- Alpaca-LoRA
- Stanford Alpaca
- LLaMA-Factory
- Hugging Face
- Peft
- axolotl
- deepspeed
- Unsloth
- qlora
- bitsandbytes
一些 lmm 微调仓库
- https://github.com/QwenLM
- https://github.com/InternLM
- https://github.com/ymcui/Chinese-LLaMA-Alpaca-3
- https://github.com/ymcui/Chinese-Mixtral
- https://github.com/SmartFlowAI/EmoLLM
- https://github.com/yangjianxin1/Firefly
- https://github.com/LiuHC0428/LAW-GPT
引用
如果您使用本仓库中的数据或代码,请引用本仓库。
@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}},
}