Tekoäly
Ainoa opas, jonka tarvitset Llama 3:n tai minkä tahansa muun avoimen lähdekoodin mallin hienosäätöön
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:
- Esikoulutetun mallin valinta: Valitse perusmalli, joka vastaa toivottua arkkitehtuuria.
- Relevantin tietojoukon kerääminen: Kerää ja esikäännä tietty aihealueeseen liittyvä tietojoukko.
- Hienosäätö: Sovella mallia tietojoukon avulla parantamaan sen suorituskykyä tiettyjä tehtäviä varten.
- Arviointi: Arvioi hienosäätöä käyttämällä sekä laadullisia että määrällisiä mittareita.
Käsitteet ja tekniikat
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
- 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.
- 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
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
- Ympäristön asettaminen: Asenna tarvittavat kirjastot ja määritä laskentaympäristö.
- Tietojoukon lataaminen ja esikäsittely: Lataa tietojoukko ja esikäännä se muotoon, joka on soveltuva mallille.
- Esikoulutetun mallin lataaminen: Lataa perusmalli kvantifiointimäärityksillä, jos käytät QLoRA:aa.
- Tokenisointi: Tokenisoi tietojoukko valmistelemaan sitä koulutukseen.
- Koulutus: Hienosäätö mallia valmistellulla tietojoukolla.
- 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-8BHugging 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











