Unsloth是一个开源的大模型训练加速项目,使用OpenAI的Triton对模型的计算过程进行重写,
大幅提升模型的训练速度,降低训练中的显存占用
。
Unsloth能够
保证重写后的模型计算的一致性,实现中不存在近似计算,
模型训练的精度损失为零
。
U
nslo
t
h支持绝大多数主流的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 torch
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset
max_seq_length = 2048
url = "https://huggingface.co/datasets/laion/OIG/resolve/main/unified_chip2.jsonl"
dataset = load_dataset("json", data_files = {"train" : url}, split = "train")
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",
"unsloth/gemma-2b-bnb-4bit",
"unsloth/gemma-2b-it-bnb-4bit",
"unsloth/llama-3-8b-bnb-4bit",
"unsloth/Phi-3-mini-4k-instruct-bnb-4bit",
]
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,
)
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,
bias = "none",
use_gradient_checkpointing = "unsloth",
random_state = 3407,
max_seq_length = max_seq_length,
use_rslora = False,
loftq_config = None,
)
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,目前处于测试阶段,敬请期待
。
拉取Firefly代码库:
git clone https://github.com/yangjianxin1/Firefly.git
在Firefly中启动Unsloth训练Llama3