Connect with us

Ainoa opas, jonka tarvitset Llama 3:n tai minkä tahansa muun avoimen lähdekoodin mallin hienosäätöön

Tekoäly

Ainoa opas, jonka tarvitset Llama 3:n tai minkä tahansa muun avoimen lähdekoodin mallin hienosäätöön

mm
FINE TUNING OPEN SOURCE LLM PYTHON GUIDE

Suurten kielen mallien (LLM) hienosäätö, kuten Llama 3, käyttää esikoulutettua mallia tiettyihin tehtäviin tietyssä aihealueessa olevan tietojoukon avulla. Tämä prosessi hyödyntää mallin olemassa olevaa tietoa, mikä tekee siitä tehokkaan ja kustannustehokkaan verrattuna kouluttamiseen alusta alkaen. Tässä opaskirjassa käymme läpi Llama 3:n hienosäätöön liittyvät vaiheet QLoRA:n (Quantized LoRA) avulla, joka on parametreja tehokas menetelmä, joka vähentää muistin käyttöä ja laskennallisia kustannuksia.

Hienosäätöön liittyvä yleiskatsaus

Hienosäätöön liittyy useita tärkeitä vaiheita:

  1. Esikoulutetun mallin valinta: Valitse perusmalli, joka vastaa toivottua arkkitehtuuria.
  2. Relevantin tietojoukon kerääminen: Kerää ja esikäännä tietty aihealueeseen liittyvä tietojoukko.
  3. Hienosäätö: Sovella mallia tietojoukon avulla parantamaan sen suorituskykyä tiettyjä tehtäviä varten.
  4. Arviointi: Arvioi hienosäätöä käyttämällä sekä laadullisia että määrällisiä mittareita.

Käsitteet ja tekniikat

Suurten kielen mallien hienosäätö

Suurten kielen mallien hienosäätö

Täydellinen hienosäätö

Täydellinen hienosäätö päivittää kaikki mallin parametreja, mikä tekee siitä tietyn tehtävän mukaisen. Tämä menetelmä vaatii merkittäviä laskennallisia resursseja ja on usein epäkäytännöllinen erittäin suurten mallien osalta.

Parametreja tehokas hienosäätö (PEFT)

PEFT päivittää vain osan mallin parametreja, mikä vähentää muistin tarvetta ja laskennallisia kustannuksia. Tämä tekniikka estää katastrofaalisen unohtamisen ja säilyttää mallin yleisen tietämyksen.

Low-Rank-sovittaminen (LoRA) ja Quantized LoRA (QLoRA)

LoRA hienosäätää vain muutamia matalan sijan matriiseja, kun taas QLoRA kvantifioi nämä matriisit vähentääksesi muistin jalanjälkeä edelleen.

Hienosäätömenetelmät

  1. Täydellinen hienosäätö: Tämä käyttää koko mallin kouluttamiseen tehtäväkohtaisella tietojoukolla. Vaikka tämä menetelmä voi olla erittäin tehokas, se on myös laskennallisesti kallista ja vaatii merkittäviä muistiresursseja.
  2. Parametreja tehokas hienosäätö (PEFT): PEFT päivittää vain osan mallin parametreja, mikä tekee siitä muistitehokkaamman. Tekniikat kuten Low-Rank-sovittaminen (LoRA) ja Quantized LoRA (QLoRA) kuuluvat tähän luokkaan.

Mikä on LoRA?

Hienosäätömenetelmien vertailu: QLORA parantaa LoRA:aa 4-bittisen tarkkuuden kvantifiointia ja sivutettuja optimoijia muistin huipun hallintaan

Hienosäätömenetelmien vertailu: QLORA parantaa LoRA:aa 4-bittisen tarkkuuden kvantifiointia ja sivutettuja optimoijia muistin huipun hallintaan

