Máte potíže s umělou inteligencí nebo s vývojem celého balíku? Naši odborníci jsou tu pro vás: poradenství na míru, technická integrace a další. Obraťte se na [email protected].

Jak vyladit LLaMA, OpenLLaMA a XGen pomocí JAX na GPU nebo TPU

LLaMA, OpenLLaMA a XGen jsou špičkové generativní modely umělé inteligence. Tyto modely poskytují ještě mnohem lepší výsledky, pokud jsou vyladěny na vašich vlastních datech. V tomto článku se podíváme, jak tyto modely vyladit na GPU i TPU pomocí JAX a knihovny EasyLM.

LLaMA, OpenLLaM a XGen

Model LLaMA vydala společnost Meta v únoru 2023. Tento generativní model umělé inteligence je open-source model navržený v několika velikostech: V tomto případě se jedná o modely o 7B parametrech, 13B parametrech, 33B parametrech a 65B parametrech.

V červnu 2021, kdy byl vydán GPT-J, si svět začal uvědomovat, že open-source generativní modely AI mohou vážně konkurovat OpenAI GPT-3. Nyní se s modelem LLaMA laťka opět zřetelně zvedla a tento model se zdá být velmi dobrou open-source alternativou k OpenAI ChatGPT a GPT-4.

Licence LLaMA však není přívětivá k podnikání: tento model nelze používat pro komerční účely... Dobrou zprávou však je, že nyní existují i jiné modely.

OpenLLaMA, vydaný v červnu 2023, je alternativní verze LLaMA, vyvinutá týmem Berkeley AI Research, která poskytuje velmi dobré výsledky a lze ji použít pro podnikání. V době psaní tohoto článku jsou k dispozici 2 verze: 7B parametrů a 13B parametrů.

XGen, vydaný společností Salesforce v červnu 2023, je další velmi výkonný základní model, který lze použít v komerčních aplikacích. V době psaní tohoto článku je k dispozici pouze verze s parametry 7B. Za zmínku stojí, že tento model podporuje kontext 8k tokenů, zatímco LLaMA a OpenLLaMA podporují pouze obsah 2k tokenů.

Proč dolaďovat vlastní model?

Výše uvedené modely jsou základní modely, což znamená, že byly vycvičeny na rozsáhlém korpusu textů.

Tyto základní modely AI jsou obvykle dobrým základem, ale je třeba je vyladit, aby správně pochopily, co chcete, a poskytovaly dobré výsledky. Nejjednodušší způsob, jak toho dosáhnout, je použít učení několika snímků (známé také jako "prompt engineering"). Zde si můžete přečíst našeho průvodce výukou několika snímků.

Učení s několika snímky je výhodné, protože je lze provádět za běhu, aniž by bylo nutné vytvářet novou verzi generativního modelu UI, ale někdy to nestačí.

Abyste dosáhli nejmodernějších výsledků, budete chtít vyladit model AI pro svůj vlastní případ použití. Doladění znamená, že na základě vlastních dat upravíte některé parametry modelu a poté získáte vlastní verzi modelu.

Dolaďování je mnohem levnější než trénování generativního modelu AI od nuly, ale stále vyžaduje výpočetní výkon, takže k doladění vlastního modelu potřebujete pokročilý hardware. Některé nedávné alternativní techniky jemného ladění vyžadují menší výpočetní výkon (viz p-tuning, promptní ladění, měkké ladění, parametricky efektivní jemné ladění, adaptéry, LoRA, QLoRA...), ale zatím se nám s těmito technikami nepodařilo dosáhnout stejné úrovně kvality, takže je v tomto tutoriálu nebudeme zmiňovat.

Jemné doladění LLaMA na TPU pomocí JAX a EasyLM

V tomto tutoriálu se zaměříme na vyladění LLaMA pomocí knihovny EasyLM, kterou 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.

Stejnou technikou můžete vyladit také OpenLLaMA nebo XGen.

My jsme zde vyladili LLaMA 7B na Google TPU V3-8, ale totéž můžete dokonale provést na GPU A100 (stačí si pozorně přečíst část "Instalace" v dokumentaci EasyLM, která se mírně liší). Samozřejmě můžete vyladit i větší verze LLaMA (13B, 33B, 65B...), ale budete k tomu potřebovat mnohem více než TPU V3-8 nebo jeden GPU A100.

A je to tady!

Nejprve vytvořte datovou sadu pro generování textu pro váš případ použití ve formátu JSONL a jako klíč pro každý příklad použijte "text". Zde je jednoduchá datová sada pro 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"}

