LLaMA, OpenLLaMA и XGen са най-съвременни генеративни модели на изкуствен интелект. Тези модели дават още по-добри резултати, когато се настройват върху вашите собствени данни. В тази статия ще видим как да настроим тези модели на GPU и TPU с помощта на JAX и библиотеката EasyLM.
Моделът 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-tuning, prompt tuning, soft tuning, parameter efficient fine-tuning, adapters, LoRA, QLoRA...), но досега не сме успели да постигнем същото ниво на качество с тези техники, затова няма да ги споменаваме в този урок.
В този урок се фокусираме върху фината настройка на 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, OpenLLaMA и XGen. Ако имате въпроси, не се колебайте да се свържете с мен, и ако искате лесно да настроите и внедрите усъвършенствани генеративни модели на изкуствен интелект без никаква техническа сложност, have a look at the NLP Cloud dedicated documentation!
Mark
Инженер по машинно обучение в NLP Cloud