专栏名称: 吃果冻不吐果冻皮
专注于AI工程化(LLM、MLOps、LLMOps、RAG、Agent)落地。
目录
相关文章推荐
河南新闻广播  ·  胖东来,新动作来了! ·  23 小时前  
绝对现场  ·  名医到院区 | ... ·  昨天  
河南新闻广播  ·  阳光正在赶来!河南即将开启升温模式 ·  昨天  
河南新闻广播  ·  南阳最新人事任免 ·  2 天前  
51好读  ›  专栏  ›  吃果冻不吐果冻皮

Unsloth微调Llama3-8B,提速44%,节省42%显存,约需8GB显存

吃果冻不吐果冻皮  · 公众号  ·  · 2024-05-14 23:25

正文

【点击】 加入大模型技术交流群

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能够 保证重写后的模型计算的一致性,实现中不存在近似计算, 模型训练的精度损失为零 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 FastLanguageModelimport torchfrom trl import SFTTrainerfrom transformers import TrainingArgumentsfrom 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 weightsmodel = 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 optimized bias = "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 context random_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







请到「今天看啥」查看全文