Máte problémy s AI alebo vývojom celého balíka? Naši odborníci sú tu, aby vám poradili: poradenstvo na mieru, technická integrácia a ďalšie služby. Obráťte sa na [email protected].

Ako doladiť LLaMA, OpenLLaMA a XGen pomocou JAX na GPU alebo TPU

LLaMA, OpenLLaMA a XGen sú špičkové generatívne modely umelej inteligencie. Tieto modely poskytujú ešte oveľa lepšie výsledky, keď sa doladia na vašich vlastných údajoch. V tomto článku si ukážeme, ako tieto modely doladiť na GPU aj TPU pomocou JAX a knižnice EasyLM.

LLaMA, OpenLLaM a XGen

Model LLaMA vydala spoločnosť Meta vo februári 2023. Tento generatívny model umelej inteligencie je model s otvoreným zdrojovým kódom navrhnutý v niekoľkých veľkostiach: Parametrov je 7B, 13B, 33B a 65B.

V júni 2021, keď bol vydaný GPT-J, si svet začal uvedomovať, že generatívne modely AI s otvoreným zdrojovým kódom môžu vážne konkurovať OpenAI GPT-3. Teraz s LLaMA sa latka opäť jasne zdvihla a tento model sa zdá byť veľmi dobrou open-source alternatívou k OpenAI ChatGPT a GPT-4.

Licencia LLaMA však nie je vhodná na podnikanie: tento model nemožno používať na komerčné účely... Dobrou správou však je, že teraz existujú aj iné modely.

OpenLLaMA, vydaný v júni 2023, je alternatívna verzia LLaMA, vyvinutá tímom Berkeley AI Research, ktorá poskytuje veľmi dobré výsledky a môže sa používať na podnikanie. V čase písania tohto článku sú k dispozícii 2 verzie: 7B parametrov a 13B parametrov.

XGen, ktorý spoločnosť Salesforce vydala v júni 2023, je ďalší veľmi výkonný základný model, ktorý možno použiť v komerčných aplikáciách. V čase písania tohto článku je k dispozícii iba verzia s parametrami 7B. Stojí za zmienku, že tento model podporuje kontext 8k tokenov, zatiaľ čo LLaMA a OpenLLaMA podporujú len obsah 2k tokenov.

Prečo dolaďovať vlastný model?

Vyššie uvedené modely sú základnými modelmi, čo znamená, že boli vycvičené na veľkom korpuse textov.

Tieto základné modely umelej inteligencie sú zvyčajne dobrým základom, ale je potrebné ich vyladiť tak, aby správne pochopili, čo chcete, a poskytovali dobré výsledky. Najjednoduchší spôsob, ako to dosiahnuť, je použiť učenie s niekoľkými zábermi (známe aj ako "promptné inžinierstvo"). Neváhajte si prečítať nášho špecializovaného sprievodcu pre učenie sa z niekoľkých záberov.

Učenie s niekoľkými zábermi je pohodlné, pretože sa dá vykonávať za behu bez toho, aby bolo potrebné vytvárať novú verziu generatívneho modelu umelej inteligencie, ale niekedy to nestačí.

Aby ste dosiahli špičkové výsledky, budete chcieť model AI vyladiť pre svoj vlastný prípad použitia. Doladenie znamená, že na základe vlastných údajov upravíte niektoré parametre modelu a potom získate vlastnú verziu modelu.

Dolaďovanie je oveľa lacnejšie ako trénovanie generatívneho modelu AI od začiatku, ale stále si vyžaduje výpočtový výkon, takže na doladenie vlastného modelu potrebujete pokročilý hardvér. Niektoré nedávne alternatívne techniky jemného ladenia si vyžadujú menší výpočtový výkon (pozri p-tuning, prompt tuning, soft tuning, parameter efficient fine-tuning, adaptéry, LoRA, QLoRA...), ale zatiaľ sa nám s týmito technikami nepodarilo dosiahnuť rovnakú úroveň kvality, takže ich v tomto návode nebudeme uvádzať.

Dolaďovanie LLaMA na TPU pomocou JAX a EasyLM

V tomto návode sa zameriame na jemné doladenie LLaMA pomocou knižnice EasyLM, ktorú vydal tím Berkeley AI Research: 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.

Rovnakou technikou môžete doladiť aj OpenLLaMA alebo XGen.

My sme tu vyladili LLaMA 7B na Google TPU V3-8, ale to isté môžete dokonale urobiť aj na GPU A100 (stačí si pozorne prečítať časť "Inštalácia" v dokumentácii EasyLM, ktorá sa mierne líši). Samozrejme, môžete vyladiť aj väčšie verzie LLaMA (13B, 33B, 65B...), ale budete potrebovať oveľa viac ako TPU V3-8 alebo jeden GPU A100.

A je to tu!

Najprv vytvorte súbor údajov na generovanie textu pre váš prípad použitia vo formáte JSONL, pričom ako kľúč pre každý príklad použite "text". Tu je jednoduchý súbor údajov pre analýzu sentimentu:

{"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"}

