Vaikeuksia tekoälyn tai full-stack-kehityksen kanssa? Asiantuntijamme opastavat sinua: räätälöityjä neuvoja, teknistä integrointia ja paljon muuta. Ota yhteyttä osoitteessa [email protected].

LLaMA:n, OpenLLaMA:n ja XGenin hienosäätö JAX:n avulla GPU:lla tai TPU:lla

LLaMA, OpenLLaMA ja XGen ovat huippuluokan generatiivisia tekoälymalleja. Nämä mallit antavat vielä paljon parempia tuloksia, kun niitä hienosäädetään omilla tiedoillasi. Tässä artikkelissa katsotaan, miten näitä malleja voidaan hienosäätää sekä GPU:lla että TPU:lla JAX:n ja EasyLM-kirjaston avulla.

LLaMA, OpenLLaM ja XGen

Meta julkaisi LLaMA-mallin helmikuussa 2023. Tämä generatiivinen tekoälymalli on avoimen lähdekoodin malli, jota on ehdotettu useassa koossa: 7B parametria, 13B parametria, 33B parametria ja 65B parametria.

Kesäkuussa 2021, kun GPT-J julkaistiin, maailma alkoi ymmärtää, että avoimen lähdekoodin generatiiviset tekoälymallit voivat vakavasti kilpailla OpenAI GPT-3:n kanssa. Nyt LLaMA:n myötä rima on jälleen selvästi nostettu, ja tämä malli vaikuttaa erittäin hyvältä avoimen lähdekoodin vaihtoehdolta OpenAI ChatGPT:lle ja GPT-4:lle.

LLaMA:n lisenssi ei kuitenkaan ole yritysystävällinen: tätä mallia ei voi käyttää kaupallisiin tarkoituksiin... Mutta hyvä uutinen on, että nyt on olemassa muitakin malleja.

OpenLLaMA, joka julkaistiin kesäkuussa 2023, on Berkeleyn tekoälytutkimusryhmän kehittämä LLaMA:n vaihtoehtoinen versio, joka antaa erittäin hyviä tuloksia ja jota voidaan käyttää liiketoiminnassa. Tätä kirjoitettaessa on saatavilla 2 versiota: 7B-parametrit ja 13B-parametrit.

XGen, jonka Salesforce julkaisi kesäkuussa 2023, on toinen erittäin tehokas perusmalli, jota voidaan käyttää kaupallisissa sovelluksissa. Tätä kirjoitettaessa saatavilla on vain 7B-parametrien versio. On syytä huomata, että tämä malli tukee 8k tokenin kontekstia, kun taas LLaMA ja OpenLLaMA tukevat vain 2k tokenin sisältöä.

Miksi hienosäätää omaa malliasi?

Edellä esitetyt mallit ovat perusmalleja, mikä tarkoittaa, että ne on koulutettu ilman valvontaa laajalla tekstikorpuksella.

Nämä perustavanlaatuiset tekoälymallit ovat yleensä hyvä perusta, mutta ne on viritettävä, jotta ne ymmärtävät oikein, mitä haluat, ja tuottavat hyviä tuloksia. Helpoin tapa saavuttaa tämä on käyttää muutaman kuvan oppimista (tunnetaan myös nimellä "prompt engineering"). Voit vapaasti lukea muutaman laukauksen oppaan täältä.

Muutaman otoksen oppiminen on kätevää, koska se voidaan suorittaa lennossa ilman, että generatiivisesta tekoälymallista tarvitsee luoda uutta versiota, mutta joskus se ei riitä.

Jotta saat huipputason tuloksia, haluat hienosäätää tekoälymallin omaa käyttötapaustasi varten. Hienosäätö tarkoittaa, että muutat joitakin mallin parametreja omien tietojesi perusteella ja saat sitten oman versiosi mallista.

Hienosäätö on paljon halvempaa kuin generatiivisen tekoälymallin kouluttaminen tyhjästä, mutta se vaatii silti laskentatehoa, joten tarvitset kehittynyttä laitteistoa oman mallisi hienosäätöön. Jotkin viimeaikaiset vaihtoehtoiset hienosäätömenetelmät vaativat vähemmän laskentatehoa (ks. p-tuning, prompt tuning, soft tuning, parameter efficient fine-tuning, adapters, LoRA, QLoRA...), mutta toistaiseksi emme ole onnistuneet saavuttamaan samaa laatutasoa näillä tekniikoilla, joten emme mainitse niitä tässä oppaassa.

LLaMA:n hienosäätö TPU:ssa JAX:n ja EasyLM:n avulla

