一、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 =>