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. Стоит отметить, что эта модель поддерживает контекст 8k токенов, в то время как LLaMA и OpenLLaMA поддерживают только содержимое 2k токенов.
Приведенные выше модели являются основополагающими, что означает, что они были обучены на большом корпусе текстов без наблюдения.
Эти базовые модели ИИ обычно являются хорошей основой, но их необходимо настроить, чтобы они правильно понимали то, что вы хотите, и давали хорошие результаты. Самый простой способ добиться этого - использовать обучение с несколькими выстрелами (также известное как "оперативное проектирование"). Не стесняйтесь читать наше специальное руководство по обучению нескольким снимкам здесь.
Обучение в несколько кадров удобно тем, что его можно выполнять "на лету", не создавая новую версию генеративной модели ИИ, но иногда этого недостаточно.
Для того чтобы получить самые современные результаты, вам потребуется тонкая настройка модели ИИ для вашего собственного случая использования. Тонкая настройка означает, что вы измените некоторые параметры модели на основе собственных данных, а затем получите свою собственную версию модели.
Тонкая настройка намного дешевле, чем обучение генеративной модели ИИ с нуля, но она все равно требует вычислительной мощности, поэтому для тонкой настройки собственной модели необходимо современное оборудование. Некоторые альтернативные методы тонкой настройки требуют меньших вычислительных мощностей (см. p-tuning, prompt tuning, soft tuning, parameter efficient fine-tuning, adaptters, 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, но вы можете сделать то же самое на GPU A100 (просто внимательно прочитайте раздел "Установка" в документации EasyLM, которая немного отличается). Конечно, вы можете настроить и более крупные версии LLaMA (13B, 33B, 65B...), но вам понадобится гораздо больше, чем TPU V3-8 или один A100 GPU.
Вот так!
Сначала создайте набор данных для генерации текста для вашего сценария использования в формате 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