LoRA on parannettu hienosäätömenetelmä, jossa esikoulutetun mallin painoarvoja ei päivitetä kaikkia, vaan kaksi pienempää matriisia, jotka approksimoivat suurempaa matriisia, päivitetään. Nämä matriisit muodostavat LoRA-sovittimen. Tämä hienosäätösovitin ladotaan esikoulutettuun malliin ja käytetään inferenceksi.

LoRA:n avainetuja:

  • Muistitehokkuus: LoRA vähentää muistin jalanjälkeä päivittämällä vain pieniä matriiseja koko mallin sijaan.
  • Uudelleenkäytettävyys: Alkuperäinen malli säilyy muuttumattomana, ja useita LoRA-sovittimia voidaan käyttää siitä, mikä helpottaa useiden tehtävien käsittelyä alhaisemmilla muistivaatimuksilla.

Mikä on Quantized LoRA (QLoRA)?

QLoRA vie LoRA:n askelen eteenpäin kvantifioiden LoRA-sovittimien painoarvot alempaan tarkkuuteen (esim. 4-bittiseen sijaan 8-bittisestä). Tämä vähentää edelleen muistin käyttöä ja tallennustilaa säilyttäen samalla vertailukelpoisen tehokkuuden.

QLoRA:n avainetuja:

  • Entistä suurempi muistitehokkuus: Painoarvojen kvantifiointi vähentää merkittävästi mallin muisti- ja tallennustilavaatimukset.
  • Suorituskyvyn ylläpitäminen: Vaikka tarkkuus on vähennetty, QLoRA ylläpitää suorituskykytasoa, joka on lähellä täysitarkkuuden mallien suorituskykyä.

Tehtäväkohtainen sovittaminen

Hienosäätöprosessin aikana mallin parametreja säätellään uuden tietojoukon perusteella, mikä auttaa mallia ymmärtämään ja tuottamaan sisältöä, joka on relevanttia tiettyyn tehtävään. Tämä prosessi säilyttää yleisen kielen tietämyksen, joka on saavutettu esikoulutuksen aikana, ja sovittaa mallin kohdealueen nuansseihin.

Hienosäätö käytännössä

Täydellinen hienosäätö vs. PEFT

  • Täydellinen hienosäätö: Tämä käyttää koko mallin kouluttamiseen, mikä voi olla laskennallisesti kallista ja vaatia merkittäviä muistiresursseja.
  • Parametreja tehokas hienosäätö (PEFT): PEFT päivittää vain osan mallin parametreja, mikä tekee siitä muistitehokkaamman. Tekniikat kuten LoRA ja QLoRA kuuluvat tähän luokkaan, mikä tekee niistä tehokkaampia vaihtoehtoja.

Toteutusvaiheet

  1. Ympäristön asettaminen: Asenna tarvittavat kirjastot ja määritä laskentaympäristö.
  2. Tietojoukon lataaminen ja esikäsittely: Lataa tietojoukko ja esikäännä se muotoon, joka on soveltuva mallille.
  3. Esikoulutetun mallin lataaminen: Lataa perusmalli kvantifiointimäärityksillä, jos käytät QLoRA:aa.
  4. Tokenisointi: Tokenisoi tietojoukko valmistelemaan sitä koulutukseen.
  5. Koulutus: Hienosäätö mallia valmistellulla tietojoukolla.
  6. Arviointi: Arvioi mallin suorituskykyä tiettyjä tehtäviä varten käyttämällä sekä laadullisia että määrällisiä mittareita.

Askeltainen opas LLM:n hienosäätöön

Ympäristön asettaminen

Käytämme Jupyter-muistikirjaa tähän opaskirjaan. Alustat kuten Kaggle, jotka tarjoavat ilmaisen GPU-käytön, tai Google Colab ovat ihanteellisia näiden kokeiden suorittamiseen.

1. Tarvittavien kirjastojen asennus

Varmista, että sinulla on tarvittavat kirjastot asennettuna:

