Боретеся зі штучним інтелектом або повним циклом розробки? Наші експерти допоможуть вам: індивідуальні консультації, технічна інтеграція та багато іншого. Звертайтеся за адресою [email protected].

Як налаштувати LLaMA, OpenLaMA та XGen за допомогою JAX на GPU або TPU

LLaMA, OpenLLaMA та XGen - це найсучасніші моделі генеративного ШІ. Ці моделі дають навіть набагато кращі результати, якщо їх точно налаштувати на ваших власних даних. У цій статті ми розглянемо, як налаштувати ці моделі на GPU і TPU, використовуючи JAX і бібліотеку EasyLM.

LLaMA, OpenLLaM та XGen

Модель LLaMA була випущена компанією Meta в лютому 2023 року. Ця генеративна модель ШІ є моделлю з відкритим вихідним кодом і пропонується в декількох розмірах: 7B параметрів, 13B параметрів, 33B параметрів і 65B параметрів.

У червні 2021 року, коли вийшла GPT-J, світ почав усвідомлювати, що моделі генеративного ШІ з відкритим кодом можуть скласти серйозну конкуренцію OpenAI GPT-3. Тепер, з появою LLaMA, планку знову піднято, і ця модель здається дуже хорошою альтернативою OpenAI ChatGPT і GPT-4 з відкритим кодом.

Ліцензія LLaMA не є дружньою до бізнесу: цю модель не можна використовувати в комерційних цілях... Але хороша новина полягає в тому, що зараз існують інші моделі.

OpenLLaMA, випущена в червні 2023 року, є альтернативною версією LLaMA, розробленою командою Berkeley AI Research, яка дає дуже хороші результати і може бути використана для бізнесу. На момент написання цієї статті доступні 2 версії: 7B параметрів і 13B параметрів.

XGen, випущена компанією Salesforce у червні 2023 року, є ще однією дуже потужною базовою моделлю, яку можна використовувати в комерційних додатках. На момент написання цієї статті доступна лише версія з параметрами 7B. Варто зазначити, що ця модель підтримує контекст з 8 тис. токенів, в той час як LLaMA та OpenLLaMA підтримують лише контент з 2 тис. токенів.

Навіщо допрацьовувати власну модель?

Наведені вище моделі є фундаментальними моделями, що означає, що вони були навчені без нагляду на великому корпусі текстів.

Ці фундаментальні моделі ШІ зазвичай є хорошою основою, але їх потрібно налаштувати, щоб вони правильно розуміли, чого ви хочете, і давали хороші результати. Найпростіший спосіб досягти цього - використовувати навчання з кількох спроб (також відоме як "швидке проектування"). Не соромтеся прочитати наш спеціальний посібник з навчання з кількома кадрами тут.

Навчання з кількох пострілів зручне тим, що його можна виконувати "на льоту" без необхідності створювати нову версію генеративної моделі ШІ, але іноді цього буває недостатньо.

Щоб отримати найсучасніші результати, вам потрібно буде доопрацювати модель ШІ для вашого власного сценарію використання. Точне налаштування означає, що ви зміните деякі параметри моделі на основі власних даних, а потім отримаєте власну версію моделі.

Тонке налаштування набагато дешевше, ніж навчання генеративної моделі ШІ з нуля, але воно все одно вимагає обчислювальних потужностей, тому вам знадобиться сучасне обладнання, щоб точно налаштувати власну модель. Деякі нещодавні альтернативні методи тонкого налаштування вимагають меншої обчислювальної потужності (див. p-налаштування, швидке налаштування, м'яке налаштування, параметрично ефективне тонке налаштування, адаптери, LoRA, QLoRA...), але поки що нам не вдалося досягти такого ж рівня якості за допомогою цих методів, тому ми не будемо згадувати про них у цьому підручнику.

Тонке налаштування LLaMA на TPU за допомогою JAX та EasyLM

У цьому посібнику ми зосередимося на тонкому налаштуванні LLaMA за допомогою бібліотеки EasyLM, випущеної командою 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.

Ви також можете налаштувати OpenLLaMA або XGen, використовуючи ту ж саму техніку.

Тут ми налаштовуємо LLaMA 7B на Google TPU V3-8, але ви можете зробити те ж саме на графічному процесорі A100 (просто уважно прочитайте розділ "Встановлення" в документації EasyLM, який дещо відрізняється). Звичайно, ви також можете налаштувати більші версії LLaMA (13B, 33B, 65B...), але для цього вам знадобиться набагато більше, ніж TPU V3-8 або один графічний процесор A100.

Поїхали!

Спочатку створіть набір даних для генерації тексту для вашого варіанту використання у форматі JSONL, використовуючи "text" як ключ для кожного прикладу. Ось простий набір даних для аналізу настроїв:

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

Зверніть увагу на кілька важливих речей. По-перше, цей набір даних містить лише 3 приклади для простоти, але в реальному житті вам знадобиться набагато більше прикладів. 300 прикладів зазвичай є хорошим початком. По-друге, коли ви будете використовувати свою доопрацьовану модель для інференції, вам потрібно буде суворо дотримуватися того ж форматування, використовуючи префікси "[Content]:" і "[Sentiment]:". Нарешті, лексема "</s>" є важливою, оскільки вона означає, що модель повинна зупинити генерацію на цьому місці. Ви можете знайти більше прикладів наборів даних у документації NLP Cloud: дізнайтеся більше тут.

Створіть віртуальну машину TPU V3-8 у Google Cloud з версією програмного забезпечення V2 Alpha:

SSH у віртуальну машину та встановіть EasyLM:

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

Тепер ви можете завантажити та конвертувати ваги LLaMA. Перший варіант - звернутися до Meta за офіційними вагами: https://ai.facebook.com/blog/large-language-model-llama-meta-ai/. Потім перетворіть ваги в EasyLM за допомогою цього скрипта: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_torch_to_easylm.py. Другий варіант - використовувати ваги LLaMA на HuggingFace: https://huggingface.co/decapoda-research/llama-7b-hf. Потім перетворіть ваги в EasyLM за допомогою цього скрипта: https://github.com/young-geng/EasyLM/blob/main/EasyLM/models/llama/convert_hf_to_easylm.py.

Завантажте свій набір даних у віртуальну машину, порахуйте, скільки токенів він містить, за допомогою токенізатора 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())))"