Tässä opetusohjelmassa keskitymme LLaMA:n hienosäätöön Berkeleyn tekoälytutkimusryhmän julkaiseman EasyLM-kirjaston avulla: https://github.com/young-geng/EasyLM. This library is based on JAX which makes the fine-tuning process fast and compatible with both GPUs and Google TPUs.

Voit myös hienosäätää OpenLLaMAa tai XGeniä samalla tekniikalla.

Hienosäädämme LLaMA 7B:n Google TPU V3-8:lla tässä, mutta voit tehdä saman täydellisesti A100-grafiikkasuorittimella (lue vain huolellisesti EasyLM:n dokumentaation "Asennus"-osa, joka on hieman erilainen). Voit tietysti hienosäätää myös suurempia LLaMA-versioita (13B, 33B, 65B...), mutta tarvitset paljon enemmän kuin TPU V3-8:n tai yhden A100-grafiikkapiirin.

Nyt mennään!

Luo ensin JSONL-muotoinen tekstin tuottamista koskeva tietokokonaisuus käyttötapaustasi varten käyttämällä kunkin esimerkin avaimena "text". Tässä on yksinkertainen sentimenttianalyysitietokanta:

{"text":"[Content]: I love NLP Cloud, this company is awesome!\n[Sentiment]: Positive"}
{"text":"[Content]: Training LLMs is a complex but rewarding process.\n[Sentiment]: Neutral"}
{"text":"[Content]: My fine-tuning keeps crashing because of an OOM error! It just does not work at all!\n[Sentiment]: Negative"}

Huomaa pari tärkeää asiaa. Ensinnäkin tämä tietokokonaisuus sisältää yksinkertaisuuden vuoksi vain 3 esimerkkiä, mutta todellisessa elämässä tarvitset paljon enemmän esimerkkejä. 300 esimerkkiä on yleensä hyvä alku. Toiseksi, kun käytät hienosäädettyä malliasi päättelyyn, sinun on noudatettava tiukasti samaa muotoilua käyttämällä etuliitteitä "[Content]:" ja "[Sentiment]:". Viimeiseksi "</s>"-merkki on tärkeä, koska se tarkoittaa, että mallin pitäisi lopettaa tuottaminen tähän. Lisää esimerkkejä dataseteistä löydät NLP Cloud -dokumentaatiosta: Lue lisää täältä.

Luo TPU V3-8 VM Google Cloudiin V2 Alpha -ohjelmistoversiolla:

Kirjaudu SSH-yhteydellä VM:ään ja asenna EasyLM:

git clone https://github.com/young-geng/EasyLM
cd EasyLM
bash ./scripts/tpu_vm_setup.sh

Voit nyt ladata ja muuntaa LLaMA-painot. Ensimmäinen vaihtoehto on pyytää Metalta virallisia painoja: https://ai.facebook.com/blog/large-language-model-llama-meta-ai/. Muunna sitten painot EasyLM:ään tällä skriptillä: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_torch_to_easylm.py. Toinen vaihtoehto on käyttää LLaMA-painoja HuggingFacessa: https://huggingface.co/decapoda-research/llama-7b-hf. Muunna sitten painot EasyLM:ään tällä skriptillä: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_hf_to_easylm.py.

Lataa tietokokonaisuutesi VM:ään ja laske, kuinka monta merkkiä se sisältää HF LLaMA -merkkimuunninta käyttäen:

pip install -U transformers
python -c "from transformers import LlamaTokenizer; tokenizer = LlamaTokenizer.from_pretrained('decapoda-research/llama-7b-hf'); f = open('/path/to/your/dataset', 'r'); print(len(tokenizer.encode(f.read())))"

Jos koulutat mallisi 1024 merkin kontekstille, sinun on jaettava palautettu merkkien määrä 1024:llä.

Jos koulutat mallisi 2048 merkin kontekstille, sinun on jaettava palautettu merkkien määrä 2048:lla.

Tämä luku on askelten lukumäärä epookkia kohden. Jos esimerkiksi haluat harjoitella 5 epookin ajan (mikä on yleensä hyvä asetus), sinun on kerrottava tämä luku viidellä ja annettava saatu arvo alla olevaan --total_steps -kenttään.

Tässä on konkreettinen esimerkki: jos tietokokonaisuutesi sisältää 100 000 tokenia ja haluat 1024 tokenin kontekstin ja 5 epookkia, askelten kokonaismäärä on (100 000/1024)*5 = 488.

Aseta --train_dataset.json_dataset.seq_length arvoksi 1024 tai 2048 riippuen kontekstin pituudesta. Huomaa, että mallin hienosäätö 2048 merkin kontekstia varten vaatii enemmän muistia, joten jos tämä ei ole ehdottoman välttämätöntä, suosittelemme, että pysyt 1024 merkin kontekstissa.

