社区供稿 | Unsloth x Qwen2,提速 47.32%,节省 39.13% 显存,最少仅需 8.43GB 显存
在之前的一篇文章里,我们聊过 Unsloth 这个训练加速框架——它通过优化梯度计算、链式矩阵乘法以及 Triton 内核等手段,把 Llama3-8B 的训练速度提升了 44%,显存省了 42%。效果确实惊艳。但当时有个遗憾:Unsloth 官方并不支持 Qwen2 模型结构(注意,这里说的 Qwen2 指的是模型架构,不是权重;Qwen1.5 属于 Qwen2 架构的 preview 版本,而正式版 Qwen2 权重尚未开源)。社区里不少人在 issue 里喊过需求,得到的回复却是“短期内不支持,建议把 Qwen2 的权重 Llama 化后再训练”。
但问题在于,权重 Llama 化之后,模型性能会明显下滑。而 Qwen1.5 系列本身在中英文任务上表现极好,一度是开源模型的 SOTA,用户基数也很大。既然官方不搞,那就自己动手。于是 Firefly 项目组对 Unsloth 做了扩展,让它能直接支持 Qwen2 架构的训练。结果还挺给力:用一张 1080Ti 就能训 Qwen1.5-7B(显存最低只要 8.43GB),速度提升 47.32%,训练时间减少 32.12%,显存占用降低 39.13%。我们还在 Open LLM Leaderboard 上验证了效果,具体数据下文会讲。

现状
Unsloth 本身是一个高效训练框架,专注于加速和显存优化。Firefly 项目已经把它整合进来,此前在 Llama3-8B 上的测试结果也很亮眼。但 Qwen2 架构的用户一直等不到官方支持,这才有了我们自行扩展开源版的尝试。
Qwen1.5 作为 Qwen2 的 preview 版本,在开源社区中有着广泛的使用基础,中英文能力都很突出。后续还会推出正式版 Qwen2 权重,但模型结构本身是确定的。所以这次扩展,实际上是为整个 Qwen2 系列铺好了路。
Unsloth x Qwen2
扩展后的代码仓库已经开源,安装也很简单,只需要更新几个 Python 包:
pip install git+https://github.com/yangjianxin1/unsloth.git
pip install bitsandbytes==0.43.1
pip install transformers==4.37
pip install peft==0.10.0
pip install torch==2.2.2
pip install xformers==0.0.25.post1
拉取 Firefly 仓库:
git clone https://github.com/yangjianxin1/Firefly.git
在 Firefly 中启动训练时,只需将配置文件里的 use_unsloth 设为 true 即可(默认为 false)。SFT 和 DPO 的启动命令如下:
python train.py --train_args_file train_args/sft/qlora/qwen1.5-7b-sft-qlora.json
python train.py --train_args_file train_args/dpo/qlora/qwen1.5-7b-dpo-qlora.json
需要提醒一点:开源版的 Unsloth 目前只支持单机单卡训练,商业版才有更强的并行能力,但即便是这个“尝鲜版”,效果已经够让人惊喜了。
训练增益 & 模型评测
先看训练增益的实测数据。我们在单张 V100 上对 Qwen1.5-7B 做 QLoRA 训练,使用相同数据集训 20 步,开启 gradient checkpointing,每条数据 padding 到 max_seq_length,所有 Linear 层都插入 adapter。因为 V100 不支持 Flash Attention,所以测试中没有开启它。结果如下:
- 结合 QLoRA 与 Unsloth,Qwen1.5-7B 显存最低仅需
8.43GB
- 训练速度提升
47.32%
- 训练时间减少
32.12%
- 显存占用减少
39.13%
这个数字意味着什么?一张 1080Ti(11GB 显存)就能跑 7B 模型的微调,放在以前是想都不敢想的。
为了验证训练效果,我们使用 Unsloth + QLoRA 对 Qwen1.5-7B 进行了两阶段训练:先 SFT,后 DPO。全程只用一张 V100,所有 Linear 层都加了 adapter。训练数据为英文,对话模板沿用 Qwen1.5 官方格式:
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
hello, who are you?<|im_end|>
<|im_start|>assistant
I am a AI program developed by Firefly<|im_end|>
SFT 阶段参数:
num_epochs: 1
learning_rate: 2e-4
total_train_batch_size: 32
max_seq_length: 2048
optimizer: paged_adamw_32bit
lr_scheduler_type: constant_with_warmup
warmup_steps: 600
lora_rank: 64
lora_alpha: 16
lora_dropout: 0.05
gradient_checkpointing: true
fp16: true
DPO 阶段参数:
num_epochs: 1
learning_rate: 2e-4
total_train_batch_size: 32
max_seq_length: 2048
max_prompt_length: 500
optimizer: paged_adamw_32bit
lr_scheduler_type: constant_with_warmup
warmup_steps: 100
lora_rank: 64
lora_alpha: 16
lora_dropout: 0.05
gradient_checkpointing: true
fp16: true
最终我们将 SFT 和 DPO 模型提交到 Open LLM Leaderboard 进行评测,平均表现显著优于官方的 Qwen1.5-7B-Chat 和 Gemma-7B-it 等模型。
下面两张图展示了 DPO 训练过程中的指标变化:
(图片:DPO 训练中 Rewards/accuracies 的变化趋势,表示较优回答的奖励大于较劣回答奖励的频率均值)
(图片:DPO 训练中 Rewards/margins 的变化趋势,表示较优回答与较劣回答奖励之差的均值)
可以看到,Rewards/accuracies 和 Rewards/margins 都处于上升趋势,说明 DPO 训练是有效的。
结语
Unsloth 通过优化梯度计算、链式矩阵乘法以及 Triton 内核重写,实现了提速和显存节省的双重目标。虽然开源版目前只支持单机单卡,但已经足够惊艳。这也说明一个道理:在算力不变的情况下,通过软件层面的优化,大模型训练的成本和速度还有非常大的进步空间。硬件门槛正在一步步降低。
最后,期待开源社区的力量能推动 Unsloth 进一步完善——毕竟,好东西值得更多人用上。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名