Найти тему
Pavel Zloi

ИИ в каждый дом! Тонкая настройка ruGPT-3.5 при помощи LoRA

Оглавление

Приветствую вас мои уважаемые читатели!

В данной публикации я бы хотел в слегка облегчённой форме пересказать то о чём рассказывал в Дообучение ruGPT-3.5 13B с LoRA на Хабре.

Сгенерировано нейросетью Kandinsky 2.2
Сгенерировано нейросетью Kandinsky 2.2

Но на этот раз сконцентрируюсь на моём проекте ruGPT-3.5-training и постараюсь вкратце объяснить, как при помощи скриптов из упомянутого проекта можно без особых усилий произвести дообучение оригинальной модели ruGPT-3.5-13B от команды Sber AI.

Введение

Коллекцию датасетов будем использовать ту же самую, что применяется в процессе дообучения языковых моделей семейства Saiga (rulm), обучение будем выполнять через Peft на оригинальной модели ruGPT-3.5-13B запущенной в режиме квантизации "на лету" 8bit через bitsandbytes, по итогам которой получим LoRA слой, который мы вольём в базовую модель, после чего конвертируем результат в формат GGML (с квантизацией).

Если некоторые из сказанных выше слов кажутся вам незнакомыми, но вы в любом случае хотите дообучить свою собственную ruGPT-3.5, то не переживайте, мои скрипты сделают всё за вас, а пока они будут работать можете поклацать по ссылкам и всё внимательно изучить :)

Системные требования

Прежде чем мы продолжим, давайте убедимся в том, что ваша система соответствует минимальным системным требованиям. Для дообучения модели вам потребуется:

  • Операционная система на базе ядра Linux (я использую Debian);
  • 20Гб оперативной памяти на видеокарте (однако, если у вас 16Гб видеокарта, то придётся выполнить некоторые правки конфигураций, что может привести к понижению точности модели), настоятельно рекомендую, чтобы ваша видеокарта была от Nvidia;
  • Свежий драйвер видеокарты и драйвер CUDA (я проводил обучение на 12.2, однако, модель ruGPT-3.5 в режиме инференса можно запустить даже на 11.7, полагаю и обучение будет прекрасно работать);
  • 200Гб свободного места на жестком диске;
  • 60Гб обычной оперативной памяти (или меньше, но плюс SWAP раздел).

Если у вас нет подходящей видеокарты, то гипотетически можно выполнить обучение на процессоре, но знайте что обучение на RTX 4090 займёт у вас примерно в 20-30 раз меньше времени, чем обучение на разогнанном до 4ГГц 32х ядерном процессоре AMD 5950X.

Поэтому если подходящей видеокарты у вас нет, то рекомендую посмотреть в сторону бесплатного тарифа Google Colab, либо же хостеров, которые предлагаю почасовую аренду серверов с GPU, например Selectel, Sber Cloud, Yandex Cloud или любого другого.

Подготовка окружения

Для этого вам понадобятся:

  • Git;
  • Python 3.10 (хотя, скорее всего на 3.11 всё тоже будет хорошо работать);
  • Python VirtualEnv.

Клонируем репозиторий, затем переходим в директорию:

git clone --recurse-submodules https://github.com/EvilFreelancer/ruGPT-3.5-training.git
cd ruGPT-3.5-training

Инициализируем виртуальное окружение:

python3 -m venv venv

Переключаем контекст на виртуальное окружение:

source venv/bin/venv

Теперь установим зависимости:

pip install -r requirements.txt

Скачать придётся примерно 4Гб пакетов, так что наберитесь терпения.

Создание датасета

Как было упомянуто ранее, в качестве датасета возьмём chat датасет, который используется при обучении chat-моделей семейства Saiga (rulm). Подробнее можно посмотреть вот тут.

Запустим следующую команду:

python3 1_dataset.py

В среднем данный скрипт выполняется за 20-30 минут, так как ему надо перелопатить примерно 62 тысячи документов и создать в корне проекта четыре файла: train_full.jsonl, val_full.jsonl, train.jsonl и val.jsonl.

Запуск обучения

После того как датасеты будут созданы мы можем переходить к самой долгой части, а именно обучению.

Если у вас видеокарта с 16Гб оперативной памяти, то необходимо будет подправить пару строк в файле 2_train.py:

config['load_in_8bit'] = True
config['load_in_4bit'] = False

Заменить на:

config['load_in_8bit'] = False
config['load_in_4bit'] = True

А строку:

config['trainer']['per_device_train_batch_size'] = 2

Поменять на:

config['trainer']['per_device_train_batch_size'] = 1

Если же вы, как и я, счастливый обладатель видеокарты RTX 4090 (3090 тоже подойдёт), то ничего менять не потребуется.

Выполним следующую команду:

python3 2_train.py

На моей RTX 4090 обучение на тренировочном наборе train_full.jsonl заняло примерно 26 с небольшим часов, желательно в этот момент не загружать компьютер тяжелыми графическими приложениями (такими как игры).

После завершения обучения в папке output у вас появится множество файлов, но самые интересные из них это:

  • adapter_model.bin - в нём содержатся веса LoRA слоя;
  • adapter_config.json - конфигурация необходимая для правильного наложения данного LoRA слоя на модель ruGPT-3.5-13B.

Вы можете сразу попробовать получившийся слой командой:

python3 test_lora.py

Запустится интерактивная оболочка с поддержкой истории сообщений, выйти из которой можно комбинацией клавиш Ctrl+D.

Для вашего удобства я подготовил репозиторий на HuggingFace содержащий обученный мною LoRA слой и всё необходимое для его правильной работы.

Слияние весов LoRA с весами модели

Для выполнения данного шага вам потребуется примерно 60Гб оперативной памяти.

Выполним команду:

python3 3_merge.py

Скрипт выполняется примерно 5-10 минут, после чего будет создан файл pytorch_model.bin в папке output, которую можно потестировать следующим способом:

python3 test_merged.py

Так же как и в прошлый раз, запустится интерактивная оболочка, выйти из которой можно комбинацией клавиш Ctrl+D.

Конвертация в GGML

Чтобы выполнить преобразование в формат GGML дообученной модели в которую были влиты веса LoRA выполните следующую команду:

python3 4_ggml.py

Среднее время выполнения скрипта равно примерно 20-30 минутам, по результатам его работы в папке output_ggml появятся файлы преобразованных в формат GGML моделей, которые можно проверить при помощи следующего скрипта:

python3 test_ggml.py

И можно поиграть с моделью через интерактивную оболочку.

Кстати, я подготовил репозиторий на HuggingFace, так что можете их уже пощупать.

Заключение

Надеюсь публикация на Хабр и эта короткая инструкция помогут вам разобраться с тем как выполнить дообучение модели ruGPT-3.5 в домашних условиях.

Не забудьте поставить лайк, подписаться на канал, а также приглашаю ко мне на Telegram-канал на котором я публикую свои размышления, рассказываю о разных интересных новостях, а также делюсь своими наработками и опытом.

К тому же, если вы хотите поддержать мои усилия и вклад в развитие общества знаний, вы можете сделать пожертвование на CloudTips. Ваша поддержка поможет мне продолжать свою работу и делиться новыми открытиями с вами.

До встречи в следующей публикации!