Wprowadzenie
Po wypuszczeniu modeli Llama i Mistral, open-source'owe LLM znalazły się w centrum uwagi OpenAI. Od tego czasu wypuszczono wiele modeli opartych na architekturze Llama i Mistral, które działają na równi z zastrzeżonymi modelami, takimi jak GPT-3.5 Turbo, Claude, Gemini itp. Jednak modele te są zbyt duże, aby można je było stosować w sprzęcie konsumenckim.
Jednak ostatnio pojawiła się nowa klasa LLM. Są to LLM w kategorii parametrów poniżej 7B. Mniejsza liczba parametrów sprawia, że są one wystarczająco kompaktowe, aby można je było uruchomić na sprzęcie konsumenckim, zachowując jednocześnie wydajność porównywalną z modelami 7B. Modele takie jak Tiny-Llama-1B, Phi-2 firmy Microsoft i Qwen-3b firmy Alibaba mogą być świetnymi substytutami większych modeli do działania lokalnego lub wdrażania na urządzeniach brzegowych. Jednocześnie precyzyjne dostrojenie ma kluczowe znaczenie, aby wydobyć to, co najlepsze z dowolnego modelu podstawowego do wszelkich dalszych zadań.
Tutaj przyjrzymy się, jak dostroić bazę Model Tiny-Lamy na oczyszczonym zestawie danych Alpaca.
Cele kształcenia
- Zrozumienie dostrajania i różnych jego metod.
- Dowiedz się o narzędziach i technikach skutecznego dostrajania.
- Dowiedz się o WandB do rejestrowania dzienników szkoleniowych.
- Dostosuj Tiny-Llama w zbiorze danych Alpaca w Colab.
Ten artykuł został opublikowany jako część Blogathon nauki o danych.
Spis treści
Co to jest dostrajanie LLM?
Dostrajanie to proces polegający na tym, że wstępnie wytrenowany model uczy się nowej wiedzy. Wstępnie wyszkolony model jest modelem ogólnego przeznaczenia przeszkolonym na dużej ilości danych. Jednak w większości przypadków nie działają one zgodnie z oczekiwaniami, a dostrajanie jest najskuteczniejszym sposobem dostosowania modelu do konkretnych przypadków użycia. Na przykład baza LLM dobrze radzą sobie z generowaniem tekstu w jednoobrotowej kontroli jakości, ale mają problemy z wieloobrotowymi rozmowami, takimi jak modele czatów.
Modele bazowe muszą być przeszkolone na transkrypcjach dialogów, aby móc prowadzić rozmowy wieloobrotowe. Dokładne dostrojenie jest niezbędne, aby uformować wstępnie wytrenowane modele w różne awatary. Jakość modeli dostrojonych zależy od jakości danych i możliwości modelu podstawowego. Istnieje wiele sposobów dostrajania modelu, takich jak LoRA, QLoRA itp.
Przyjrzyjmy się pokrótce tym koncepcjom.
LoRA
LoRA oznacza adaptację niskiego rzędu, popularną technikę dostrajania, w której wybieramy kilka parametrów, które można wytrenować, zamiast aktualizować wszystkie parametry poprzez przybliżenie niskiego rzędu oryginalnych macierzy wag. Model LoRA można szybciej dostroić na sprzęcie wymagającym mniej obliczeń.
QLoRA
QLoRA lub Quantized LoRA to krok dalej niż LoRA. Zamiast modelu o pełnej precyzji, przed zastosowaniem LoRA kwantyzuje wagi modelu w celu obniżenia precyzji zmiennoprzecinkowej. Kwantyzacja to proces obniżania wyższych wartości bitów do niższych wartości. Proces 4-bitowej kwantyzacji obejmuje kwantyzację 16-bitowych wag do 4-bitowych wartości zmiennoprzecinkowych.
Kwantyzacja modelu prowadzi do znacznego zmniejszenia rozmiaru modelu z dokładnością porównywalną z modelem oryginalnym. W QLoRA bierzemy skwantowany model i stosujemy do niego LoRA. Modele można kwantyzować na wiele sposobów, na przykład za pomocą pliku llama.cpp, AWQ, bitsandbytes itp.
Dostrajanie z Unsloth
Unsloth to platforma typu open source umożliwiająca szybsze dostrajanie popularnych modeli wielkojęzykowych. Obsługuje popularne LLM, w tym Llama-2 i Mistral, oraz ich pochodne, takie jak Yi, Open-hermes itp. Implementuje niestandardowe jądro Triton i ręczny silnik tylnego śmigła, aby poprawić prędkość szkolenia modelu.
Tutaj użyjemy Unslotha do dostrojenia podstawowego 4-bitowego, skwantowanego modelu Tiny-Lamy na Alpaka zbiór danych. Model jest kwantowany za pomocą bitów i bajtów, a jądra są optymalizowane za pomocą Tritona OpenAI.
Logowanie za pomocą WandB
W uczeniu maszynowym kluczowe znaczenie ma rejestrowanie wskaźników szkolenia i oceny. Daje nam to pełny obraz przebiegu pociągu. Wagi i odchylenia (WandB) to biblioteka typu open source do wizualizacji i śledzenia eksperymentów uczenia maszynowego. Posiada dedykowaną aplikację internetową do wizualizacji wskaźników treningowych w czasie rzeczywistym. Pozwala nam także centralnie zarządzać modelami produkcyjnymi. Będziemy używać WandB tylko do śledzenia naszego procesu dostrajania Tiny-Llama.
Aby korzystać z WandB, załóż darmowe konto i utwórz Klucz API.
Teraz zacznijmy dostrajać nasz model.
Jak dostroić Tiny-Llamę?
Dostrajanie to zadanie wymagające dużej mocy obliczeniowej. Wymaga komputera z 10-15 GB pamięci VRAM lub możesz skorzystać z bezpłatnego środowiska wykonawczego GPU Tesla T4 firmy Colab.
Teraz zainstaluj 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
Następną rzeczą jest załadowanie 4-bitowego, skwantowanego, wstępnie wytrenowanego modelu za pomocą 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,
)
Spowoduje to zainstalowanie modelu lokalnie. Rozmiar modelu 4-bitowego będzie wynosić około 760 MB.
Teraz zastosuj PEFT do 4-bitowego modelu Tiny-Llama.
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
)
Przygotuj dane
Następnym krokiem jest przygotowanie zbioru danych do dostrajania. Jak wspomniałem wcześniej, użyjemy oczyszczonego Zbiór danych alpaki. To jest oczyszczona wersja oryginalnego zbioru danych Alpaki. Jest zgodny z formatem instrukcja-wejście-odpowiedź. Oto przykład danych Alpaki
Teraz przygotujmy nasze dane.
@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,)
Teraz podziel dane na dane pociągowe i ewaluacyjne. Wziąłem małe dane ewaluacyjne, ponieważ większe dane ewaluacyjne spowalniają szkolenie.
dataset_dict = dataset.train_test_split(test_size=0.004)
Skonfiguruj WandB
Teraz skonfiguruj wagi i odchylenia w bieżącym środowisku wykonawczym.
# @title wandb init
import wandb
wandb.login()
Po wyświetleniu monitu podaj klucz API, aby zalogować się do WandB.
Skonfiguruj zmienne środowiskowe.
%env WANDB_WATCH=all
%env WANDB_SILENT=true
Model pociągu
Do tej pory załadowaliśmy model 4-bitowy, stworzyliśmy konfigurację LoRA, przygotowaliśmy zbiór danych i skonfigurowaliśmy WandB. Następnym krokiem jest wytrenowanie modelu na danych. W tym celu musimy zdefiniować trainer z biblioteki Trl. Będziemy używać SFTrainera z Trl. Ale wcześniej zainicjuj WandB i zdefiniuj odpowiednie argumenty szkoleniowe.
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")
Argumenty szkoleniowe
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,
)
Jest to ważne podczas treningu. Aby utrzymać niskie wykorzystanie procesora graficznego, należy utrzymywać niskie kroki pociągu, ewaluacji wsadowej i gromadzenia gradientu. Rejestrowanie_kroków to liczba kroków, zanim metryki zostaną zarejestrowane w WandB.
Teraz zainicjuj 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,
)
Teraz rozpocznij trening.
trainer_stats = trainer.train()
wandb.finish()
Podczas przebiegu szkoleniowego WandB będzie śledzić metryki szkoleniowe i ewaluacyjne. Odwiedzasz podany link do dashboardu i widzisz go w czasie rzeczywistym.
To jest zrzut ekranu z mojego działania na notatniku Colab.
Szybkość uczenia będzie zależeć od wielu czynników, w tym od rozmiarów danych szkoleniowych i ewaluacyjnych, wielkości partii pociągowych i ewaluacyjnych oraz liczby epok. Jeśli napotkasz problemy z użyciem procesora graficznego, spróbuj zmniejszyć wielkość kroków akumulacji wsadowej i gradientowej. Rozmiar partii pociągu = rozmiar_partia_na_urządzenie * kroki_gradient_accumulation. A liczba kroków optymalizacji = całkowite dane szkoleniowe/wielkość partii. Możesz pobawić się parametrami i zobaczyć, które działają lepiej.
Możesz wizualizować utratę treningu i oceny treningu na pulpicie nawigacyjnym WandB.
Strata pociągu
Strata ewaluacyjna
Wnioskowanie
Możesz zapisać adaptery LoRA lokalnie lub przesłać je do repozytorium HuggingFace.
model.save_pretrained("lora_model") # Local saving
# model.push_to_hub("your_name/lora_model", token = "...") # Online saving
Można także załadować zapisany model z dysku i wykorzystać go do wnioskowania.
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)
Do przesyłania strumieniowego odpowiedzi modelu.
from transformers import TextStreamer
text_streamer = TextStreamer(tokenizer)
_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 64)
Chodziło więc o dostrojenie modelu Tiny-Llama za pomocą rejestrowania WandB.
Oto Notatnik Colab za to samo.
Wnioski
Małe LLM mogą być korzystne przy wdrażaniu na sprzęcie o ograniczonej mocy obliczeniowej, takim jak komputery osobiste, telefony komórkowe i inne urządzenia do noszenia itp. Dokładne dostrojenie pozwala tym modelom lepiej wykonywać zadania późniejsze. W tym artykule dowiedzieliśmy się, jak dostroić model języka podstawowego na zestawie danych.
Na wynos
- Dostrajanie to proces dostosowywania wstępnie wytrenowanego modelu do nowego, konkretnego zadania.
- Tiny-Llama to LLM z zaledwie 1.1 miliarda parametrów i jest szkolony na 3 bilionach tokenów.
- Istnieją różne sposoby dostrajania LLM, takie jak LoRA i QLoRA.
- Unsloth to platforma typu open source, która zapewnia LLM zoptymalizowane pod kątem CUDA, aby przyspieszyć dostrajanie LLM.
- Wagi i odchylenia (WandB) to narzędzie do śledzenia i przechowywania eksperymentów ML.
Często Zadawane Pytania
O. Dostrajanie, w kontekście uczenia maszynowego, zwłaszcza głębokiego uczenia się, to technika, w której bierzesz wstępnie wytrenowany model i dostosowujesz go do nowego, konkretnego zadania.
O. W Colab można bezpłatnie dostroić mniejsze LLM za pomocą procesora graficznego Tesla T4 z QLoRA.
O. Dostrajanie znacznie zwiększa zdolność LLM do wykonywania dalszych zadań, takich jak odgrywanie ról, generowanie kodu itp.
O. Tiny-Llama wyszkolona na 3 bilionach tokenów to LLM z parametrami 1.1B. Model przyjmuje oryginalną architekturę Llama-2.
O. Unsloth to narzędzie typu open source, które zapewnia szybsze i bardziej wydajne dostrajanie LLM poprzez optymalizację jąder GPU za pomocą Triton.
Media pokazane w tym artykule nie są własnością Analytics Vidhya i są wykorzystywane według uznania Autora.
Związane z
- Dystrybucja treści i PR oparta na SEO. Uzyskaj wzmocnienie już dziś.
- PlatoData.Network Pionowe generatywne AI. Wzmocnij się. Dostęp tutaj.
- PlatoAiStream. Inteligencja Web3. Wiedza wzmocniona. Dostęp tutaj.
- PlatonESG. Węgiel Czysta technologia, Energia, Środowisko, Słoneczny, Gospodarowanie odpadami. Dostęp tutaj.
- Platon Zdrowie. Inteligencja w zakresie biotechnologii i badań klinicznych. Dostęp tutaj.
- Źródło: https://www.analyticsvidhya.com/blog/2024/02/fine-tuning-a-tiny-llama-model-with-unsloth/
- :ma
- :Jest
- :nie
- :Gdzie
- $W GÓRĘ
- 1
- 11
- 12
- 15%
- 16
- 1b
- 258
- 32
- 7
- 8
- a
- A100
- Zdolny
- O nas
- Konto
- akumulacja
- precyzja
- przystosować
- adaptacja
- Dodaj
- Wszystkie kategorie
- pozwala
- również
- ilość
- an
- analityka
- Analityka Widhja
- i
- każdy
- api
- Aplikacja
- Aplikuj
- Stosowanie
- właściwy
- odpowiednio
- architektura
- SĄ
- argumenty
- na około
- artykuł
- AS
- At
- samochód
- awatary
- b
- baza
- na podstawie
- BE
- być
- zanim
- poniżej
- korzystny
- Korzyści
- BEST
- Ulepsz Swój
- stronniczość
- uprzedzenia
- Miliard
- Bit
- Bity
- pusty
- blogaton
- krótko
- przynieść
- ale
- by
- CAN
- możliwości
- zdolność
- kapitał
- Etui
- Kategoria
- pogawędzić
- Dodaj
- klasa
- kod
- kompaktowy
- porównywalny
- kompletny
- Ukończył
- komputery
- Koncepcje
- systemu
- skonfigurowany
- konsument
- Sprzęt konsumencki
- kontekst
- rozmowy
- Stwórz
- stworzony
- istotny
- Aktualny
- Obecnie
- zwyczaj
- myślnik
- tablica rozdzielcza
- dane
- zbiory danych
- dedykowane
- głęboko
- głęboka nauka
- określić
- zależeć
- zależy
- rozwijać
- wdrażanie
- Pochodne
- opisuje
- Wykrywanie
- dialogi
- różne
- dyskrecja
- do
- na dół
- Wcześniej
- krawędź
- Efektywne
- efektywność
- wydajny
- więcej
- powstanie
- umożliwiać
- spotkanie
- silnik
- Poprawia
- dość
- jednostka
- Środowisko
- epoki
- szczególnie
- niezbędny
- itp
- Eter (ETH)
- ewaluację
- przykład
- przykłady
- eksperymenty
- odkryj
- Czynniki
- FAIL
- fałszywy
- daleko
- szybciej
- kilka
- mniej
- pływak
- unoszący się
- następujący sposób
- W razie zamówieenia projektu
- format
- Francja
- Darmowy
- od
- dalej
- Gemini
- ogólny cel
- generacja
- otrzymać
- git
- dany
- daje
- Go
- GPU
- GPU
- wspaniały
- sprzęt komputerowy
- Have
- tutaj
- Wysoki
- wyższy
- przytrzymaj
- W jaki sposób
- How To
- Jednak
- HTTPS
- Przytulanie twarzy
- i
- if
- narzędzia
- importować
- ważny
- podnieść
- in
- Włącznie z
- wkład
- Wejścia
- zainstalować
- zamiast
- instrukcje
- zamierzony
- najnowszych
- dotyczy
- problemy
- IT
- jpg
- Trzymać
- konserwacja
- Klawisz
- wiedza
- Kumar
- język
- duży
- większe
- Wyprowadzenia
- UCZYĆ SIĘ
- dowiedziałem
- nauka
- Pozostawiać
- mniej
- pozwala
- Biblioteka
- lubić
- światło wapienne
- liniowy
- LINK
- Lama
- llm
- załadować
- załadunek
- miejscowy
- lokalnie
- log
- zalogowany
- zalogowaniu
- od
- niski
- niższy
- maszyna
- uczenie maszynowe
- robić
- Dokonywanie
- zarządzanie
- podręcznik
- Maksymalna szerokość
- Media
- Pamięć
- wzmiankowany
- metody
- Metryka
- ML
- Aplikacje mobilne
- telefony komórkowe
- model
- modele
- jeszcze
- bardziej wydajny
- większość
- wielokrotność
- musi
- my
- Nazwa
- Potrzebować
- Nowości
- Następny
- żaden
- notatnik
- numer
- of
- często
- starszych
- on
- Online
- tylko
- open source
- OpenAI
- optymalizacja
- zoptymalizowane
- optymalizacji
- or
- oryginalny
- OS
- Inne
- Inaczej
- ludzkiej,
- na zewnątrz
- wydajność
- Wyjścia
- koniec
- własność
- Pakiety
- sparowany
- parametr
- parametry
- część
- przechodzić
- wykonać
- wykonywania
- osobisty
- Komputery osobiste
- telefony
- obraz
- Platforma
- plato
- Analiza danych Platona
- PlatoDane
- Grać
- punkt
- Popularny
- możliwy
- Detaliczność
- Przygotować
- przygotowany
- wygląda tak
- Produkcja
- własność
- zapewnia
- opublikowany
- Naciskać
- Q & A
- jakość
- R
- rankingu
- w czasie rzeczywistym
- zmniejszyć
- redukcja
- redukcja
- wydany
- składnica
- zażądać
- Wymaga
- Badania naukowe
- odpowiedź
- Odpowiedzi
- powrót
- Rola
- Rtx
- run
- taki sam
- Zapisz
- zapisywane
- oszczędność
- skalowaniem
- nauka
- widzieć
- nasienie
- wybierać
- zestaw
- Short
- pokazane
- znak
- ponieważ
- Rozmiar
- rozmiary
- zwalnia
- mały
- mniejszy
- specyficzny
- prędkość
- dzielić
- stojaki
- początek
- Ewolucja krok po kroku
- Cel
- Streaming
- Walka
- znaczny
- taki
- wsparcie
- podpory
- Brać
- Zadania
- Zadanie
- zadania
- technika
- Techniki
- Tesla
- test
- XNUMX
- generowanie tekstu
- niż
- że
- Połączenia
- ich
- Im
- następnie
- Tam.
- Te
- one
- rzecz
- to
- Przez
- czas
- do
- razem
- żeton
- Żetony
- także
- wziął
- narzędzie
- narzędzia
- pochodnia
- Kwota produktów:
- śledzić
- Śledzenie
- Pociąg
- przeszkolony
- Trening
- Transformatory
- Trylion
- Tryton
- prawdziwy
- próbować
- aktualizowanie
- us
- Stosowanie
- posługiwać się
- używany
- Wartości
- wersja
- przez
- Odwiedzić
- wyobrażać sobie
- była
- Droga..
- sposoby
- we
- wearables
- sieć
- webp
- waga
- DOBRZE
- były
- Co
- Co to jest
- jeśli chodzi o komunikację i motywację
- który
- Podczas
- będzie
- w
- działa
- napisać
- ty
- Twój
- zefirnet