目录
  1. 1. 目录
  2. 2. 项目速览
  3. 3. 功能概述
    1. 3.1. 训练模式
    2. 3.2. 模型覆盖
    3. 3.3. 开源数据集
    4. 3.4. Unsloth 加速集成
  4. 4. 适用场景
  5. 5. 快速上手
    1. 5.1. 安装
    2. 5.2. 训练配置
    3. 5.3. 执行训练
    4. 5.4. 数据格式
  6. 6. 源码架构
  7. 7. 实操 Demo
    1. 7.1. 步骤 1:准备客服对话数据
    2. 7.2. 步骤 2:创建 QLoRA 配置文件
    3. 7.3. 步骤 3:训练与监控
    4. 7.4. 步骤 4:推理验证
  8. 8. 同类对比
  9. 9. 参考资源
Firefly — 中文大模型训练的一站式工具链

GitHub: yangjianxin1/Firefly
Stars: 6,600+ | Language: Python (100%) | License: 暂无
最新版本: v0.0.1-alpha | 作者: 杨建新(yangjianxin1)

目录

  1. 项目速览
  2. 功能概述
  3. 适用场景
  4. 快速上手
  5. 源码架构
  6. 实操 Demo
  7. 同类对比
  8. 参考资源

项目速览

Firefly(萤火虫)是由杨建新开发的中文大模型训练工具,GitHub 6.6k Star。与 LLaMA-Factory、unsloth 等国际社区主流框架不同,Firefly 深耕中文 NLP 场景,围绕”数据—训练—评估”提供了一套完整的工具链:不仅提供训练代码,还配套开源了包含 1.15M 样本的中文指令数据集(firefly-train-1.1M)和在 HuggingFace 上开源的 Firefly 系列模型权重。

Firefly 的设计哲学是”大道至简”:训练配置使用直观的 JSON 文件,训练入口是单一的 train.py,通过 --train_args_file 参数指定不同配置文件来切换预训练、指令微调、DPO 对齐等训练模式。这种设计使代码量极小(核心逻辑不到 2000 行),易于理解和二次开发。

项目在 QLoRA 微调效果的验证上做得很扎实——在 Open LLM Leaderboard 上公开了使用 Firefly QLoRA 微调后的模型评测成绩,证明了 4-bit QLoRA 微调在中文场景的有效性。此外,Firefly 较早地集成了 unsloth 加速支持,将 unsloth 的内核优化与自身的训练管线结合。

功能概述

训练模式

Firefly 支持三种训练模式,通过 JSON 配置中的 task_type 字段切换:

训练模式 task_type train_mode 说明
预训练 (Pretrain) pretrain full 全量参数预训练
指令微调 (SFT) sft full / lora / qlora 全量/LoRA/QLoRA 三种模式
偏好对齐 (DPO) dpo qlora 基于 QLoRA 的 DPO 对齐

模型覆盖

Firefly 支持 20+ 种中文社区主流模型:

厂商 模型系列
阿里 Qwen, Qwen2, Qwen2.5
零一万物 Yi-6B, Yi1.5
Meta Llama, Llama2, Llama3
微软 Phi-3
谷歌 Gemma
面壁智能 MiniCPM, MiniCPM3
智谱 ChatGLM2
上海 AI Lab InternLM
DeepSeek Deepseek
Mistral Mistral, Mixtral-8x7B, Zephyr
百川 Baichuan, Baichuan2
其他 Orion, Xverse, Bloom, Falcon, TinyLlama, Vicuna, Ziya2

开源数据集

Firefly 配套了多套中英文训练数据集:

数据集 规模 说明
firefly-train-1.1M 1.15M 条 23 个中文 NLP 任务 + 人文数据
moss-003-sft-data 1M+ 条 复旦 MOSS 团队中英多轮对话
ultrachat 1.4M+ 条 清华英文多轮对话
WizardLM_evol_instruct_V2_143k 143k 条 英文复杂指令
school_math_0.25M 250k 条 BELLE 数学运算指令
shareAI/CodeChat - 代码问答与生成
shareAI/ShareGPT-Chinese-English-90k 90k 条 中英双语人机对话
ultrachat_200k 200k 条 Zephyr 清洗的英文指令数据
ultrafeedback_binarized - DPO 偏好对齐数据

Unsloth 加速集成

Firefly 较早集成了 unsloth 加速,通过在 JSON 配置中设置 "use_unsloth": true 即可启用。安装 unsloth 后端:

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

