Приветствую вас мои уважаемые читатели!
В данной публикации я бы хотел в слегка облегчённой форме пересказать то о чём рассказывал в Дообучение ruGPT-3.5 13B с LoRA на Хабре.
Но на этот раз сконцентрируюсь на моём проекте 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. Ваша поддержка поможет мне продолжать свою работу и делиться новыми открытиями с вами.
До встречи в следующей публикации!