Voit nyt käynnistää hienosäätöprosessin:

nohup python -u EasyLM/EasyLM/models/llama/llama_train.py \
--total_steps=your number of steps \
--save_model_freq=usually same as your number of steps \
--optimizer.adamw_optimizer.lr_warmup_steps=usually 10% of total steps \
--train_dataset.json_dataset.path='/path/to/your/dataset' \
--train_dataset.json_dataset.seq_length=1024 or 2048 \
--load_checkpoint='params::/path/to/converted/model' \
--tokenizer.vocab_file='/path/to/tokenizer' \
--logger.output_dir=/path/to/output  \
--mesh_dim='1,4,2' \
--load_llama_config='7b' \
--train_dataset.type='json' \
--train_dataset.text_processor.fields='text' \
--optimizer.type='adamw' \
--optimizer.accumulate_gradient_steps=1 \
--optimizer.adamw_optimizer.lr=0.002 \
--optimizer.adamw_optimizer.end_lr=0.002 \
--optimizer.adamw_optimizer.lr_decay_steps=100000000 \
--optimizer.adamw_optimizer.weight_decay=0.001 \
--optimizer.adamw_optimizer.multiply_by_parameter_scale=True \
--optimizer.adamw_optimizer.bf16_momentum=True &

Joitakin selityksiä:

--save_model_freq: kuinka usein haluat tallentaa mallisi prosessin aikana. Jos teet hienosäätöä vain pienellä tietokokonaisuudella, voit tallentaa vain prosessin lopussa, jolloin tämä arvo on yhtä suuri kuin --total_steps.

--optimizer.adamw_optimizer.lr_warmup_steps: 10% kokonaisaskeleista on yleensä hyvä arvo.

--tokenizer.vocab_file: polku tokenizer.model-tiedostoon. Jos esimerkiksi käytät HuggingFace-sivuston decapoda-repositorya, tässä on linkki tokenizeriin: https://huggingface.co/decapoda-research/llama-7b-hf/resolve/main/tokenizer.model.

--logger.output_dir: polku lopulliseen malliin ja lokitiedostoihin.

Muut parametrit voidaan jättää muuttamatta.

Kun hienosäätöprosessi on valmis, voit hakea mallisi --logger.output_dir-kohdassa määritettyyn polkuun.

Hienosäädetyn mallin käyttäminen päättelyyn

Sinulla on nyt oma hienosäädetty malli ja haluat tietenkin käyttää sitä!

Ensimmäinen strategia on käyttää EasyLM-kirjastoa päättelyyn. Tällöin voit käynnistää päättelypalvelimen seuraavasti:

python EasyLM/EasyLM/models/llama/llama_serve.py  \
--mesh_dim='1,1,-1' \
--load_llama_config='7b' \
--load_checkpoint='params::/path/to/your/model' \
--tokenizer.vocab_file='/path/to/tokenizer'

Lähetä sitten pyyntösi cURL:llä näin:

curl "http://0.0.0.0:5007/generate" \
-H "Content-Type: application/json" \
-X POST -d '{"prefix_text":["[Content]: EasyLM works really well!\n[Sentiment]:"]}'

Toinen strategia on viedä malli HuggingFace-formaattiin, jotta voit tehdä päätelmiä toisessa kehyksessä. Näin voit viedä sen:

python EasyLM/EasyLM/models/llama/convert_easylm_to_hf.py \
--load_checkpoint='params::/path/to/output/model/streaming_params' \
--tokenizer_path='/path/to/tokenizer' \
--model_size='7b' \
--output_dir='/path/to/converted/model'

Päätelmä

Vuosi 2023 on ollut suuri virstanpylväs avoimen lähdekoodin generatiivisille tekoälymalleille. Tätä kirjoitettaessa kaikki voivat käyttää loistavia malleja, kuten LLaMA, OpenLLaMA, XGen, Orca, Falcon,...

Näiden mallien hienosäätö on paras tapa saada huippuluokan tuloksia, jotka on räätälöity omaan käyttötapaukseesi ja jotka voivat päihittää merkittävästi parhaat omat tekoälymallit, kuten ChatGPT (GPT-3.5), GPT-4, Claude....

Tässä oppaassa näytin, miten LLaMA, OpenLLaMA ja XGen hienosäädetään. Jos sinulla on kysyttävää, älä epäröi ottaa yhteyttä minuun, ja jos haluat helposti hienosäätää ja ottaa käyttöön kehittyneitä generatiivisia tekoälymalleja ilman teknistä monimutkaisuutta, have a look at the NLP Cloud dedicated documentation!

Mark
Koneoppimisinsinööri NLP Cloudissa