Upozorňujeme na niekoľko dôležitých vecí. Po prvé, tento súbor údajov obsahuje pre zjednodušenie len 3 príklady, ale v reálnom živote budete potrebovať oveľa viac príkladov. 300 príkladov je zvyčajne dobrý začiatok. Po druhé, keď budete používať svoj vyladený model na odvodzovanie, budete musieť striktne dodržiavať rovnaké formátovanie a používať prefixy "[Obsah]:" a "[Sentiment]:". Napokon, token "</s>" je dôležitý, pretože ak znamená, že model by sa tu mal prestať generovať. Ďalšie príklady súborov údajov nájdete v dokumentácii služby NLP Cloud: Viac informácií nájdete tu.

Vytvorte virtuálny počítač TPU V3-8 v službe Google Cloud s verziou softvéru V2 Alpha:

Prihláste sa cez SSH do virtuálneho počítača a nainštalujte EasyLM:

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

Teraz si môžete stiahnuť a previesť váhy LLaMA. Prvou možnosťou je požiadať spoločnosť Meta o oficiálne váhy: https://ai.facebook.com/blog/large-language-model-llama-meta-ai/. Potom prekonvertujte váhy do EasyLM pomocou tohto skriptu: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_torch_to_easylm.py. Druhou možnosťou je použiť závažia LLaMA na HuggingFace: https://huggingface.co/decapoda-research/llama-7b-hf. Potom prekonvertujte váhy do EasyLM pomocou tohto skriptu: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_hf_to_easylm.py.

Nahrajte súbor údajov do virtuálneho počítača, spočítajte, koľko tokenov obsahuje, pomocou tokenizéra HF LLaMA:

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())))"

Ak svoj model trénujete pre kontext s 1024 tokenmi, musíte vrátený počet tokenov vydeliť 1024.

Ak svoj model trénujete pre kontext 2048 tokenov, musíte vrátený počet tokenov vydeliť 2048.

Toto číslo bude predstavovať počet krokov za epochu. Takže ak chcete napríklad trénovať 5 epoch (čo je zvyčajne dobré nastavenie), musíte toto číslo vynásobiť 5 a výslednú hodnotu uviesť do parametra --total_steps nižšie.

Tu je konkrétny príklad: ak váš súbor údajov obsahuje 100 000 tokenov a chcete kontext 1024 tokenov a 5 epoch, váš celkový počet krokov bude (100 000/1024)*5 = 488.

V závislosti od dĺžky kontextu nastavte --train_dataset.json_dataset.seq_length na 1024 alebo 2048. Všimnite si, že jemné ladenie modelu pre kontext s 2048 tokens vyžaduje viac pamäte, takže ak to nie je nevyhnutne potrebné, odporúčame, aby ste sa držali kontextu s 1024 tokens.

Teraz môžete spustiť proces dolaďovania:

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 &

Niektoré vysvetlenia:

--save_model_freq: ako často chcete ukladať model počas procesu. Ak len dolaďujete na malom súbore údajov, môžete ukladať len na konci procesu a v takom prípade sa táto hodnota bude rovnať --total_steps.

--optimizer.adamw_optimizer.lr_warmup_steps: Zvyčajne je dobrou hodnotou 10 % z celkového počtu krokov.

--tokenizer.vocab_file: cesta k súboru tokenizer.model. Ak napríklad používate úložisko decapoda na HuggingFace, tu je odkaz na tokenizer: https://huggingface.co/decapoda-research/llama-7b-hf/resolve/main/tokenizer.model.

--logger.output_dir: cesta k finálnemu modelu a logom

Ostatné parametre môžu zostať nezmenené.

Po dokončení procesu dolaďovania môžete načítať svoj model na ceste, ktorú ste zadali v položke --logger.output_dir.

Používanie vyladeného modelu na odvodzovanie

Teraz máte svoj vlastný vyladený model a chcete ho samozrejme používať!

Prvou stratégiou je použitie knižnice EasyLM na odvodzovanie. V takom prípade môžete inferenčný server spustiť takto:

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'

Potom jednoducho pošlite požiadavky pomocou cURL takto:

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]:"]}'

Druhou stratégiou je exportovať váš model do formátu HuggingFace, aby ste mohli vykonávať inferenciu pomocou iného rámca. Tu je uvedený spôsob, ako ho môžete exportovať:

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'

Záver

Rok 2023 bol veľkým míľnikom pre generatívne modely AI s otvoreným zdrojovým kódom. Od tohto dátumu môže každý používať skvelé modely ako LLaMA, OpenLLaMA, XGen, Orca, Falcon...

Jemné doladenie týchto modelov je najlepší spôsob, ako získať špičkové výsledky prispôsobené vášmu vlastnému prípadu použitia, ktoré môžu výrazne prekonať najlepšie vlastné modely AI, ako sú ChatGPT (GPT-3.5), GPT-4, Claude...

V tejto príručke som vám ukázal, ako doladiť LLaMA, OpenLLaMA a XGen. Ak máte otázky, neváhajte ma kontaktovať, a ak chcete jednoducho doladiť a nasadiť pokročilé generatívne modely umelej inteligencie bez akejkoľvek technickej zložitosti, have a look at the NLP Cloud dedicated documentation!

Mark
Inžinier strojového učenia v spoločnosti NLP Cloud