!pip install -qqq -U bitsandbytes transformers peft accelerate datasets scipy einops evaluate trl rouge_score

2. Kirjastojen tuominen ja ympäristön asettaminen

import os
import torch
from datasets import load_dataset
from transformers import (
AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments,
pipeline, HfArgumentParser
)
from trl import ORPOConfig, ORPOTrainer, setup_chat_format, SFTTrainer
from tqdm import tqdm
import gc
import pandas as pd
import numpy as np
from huggingface_hub import interpreter_login

# Poista Weights and Biases -loki
os.environ['WANDB_DISABLED'] = "true"
interpreter_login()

3. Tietojoukon lataaminen

Käytämme DialogSum-tietojoukkoa tähän opaskirjaan:

Esikäännä tietojoukko mallin vaatimusten mukaan, mukaan lukien sovellettavien templaattien soveltaminen ja varmistaminen, että tietojoukon muoto on soveltuva hienosäätöön​ (Hugging Face)​​ (DataCamp)​.

dataset_name = "neil-code/dialogsum-test"
dataset = load_dataset(dataset_name)

Tutki tietojoukon rakennetta:

print(dataset['test'][0])

4. BitsAndBytes-konfiguraation luominen

Lataa malli 4-bittisessä muodossa:

compute_dtype = getattr(torch, "float16")
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type='nf4',
bnb_4bit_compute_dtype=compute_dtype,
bnb_4bit_use_double_quant=False,
)

5. Esikoulutetun mallin lataaminen

Käytämme Microsoftin Phi-2-mallia tähän opaskirjaan:

model_name = 'microsoft/phi-2'
device_map = {"": 0}
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

6. Tokenisointi

Määritä tokenisaattori:

tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
padding_side="left",
add_eos_token=True,
add_bos_token=True,
use_fast=False
)
tokenizer.pad_token = tokenizer.eos_token

Llama 3:n tai muiden mallien hienosäätö

Kun hienosäätöt Llama 3:aa tai muita valmiita avoimen lähdekoodin LLM-malleja, on tärkeää ottaa huomioon tietyt seikat ja sovitukset, jotta saavutetaan optimaalinen suorituskyky. Tässä on yksityiskohtaiset vaiheet ja näkemykset siitä, miten lähestyä tätä eri malleille, mukaan lukien Llama 3, GPT-3 ja Mistral.

5.1 Llama 3:n käyttäminen

Mallin valinta:

  • Varmista, että sinulla on oikea mallin tunniste Hugging Face -mallihubbista. Esimerkiksi Llama 3 -malli voi olla tunnistettu meta-llama/Meta-Llama-3-8B Hugging Facessa.
  • Varmista, että sinulla on pääsy malliin ja kirjaudu Hugging Face -tiliisi, jos mallit kuten Llama 3 vaativat sitä​ (Hugging Face)​​

Tokenisointi:

  • Käytä oikeaa tokenisaattoria Llama 3:lle, varmista, että se on yhteensopiva mallin kanssa ja tukee tarvittavia ominaisuuksia, kuten paddingia ja erikoistunnisteita.

Muisti ja laskenta:

  • Llama 3:n kaltaisten suurten mallien hienosäätö vaatii merkittäviä laskennallisia resursseja. Varmista, että ympäristösi, kuten voimakas GPU-asettelu, pystyy käsittelemään muisti- ja laskentavaatimukset. Varmista, että ympäristö pystyy käsittelemään muistivaatimukset, jotka voidaan lieventää käyttämällä tekniikoita kuten QLoRA:aa muistijalanjäljen vähentämiseksi​ (Hugging Face Forums)

Esimerkki:

model_name = 'meta-llama/Meta-Llama-3-8B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

Tokenisointi:

