01
前言
本文主要介绍Unsloth,它可以显著提升大模型的训练速度,减少显存占用,我们将其整合到Firefly训练框架中,实现对Llama3、Llama2、Mistral、Gemma、Zephyr等模型训练的「降本增速」。
我们实测了Unsloth所带来的训练增益,对Llama3-8B进行QLoRA训练,最少仅需7.75GB显存,这意味着我们可以在一张1080Ti上训练Llama3-8B,进一步降低了大模型训练的硬件门槛。开启Unsloth后,Llama3-8B的训练速度可提升44.35%,训练时间可减少30.72%,显存占用可减少42.58%。更详细的测试设置可参考第三节。
Firefly项目链接:
https://github.com/yangjianxin1/Firefly
Unsloth项目链接:
https://github.com/unslothai/unsloth
02
Unsloth简介
Unsloth是一个开源的大模型训练加速项目,使用OpenAI的Triton对模型的计算过程进行重写,大幅提升模型的训练速度,降低训练中的显存占用。Unsloth能够保证重写后的模型计算的一致性,实现中不存在近似计算,模型训练的精度损失为零。Unsloth支持绝大多数主流的GPU设备,包括V100, T4, Titan V, RTX 20, 30, 40x, A100, H100, L40等,支持对LoRA和QLoRA的训练加速和高效显存管理,支持Flash Attention。
Unsloth对大模型的训练提升如下图所示。在一张A100上,使用QLoRA对不同的模型进行训练,Llama2-7B的训练速度是原来的1.87倍,显存占用减少39.3%,Mistral-7B的训练速度是原来的1.88倍,显存占用减少65.9%。在无精度损失的前提下,Unsloth对大模型训练具有显著的「降本增速」作用,可谓是「免费的午餐」。
更重要的是,Unsloth与HuggingFace生态兼容,可以很容易将其与transformers、peft、trl等代码库进行结合,以实现模型的SFT与DPO,仅需修改模型的加载方式即可,无需对此前的训练代码进行过多的修改。Demo如下所示。
from unsloth import FastLanguageModel
import torchfrom trl
import SFTTrainerfrom transformers
import TrainingArguments
from datasets import load_datasetmax_seq_length = 2048
# Supports RoPE Scaling interally, so choose any!
# Get LAION dataseturl = "https://huggingface.co/datasets/laion/OIG/resolve/main/unified_chip2.jsonl"
dataset = load_dataset("json", data_files = {"train" : url}, split = "train")
# 4bit pre quantized models we support for 4x faster downloading + no OOMs.
fourbit_models = [
"unsloth/mistral-7b-bnb-4bit",
"unsloth/mistral-7b-instruct-v0.2-bnb-4bit",
"unsloth/llama-2-7b-bnb-4bit",
"unsloth/gemma-7b-bnb-4bit",
"unsloth/gemma-7b-it-bnb-4bit",
# Instruct version of Gemma 7b"unsloth/gemma-2b-bnb-4bit",
"unsloth/gemma-2b-it-bnb-4bit",
# Instruct version of Gemma 2b"unsloth/llama-3-8b-bnb-4bit",
# [NEW] 15 Trillion token Llama-3"unsloth/Phi-3-mini-4k-instruct-bnb-4bit",
]
# More models at https://huggingface.co/unsloth
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3-8b-bnb-4bit",
max_seq_length = max_seq_length,
dtype = None,
load_in_4bit = True,
)
# Do model patching and add fast LoRA weights
model = FastLanguageModel.get_peft_model(
model,
r = 16,
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 16,
lora_dropout = 0,
# Supports any, but = 0 is optimizedbias = "none",
# Supports any, but = "none" is optimized# [NEW] "unsloth" uses 30% less VRAM, fits 2x larger batch sizes!
use_gradient_checkpointing = "unsloth",
# True or "unsloth" for very long contextrandom_state = 3407,
max_seq_length = max_seq_length,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
trainer = SFTTrainer(
model = model,
train_dataset = dataset,
dataset_text_field = "text",
max_seq_length = max_seq_length,
tokenizer = tokenizer,
args = TrainingArguments(
per_device_train_batch_size = 2,
gradient_accumulation_steps = 4,
warmup_steps = 10,
max_steps = 60,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
logging_steps = 1,
output_dir = "outputs",
optim = "adamw_8bit",
seed = 3407,
),
)
trainer.train()
尚未开源的Unsloth Pro与Max版本,有着更强劲的训练效率的提升。
目前开源版本的Unsloth,仅支持单机单卡训练,且仅支持Llama2、Llama3、Mistral、Gemma、Zephyr、TinyLlama、Phi-3等模型。遗憾的是,Qwen2并不在Unsloth的支持列表中,该需求在Unsloth的issue中也被频繁提及。
Unsloth官方在短期内暂时没有支持Qwen2的计划,更多的是建议用户将Qwen2的权重进行Llama化,然后采用Llama的训练方式。但对Qwen2的权重进行Llama化后,模型性能有显著的下降。对于该问题,Firefly项目组也正在进行尝试,希望能够使Unsloth原生支持Qwen2,目前处于测试阶段,敬请期待。
03
Unsloth实践 & 测试
拉取Firefly代码库:
git clone https://github.com/yangjianxin1/Firefly.git
在Firefly中启动Unsloth训练Llama3,仅需在训练配置文件中将use_unsloth设为true即可,use_unsloth默认为False。
pip install git+https://github.com/unslothai/unsloth.git
pip install transformers==4.37
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
python train.py --train_args_file train_args/sft/qlora/llama3-8b-sft-qlora.json
我们在一张V100上对Llama3-8B进行QLoRA训练,使用相同的数据集训练50步,开启gradient_checkpointing,每条数据均padding至max_seq_length,在所有linear层均插入adapter,由于V100不支持Flash Attention,所以本测试未开启Flash Attention。Unsloth所带来的训练增益如下表所示。
结合QLoRA与Unsloth训练Llama3-8B,最少仅需7.75GB显存,开启Unsloth后,Llama3-8B的训练速度可提升44.35%,训练时间可减少30.72%,显存占用可减少42.58%。当max_seq_length或者per_device_train_batch_size增大时,Unsloth节省显存的优势更加明显。
从上述结果来看,Unsloth对于训练加速和节省显存的效果非常显著,我们也正在对Unsloth支持Qwen2的工作进行尝试。
好文章,需要你的鼓励
DeepResearchGym是一个创新的开源评估框架,专为深度研究系统设计,旨在解决当前依赖商业搜索API带来的透明度和可重复性挑战。该系统由卡内基梅隆大学研究团队开发,结合了基于ClueWeb22和FineWeb大型网络语料库的可重复搜索API与严格的评估协议。实验表明,使用DeepResearchGym的系统性能与使用商业API相当,且在评估指标间保持一致性。人类评估进一步证实了自动评估协议与人类偏好的一致性,验证了该框架评估深度研究系统的有效性。
这项研究介绍了FinTagging,首个面向大型语言模型的全面财务信息提取与结构化基准测试。不同于传统方法,它将XBRL标记分解为数值识别和概念链接两个子任务,能同时处理文本和表格数据。在零样本测试中,DeepSeek-V3和GPT-4o表现最佳,但在细粒度概念对齐方面仍面临挑战,揭示了当前大语言模型在自动化XBRL标记领域的局限性,为金融AI发展提供了新方向。
这项研究介绍了SweEval,一个新型基准测试,用于评估大型语言模型在企业环境中处理脏话的能力。研究团队从Oracle AI等多家机构的专家创建了一个包含八种语言的测试集,模拟不同语调和上下文的真实场景。实验结果显示,LLM在英语中较少使用脏话,但在印地语等低资源语言中更易受影响。研究还发现较大模型通常表现更好,且多语言模型如Llama系列在处理不当提示方面优于其他模型。这项工作对企业采用AI技术时的安全考量提供了重要参考。
这项研究提出了"VeriFree"——一种不需要验证器的方法,可以增强大型语言模型(LLM)的通用推理能力。传统方法如DeepSeek-R1-Zero需要验证答案正确性,限制了其在数学和编程以外领域的应用。VeriFree巧妙地计算正确答案在模型生成的推理过程后出现的概率,作为评估和训练信号。实验表明,这种方法不仅能匹配甚至超越基于验证器的方法,还大幅降低了计算资源需求,同时消除了"奖励黑客"问题。这一突破将有助于开发出在化学、医疗、法律等广泛领域具有更强推理能力的AI系统。