# Firefly **Repository Path**: m626/Firefly ## Basic Information - **Project Name**: Firefly - **Description**: Firefly: 大模型训练工具,支持训练Qwen2、Yi1.5、Phi-3、Llama3、Gemma、MiniCPM、Yi、Deepseek、Orion、Xverse、Mixtral-8x7B、Zephyr、Mistral、Baichuan2、Llma2、Llama、Qwen、Baichuan、ChatGLM2、InternLM、Ziya2、Vicuna、Bloom等大模型 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-13 - **Last Updated**: 2025-12-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Firefly: 一站式大模型训练工具
欢迎加入Firefly大模型技术交流群,关注我们的公众号,点击加群按钮即可。
欢迎关注我们的知乎进行交流讨论:**[红雨瓢泼](https://www.zhihu.com/people/jian-xin-15-96)**
## 项目简介
**Firefly** 是一个开源的大模型训练项目,支持对主流的大模型进行预训练、指令微调和DPO,包括但不限于Qwen2、Yi-1.5、Llama3、Gemma、Qwen1.5、MiniCPM、Llama、InternLM、Baichuan、ChatGLM、Yi、Deepseek、Qwen、Orion、Ziya、Xverse、Mistral、Mixtral-8x7B、Zephyr、Vicuna、Bloom等。
本项目支持**全量参数训练、LoRA、QLoRA高效训练**,支持**预训练、SFT、DPO**。 如果你的训练资源有限,我们极力推荐使用QLoRA进行指令微调,因为我们在Open LLM Leaderboard上验证了该方法的有效性,并且取得了非常不错的成绩。
🔔 本项目主要内容如下:
- 📗 支持预训练、指令微调、DPO,支持全量参数训练、LoRA、QLoRA高效训练。通过配置文件的方式训练不同的模型,小白亦可快速上手训练模型。
- 📗 支持使用[Unsloth](https://github.com/yangjianxin1/unsloth)加速训练,并且节省显存。
- 📗 支持绝大部分主流的开源大模型,如Llama3、Gemma、MiniCPM、Llama、InternLM、Baichuan、ChatGLM、Yi、Deepseek、Qwen、Orion、Ziya、Xverse、Mistral、Mixtral-8x7B、Zephyr、Vicuna、Bloom,训练时与各个官方的chat模型的template对齐。
- 📗 整理并开源指令微调数据集:firefly-train-1.1M 、moss-003-sft-data、ultrachat、 WizardLM_evol_instruct_V2_143k、school_math_0.25M。
- 📗 开源[Firefly系列指令微调模型权重](https://huggingface.co/YeungNLP) 。
- 📗 在Open LLM Leaderboard上验证了QLoRA训练流程的有效性。
当前版本针对不同的chat模型的template进行了适配,代码存在较大的更新。若你更喜欢此前的版本,可下载代码[v0.0.1-alpha](https://github.com/yangjianxin1/Firefly/releases/tag/v0.0.1-alpha)
## News
- 🔥 Unsloth x Qwen2模型结构的PR已merge到[Unsloth](https://github.com/unslothai/unsloth)的master分支。
- 🔥 扩展Unsloth,支持Qwen2模型结构,包括Qwen1.5系列的Dense模型,代码库:[Unsloth](https://github.com/yangjianxin1/unsloth)。 [技术文章](https://mp.weixin.qq.com/s/x2N3p1qgJy_RyRsO2PHS_A)
- 🔥 支持[Unsloth](https://github.com/unslothai/unsloth),训练Llama3-8B仅需7.75GB显存,可减少42.58%显存占用,减少30.72%训练时间。 [训练增益评测](https://mp.weixin.qq.com/s/Zlp7GM37_bkvvQZedzNp0g)。
- 🔥 优化训练流程,支持全量训练、LoRA、QLoRA高效训练,支持预训练、指令微调和DPO。指令微调与DPO的template与原有的chat模型对齐,支持绝大多数开源模型,包括Gemma、MiniCPM、Llama、InternLM、Baichuan、ChatGLM、Yi、Deepseek、Qwen、Orion、Ziya、Xverse、Mistral、Mixtral-8x7B、Zephyr、Vicuna、Bloom等。
- 🔥 开源模型权重[firefly-mixtral-8x7b](https://huggingface.co/YeungNLP/firefly-mixtral-8x7b) ,在[🤗Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)分数为70.34,超越Yi-34B、Llama2-65B-Chat、Qwen-14B、Vicuna-33B-v1.3等模型。
- 🔥 开源[LongQLoRA](https://github.com/yangjianxin1/LongQLoRA), 【[技术报告](https://arxiv.org/abs/2311.04879)】。可高效扩展LLama上下文长度,在单张32GB V100上将Llama2长度扩展至8k(亦可扩展至12k),仅微调1000 step,在PG19和Proof-pile数据集上的perplexity优于LongLoRA,在PG19上略胜MPT-7B-8K。
- 🔥 开源[Firefly-LLaMA2-Chinese项目](https://github.com/yangjianxin1/Firefly-LLaMA2-Chinese),**在4*V100上进行高效训练**,经过中文词表扩充、增量预训练、多轮指令微调,在CMMLU上超越Linly、Yayi、FlagAlpha等,与Ziya、Chinese-Alpaca表现基本持平。
- 🔥 开源[firefly-baichuan2-13b](https://huggingface.co/YeungNLP/firefly-baichuan2-13b),在OpenCompass的CMMLU榜单上以56.83的分数,位列第8,比百川官方Chat模型略低1.57分。
- 🔥 开源[firefly-llama-30b](https://huggingface.co/YeungNLP/firefly-llama-30b),在[🤗Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)上以64.83分,同量级模型**排名第10**。
- 🔥 开源[firefly-llama2-13b](https://huggingface.co/YeungNLP/firefly-llama2-13b),在[🤗Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)上以62分,同量级模型**排名第3**,比榜首略低0.5分。
- 🔥 开源[firefly-llama-13b](https://huggingface.co/YeungNLP/firefly-llama-13b),在[Hugging Face的Open LLM排行榜](https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)上复刻Vicuna-13B,比Vicuna-13b-1.1略高0.2分,比llams-2-13b-chat略低0.5分。
- [LLMPruner:大语言模型裁剪工具](https://github.com/yangjianxin1/LLMPruner) ,开源[裁剪后的Bloom模型权重](https://huggingface.co/YeungNLP) 。
## 相关项目
- [Firefly-LLaMA2-Chinese](https://github.com/yangjianxin1/Firefly-LLaMA2-Chinese):中文Llama2模型,对Llama2进行中文词表扩充、增量预训练和指令微调。
- [LongQLoRA](https://github.com/yangjianxin1/LongQLoRA):大模型长度扩展项目,可在单卡V100上将LLaMA-13B的长度扩展至8192,且性能逼近MPT-8K。
- [LLMPruner](https://github.com/yangjianxin1/LLMPruner):对Bloom进行词表裁剪,减少模型参数量。
## 技术博客
### 预训练数据
数据格式可以参考项目中的data/pretrain/dummy_pretrain.jsonl文件。
### DPO数据
数据格式可以参考项目中的data/dummy_dpo.jsonl文件。
## 模型训练
若训练中报错,可先查看[FAQ]()。
我们将训练中使用的各种组件抽取出来,以便后续的扩展和优化,详见component目录下的实现。训练时的参数配置存储在train_args目录下,方便统一管理和更改。大家可以在train_args目录下查看不同模型的训练配置,按需修改或添加。
### 安装环境
在requirements.txt下固定了几个主要的python包的版本,执行如下脚本即可。注意:
- 对于绝大部分模型,我们均在torch==1.13,transformers==4.36环境上进行调试和训练。但部分较新的模型,需要更新transformers版本。
- Qwen1.5需要将transformers更新只4.37。
- Gemma需要将transformers更新只4.38.1,torch==2.0.0。
- 使用QLoRA训练Baichuan2时,需要安装torch==2.0,并且卸载xformers和apex。
- 使用QLoRA训练Qwen时,需将flash-attn卸载,否则会报错。
```bash
pip install requirements.txt
```
如果需要开启Unsloth,建议安装或者更新以下Python包:
```bash
pip install git+https://github.com/unslothai/unsloth.git
pip install bitsandbytes==0.43.1
pip install peft==0.10.0
pip install torch==2.2.2
pip install xformers==0.0.25.post1
```
如果需要使用Unsloth对Qwen1.5进行训练,安装如下包:
```bash
pip install git+https://github.com/yangjianxin1/unsloth.git
```
### 损失函数
预训练时,我们采用经典的自回归损失,即每个位置的token都会参与loss计算。
指令微调时,我们仅计算assistant回复部分的loss。
### 参数说明
📝 train_args目录下存储了不同模型使用不同训练方式的配置文件,主要参数说明如下:
- output_dir:训练输出目录,存储checkpoint、tokenizer、tensorboard等
- model_name_or_path:预训练模型的本地目录,或者在huggingface上的模型名称。
- train_file:训练数据集路径。sft时,需要设置为文件,可以使用data/dummy_data.jsonl进行debug。pretrain时,需要设置为目录。脚本会自动扫描目录下的所有jsonl文件。
- template_name:指令微调时,使用的模板名称。具体有哪些template_name,可参考component/template.py文件
- num_train_epochs:训练的轮次。如果数据量足够大,一般建议只训一个epoch。
- tokenize_num_workers:预训练时,tokenize的线程数,默认为10。
- deepspeed:deepspeed的训练配置文件。全量参数训练时,将采用deepspeed,关于deepspeed的参数配置说明,请参考[deepspeed文档](https://hf-mirror.com/docs/transformers/main/en/deepspeed#deepspeed)
- train_mode:训练模式,full、lora或qlora,默认为qlora。
- task_type:任务类型,pretrain、sft或dpo,默认为sft。
- per_device_train_batch_size:每张显卡的batch size。
- gradient_accumulation_steps:梯度累计步数。global batch=num_gpus * per_device_train_batch_size * gradient_accumulation_steps。
- gradient_checkpointing:如果显存捉襟见肘,可以开启。以时间换空间,模型不缓存激活状态,会进行两次forward计算,以节省显存。
- learning_rate:学习率。全量参数微调的时候,建议小一些,1e-5或5e-6。
- max_seq_length:训练时的最大长度。按照自己的设备进行设置,越长需要占用越多显存。
- max_prompt_length:进行dpo时,prompt的最大长度。
- logging_steps:每隔多少步统计一次train loss。
- save_steps:每隔多少步保存一个模型。
- save_total_limit:output_dir目录中最多保存多少个checkpoint,超出则会将最旧的删除。
- lr_scheduler_type:学习率变化策略。
- warmup_steps:warm up步数。学习率经过多少步,增长到指定的数值。
- optim:优化器。如果是全量参数微调,建议使用adamw_hf。
- seed:随机种子,用于复现实验结果。
- fp16:使用使用fp16混合精度。V100建议开启。
- bf16:使用使用bf16混合精度。A100建议开启。
- use_unsloth:是否使用unsloth,目前unsloth仅支持部分模型,例如Llama3、Mistral、Gemma、TinyLlama等,详情见[Unsloth](https://github.com/unslothai/unsloth)。
以下几个参数,当使用QLoRA训练的时候,需要设置:
- lora_rank:qlora矩阵的秩。一般设置为8、16、32、64等,在qlora论文中作者设为64。越大则参与训练的参数量越大,一般来说效果会更好,但需要更多显存,。
- lora_alpha: qlora中的缩放参数。一般设为16、32即可。
- lora_dropout: lora权重的dropout rate。
关于deepspeed的参数配置,可按需自行修改。
### 开始训练
💻 全量参数预训练,将{num_gpus}替换为显卡数量:
```bash
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/pretrain/full/bloom-1b1-pretrain-full.json
```
💻 全量参数指令微调,将{num_gpus}替换为显卡数量:
```bash
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/sft/full/bloom-1b1-sft-full.json
```
💻 单卡QLoRA预训练:
```bash
python train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
```
💻 单卡QLoRA指令微调:
```bash
python train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
```
💻 多卡QLoRA预训练:
```bash
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
```
💻 多卡QLoRA指令微调:
```bash
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
```
💻 单卡QLoRA进行DPO训练:
```bash
python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json
```
## 模型使用
### 权重合并
如果使用LoRA或者QLoRA进行训练,本项目仅保存adapter的权重和配置文件,需要将adapter权重与base model进行合并。脚本见script/merge_lora.py
### 模型推理
我们提供了多轮对话的交互脚本,详见script/chat目录,该脚本可同时兼容本项目训练的所有模型进行推理。脚本中设置的template_name,需要与模型训练时的template_name一致。
```bash
cd script/chat
python chat.py
```
生成脚本中的top_p、temperature、repetition_penalty、do_sample等参数对模型的生成效果影响较大,可按照自己的使用场景进行调试修改。
推理脚本中支持使用base model和adapter进行推理,缺点是每次启动脚本都需要合并一次权重,等待时间较久。
支持使用4bit进行推理,显存要求低,效果会略有下降。
## FAQ
#### 问题1:OOM如何解决?
如果发生OOM,可以缩小per_device_train_batch_size、max_seq_length等参数来缓解。也可以设gradient_checkpointing=true,可以大幅降低显存占用,但训练速度会变慢一些。
#### 问题2:安装包错误
requirements.txt中有各python包的版本
```bash
pip install -r requirements.txt
```
#### 问题3:如何指定使用某些卡训练?
通过如下方式,即可指定使用0和1号卡进行训练:
```bash
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node={num_gpus} train_qlora.py --train_args_file train_args/qlora/baichuan-7b-sft-qlora.json
```
#### 问题4:训练Baichuan2失败
训练Baichuan2需要安装torch==2.0,并且卸载xformers和apex,否则会报错
```
RuntimeError: No such operator xformers::efficient_attention_forward_generic - did you forget to build xformers with `python setup.py develop`?
```
#### 问题5:训练Qwen失败
Qwen进行QLoRA训练需要卸载flash-attn,否则会报错:
```
assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v)))
```
#### 问题6:Qwen-Base和Yi-Base经过SFT之后,没法生成<|im_end|>,无法正常停止
经查询,该问题广泛存在于Qwen官方代码库的issue中,如果训练Qwen-Base和Yi-Base,建议设template_name="default",可以避免该问题。
如果对Qwen-Chat和Yi-Chat模型进行SFT,则不会产生该问题,可将template_name分别设为"qwen"和"yi"。
注意:该问题在Qwen1.5中不存在
## 局限性和使用限制
由于模型参数量限制、训练数据的清洗程度等因素,本项目开源的模型可能存在以下局限性:
- 对于事实性知识,容易产生错误的回复。
- 由于未经过无害化微调,可能会产生歧视、危害、违背伦理道德的言论。
- 在代码、推理上的能力仍有欠缺。
基于以上模型的局限性,我们要求本项目的代码、数据、模型不得用于对社会造成危害的用途,且应当遵循基座模型的商业许可。
## 引用
若使用本项目的数据、代码或模型,请引用本项目。
```text
@misc{Firefly,
author = {Jianxin Yang},
title = {Firefly(流萤): 中文对话式大语言模型},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/yangjianxin1/Firefly}},
}
```
[//]: # (## 关注我们)
[//]: # ()
[//]: # (
)
## Star History
