Firefly:中文大模型微调框架详解
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 字段为列表,每个元素包含 human 和 assistant,支持多轮。
{"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_dir 和 resume_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