"LLaMA", "OpenLLaMA" ir "XGen" yra pažangiausi generatyviniai dirbtinio intelekto modeliai. Šie modeliai duoda dar geresnius rezultatus, kai juos tiksliai suderinate su savo duomenimis. Šiame straipsnyje pažiūrėkime, kaip tiksliai sureguliuoti šiuos modelius naudojant ir GPU, ir TPU, naudojant JAX ir "EasyLM" biblioteką.
LLaMA modelį "Meta" išleido 2023 m. vasario mėn. Šis generatyvinis dirbtinio intelekto modelis yra atvirojo kodo modelis, siūlomas kelių dydžių: MaaLaMA yra keli galimi modeliai: 7B parametrų, 13B parametrų, 33B parametrų ir 65B parametrų.
2021 m. birželį, kai buvo išleistas "GPT-J", pasaulis ėmė suprasti, kad atvirojo kodo generatyviniai dirbtinio intelekto modeliai gali rimtai konkuruoti su "OpenAI GPT-3". Dabar, pasirodžius LLaMA, kartelė vėl akivaizdžiai pakelta, ir šis modelis, atrodo, yra labai gera atvirojo kodo alternatyva "OpenAI ChatGPT" ir GPT-4.
Tačiau LLaMA licencija nėra palanki verslui: šio modelio negalima naudoti komerciniais tikslais... Tačiau gera žinia ta, kad dabar yra ir kitų modelių.
2023 m. birželį išleista "OpenLLaMA" yra alternatyvi "Berkeley AI Research" komandos sukurta "LLaMA" versija, kuri duoda labai gerų rezultatų ir gali būti naudojama versle. Šiuo metu yra 2 versijos: 7B parametrų ir 13B parametrų.
2023 m. birželį "Salesforce" išleistas "XGen" yra dar vienas labai galingas pamatinis modelis, kurį galima naudoti komercinėse programose. Šiuo metu prieinama tik 7B parametrų versija. Verta paminėti, kad šis modelis palaiko 8k žetonų kontekstą, o LLaMA ir OpenLLaMA palaiko tik 2k žetonų turinį.
Pirmiau pateikti modeliai yra pamatiniai modeliai, o tai reiškia, kad jie buvo apmokyti nekontroliuojamuoju būdu, naudojant didelį tekstų korpusą.
Šie pagrindiniai AI modeliai paprastai yra geras pagrindas, tačiau juos reikia suderinti, kad jie tinkamai suprastų, ko norite, ir grąžintų gerus rezultatus. Lengviausias būdas tai pasiekti - naudoti kelių kadrų mokymąsi (dar vadinamą "greitąja inžinerija"). Kviečiame skaityti mūsų specialų kelių kadrų mokymosi vadovą čia.
Mokymasis keliais bandymais yra patogus, nes jį galima atlikti "akimirksniu", nekuriant naujos generatyvinio dirbtinio intelekto modelio versijos, tačiau kartais to nepakanka.
Kad gautumėte naujausius rezultatus, norėsite tiksliai pritaikyti dirbtinio intelekto modelį savo naudojimo atvejui. Tikslus derinimas reiškia, kad, remdamiesi savo duomenimis, pakeisite kai kuriuos modelio parametrus ir gausite savo modelio versiją.
Tikslus derinimas yra daug pigesnis nei generatyvinio dirbtinio intelekto modelio mokymas nuo nulio, tačiau tam vis tiek reikia skaičiavimo galios, todėl norint tiksliai suderinti savo modelį reikia pažangios aparatinės įrangos. Kai kuriems naujausiems alternatyviems tikslaus derinimo metodams reikia mažiau skaičiavimo galios (žr. p-tuning, prompt tuning, soft tuning, parameter efficient fine-tuning, adapteriai, LoRA, QLoRA...), tačiau kol kas šiais metodais nepavyko pasiekti tokio paties kokybės lygio, todėl šiame vadovėlyje jų neminėsime.
Šiame vadovėlyje daugiausia dėmesio skiriame LLaMA derinimui su "EasyLM" biblioteka, kurią išleido "Berkeley AI Research" komanda: 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.
Naudodami tą patį metodą taip pat galite tiksliai sureguliuoti "OpenLLaMA" arba "XGen".
Čia mes tiksliai suderinome "LLaMA 7B" su "Google TPU V3-8", tačiau tą patį puikiai galite padaryti ir su A100 GPU (tiesiog atidžiai perskaitykite "EasyLM" dokumentacijos dalį "Diegimas", kuri šiek tiek skiriasi). Žinoma, galite derinti ir didesnes LLaMA versijas (13B, 33B, 65B...), tačiau jums reikės daug daugiau nei TPU V3-8 arba vieno A100 GPU.
Štai taip!
Pirmiausia sukurkite JSONL formato teksto generavimo duomenų rinkinį savo naudojimo atvejui, naudodami "text" kaip kiekvieno pavyzdžio raktą. Čia pateikiamas paprastas nuotaikų analizės duomenų rinkinys:
{"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"}
Atkreipkite dėmesį į keletą svarbių dalykų. Pirma, šiame duomenų rinkinyje yra tik 3 pavyzdžiai, kad būtų paprasčiau, tačiau realiame gyvenime pavyzdžių reikės kur kas daugiau. Paprastai 300 pavyzdžių yra gera pradžia. Antra, kai išvadoms daryti naudosite savo sureguliuotą modelį, turėsite griežtai laikytis to paties formatavimo, naudodami "[Turinys]:" ir "[Nuotaikos]:" priešdėlius. Galiausiai simbolis "</s>" yra svarbus, nes jis reiškia, kad modelis čia turėtų nustoti generuoti. Daugiau duomenų rinkinio pavyzdžių galite rasti "NLP Cloud" dokumentacijoje: daugiau sužinoti čia.
Sukurkite TPU V3-8 virtualiąją mašiną "Google" debesyje su "V2 Alpha" programinės įrangos versija:
SSH įeikite į virtualiąją mašiną ir įdiekite "EasyLM":
git clone https://github.com/young-geng/EasyLM
cd EasyLM
bash ./scripts/tpu_vm_setup.sh
Dabar galite atsisiųsti ir konvertuoti LLaMA svorius. Pirmoji galimybė - paprašyti "Meta" oficialių svorių: https://ai.facebook.com/blog/large-language-model-llama-meta-ai/. Tada konvertuokite svorius į EasyLM naudodami šį scenarijų: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_torch_to_easylm.py. Antroji galimybė - naudoti LLaMA svorius "HuggingFace": https://huggingface.co/decapoda-research/llama-7b-hf. Tada konvertuokite svorius į EasyLM naudodami šį scenarijų: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_hf_to_easylm.py.
Įkelkite savo duomenų rinkinį į virtualiąją mašiną, suskaičiuokite, kiek jame yra simbolių, naudodami HF LLaMA tokenizer:
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())))"
Jei savo modelį treniruojate 1024 ženklų kontekstui, grąžintą ženklų skaičių turėsite padalyti iš 1024.
Jei savo modelį treniruojate 2048 žetonų kontekstui, grąžintą žetonų skaičių turėsite padalyti iš 2048.
Šis skaičius bus žingsnių skaičius per epochą. Pavyzdžiui, jei norite mokyti 5 epochas (paprastai tai yra geras nustatymas), šį skaičių reikia padauginti iš 5 ir gautą reikšmę įrašyti į --total_steps toliau.
Štai konkretus pavyzdys: jei jūsų duomenų rinkinyje yra 100 000 simbolių, o jūs norite 1024 simbolių konteksto ir 5 epochų, bendras žingsnių skaičius bus (100 000/1024)*5 = 488.
Priklausomai nuo konteksto ilgio, toliau nustatykite --train_dataset.json_dataset.seq_length kaip 1024 arba 2048. Atkreipkite dėmesį, kad modeliui tiksliai sureguliuoti 2048 žetonų kontekste reikia daugiau atminties, todėl, jei tai nėra būtina, rekomenduojame pasirinkti 1024 žetonų kontekstą.
Dabar galite pradėti derinimo procesą:
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 &
Keletas paaiškinimų:
--save_model_freq: kaip dažnai norite išsaugoti modelį proceso metu. Jei tikslinate tik nedidelį duomenų rinkinį, galite išsaugoti tik proceso pabaigoje ir tokiu atveju ši reikšmė bus lygi --total_steps.
--optimizer.adamw_optimizer.lr_warmup_steps: Paprastai 10 % visų žingsnių yra gera vertė.
--tokenizer.vocab_file: kelias iki tokenizer.model failo. Pavyzdžiui, jei naudojate "HuggingFace" esančią "decapoda" saugyklą, čia pateikiama nuoroda į tokenizerį: https://huggingface.co/decapoda-research/llama-7b-hf/resolve/main/tokenizer.model.
--logger.output_dir: galutinio modelio ir žurnalų kelias
Kitų parametrų galima nekeisti.
Kai derinimo procesas bus baigtas, modelį galėsite gauti keliu, kurį nurodėte parametre --logger.output_dir.
Dabar jau turite savo sureguliuotą modelį ir, žinoma, norite jį naudoti!
Pirmoji strategija - naudoti EasyLM biblioteką išvadoms daryti. Tokiu atveju išvedimo serverį galite paleisti taip:
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'
Tada tiesiog siųskite užklausas naudodami cURL, kaip nurodyta toliau:
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]:"]}'
Antroji strategija - eksportuoti modelį į "HuggingFace" formatą, kad būtų galima atlikti išvadas naudojant kitą sistemą. Štai kaip galite jį eksportuoti:
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'
2023 m. buvo didelis etapas atvirojo kodo generatyvinių dirbtinio intelekto modelių srityje. Nuo šio rašto visi gali naudotis puikiais modeliais, tokiais kaip LLaMA, OpenLaMA, XGen, Orca, Falcon...
Šių modelių tobulinimas - geriausias būdas gauti pažangiausius, jūsų naudojimo atvejui pritaikytus rezultatus, kurie gali gerokai pranokti geriausius patentuotus dirbtinio intelekto modelius, tokius kaip ChatGPT (GPT-3.5), GPT-4, Claude...
Šiame vadove parodžiau, kaip tiksliai suderinti LLaMA, OpenLLaMA ir XGen. Jei turite klausimų, nedvejodami kreipkitės į mane ir jei norite lengvai suderinti ir įdiegti pažangius generatyvinius dirbtinio intelekto modelius be jokio techninio sudėtingumo, have a look at the NLP Cloud dedicated documentation!
Mark
"NLP Cloud" mašininio mokymosi inžinierius