Дообучение ruGPT-3.5 13B с LoRA |
||
|
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2023-10-09 10:00 Сегодня я рад представить вам подробное руководство по обучению модели ruGPT-3.5 13B с использованием датасетов модели Saiga-2/GigaSaiga, технологии Peft/LoRA и технологии GGML. Эта статья призвана стать полезным и практичным ресурсом для всех, кто интересуется машинным обучением, искусственным интеллектом и глубоким обучением, а также для тех, кто стремится глубже понять и освоить процесс обучения одной из самых мощных и перспективных русскоязычных моделей. В данной публикации мы разберем каждый этап обучения модели, начиная от подготовки данных и заканчивая конвертацией в формат GGML. Буду рад, если мой опыт и знания помогут вам в вашем исследовании и экспериментах в этой захватывающей области! Мотивация В свете недавних успехов и инноваций в области больших языковых моделей (LLM), особое внимание уделяется созданию более мощных и эффективных систем, способных обрабатывать и анализировать текст на естественном языке. Одним из ярких примеров таких систем является модель ruGPT-3.5 на 13 миллиардов параметров, созданная командой Sber AI и опубликованная 20го июля 2023 года. Эта модель представляет собой языковую нейронную сеть оптимизированную под работу с русским языком, она может совершать различные задачи обработки текста, от генерации текста до ответов на вопросы и многого другого. Однако, может не значит умеет, оригинальная ruGPT-3.5 "из коробки" хорошо умеет только продолжать текст предложенный пользователем. А вот чтобы она умела ещё и выполнять более-менее полезные действия, такие как писать код, щелкать математические задачки, вести диалог и так далее, необходимо выполнить дообучение на соответствующих датасетах. На Хабре имеется две хорошие публикации, посвященные данной теме:
А все прочие публикации которые мне попадались на глаза либо ссылались на упомянутые выше, либо были вида "Сбер явил миру ruGPT-3.5". И у меня сложилось впечатление, что ML сообществу более интересна тема дообучения моделей семейства LLaMA, хотя на мой скромный взгляд (и опираясь на опыт личного использования) ламы несколько хуже приспособлены для работы с русским языком. Ну и в целом, зачем заниматься дообучением LLaMA если про это уже написано десятки если не сотни публикаций? В этом нет ни вызова, ни новизны. Знакомство с ruGPT-3.5 Началось моё знакомство с данной моделью неспешно, после того как появились первые новости о новой модели от Сбера. На тот момент у меня уже имелась RTX 4090 на 24Гб VRAM от Гигабайт, но даже её памяти не хватало для запуска модели. Поэтому я стал искать различные способы её хоть как-то уместить в память карточки, по ходу дела узнал про библиотеку bitsandbytes, которая расширяет функционал библиотеки transformers, добавляя такие замечательные опции как По мотивам указанных изысканий я опубликовал на Дзене в своём блоге пост под названием ИИ в каждый дом! Инструкция по запуску ruGPT-3.5 13B. Мои эксперименты показали, что в режиме 8bit качество её работы в целом приемлемое, генерация текста получается не самая плохая и оперативной памяти карточки хватает. После этого я понял, что надо уже пробовать выполнить дообучение. Подготавливаем окружение Как я упомянул ранее, на Хабре мелькала публикация о проекте rulm, автор данной публикации подробно рассказал о том, как ему удалось собрать большой русскоязычный датасет и выполнить дообучение множества различных моделей, включая LLaMA (2) и ruGPT-3.5. На GitHub страничке указанного проекта я обнаружил Jupyter Notebook tune_llama_7b.ipynb с подробной инструкцией о том, как дообучить LLaMA 2 7B, но ничего похожего про ruGPT-3.5 не было, хотя и упоминалась модель GigaSaiga, конфигурацию gigasaiga_13b.json которой я решил использовать в качестве основы для своих экспериментов. И так, создадим директорию в которой будем выполнять все действия: Для дальнейшей работы нам понадобится Python 3.10, хотя возможно и на 3.11 всё будет отлично работать, не проверял. Помимо этого необходим модуль Python VirtualEnv (предпочитаю это решение, так как not a big fan of Conda) и само собой драйвера Nvidia, включая CUDA (я проводил обучение на 12.2). Создадим виртуальное окружение и переключимся на него: Установим зависимости, вот пример файла requirements.txt Теперь клонируем репозиторий rulm: Далее скопируем некоторые конфигурационные файлы: После чего в файле Тренируем модель Вся тренировка состоит из четырёх простых шагов, но если вам нужно получить только LoRA слой и вам не нужна GGML версия модели, то выполнять последние два шага вам не понадобится. Шаг 1 - Подготовка датасетов Для обучения большинства моделей необходимо иметь датасеты: тренировочный и валидационный, но чтобы их сделать необходимо для начала подготовить какой-то общий, большой датасет, но где взять данные? На помощь опять приходит проект rulm, там имеется три скрипта для создания датасетов из данных заранее подготовленных командой rulm. Каждый из них собирает специфический вариант датасета используемого для обучения разных версий моделей семейства Saiga, но лично меня больше всего заинтересовал create_chat_set.py, так как он предполагал слияние сразу 7 различных датасетов и готовил их таким образом, чтобы после обучения на них получалась модель типа ChatBot, вот полный список: К слову сказать, оригинальная GigaSaiga была обучена на 6 из них, не был задействован датасет gpt_roleplay_realm, в нём обыгрываются забавные и нестандартные игровые сценарии общения модели с пользователем. Попробуем скачать все упомянутые датасеты и собрать их в один большой датасет, после чего перемешаем и разделим на тренировочную и валидационную выборки. Создадим для этого скрипт, назовём его скажем Исходный код тут. Запустим и подождём некоторое время: По итогу в корне проекта появится два файла:
Шаг 2 - Тренировка модели Датасеты готовы, а это значит, что можно приступать к обучению самой модели, для этого будут использованы библиотеки torch, transformers и peft. Если в двух словах на этом этапе нам потребуется скачать модель Полный код скрипта По коду видно, что происходит запуск модуля Запустим его командой: На моей RTX 4090 обучение заняло примерно 26 с небольшим часов и потребовало примерно 19Гб VRAM, так что пришлось позакрывать многие приложения использующие видеокарту. Кстати, можно немного уменьшить объём необходимой VRAM до 13Гб, для этого потребуется переключить квантизацию "на лету" в режим Но лично я эту возможность не проверял, так как полагаю, что качество обучения модели может ухудшиться. В результате работы скрипта в директории output появятся следующие файлы:
Нас прежде всего интересуют первые два из списка, в файле Для вашего удобства я подготовил репозиторий на HuggingFace содержащий указанный LoRA слой и всё необходимое для его правильной работы, тестовый пример применения можно посмотреть тут. Шаг 3 - Слияние LoRA слоя и базовой модели Данный шаг является промежуточным, но он необходим для того чтобы в дальнейшем получить GGML версии модели. Для выполнения процедуры слияния слоёв команда rulm подготовила специальный скрипт под названием convert_to_native.py, но к сожалению он не совместим с ruGPT-3.5, так как оптимизирован под работу с архитектурой LLaMA. В общем пришлось его немного модифицировать. Надо положить его в корень проекта с соответствующим названием, далее создадим файл Исходный код тут. Скрипт вливает слой LoRA в базовую модель ruGPT-3.5 (загруженную в режиме float32). Для работы скрипта понадобится примерно 60Гб RAM, так как слияние происходит в системной оперативной памяти, что видно по опции Давайте запустим его: В результате в директории Самый любопытный момент в том, что указанный файл уже можно применять для выполнения задач инференса, просто указажите в Пример использования тут. Шаг 4 - Создание GGML моделей У нас всё готово для того чтобы начать преобразование Создадим файл Запустим скрипт, на конвертацию во все форматы понадобится примерно 30 минут: По коду видно, что сначала происходит преобразование модели в формат совместимый с GGML, помимо этого происходит конвертация весов из float32 во float16, затем конвертированная модель сохраняется в директории После преобразования запускается процедура квантизации, по итогу у нас получится 5 версий модели в формате GGML, которые можно запускать например бинарным файлом gpt-2 собранным в рамках проекта ggml или же с помощь llm, или же llm-rs-python и так далее. Все модели будут сохранены в директории Пример использования указанных моделей тут. Кстати, я подготовил репозиторий на HuggingFace, так что можете их уже пощупать. Благодарности Под занавес я хочу выразить искреннюю благодарность следующим авторам и командам:
Заключение Ну чтож, вот мы и на финишной прямой, надеюсь, эта статья будет полезной для всех, кто интересуется обучением глубоких нейронных сетей и планирует применять модель ruGPT-3.5 13B в своих исследованиях и проектах. Желаю вам успехов в ваших начинаниях в области машинного обучения! PS. Решение описанное в данной публикации совместимо с моделями mGPT-13B, так как принципиально их архитектура ничем не отличается от ruGPT-3.5. Ссылки Источник: habr.com Комментарии: |
|