Vezměte prosím na vědomí několik důležitých věcí. Zaprvé, tato datová sada obsahuje pro zjednodušení pouze 3 příklady, ale v reálném životě budete potřebovat mnohem více příkladů. Obvykle je dobrým začátkem 300 příkladů. Za druhé, až budete svůj vyladěný model používat k odvozování, budete muset striktně dodržovat stejné formátování a používat předpony "[Obsah]:" a "[Sentiment]:". A konečně, token "</s>" je důležitý, protože pokud znamená, že model by zde měl přestat generovat. Další příklady datových sad najdete v dokumentaci služby NLP Cloud: více informací zde.

Vytvořte virtuální počítač TPU V3-8 v cloudu Google Cloud s verzí softwaru V2 Alpha:

SSH do virtuálního počítače a nainstalujte EasyLM:

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

Nyní si můžete stáhnout a převést váhy LLaMA. První možností je požádat společnost Meta o oficiální váhy: https://ai.facebook.com/blog/large-language-model-llama-meta-ai/. Poté převeďte váhy do EasyLM pomocí tohoto skriptu: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_torch_to_easylm.py. Druhou možností je použít závaží LLaMA na HuggingFace: https://huggingface.co/decapoda-research/llama-7b-hf. Poté převeďte váhy do EasyLM pomocí tohoto skriptu: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_hf_to_easylm.py.

Nahrajte datovou sadu do virtuálního počítače a spočítejte, kolik tokenů obsahuje, pomocí tokenizéru 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())))"

Pokud svůj model trénujete pro kontext 1024 tokenů, musíte vrácený počet tokenů vydělit 1024.

Pokud svůj model trénujete pro kontext 2048 tokenů, musíte vrácený počet tokenů vydělit 2048.

Toto číslo bude představovat počet kroků za epochu. Pokud tedy například chcete trénovat po dobu 5 epoch (což je obvykle dobré nastavení), musíte toto číslo vynásobit 5 a výslednou hodnotu zadat do parametru --total_steps níže.

Zde je konkrétní příklad: pokud vaše datová sada obsahuje 100 000 tokenů a chcete kontext 1024 tokenů a 5 epoch, váš celkový počet kroků bude (100 000/1024)*5 = 488.

V závislosti na délce kontextu nastavte níže --train_dataset.json_dataset.seq_length na 1024 nebo 2048. Všimněte si, že jemné vyladění modelu pro kontext 2048 tokenů vyžaduje více paměti, takže pokud to není nezbytně nutné, doporučujeme zůstat u kontextu 1024 tokenů.

Nyní můžete spustit proces jemného doladění:

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 &

Některá vysvětlení:

--save_model_freq: jak často chcete během procesu ukládat model. Pokud pouze dolaďujete malou sadu dat, můžete ukládat pouze na konci procesu a v takovém případě bude tato hodnota rovna --total_steps.

--optimizer.adamw_optimizer.lr_warmup_steps: Obvykle je dobrou hodnotou 10 % z celkového počtu kroků.

--tokenizer.vocab_file: cesta k souboru tokenizer.model. Pokud například používáte repozitář decapoda na HuggingFace, zde je odkaz na tokenizer: https://huggingface.co/decapoda-research/llama-7b-hf/resolve/main/tokenizer.model.

--logger.output_dir: cesta k finálnímu modelu a logům

Ostatní parametry lze ponechat beze změny.

Po dokončení procesu jemného doladění můžete načíst svůj model v cestě zadané v parametru --logger.output_dir.

Použití vyladěného modelu pro odvozování závěrů

Nyní máte svůj vlastní vyladěný model a chcete ho samozřejmě používat!

První strategií je použití knihovny EasyLM pro inferenci. V takovém případě můžete inferenční server spustit 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'

Pak jednoduše odešlete požadavky pomocí 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 strategií je exportovat model do formátu HuggingFace, aby bylo možné provést inferenci pomocí jiného rámce. Zde je uveden způsob, jak jej můžete exportovat:

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ávěr

Rok 2023 byl velkým milníkem pro generativní modely AI s otevřeným zdrojovým kódem. Od tohoto okamžiku může každý používat skvělé modely jako LLaMA, OpenLLaMA, XGen, Orca, Falcon...

Jemné vyladění těchto modelů je nejlepší způsob, jak získat špičkové výsledky přizpůsobené vašemu vlastnímu případu použití, které mohou výrazně překonat nejlepší proprietární modely AI, jako jsou ChatGPT (GPT-3.5), GPT-4, Claude...

V tomto návodu jsem vám ukázal, jak vyladit LLaMA, OpenLLaMA a XGen. Pokud máte dotazy, neváhejte se na mě obrátit, a pokud chcete snadno vyladit a nasadit pokročilé generativní modely AI bez technických složitostí, have a look at the NLP Cloud dedicated documentation!

Mark
Inženýr strojového učení ve společnosti NLP Cloud