Якщо ви тренуєте модель для контексту з 1024 токенів, вам потрібно буде розділити отриману кількість токенів на 1024.

Якщо ви тренуєте модель для контексту з 2048 токенів, вам потрібно буде розділити повернуту кількість токенів на 2048.

Це число буде кількістю кроків за епоху. Наприклад, якщо ви хочете тренуватися протягом 5 епох (що зазвичай є хорошим варіантом), вам потрібно помножити це число на 5 і вписати отримане значення в --total_steps нижче.

Ось конкретний приклад: якщо ваш набір даних містить 100 000 лексем, а вам потрібен контекст з 1024 лексем і 5 епох, загальна кількість кроків становитиме (100 000/1024)*5 = 488.

Залежно від довжини вашого контексту, встановіть --train_dataset.json_dataset.seq_length як 1024 або 2048 нижче. Зауважте, що точне налаштування моделі для контексту з 2048 токенів потребує більше пам'яті, тому, якщо це не є вкрай необхідним, ми рекомендуємо використовувати контекст з 1024 токенами.

Тепер ви можете розпочати процес точного налаштування:

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 &

Декілька пояснень:

--save_model_freq: як часто ви хочете зберігати вашу модель під час процесу. Якщо ви виконуєте тонку настройку на невеликому наборі даних, ви можете зберігати модель лише в кінці процесу, і тоді це значення буде дорівнювати --total_steps.

--optimizer.adamw_optimizer.lr_warmup_steps: 10% від загальної кількості кроків зазвичай є хорошим значенням.

--tokenizer.vocab_file: шлях до файлу tokenizer.model. Наприклад, якщо ви використовуєте репозиторій decapoda на HuggingFace, ось посилання на токенізатор: https://huggingface.co/decapoda-research/llama-7b-hf/resolve/main/tokenizer.model

--logger.output_dir: шлях до кінцевої моделі та логів

Інші параметри можна не змінювати.

Після завершення процесу тонкого налаштування ви можете отримати вашу модель за шляхом, вказаним у --logger.output_dir.

Використання точної моделі для виведення

Тепер у вас є власна досконала модель, і ви, звичайно ж, хочете нею користуватися!

Перша стратегія полягає у використанні бібліотеки EasyLM для виведення. У цьому випадку ви можете запустити сервер виведення ось так:

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'

Тоді просто надсилайте свої запити за допомогою cURL ось так:

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

Друга стратегія - експортувати вашу модель у формат HuggingFace, щоб виконати висновок за допомогою іншого фреймворку. Ось як ви можете експортувати її:

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 рік став важливою віхою для генеративних моделей ШІ з відкритим вихідним кодом. На момент написання цієї статті кожен може використовувати такі чудові моделі, як LLaMA, OpenLLaMA, XGen, Orca, Falcon...

Точне налаштування цих моделей - найкращий спосіб отримати найсучасніші результати, адаптовані до ваших потреб, які можуть значно перевершити найкращі власні моделі штучного інтелекту, такі як ChatGPT (GPT-3.5), GPT-4, Claude...

У цьому посібнику я показав, як налаштувати LLaMA, OpenLaMA та XGen. Якщо у вас виникнуть запитання, будь ласка, звертайтеся до мене, і якщо ви хочете легко налаштувати та розгорнути просунуті моделі генеративного ШІ без будь-яких технічних складнощів, have a look at the NLP Cloud dedicated documentation!

Mark
Інженер машинного навчання в NLP Cloud