适用场景

  1. 中文垂直领域微调:利用 firefly-train-1.1M 中文数据集作为种子数据,叠加自有领域数据进行微调,适合医疗、法律、教育等中文场景。
  2. QLoRA 低资源训练:在消费级 GPU 上微调 Yi-6B、Qwen2.5-7B 等中文模型,6GB 显存即可训练。
  3. DPO 偏好对齐实验:利用 ultrafeedback_binarized 数据集做中文模型的偏好对齐,提升回答质量和安全性。
  4. 预训练研究:在小模型(如 BLOOM-1B1)上快速验证预训练方案,代码简洁易于修改。
  5. 学习与教学:代码量小、结构清晰,是三款框架中最适合学习大模型训练原理的入门项目。

快速上手

安装

git clone https://github.com/yangjianxin1/Firefly.git
cd Firefly
pip install -r requirements.txt

训练配置

Firefly 使用 JSON 文件配置训练参数,以 Yi-6B-Chat 的 QLoRA 指令微调为例(train_args/sft/qlora/yi-6b-sft-qlora.json):

{
"output_dir": "output/firefly-yi-6b-sft-qlora",
"model_name_or_path": "01-ai/Yi-6B-Chat",
"train_file": "./data/dummy_data.jsonl",
"template_name": "yi",
"num_train_epochs": 1,
"per_device_train_batch_size": 1,
"gradient_accumulation_steps": 16,
"learning_rate": 2e-4,
"max_seq_length": 1024,
"logging_steps": 100,
"save_steps": 100,
"save_total_limit": 1,
"lr_scheduler_type": "constant_with_warmup",
"warmup_steps": 100,
"lora_rank": 64,
"lora_alpha": 16,
"lora_dropout": 0.05,
"gradient_checkpointing": true,
"disable_tqdm": false,
"optim": "paged_adamw_32bit",
"seed": 42,
"fp16": true,
"report_to": "tensorboard",
"dataloader_num_workers": 0,
"save_strategy": "steps",
"weight_decay": 0,
"max_grad_norm": 0.3,
"remove_unused_columns": false
}

执行训练

# 单卡 QLoRA 微调
python train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json

# 多卡 QLoRA 微调
torchrun --nproc_per_node=4 train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json

# 全量参数 SFT(DeepSpeed)
deepspeed --num_gpus=8 train.py --train_args_file train_args/sft/full/bloom-1b1-sft-full.json

# 预训练
deepspeed --num_gpus=8 train.py --train_args_file train_args/pretrain/full/bloom-1b1-pretrain-full.json

# DPO 偏好对齐
python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json

# 推理测试
cd script/chat
python chat.py

数据格式

Firefly 的训练数据为 JSONL 格式,每行一条:

{"conversation": [{"human": "请用一句话介绍杭州", "assistant": "杭州是浙江省省会,以西湖美景和互联网产业闻名于世。"}]}
{"conversation": [{"human": "什么是机器学习?", "assistant": "机器学习是人工智能的一个分支,让计算机通过数据学习模式而非显式编程来实现任务。"}]}

源码架构

Firefly 的代码组织极为精简,核心逻辑清晰:

Firefly/
├── train.py # 唯一训练入口(参数解析 + 模式分发)
├── component/ # 核心组件
│ ├── dataloader.py # 数据加载与对话模板格式化
│ ├── dataset.py # SFT/DPO/Pretrain 数据集类
│ ├── trainer.py # 训练器封装(集成 unsloth)
│ ├── collator.py # 数据批处理与 Padding
│ ├── template.py # 各模型对话模板(yi, qwen, llama3 等)
│ ├── model.py # 模型加载(全量/LoRA/QLoRA)
│ └── argument.py # 训练参数定义
├── train_args/ # 训练配置文件
│ ├── pretrain/full/ # 预训练配置
│ └── sft/
│ ├── full/ # 全量微调配置
│ └── qlora/ # QLoRA 微调配置(主要使用)
├── script/
│ └── chat/
│ └── chat.py # 推理对话脚本
└── data/ # 示例数据

核心设计模式:

  1. 单文件入口:所有训练模式通过同一个 train.py 分发,参数通过 JSON 文件注入,代码修改点极简。
  2. 配置即模式task_type(pretrain/sft/dpo)和 train_mode(full/lora/qlora)的组合定义了训练行为,配置驱动一切。
  3. 模板驱动对话:通过 template_name 自动匹配不同模型的对话格式(Yi 模板、Qwen 模板、Llama3 模板等),类似 LLaMA-Factory 的模板系统但更轻量。
  4. 组件化但非插件化:与 LLaMA-Factory 的插件式架构不同,Firefly 的组件之间是直接引用的,代码行数更少但扩展性较低。

