一、Unsloth 简介
Unsloth 是一个专门为模型微调而设计的框架,它旨在解决模型微调过程中常见的训练速度慢、显存占用高等问题。通过一系列创新的技术和优化策略,Unsloth 能够显著提高模型微调的效率,使得开发者能够在更短的时间内获得更好的模型性能。
二、Unsloth 的主要优势
1. 快速的训练速度
在对主流模型(如 llama - 3、qwen2、mistral 等)进行微调时,Unsloth 展现出了令人瞩目的训练速度提升。相比其他传统的微调方法,它的速度可以提高 2 至 5 倍。这意味着开发者能够更快地完成模型的训练过程,大大缩短了开发周期。例如,在处理大规模文本数据时,Unsloth 能够迅速收敛,减少了训练时间,让开发者能够更快地看到模型的效果。
2. 低显存占用
显存占用是模型微调过程中一个关键的问题,尤其是对于一些资源有限的设备。Unsloth 巧妙地解决了这个问题,它最大能够减少约 70%的显存使用量。这使得即使在显存有限的硬件上,如一些中低端的 GPU 设备,也能够顺利进行模型微调训练。这一优势为更多开发者提供了机会,让他们能够在不同的硬件环境下开展工作,而不必担心硬件资源的限制。
三、Unsloth 的技术特点
1. 强大的兼容性
Unsloth 支持多种硬件设置,涵盖了从 Nvidia Tesla T4 到 H100 等不同型号的 GPU。不仅如此,它还扩展到了 AMD 和英特尔 GPU 的兼容性,这为使用不同硬件的开发者提供了极大的便利。无论你使用的是哪种 GPU 设备,都可以尝试使用 Unsloth 进行模型微调。这种广泛的兼容性使得 Unsloth 能够在不同的硬件平台上发挥出其优势,为开发者提供了更多的选择。
2. 优化的内存使用
Unsloth 采用了智能权重上投等开创性技术,在 QLoRA 过程中减少了权重上投的必要性,从而有效地优化了内存使用。通过这种方式,它能够更好地利用硬件资源,提高模型训练的效率。此外,Unsloth 还能够迅速利用 BFloat16,提高 16 位训练的稳定性,进一步加快了 QLoRA 的微调过程。这种对内存和计算资源的精细管理,使得 Unsloth 在处理大规模模型和数据时表现出色。
四、Unsloth 的使用体验
1.安装 Unsloth
安装 Unsloth 相对简单,你可以通过以下命令进行安装:`pip install "unsloth(cu121 - torch230)@git +"`。当然,具体的安装命令可能会因环境和需求的不同而有所差异。在安装过程中,建议参考官方文档,以确保安装的顺利进行。
pip install "unsloth[colab-new] @ git+"
执行如下:
2.镜像设置
由于网络原因,可能无法访问huggingface上的资源,可以使用国内的镜像站。
1)安装依赖
pip install -U huggingface_hub
2)设置环境变量
import osos.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
3.模型加载
from unsloth import FastLanguageModelimport torchmax_seq_length = 2048 # Choose any! We auto support RoPE Scaling internally!dtype = None # None for auto detection. Float16 for Tesla T4, V100, Bfloat16 for Ampere+load_in_4bit = True # Use 4bit quantization to reduce memory usage. Can be False.# 4bit pre quantized models we support for 4x faster downloading + no OOMs.fourbit_models = ["unsloth/Meta-Llama-3.1-8B-bnb-4bit",# Llama-3.1 2x faster"unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit","unsloth/Meta-Llama-3.1-70B-bnb-4bit","unsloth/Meta-Llama-3.1-405B-bnb-4bit",# 4bit for 405b!"unsloth/Mistral-Small-Instruct-2409",# Mistral 22b 2x faster!"unsloth/mistral-7b-instruct-v0.3-bnb-4bit","unsloth/Phi-3.5-mini-instruct",# Phi-3.5 2x faster!"unsloth/Phi-3-medium-4k-instruct","unsloth/gemma-2-9b-bnb-4bit","unsloth/gemma-2-27b-bnb-4bit",# Gemma 2x faster!"unsloth/Llama-3.2-1B-bnb-4bit",# NEW! Llama 3.2 models"unsloth/Llama-3.2-1B-Instruct-bnb-4bit","unsloth/Llama-3.2-3B-bnb-4bit","unsloth/Llama-3.2-3B-Instruct-bnb-4bit",] # More models attokenizer = FastLanguageModel.from_pretrained(model_name = "unsloth/Llama-3.2-3B-Instruct", # or choose "unsloth/Llama-3.2-1B-Instruct"max_seq_length = max_seq_length,dtype = dtype,load_in_4bit = load_in_4bit,# token = "hf_...", # use one if using gated models like meta-llama/Llama-2-7b-hf)
加载如下:
4.LoRA 配置
model = FastLanguageModel.get_peft_model(model,r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128target_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,use_rslora = False,# We support rank stabilized LoRAloftq_config = None, # And LoftQ)
5.数据集准备
使用 Maxime Labonne 的 ShareGPT 风格的 FineTome-100k 数据集。
将 ("from", "value")格式,替换为("role", "content") 格式
from unsloth.chat_templates import get_chat_templatetokenizer = get_chat_template(tokenizer,chat_template = "llama-3.1",)def formatting_prompts_func(examples):convos = examples["conversations"]texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False) for convo in convos]return { "text" : texts, }passfrom>
数据集读取
我们现在使用`standardize_sharegpt`将sharegpt风格的数据集转换为HuggingFace的通用格式。
{"from": "system", "value": "You are an assistant"}
{"from": "human", "value": "What is 2+2?"}
{"from": "gpt", "value": "It's 4."}
{"role": "system", "content": "You are an assistant"}
{"role": "user", "content": "What is 2+2?"}
{"role": "assistant", "content": "It's 4."}
from unsloth.chat_templates import standardize_sharegptdataset = standardize_sharegpt(dataset)dataset =>