Firefly:中文大模型微调框架详解

FreeGuideOnline 最新 2026-06-22

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


如果需要使用 QLoRA 和 FlashAttention,建议额外执行:

```bash
pip install bitsandbytes
pip install flash-attn --no-build-isolation

快速入门:5 分钟跑通微调

我们以 Qwen2-7B 使用 QLoRA 微调中文指令数据为例。

1. 准备数据

Firefly 要求的数据格式为 jsonl,每行一个样本。标准指令格式如下:

{"conversation": [{"human": "请用一句话介绍杭州。", "assistant": "杭州是一座风景如画的历史文化名城,以西湖和数字经济的活力闻名世界。"}]}
{"conversation": [{"human": "写一首关于秋天的五言诗。", "assistant": "秋风送晚凉,落叶满城黄。月冷寒蝉寂,孤灯照故乡。"}]}

您也可以直接用框架提供的脚本从公开数据集构造数据,例如:

python build_dataset.py --data_name alpaca_gpt4_zh

2. 修改配置文件

配置文件位于 config/ 目录下。以 train_dpo_qwen2_7b_qlora.json 为例,需要修改的主要参数:

{
  "model_name_or_path": "Qwen/Qwen2-7B-Instruct",
  "data_path": "./data/my_instructions.jsonl",
  "output_dir": "./output/qwen2-7b-qlora",
  "train_mode": "qlora",
  "per_device_train_batch_size": 2,
  "gradient_accumulation_steps": 8,
  "learning_rate": 2e-4,
  "num_train_epochs": 3
}

3. 启动训练

单卡训练直接运行:

python train.py --config config/train_dpo_qwen2_7b_qlora.json

多卡训练使用 DeepSpeed:

deepspeed --num_gpus=4 train.py --config config/train_dpo_qwen2_7b_qlora.json --deepspeed config/ds_config_zero2.json

训练日志中会实时显示损失、学习率、当前步数,并通过 Wandb 可选可视化。

数据格式深度解析

Firefly 支持多种数据格式以满足不同微调目标。

指令微调(SFT)

标准格式如下,conversation 字段为列表,每个元素包含 humanassistant,支持多轮。

{"conversation": [
  {"human": "你是谁?", "assistant": "我是Firefly训练出来的AI助手。"},
  {"human": "你能做什么?", "assistant": "我可以回答各类问题,帮助写作和编程。"}
]}

偏好对齐微调(DPO)

用于强化模型与人类偏好对齐,格式为:

{"conversation": [...], "chosen": "正确回复", "rejected": "错误回复"}

工具调用微调

可在 system 中定义工具说明,assistant 回复中包含函数调用参数。

Firefly 会自动根据数据字段拼接 prompt 模板,您只需按照规范提供原始对话即可。

微调策略与参数调优

微调模式选择

  • 全量微调 (full):全部参数参与训练,显存要求较高,适合13B以下模型且资源充足时获得最佳效果。
  • LoRA (lora):仅训练低秩矩阵,显存需求约为全量的 1/3,适合7B以上模型。
  • QLoRA (qlora):在量化模型上使用 LoRA,显存需求再降低 40%-60%,是消费级显卡的最佳选择。

关键超参数建议

参数 推荐范围 说明
learning_rate 全量: 5e-6 ~ 1e-5 / LoRA: 2e-4 ~ 5e-4 LoRA 学习率可比全量高一个数量级
lora_rank 8 ~ 64 秩越大表达能力越强但训练越慢,16 较为均衡
batch_size 实际显存允许下尽量大 可通过梯度累积等效增大批次
warmup_ratio 0.03 ~ 0.1 预热步数比例
max_seq_length 512/1024/2048/4096 根据数据长度设定,过长会浪费显存

DeepSpeed 配置推荐

  • 单卡微调 7B LoRA:关闭 DeepSpeed 即可。
  • 多卡微调 13B 全量:使用 ZeRO-2,设置 "zero_optimization": {"stage": 2}
  • 超大模型 70B+:开启 ZeRO-3 + CPU offload。

配置文件模板已放在 config/ds_config_*.json,直接引用即可。

训练过程监控与中断恢复

Firefly 默认同时输出控制台日志和 TensorBoard 日志。可通过以下命令启动可视化:

tensorboard --logdir output/qwen2-7b-qlora/logs

若训练意外中断,无需重新开始。Firefly 会自动保存检查点,在训练命令中指定相同 output_dirresume_from_checkpoint: true 即可继续。

模型评估与测试

训练完成后,可使用内置的评估脚本快速验证模型效果。

自动评测

python evaluate.py --model_path ./output/qwen2-7b-qlora/final --eval_dataset ceval

支持 C-Eval、MMLU、CMMLU 等中文基准测试。

交互式测试

python chat.py --model_path ./output/qwen2-7b-qlora/final

在命令行直接与微调后的模型对话,体验回答质量。

模型导出与合并

若使用 LoRA/QLoRA 训练,需要将适配器权重合并回基础模型以便部署:

python merge_lora.py --base_model Qwen/Qwen2-7B-Instruct --lora_path ./output/qwen2-7b-qlora/final --output_dir ./merged_model

导出后的完整模型可直接用于下游推理引擎。

部署到生产环境

合并后的模型可轻松部署为 API 服务。

使用 FastChat 部署

Firefly 模型完全兼容 FastChat,启动控制器和推理服务:

python -m fastchat.serve.controller
python -m fastchat.serve.model_worker --model-path ./merged_model
python -m fastchat.serve.openai_api_server --host localhost --port 8000

使用 vLLM 提升吞吐

对于高并发场景,vLLM 是更优选择:

python -m vllm.entrypoints.openai.api_server --model ./merged_model --served-model-name my-model