实操 Demo

以下演示使用 Firefly 在单卡 RTX 4090(24GB)上对 Qwen2.5-7B 进行中文客服微调。

步骤 1:准备客服对话数据

创建 data/customer_service.jsonl

{"conversation": [{"human": "我的订单怎么还没发货?", "assistant": "非常抱歉给您带来不便!请您提供订单编号,我马上帮您查询物流状态。通常在付款后24小时内发货,如遇大促期间可能会有延迟。"}]}
{"conversation": [{"human": "收到的东西是坏的怎么办?", "assistant": "非常抱歉!请您拍照保留证据,在订单详情页点击'申请售后',选择'质量问题'。我们会在48小时内为您处理退换货,运费由我们承担。"}]}
{"conversation": [{"human": "能开发票吗?", "assistant": "可以的!在订单确认收货后,进入订单详情页点击'申请发票',支持个人发票和企业增值税专用发票。电子发票将在申请后1小时内发送至您的邮箱。"}]}

步骤 2:创建 QLoRA 配置文件

创建 train_args/sft/qlora/qwen2.5-7b-cs-qlora.json

{
"output_dir": "output/qwen2.5-7b-customer-service",
"model_name_or_path": "Qwen/Qwen2.5-7B-Instruct",
"train_file": "./data/customer_service.jsonl",
"template_name": "qwen",
"num_train_epochs": 5,
"per_device_train_batch_size": 1,
"gradient_accumulation_steps": 8,
"learning_rate": 1e-4,
"max_seq_length": 1024,
"logging_steps": 10,
"save_steps": 50,
"save_total_limit": 2,
"lr_scheduler_type": "cosine",
"warmup_steps": 20,
"lora_rank": 32,
"lora_alpha": 64,
"lora_dropout": 0.05,
"gradient_checkpointing": true,
"optim": "paged_adamw_32bit",
"seed": 42,
"bf16": true,
"report_to": "tensorboard",
"weight_decay": 0.01,
"max_grad_norm": 0.3,
"remove_unused_columns": false,
"use_unsloth": true
}

步骤 3:训练与监控

# 启动训练
python train.py --train_args_file train_args/sft/qlora/qwen2.5-7b-cs-qlora.json

# 另一个终端监控
tensorboard --logdir output/qwen2.5-7b-customer-service

步骤 4:推理验证

cd script/chat
# 修改 chat.py 中的模型路径为 output/qwen2.5-7b-customer-service
python chat.py

对话测试:

User: 我买了两件商品,只收到一件怎么办?
Bot: 非常抱歉!请您核对一下包裹内的发货清单,确认缺失的商品名称,
然后联系在线客服或拨打客服热线 400-XXX-XXXX。
我们会立即为您核实并补发,通常 1-3 个工作日内送达。

同类对比

维度 Firefly LLaMA-Factory unsloth
Star 数 6.6k 72.2k 66.6k
定位 中文场景一站式中 国际化统一微调框架 内核级训练加速
代码规模 极简(<2000 行核心) 大型工程(5 万+ 行) 中等
配置格式 JSON YAML Python + WebUI
模型数量 20+ 100+ 500+ (通用适配)
训练方法 Pretrain/SFT/DPO Pretrain/SFT/RM/DPO/KTO/ORPO/PPO/SimPO SFT/GRPO/Pretrain
开源数据集 1.1M 中文指令数据
中文支持 深度优化(数据+模板+模型) 通用支持 通用支持
Unsloth 集成 原生支持 可选配置 自身
GRPO 支持 不支持 不支持 原生支持
多模态 不支持 全面支持 VLM GRPO
社区活跃度 个人维护 200+ 贡献者 团队维护
学习曲线 最低 中等
许可证 暂无 Apache-2.0 Apache-2.0 + AGPL-3.0

Firefly 的独特定位在于”中文优先 + 极简设计”。对于中文 NLP 从业者来说,Firefly 的 1.1M 中文数据集和 20+ 中文模型模板是即插即用的资源。但如果你需要 GRPO 强化学习、多模态训练或生产级云原生部署,LLaMA-Factory 或 Axolotl 是更合适的选择。

参考资源

文章作者: Leo·Cheung
文章链接: http://tufusi.com/2026/06/15/SKILL-Firefly/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ONE·PIECE
打赏
  • 微信
  • 支付宝

评论