Riippuen tietystä käyttötarkoituksesta ja mallin vaatimuksista, varmista, että tokenisaattori on määritetty oikein ilman tarpeettomia asetuksia. Esimerkiksi use_fast=True on suositeltavaa paremman suorituskyvyn vuoksi​ (Hugging Face)​​ (Weights & Biases)​.

tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
padding_side="left",
add_eos_token=True,
add_bos_token=True,
use_fast=False
)
tokenizer.pad_token = tokenizer.eos_token

5.2 Muiden suosittujen mallien (esim. GPT-3, Mistral) käyttäminen

Mallin valinta:

  • GPT-3:n ja Mistralin kaltaisten mallien osalta varmista, että käytät oikeaa mallinimeä ja tunnistetta Hugging Face -mallihubbista tai muista lähteistä.

Tokenisointi:

  • Samoin kuin Llama 3:ssa, varmista, että tokenisaattori on oikein määritetty ja yhteensopiva mallin kanssa.

Muisti ja laskenta:

  • Kukin malli voi vaatia erilaisia muistiresursseja. Säätä ympäristösi asetukset vastaavasti.

Esimerkki GPT-3:lle:

model_name = 'openai/gpt-3'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

Esimerkki Mistralille:

model_name = 'mistral-7B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)

Tokenisointiasetukset: Kukin malli voi vaatia yksilöllisiä tokenisointiasetuksia. Varmista, että tokenisaattori vastaa mallia ja on määritetty oikein.

Llama 3:n tokenisaattoriesimerkki:

tokenizer = AutoTokenizer.from_pretrained(
model_name,
trust_remote_code=True,
padding_side="left",
add_eos_token=True,
add_bos_token=True,
use_fast=False
)
tokenizer.pad_token = tokenizer.eos_token

GPT-3:n ja Mistralin tokenisaattoriesimerkki:

tokenizer = AutoTokenizer.from_pretrained(
model_name,
use_fast=True
)

7. Mallin testaaminen nollasuorituksella

Arvioi perusmallia näytteellisellä syötteellä:

from transformers import set_seed

set_seed(42)
index = 10
prompt = dataset['test'][index]['dialogue']
formatted_prompt = f"Instruct: Summarize the following conversation.\n{prompt}\nOutput:\n"

# Generoi vastaus
def gen(model, prompt, max_length):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=max_length)
return tokenizer.batch_decode(outputs, skip_special_tokens=True)

res = gen(original_model, formatted_prompt, 100)
output = res[0].split('Output:\n')[1]

print(f'INPUT PROMPT:\n{formatted_prompt}')
print(f'MODEL GENERATION - ZERO SHOT:\n{output}')

8. Tietojoukon esikäsittely

Muunna dialogi-yhteenveto-parit ohjelmapohjiksi:

def create_prompt_formats(sample):
blurb = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
instruction = "### Instruct: Summarize the below conversation."
input_context = sample['dialogue']
response = f"### Output:\n{sample['summary']}"
end = "### End"

parts = [blurb, instruction, input_context, response, end]
formatted_prompt = "\n\n".join(parts)
sample["text"] = formatted_prompt
return sample

dataset = dataset.map(create_prompt_formats)

Tokenisoi muodostetun tietojoukon:

def preprocess_batch(batch, tokenizer, max_length):
return tokenizer(batch["text"], max_length=max_length, truncation=True)

max_length = 1024
train_dataset = dataset["train"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True)
eval_dataset = dataset["validation"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True)

9. Valmistele malli QLoRA:lle

Olen viettänyt viimeiset viisi vuotta uppoutumassa kiinnostavaan koneoppimisen ja syväoppimisen maailmaan. Intohimoni ja asiantuntemukseni ovat johtaneet minun osallistumiseen yli 50:een monipuoliseen ohjelmistosuunnitteluhankkeeseen, joissa on erityisesti painottunut tekoäly/ML. Jatkuva uteliaisuuteni on myös ohjannut minua kohti luonnollisen kielen prosessointia, alaa jota haluan tutkia tarkemmin.