Introducere
După ce modelele Llama și Mistral au fost lansate, LLM-urile open-source au luat lumina reflectoarelor din OpenAI. De atunci, au fost lansate mai multe modele bazate pe arhitectura Llama și Mistral, performanțe la egalitate cu modelele proprietare precum GPT-3.5 Turbo, Claude, Gemini etc. Cu toate acestea, aceste modele sunt prea mari pentru a fi utilizate în hardware-ul de consum.
Dar în ultimul timp, a apărut o nouă clasă de LLM. Acestea sunt LLM-urile din categoria parametrilor sub-7B. Mai puțini parametri le fac suficient de compacte pentru a fi rulate în hardware de consum, păstrând în același timp eficiența comparabilă cu modelele 7B. Modele precum Tiny-Llama-1B, Phi-2 de la Microsoft și Qwen-3b de la Alibaba pot fi înlocuitori grozavi pentru modelele mai mari pentru a rula local sau a fi implementate pe margine. În același timp, reglarea fină este esențială pentru a aduce cele mai bune rezultate din orice model de bază pentru orice sarcini din aval.
Aici, vom explora cum să reglam o bază Model Tiny-Llama pe un set de date Alpaca curățat.
obiective de invatare
- Înțelegeți reglajul fin și diferitele metode ale acesteia.
- Aflați despre instrumentele și tehnicile pentru o reglare fină eficientă.
- Aflați despre WandB pentru înregistrarea jurnalelor de antrenament.
- Ajustați Tiny-Llama pe setul de date Alpaca din Colab.
Acest articol a fost publicat ca parte a Blogathonul științei datelor.
Cuprins
Ce este LLM Fine-Tuning?
Reglajul fin este procesul prin care un model pre-antrenat să învețe noi cunoștințe. Modelul pre-antrenat este un model de uz general antrenat pe o cantitate mare de date. Cu toate acestea, în majoritatea cazurilor, acestea nu reușesc să funcționeze conform intenției, iar reglarea fină este cea mai eficientă modalitate de a face modelul să se adapteze la anumite cazuri de utilizare. De exemplu, baza LLM-uri se descurcă bine la generarea de text cu QA într-o singură tură, dar se luptă cu conversațiile în mai multe rânduri, cum ar fi modelele de chat.
Modelele de bază trebuie să fie instruite pe transcrieri ale dialogurilor pentru a putea ține conversații în mai multe rânduri. Reglarea fină este esențială pentru modelarea modelelor pre-antrenate în diferite avatare. Calitatea modelelor reglate fin depinde de calitatea datelor și de capabilitățile modelului de bază. Există mai multe moduri de reglare fină a modelului, cum ar fi LoRA, QLoRA etc.
Să trecem pe scurt prin aceste concepte.
LoRA
LoRA înseamnă Adaptare de rang scăzut, o tehnică populară de reglare fină în care selectăm câțiva parametri antrenați în loc să actualizăm toți parametrii printr-o aproximare de rang scăzut a matricelor de greutate originale. Modelul LoRA poate fi reglat mai rapid pe un hardware care necesită mai puțin calcul.
QLoRA
QLoRA sau Quantized LoRA este un pas mai departe decât LoRA. În loc de un model de precizie completă, cuantifică greutățile modelului pentru a reduce precizia în virgulă mobilă înainte de a aplica LoRA. Cuantizarea este procesul de reducere a valorilor de biți mai mari la valori mai mici. Un proces de cuantificare pe 4 biți implică cuantificarea greutăților de 16 biți la valori flotante de 4 biți.
Cuantificarea modelului duce la o reducere substanțială a dimensiunii modelului cu o precizie comparabilă cu modelul original. În QLoRA, luăm un model cuantificat și îi aplicăm LoRA. Modelele pot fi cuantificate în mai multe moduri, cum ar fi prin llama.cpp, AWQ, bitsandbytes etc.
Reglaj fin cu Unsloth
Unsloth este o platformă open-source pentru reglarea mai rapidă a modelelor de limbi mari populare. Acceptă LLM-uri populare, inclusiv Llama-2 și Mistral, și derivatele lor, cum ar fi Yi, Open-hermes etc. Implementează nuclee triton personalizate și un motor manual de tip back-prop pentru a îmbunătăți viteza de antrenament a modelului.
Aici, vom folosi Unsloth pentru a regla fin un model de bază Tiny-Llama cuantizat pe 4 biți pe Alpaca set de date. Modelul este cuantificat cu biți și octeți, iar nucleele sunt optimizate cu Triton de la OpenAI.
Logare cu WandB
În învățarea automată, este esențial să înregistrați valorile de instruire și evaluare. Aceasta ne oferă o imagine completă a mersului trenului. Greutăți și prejudecăți (WandB) este o bibliotecă open-source pentru vizualizarea și urmărirea experimentelor de învățare automată. Are o aplicație web dedicată pentru vizualizarea valorilor de antrenament în timp real. De asemenea, ne permite să gestionăm modelele de producție la nivel central. Vom folosi WandB numai pentru a urmări rularea noastră de reglare fină a Tiny-Llama.
Pentru a utiliza WandB, creați un cont gratuit și creați un Cheia API.
Acum, să începem să ne reglam modelul.
Cum să reglați Tiny-Llama?
Reglarea fină este o sarcină grea de calcul. Este nevoie de o mașină cu 10-15 GB de VRAM sau puteți folosi timpul de rulare gratuit al GPU Tesla T4 de la Colab.
Acum instalați Unsloth și WandB
%%capture
import torch
major_version, minor_version = torch.cuda.get_device_capability()
!pip install wandb
if major_version >= 8:
# Use this for new GPUs like Ampere, Hopper GPUs (RTX 30xx, RTX 40xx, A100, H100, L40)
!pip install "unsloth[colab_ampere] @ git+https://github.com/unslothai/unsloth.git"
else:
# Use this for older GPUs (V100, Tesla T4, RTX 20xx)
!pip install "unsloth[colab] @ git+https://github.com/unslothai/unsloth.git"
pass
Următorul lucru este să încărcați modelul pre-antrenat cuantizat pe 4 biți cu Unsloth.
from unsloth import FastLanguageModel
import torch
max_seq_length = 4096 # 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.
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/tinyllama-bnb-4bit", # "unsloth/tinyllama" for 16bit loading
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
Acest lucru va instala modelul local. Dimensiunea modelului pe 4 biți va fi de aproximativ 760 MB.
Acum aplica PEFT la modelul Tiny-Llama pe 4 biți.
model = FastLanguageModel.get_peft_model(
model,
r = 32, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",],
lora_alpha = 32,
lora_dropout = 0, # Currently only supports dropout = 0
bias = "none", # Currently only supports bias = "none"
use_gradient_checkpointing = True, # @@@ IF YOU GET OUT OF MEMORY - set to True @@@
random_state = 3407,
use_rslora = False, # We support rank stabilized LoRA
loftq_config = None, # And LoftQ
)
Pregătiți datele
Următorul pas este pregătirea setului de date pentru reglare fină. După cum am menționat mai devreme, vom folosi un curățat Setul de date alpaca. Aceasta este o versiune curățată a setului de date original Alpaca. Urmează formatul instrucțiuni-input-răspuns. Iată un exemplu de date Alpaca
Acum, să ne pregătim datele.
@title prepare data
#alpaca_prompt = """Below is an instruction that describes a task, paired with an input that
provides further context.
Write a response that appropriately completes the request.
### Instruction:
{}
### Input:
{}
### Response:
{}"""
EOS_TOKEN = tokenizer.eos_token
def formatting_prompts_func(examples):
instructions = examples["instruction"]
inputs = examples["input"]
outputs = examples["output"]
texts = []
for instruction, input, output in zip(instructions, inputs, outputs):
# Must add EOS_TOKEN, otherwise your generation will go on forever!
text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN
texts.append(text)
return { "text" : texts, }
pass
from datasets import load_dataset
dataset = load_dataset("yahma/alpaca-cleaned", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)
Acum, împărțiți datele în date tren și eval. Am luat date de evaluare mici, deoarece datele de evaluare mai mari încetinesc antrenamentul.
dataset_dict = dataset.train_test_split(test_size=0.004)
Configurați WandB
Acum, configurați Weights and Biases în timpul de rulare curent.
# @title wandb init
import wandb
wandb.login()
Furnizați cheia API pentru a vă conecta la WandB când vi se solicită.
Configurați variabilele de mediu.
%env WANDB_WATCH=all
%env WANDB_SILENT=true
Model de tren
Până acum, am încărcat modelul pe 4 biți, am creat configurația LoRA, am pregătit setul de date și am configurat WandB. Următorul pas este antrenarea modelului pe date. Pentru asta, trebuie să definim un antrenor din biblioteca Trl. Vom folosi SFTrainer de la Trl. Dar înainte de asta, inițializați WandB și definiți argumentele de antrenament adecvate.
import os
from trl import SFTTrainer
from transformers import TrainingArguments
from transformers.utils import logging
import wandb
logging.set_verbosity_info()
project_name = "tiny-llama"
entity = "wandb"
# os.environ["WANDB_LOG_MODEL"] = "checkpoint"
wandb.init(project=project_name, name = "tiny-llama-unsloth-sft")
Argumente de antrenament
args = TrainingArguments(
per_device_train_batch_size = 2,
per_device_eval_batch_size=2,
gradient_accumulation_steps = 4,
evaluation_strategy="steps",
warmup_ratio = 0.1,
num_train_epochs = 1,
learning_rate = 2e-5,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
optim = "adamw_8bit",
weight_decay = 0.1,
lr_scheduler_type = "linear",
seed = 3407,
output_dir = "outputs",
report_to="wandb", # enable logging to W&B
# run_name="tiny-llama-alpaca-run", # name of the W&B run (optional)
logging_steps=1, # how often to log to W&B
logging_strategy = 'steps',
save_total_limit=2,
)
Acest lucru este important pentru antrenament. Pentru a menține un nivel scăzut de utilizare a GPU-ului, mențineți pașii de acumulare a trenului, a lotului de evaluare și a gradientului la un nivel scăzut. Logging_steps este numărul de pași înainte ca valorile să fie înregistrate în WandB.
Acum, inițializați SFTTrainer.
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset_dict["train"],
eval_dataset=dataset_dict["test"],
dataset_text_field = "text",
max_seq_length = max_seq_length,
dataset_num_proc = 2,
packing = True, # Packs short sequences together to save time!
args = args,
)
Acum, începe antrenamentul.
trainer_stats = trainer.train()
wandb.finish()
În timpul cursei de antrenament, WandB va urmări valorile de antrenament și de evaluare. Accesați linkul dat de tabloul de bord și îl vedeți în timp real.
Aceasta este o captură de ecran din alergarea mea pe un notebook Colab.
Viteza de antrenament va depinde de mai mulți factori, inclusiv dimensiunea datelor de antrenament și eval, dimensiunea lotului de tren și eval și numărul de epoci. Dacă întâmpinați probleme de utilizare a GPU-ului, încercați să reduceți dimensiunile pasilor de acumulare a loturilor și a gradientului. Dimensiunea lotului de tren = batch_size_per_device * gradient_accumulation_steps. Și numărul de pași de optimizare = datele totale de antrenament/dimensiunea lotului. Te poți juca cu parametrii și vezi care funcționează mai bine.
Puteți vizualiza pierderea de antrenament și evaluare a antrenamentului dvs. pe tabloul de bord WandB.
Pierderea trenului
Pierdere Eval
Deducerea
Puteți salva adaptoarele LoRA la nivel local sau le puteți împinge în depozitul HuggingFace.
model.save_pretrained("lora_model") # Local saving
# model.push_to_hub("your_name/lora_model", token = "...") # Online saving
De asemenea, puteți încărca modelul salvat de pe disc și îl puteți utiliza pentru deducere.
if False:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "lora_model", # YOUR MODEL YOU USED FOR TRAINING
max_seq_length = max_seq_length,
dtype = dtype,
load_in_4bit = load_in_4bit,
)
inputs = tokenizer(
[
alpaca_prompt.format(
"capital of France?", # instruction
"", # input
"", # output - leave this blank for a generation!
)
]*1, return_tensors = "pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True)
tokenizer.batch_decode(outputs)
Pentru transmiterea răspunsurilor modelului.
from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 64)
Deci, totul a fost despre reglarea fină a unui model Tiny-Llama cu înregistrarea WandB.
Aici este Caietul Colab Pentru același.
Concluzie
LLM-urile mici pot fi benefice pentru implementarea pe hardware cu restricții de calcul, cum ar fi computere personale, telefoane mobile și alte dispozitive portabile etc. Reglarea fină permite acestor modele să funcționeze mai bine în sarcinile din aval. În acest articol, am învățat cum să reglam fin un model de limbă de bază pe un set de date.
Intrebari cu cheie
- Reglarea fină este procesul de adaptare a unui model pre-antrenat la o anumită sarcină nouă.
- Tiny-Llama este un LLM cu doar 1.1 miliarde de parametri și este antrenat pe 3 trilioane de jetoane.
- Există diferite moduri de a ajusta LLM-urile, cum ar fi LoRA și QLoRA.
- Unsloth este o platformă open-source care oferă LLM-uri optimizate pentru CUDA pentru a accelera reglarea fină a LLM-urilor.
- Weights and Biases (WandB) este un instrument pentru urmărirea și stocarea experimentelor ML.
Întrebări Frecvente
A. Reglarea fină, în contextul învățării automate, în special învățarea profundă, este o tehnică prin care iei un model pre-antrenat și îl adaptezi la o sarcină nouă, specifică.
R. Este posibil să reglați gratuit LLM-uri mai mici pe Colab pe GPU-ul Tesla T4 cu QLoRA.
A. Reglarea fină îmbunătățește considerabil capacitatea LLM de a efectua sarcini în aval, cum ar fi jocul de rol, generarea de cod etc.
A. Tiny-Llama antrenat pe 3 trilioane de jetoane este un LLM cu parametri 1.1B. Modelul adoptă arhitectura originală Llama-2.
A. Unsloth este un instrument open-source care oferă o reglare LLM mai rapidă și mai eficientă prin optimizarea nucleelor GPU cu Triton.
Media prezentată în acest articol nu este deținută de Analytics Vidhya și este utilizată la discreția Autorului.
Legate de
- Distribuție de conținut bazat pe SEO și PR. Amplifică-te astăzi.
- PlatoData.Network Vertical Generative Ai. Împuterniciți-vă. Accesați Aici.
- PlatoAiStream. Web3 Intelligence. Cunoștințe amplificate. Accesați Aici.
- PlatoESG. carbon, CleanTech, Energie, Mediu inconjurator, Solar, Managementul deșeurilor. Accesați Aici.
- PlatoHealth. Biotehnologie și Inteligență pentru studii clinice. Accesați Aici.
- Sursa: https://www.analyticsvidhya.com/blog/2024/02/fine-tuning-a-tiny-llama-model-with-unsloth/
- :are
- :este
- :nu
- :Unde
- $UP
- 1
- 11
- 12
- 15%
- 16
- 1b
- 258
- 32
- 7
- 8
- a
- A100
- Capabil
- Despre Noi
- Cont
- acumulare
- precizie
- adapta
- adaptare
- adăuga
- TOATE
- permite
- de asemenea
- sumă
- an
- Google Analytics
- Analize Vidhya
- și
- Orice
- api
- aplicaţia
- Aplică
- Aplicarea
- adecvat
- în mod corespunzător
- arhitectură
- SUNT
- argumente
- în jurul
- articol
- AS
- At
- Auto
- Avatare
- b
- de bază
- bazat
- BE
- fost
- înainte
- de mai jos
- benefică
- Beneficiile
- CEL MAI BUN
- Mai bine
- părtinire
- distorsiunilor
- Miliard
- Pic
- biţi
- necompletat
- blogathon
- scurt
- aduce
- dar
- by
- CAN
- capacități
- capacitate
- capital
- cazuri
- Categorii
- Chat
- Alege
- clasă
- cod
- compact
- comparabil
- Completă
- finalizeaza
- Calculatoare
- Concepte
- Configuraţie
- configurat
- consumator
- Hardware de consum
- context
- conversații
- crea
- a creat
- crucial
- Curent
- În prezent
- personalizat
- Liniuţă
- tablou de bord
- de date
- seturi de date
- dedicat
- adânc
- învățare profundă
- defini
- depinde
- depinde de
- implementa
- Implementarea
- Instrumentele financiare derivate
- descrie
- Detectare
- dialoguri
- diferit
- discreție
- do
- jos
- Mai devreme
- Margine
- Eficace
- eficiență
- eficient
- altfel
- apariție
- permite
- întâlni
- Motor
- Îmbunătăţeşte
- suficient de
- entitate
- Mediu inconjurator
- epoci
- mai ales
- esenţial
- etc
- Eter (ETH)
- evaluare
- exemplu
- exemple
- experimente
- explora
- factori
- FAIL
- fals
- departe
- mai repede
- puțini
- mai puține
- pluti
- plutitor
- urmează
- Pentru
- format
- Franţa
- Gratuit
- din
- mai mult
- zodia Gemeni
- scop general
- generaţie
- obține
- merge
- dat
- oferă
- Go
- GPU
- unități de procesare grafică
- mare
- Piese metalice
- Avea
- aici
- Înalt
- superior
- deţine
- Cum
- Cum Pentru a
- Totuși
- HTTPS
- Față îmbrățișată
- i
- if
- ustensile
- import
- important
- îmbunătăţi
- in
- Inclusiv
- intrare
- intrări
- instala
- in schimb
- instrucțiuni
- destinate
- în
- implică
- probleme de
- IT
- jpg
- A pastra
- păstrare
- Cheie
- cunoştinţe
- Kumar
- limbă
- mare
- mai mare
- Conduce
- AFLAȚI
- învățat
- învăţare
- Părăsi
- mai puțin
- Permite
- Bibliotecă
- ca
- lumină reflectorului
- liniar
- LINK
- Lamă
- LLM
- încărca
- încărcare
- local
- la nivel local
- log
- autentificat
- logare
- de pe
- Jos
- LOWER
- maşină
- masina de învățare
- face
- Efectuarea
- administra
- manual
- max-width
- Mass-media
- Memorie
- menționat
- Metode
- Metrici
- ML
- Mobil
- telefoane mobile
- model
- Modele
- mai mult
- mai eficient
- cele mai multe
- multiplu
- trebuie sa
- my
- nume
- Nevoie
- Nou
- următor
- Nici unul
- caiet
- număr
- of
- de multe ori
- mai în vârstă
- on
- on-line
- afară
- open-source
- OpenAI
- optimizare
- optimizate
- optimizarea
- or
- original
- OS
- Altele
- in caz contrar
- al nostru
- afară
- producție
- iesiri
- peste
- deţinute
- Pachete
- împerecheat
- parametru
- parametrii
- parte
- trece
- efectua
- efectuarea
- personal
- Calculatoare personale
- Telefoane
- imagine
- platformă
- Plato
- Informații despre date Platon
- PlatoData
- Joaca
- Punct
- Popular
- posibil
- Precizie
- Pregăti
- pregătit
- proces
- producere
- proprietate
- furnizează
- publicat
- Împinge
- Q & A
- calitate
- R
- rank
- în timp real
- reduce
- reducerea
- reducere
- eliberat
- depozit
- solicita
- Necesită
- cercetare
- răspuns
- răspunsuri
- reveni
- Rol
- RTX
- Alerga
- acelaşi
- Economisiți
- salvate
- economisire
- scalare
- Ştiinţă
- vedea
- sămânţă
- selecta
- set
- Pantaloni scurți
- indicat
- semna
- întrucât
- Mărimea
- dimensiuni
- încetineşte
- mic
- mai mici
- specific
- viteză
- împărţi
- Standuri
- Începe
- Pas
- paşi
- de streaming
- Lupta
- substanțial
- astfel de
- a sustine
- Sprijină
- Lua
- luate
- Sarcină
- sarcini
- tehnică
- tehnici de
- Tesla
- test
- a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
- generarea textului
- decât
- acea
- lor
- Lor
- apoi
- Acolo.
- Acestea
- ei
- lucru
- acest
- Prin
- timp
- la
- împreună
- semn
- indicativele
- de asemenea
- a luat
- instrument
- Unelte
- lanternă
- Total
- urmări
- Urmărire
- Tren
- dresat
- Pregătire
- transformatoare
- Trilion
- Triton
- adevărat
- încerca
- actualizarea
- us
- Folosire
- utilizare
- utilizat
- Valori
- versiune
- de
- Vizita
- imagina
- a fost
- Cale..
- modalități de
- we
- wearables
- web
- WebP
- greutate
- BINE
- au fost
- Ce
- Ce este
- cand
- care
- în timp ce
- voi
- cu
- fabrică
- scrie
- tu
- Ta
- zephyrnet